www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@cset_grid/propertypage.m
function out=propertypage(obj,action,varargin) % PROPERTYPAGE Create a property gui for CandidateSet % % % This should be overloaded by child classes % % Property pages % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. switch lower(action) case 'layout' out=i_createlyt(varargin{:}); case 'update' out=i_update(varargin{:}); end return function lyt=i_createlyt(figh,varargin) % create new layout in figure ud.pointer=[]; ud.figure=figh; ud.model=[]; ud.callback=''; ud.rbgvalue=1; if nargin>1 for n=1:2:length(varargin) switch lower(varargin{n}) case 'callback' ud.callback=varargin{n+1}; end end end ud.lstbox=uicontrol('Parent',figh,... 'BackgroundColor','w',... 'Value',1,... 'Style','listbox',... 'Tag','GridInputList',... 'Interruptible','off'); ud.mintxt=uicontrol('Parent',figh,... 'Style','text',... 'HorizontalAlignment','left'); ud.maxtxt=uicontrol('Parent',figh,... 'Style','text',... 'Visible','off',... 'HorizontalAlignment','left'); ud.minedt=uicontrol('Parent',figh,... 'Style','edit',... 'BackgroundColor','w',... 'Interruptible','off'); ud.maxedt=uicontrol('Parent',figh,... 'Style','edit',... 'BackgroundColor','w',... 'Interruptible','off'); ud.nlvltxt=uicontrol('Parent',figh,... 'Style','text',... 'HorizontalAlignment','left'); ud.nlvledt=mbcgui.widget.Spinner('Parent', figh,... 'Min',2,... 'Max',1000,... 'ClickIncrement',1,... 'Rule','int',... 'Tag','GridLevelSpinner'); ud.rbg=[uicontrol('Parent',figh,'Style','radiobutton',... 'String','Equally spaced levels',... 'Interruptible','off','Value',1);... uicontrol('Parent',figh,'Style','radiobutton',... 'String','User-specified levels',... 'Interruptible','off')]; ud.lvledt=uicontrol('Parent',figh,... 'Style','edit',... 'BackgroundColor','w',... 'Enable','off',... 'HorizontalAlignment','left',... 'Interruptible','off'); % callbacks udh=ud.lstbox; set(ud.lstbox,'Callback',{@i_fact,udh}); set(ud.minedt,'Callback',{@i_min,udh}); set(ud.maxedt,'Callback',{@i_max,udh}); set(ud.nlvledt,'Callback',{@i_nlevels,udh}); set(ud.lvledt,'Callback',{@i_levels,udh}); set(ud.rbg,{'Callback'},{{@i_method,udh,1};{@i_method,udh,2}}); lyt=xreggridbaglayout(figh,'dimension',[17 5],... 'rowsizes',[20 5 3 15 2 5 3 15 2 5 3 15 2 5 20 5 -1],... 'colsizes',[-1 10 15 -1 70],... 'colratios',[.3 0 0 .7 0],... 'mergeblock',{[1 17],[1 1]},... % listbox 'mergeblock',{[1 1],[3 5]},... % radiobutton 'mergeblock',{[15 15],[3 5]},... % radiobutton 'mergeblock',{[3 5],[5 5]},... 'mergeblock',{[7 9],[5 5]},... 'mergeblock',{[11 13],[5 5]},... 'mergeblock',{[17 17],[4 5]},... 'elements',{ud.lstbox,[],ud.rbg(1),[],[];... [],[],[],[],[];... [],[],[],[],ud.minedt;... [],[],[],ud.mintxt,[];... [],[],[],[],[];... [],[],[],[],[];... [],[],[],[],ud.maxedt;... [],[],[],ud.maxtxt,[];... [],[],[],[],[];... [],[],[],[],[];... [],[],[],[],ud.nlvledt;... [],[],[],ud.nlvltxt,[];... [],[],[],[],[];... [],[],[],[],[];... [],[],ud.rbg(2),[],[];... [],[],[],[],[];... [],[],[],ud.lvledt,[]},... 'userdata',udh); ud.layout=lyt; set(udh,'UserData',ud); return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % External update function. Finds udh the dirty way % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function lyt=i_update(lyt,p,m) udh=get(lyt,'UserData'); ud=get(udh,'UserData'); ud.pointer=p; ud.model=m; ud=i_setvalues(ud); set(ud.lstbox,'UserData',ud); return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Set all strings, values etc from data in udh % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ud=i_setvalues(ud) % set up the listbox fact=get(ud.model,'symbol'); set(ud.lstbox,'String',fact); factnum=get(ud.lstbox,'Value'); fact=fact{factnum}; cs=ud.pointer.info; set([ud.mintxt;ud.maxtxt;ud.nlvltxt],{'String'},... {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];['Number of levels for ' fact ':']}); lvls=get(cs,'levels'); lvls=lvls{factnum}; lvls=invcode(ud.model,lvls(:),factnum); set([ud.minedt;ud.maxedt],{'String'},... {min(lvls);max(lvls)}); set(ud.nlvledt,'Value',length(lvls)); str=prettify(lvls); set(ud.lvledt,'String',str); sc=xregGui.SystemColorsDbl; % decide if the str represents a number of equal levels if (length(strfind(str,':'))<=2 && isempty(strfind(str,' '))) || length(lvls)==2 % use set levels set(ud.rbg,{'Value'},{1;0}); % set enable statuses set(ud.lvledt,'Enable','off','BackgroundColor',sc.CTRL_BACK); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on'); set([ud.minedt;ud.maxedt],'Enable','on','BackgroundColor',[1 1 1]); set(ud.nlvledt,'Enable','on'); ud.rbgvalue=1; else set(ud.rbg,{'Value'},{0;1}); set(ud.lvledt,'Enable','on','BackgroundColor','w'); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off'); set([ud.minedt;ud.maxedt],'Enable','off','BackgroundColor',sc.CTRL_BACK); set(ud.nlvledt,'Enable','off'); ud.rbgvalue=2; end return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Callbacks from each object % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function i_fact(~,~,udh) ud=get(udh,'UserData'); ud=i_setvalues(ud); set(udh,'UserData',ud); return function i_max(~,~,udh) ud=get(udh,'UserData'); factnum=get(ud.lstbox,'Value'); mxval=str2double(get(ud.maxedt,'String')); mxval=code(ud.model,mxval,factnum); cs=ud.pointer.info; lvls=get(cs,'levels'); lims=lvls{factnum}; mnval=min(lims); if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval) % reset display lims=invcode(ud.model,lims(:),factnum); set(ud.maxedt,'String',max(lims)); else % recreate levels vector nlvls=get(ud.nlvledt,'Value'); lvls{factnum}=linspace(mnval,mxval,nlvls); cs=set(cs,'levels',lvls); set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{factnum}', factnum)')); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end return function i_min(~,~,udh) ud=get(udh,'UserData'); factnum=get(ud.lstbox,'Value'); mnval=str2double(get(ud.minedt,'String')); mnval=code(ud.model,mnval,factnum); cs=ud.pointer.info; lvls=get(cs,'levels'); lims=lvls{factnum}; mxval=max(lims); if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval) % reset display lims=invcode(ud.model,lims(:),factnum); set(ud.minedt,'String',min(lims)); else % recreate levels vector nlvls=get(ud.nlvledt,'Value'); lvls{factnum}=linspace(mnval,mxval,nlvls); cs=set(cs,'levels',lvls); set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{factnum}', factnum)')); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end return function i_nlevels(obj,~,udh) ud=get(udh,'UserData'); nlvls=get(obj,'Value'); factnum=get(ud.lstbox,'Value'); cs=ud.pointer.info; lvls=get(cs,'levels'); mnval=min(lvls{factnum}(:)); mxval=max(lvls{factnum}(:)); lvls{factnum}= linspace(mnval,mxval,nlvls); cs=set(cs,'levels',lvls); ud.pointer.info=cs; % update levels edit box set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{factnum}', factnum)')); set(udh,'UserData',ud); i_firecb(ud); return function i_levels(~,~,udh) ud=get(udh,'UserData'); lvl=str2num(get(ud.lvledt,'String')); factnum=get(ud.lstbox,'Value'); cs=ud.pointer.info; lvls=get(cs,'levels'); if ~isempty(lvl) && isnumeric(lvl) && length(unique(lvl))>1 lvls{factnum}=code(ud.model,lvl(:),factnum)'; set([ud.minedt;ud.maxedt],{'String'},{min(lvl(:));max(lvl(:))}); set(ud.nlvledt,'Value',length(lvl)); cs=set(cs,'levels',lvls); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); else lvl=(invcode(ud.model,lvls{factnum}(:),factnum))'; end set(ud.lvledt,'String',prettify(lvl)); return function i_method(~,~,udh,val) ud=get(udh,'UserData'); % switch enable status of bits sc=xregGui.SystemColorsDbl; if val~=ud.rbgvalue switch val case 1 set(ud.rbg(2),'Value',0); set(ud.lvledt,'Enable','off','BackgroundColor',sc.CTRL_BACK); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on'); set([ud.minedt;ud.maxedt],'Enable','on','BackgroundColor',[1 1 1]); set(ud.nlvledt,'Enable','on'); % reset levels edit box using min/max/nlevels i_nlevels(ud.nlvledt,[],udh); case 2 set(ud.rbg(1),'Value',0); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off'); set([ud.minedt;ud.maxedt],'Enable','off','BackgroundColor',sc.CTRL_BACK); set(ud.nlvledt,'Enable','off'); set(ud.lvledt,'Enable','on','BackgroundColor',[1 1 1]); end ud.rbgvalue=val; set(udh,'UserData',ud); else set(ud.rbg(val),'Value',1); end return function i_firecb(ud) if ischar(ud.callback) evalin('base',ud.callback); else str=[ud.callback(1) {ud.layout,[]} ud.callback(2:end)]; feval(str{:}); end return