www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@cset_grdlatt/propertypage.m
function out = propertypage(obj,action,varargin) %#ok<INUSL> %PROPERTYPAGE Create a property gui for CSET_GRDLATT % % PROPERTYPAGE(CS, ACTION, ARGS) creates a property page that can be % embedded within a figure. See CANDIDATESET/PROPEDIT for more % information. % 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 function lyt=i_createlyt(figh,varargin) ud.pointer=[]; ud.figure=figh; ud.model=[]; ud.callback=''; if nargin>1 for n=1:2:length(varargin) switch lower(varargin{n}) case 'callback' ud.callback=varargin{n+1}; end end end SC = xregGui.SystemColorsDbl; ud.lstbox=uicontrol('Parent',figh,... 'BackgroundColor',SC.WINDOW_BG,... 'Value',1,... 'Style','listbox',... 'UserData',cset_grdlatt); ud.grltrb=xregGui.rbgroup('parent', figh, ... 'position',[0 0 140 20],... 'nx',2,'ny',1,... 'string',{'Grid','Lattice'},'value',[0 1]); ud.lattszedt=mbcgui.widget.Spinner('Parent', figh,... 'Min',2,... 'Max',1e6,... 'ClickIncrement',10,... 'Rule','int'); lattsz = xregGui.labelcontrol('parent', figh, ... 'string', 'Lattice size:', ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 70, ... 'ControlSizeMode', 'absolute', .... 'ControlSize', 70, ... 'Control', ud.lattszedt); frame = mbcgui.container.layoutpanel('Parent', figh, ... 'BorderType', 'etchedin', ... 'LayoutBorder', [5 5 5 5]); ud.minedt=uicontrol('Parent',frame,... 'Style','edit',... 'BackgroundColor', SC.WINDOW_BG,... 'Interruptible','off'); ud.maxedt=uicontrol('Parent',frame,... 'Style','edit',... 'BackgroundColor',SC.WINDOW_BG,... 'Interruptible','off'); ud.mintxt=xregGui.labelcontrol('parent',frame,... 'ControlSizeMode', 'absolute', .... 'ControlSize', 70, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 130, ... 'Control', ud.minedt); ud.maxtxt=xregGui.labelcontrol('parent',frame,... 'ControlSizeMode', 'absolute', .... 'ControlSize', 70, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 130, ... 'Control', ud.maxedt); ud.nlvledt=mbcgui.widget.Spinner('Parent', frame,... 'Min',2,... 'Max',1000,... 'ClickIncrement',1,... 'Rule','int'); ud.nlvltxt=xregGui.labelcontrol('parent',frame,... 'ControlSizeMode', 'absolute', .... 'ControlSize', 70, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 130, ... 'Control', ud.nlvledt); ud.rbg=xregGui.rbgroup('parent', frame,... 'nx',1,'ny',2,... 'string', {'Equally spaced levels'; 'User-specified levels'}, ... 'value',[1; 0], ... 'gapy',85); ud.lvledt=uicontrol('Parent',frame,... 'Style','edit',... 'BackgroundColor', SC.WINDOW_BG,... 'Enable','off',... 'HorizontalAlignment','left'); udh=ud.lstbox; % callbacks set(ud.lstbox,'Callback',{@i_factchng,udh}); set(ud.lattszedt,'Callback',{@i_Nchng,udh}); set(ud.minedt,'Callback',{@i_minchng,udh}); set(ud.maxedt,'Callback',{@i_maxchng,udh}); set(ud.nlvledt,'Callback',{@i_nlvlchng,udh}); set(ud.lvledt,'Callback',{@i_lvlchng,udh}); set(ud.rbg,'Callback',{@i_gridmeth,udh}); set(ud.grltrb,'Callback',{@i_grltchng,udh}); ud.grlay = xreggridbaglayout(frame, ... 'packstatus', 'off', ... 'dimension', [7, 2], ... 'rowsizes', [15 20 20 20 0 15 20], ... 'colsizes', [20 -1], ... 'gapy', 5, ... 'mergeblock', {[1 6], [1 2]}, ... 'elements', {ud.rbg, [], [], [], [], [], [], ... [], ud.mintxt, ud.maxtxt, ud.nlvltxt, [], [], ud.lvledt}); ud.ltlay = xreggridbaglayout(frame, ... 'dimension', [3, 1], ... 'rowsizes', [20 20 20], ... 'gapy', 5, ... 'elements', {ud.mintxt, ud.maxtxt, ud.nlvltxt}); ud.crd=xregcardlayout(frame, ... 'numcards',2, ... 'currentcard',2); attach(ud.crd,ud.grlay,1); attach(ud.crd,ud.ltlay,2); set(frame, 'LayoutComponent', ud.crd); lyt = xreggridbaglayout(figh, ... 'dimension', [4, 3], ... 'rowsizes', [20 10 20 -1], ... 'colsizes', [-1 -1 -1], ... 'colratios', [.25 .4 .35], ... 'gapx', 15, ... 'mergeblock', {[1 1], [1 3]}, ... 'mergeblock', {[4 4], [2 3]}, ... 'mergeblock', {[3 4], [1 1]}, ... 'elements', {lattsz, [], ud.lstbox, [], [], [], ud.grltrb, frame}); ud.layout=lyt; set(udh,'UserData',ud); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % External update function. Finds udh the dirty way % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function lyt=i_update(lyt,p,m) % Get listbox el = get(lyt, 'elements'); el = el{3}; ud=get(el,'UserData'); ud.pointer=p; ud.model=m; ud=i_setvalues(ud); set(ud.lstbox,'UserData',ud); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Set all strings, values etc from data in udh % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ud=i_setvalues(ud) cs=ud.pointer.info; fact=get(ud.model,'symbol'); set(ud.lstbox,'String',fact); factnum=get(ud.lstbox,'Value'); fact=fact{factnum}; % set lattice size set(ud.lattszedt,'Value',get(cs,'N')); grddims=get(cs,'griddims'); ltdims=get(cs,'latticedims'); vis= get(ud.crd,'Visible'); set(ud.crd,'Visible','off'); % decide which option to show for this factor if ismember(factnum,grddims) % grid set([ud.mintxt;ud.maxtxt;ud.nlvltxt],{'String'},... {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];['Number of levels for ' fact ':']}); gridnum= grddims==factnum; lvls=get(cs,'levels'); lvl=invcode(ud.model,lvls{gridnum}(:),factnum)'; set([ud.minedt;ud.maxedt],{'String'},... {min(lvl);max(lvl)}); set(ud.nlvledt,'Rule','int','Value',length(lvl),'Max',1000); str=prettify(lvl); set(ud.lvledt,'String',str); % decide if the str represents a number of equal levels SC = xregGui.SystemColorsDbl; if (length(strfind(str,':'))<=2 && isempty(strfind(str,' '))) || length(lvl)==2 % use set levels set(ud.rbg,'Value',[1; 0]); % set enable statuses set(ud.lvledt,'Enable','off', 'BackgroundColor', SC.CTRL_BG); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on'); else set(ud.rbg,'Value',[0; 1]); set(ud.lvledt,'Enable','on', 'BackgroundColor', SC.WINDOW_BG); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off'); end set(ud.crd,'currentcard',1); lyt=getcard(ud.crd,1); repack(lyt{1}); % Need to force redraw of min,max etc - shared with lattice view set(ud.grltrb,'Value',[1 0]); else % lattice set([ud.mintxt;ud.maxtxt;ud.nlvltxt],{'String'},... {['Minimum ' fact ' value:'];['Maximum ' fact ' value'];['Prime number for ' fact ':']}); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on'); latnum=find(ltdims==factnum); lims=get(cs,'limits'); lims=invcode(ud.model,lims{latnum}(:),factnum); set([ud.minedt;ud.maxedt],{'String'},... {lims(1);lims(2)}); set(ud.lattszedt,'Value',get(cs,'n')); maxg=primes(get(cs,'n')); maxg=maxg(end); g=get(cs,'g'); set(ud.nlvledt,'Rule','prime','Max',maxg,'Value',g(latnum)); set(ud.crd,'currentcard',2); lyt=getcard(ud.crd,2); repack(lyt{1}); % Need to force redraw of min,max etc - shared with grid view set(ud.grltrb,'Value',[0 1]); end set(ud.crd,'Visible',vis); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Callbacks from each object % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function i_factchng(~,~,udh) ud=get(udh,'UserData'); ud=i_setvalues(ud); set(udh,'UserData',ud); function i_Nchng(~,~,udh) ud=get(udh,'UserData'); val=get(ud.lattszedt,'Value'); cs= set(ud.pointer.info,'n',val); % check the g values are all below N g=get(cs,'g'); if any(g>val) % Change to lower primes p=primes(val); p=p(end); g(g>p)=p; cs=set(cs,'g',g); end % If the current factor is a lattice one then update the value and max of % the spinner factnum = get(ud.lstbox,'Value'); ltnum = factnum==get(cs,'latticedims'); if any(ltnum) set(ud.nlvledt,'Value',g(ltnum), 'Max', val); end ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); function i_minchng(~,~,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; if (get(ud.grltrb,'Selected')-1)~=0 % Lattice view ltnum=find(get(cs,'latticedims')==factnum); lims=get(cs,'limits'); mxval=lims{ltnum}(2); if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval) % reset display lims=invcode(ud.model,lims{ltnum}(1),factnum); set(ud.minedt,'String',lims); else lims{ltnum}(1)=mnval; cs=set(cs,'limits',lims); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end else % Grid View grnum=find(get(cs,'griddims')==factnum); lvls=get(cs,'levels'); lims=lvls{grnum}; mxval=max(lims); if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval) % reset display lims=invcode(ud.model,min(lims(:)),factnum); set(ud.minedt,'String',lims); else % recreate levels vector nlvls=get(ud.nlvledt,'Value'); lvls{grnum}=linspace(mnval,mxval,nlvls); cs=set(cs,'levels',lvls); set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{grnum}', factnum)')); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end end function i_maxchng(~,~,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; if (get(ud.grltrb,'Selected')-1)~=0 % Lattice view ltnum=find(get(cs,'latticedims')==factnum); lims=get(cs,'limits'); mnval=lims{ltnum}(1); if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval) % reset display lims=invcode(ud.model,lims{ltnum}(2),factnum); set(ud.maxedt,'String',lims); else lims{ltnum}(2)=mxval; cs=set(cs,'limits',lims); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end else % Grid View grnum=find(get(cs,'griddims')==factnum); lvls=get(cs,'levels'); lims=lvls{grnum}; mnval=min(lims); if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval) % reset display lims=invcode(ud.model,max(lims(:)),factnum); set(ud.minedt,'String',lims); else % recreate levels vector nlvls=get(ud.nlvledt,'Value'); lvls{grnum}=linspace(mnval,mxval,nlvls); cs=set(cs,'levels',lvls); set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{grnum}', factnum)')); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end end function i_nlvlchng(~,~,udh) ud=get(udh,'UserData'); factnum=get(ud.lstbox,'Value'); cs=ud.pointer.info; if (get(ud.grltrb,'Selected')-1)~=0 % Lattice View ltnum = get(cs,'latticedims')==factnum; val=get(ud.nlvledt,'Value'); g=get(cs,'g'); g(ltnum)=val; cs=set(cs,'g',g); ud.pointer.info=cs; else % Grid View grnum=find(get(cs,'griddims')==factnum); nlvls=get(ud.nlvledt,'Value'); lvls=get(cs,'levels'); mnval=min(lvls{grnum}(:)); mxval=max(lvls{grnum}(:)); lvls{grnum}= 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{grnum}', factnum)')); end set(udh,'UserData',ud); i_firecb(ud); function i_gridmeth(obj,~,udh) ud=get(udh,'UserData'); % switch enable status of bits val=get(obj,'Selected'); SC = xregGui.SystemColorsDbl; switch val case 1 set(ud.lvledt,'Enable','off', 'BackgroundColor', SC.CTRL_BG); set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on'); % reset levels edit box using min/max/nlevels i_nlvlchng(ud.nlvledt,[],udh); case 2 set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off'); set(ud.lvledt,'Enable','on', 'BackgroundColor', SC.WINDOW_BG); end function i_lvlchng(~,~,udh) ud=get(udh,'UserData'); cs=ud.pointer.info; lvl=str2num(get(ud.lvledt,'String')); factnum=get(ud.lstbox,'Value'); grnum=find(factnum==get(cs,'griddims')); lvls=get(cs,'levels'); if ~isempty(lvl) && isnumeric(lvl) && length(unique(lvl))>1 lvls{grnum}=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{grnum}(:),factnum))'; end set(ud.lvledt,'String',prettify(lvl)); function i_grltchng(~,~,udh) ud=get(udh,'UserData'); factnum=get(ud.lstbox,'Value'); isgr=get(ud.grltrb,'Selected')-1; cs=ud.pointer.info; if isgr % convert to lattice % remove from grid gdims=get(cs,'griddims'); glvls=get(cs,'levels'); gval=find(gdims==factnum); gdims(gval)=[]; glvls(gval)=[]; % add to lattice ldims=get(cs,'latticedims'); g=get(cs,'g'); [ldims i]=sort([ldims factnum]); lms=limits(cs); llims=num2cell(lms(ldims,:),2); p=primes(max(get(cs,'n')/50,30)); p=p(5:end); p = p(randperm(length(p))); g=[g p(end)]; g=g(i); else % convert to grid % remove from lattice ldims=get(cs,'latticedims'); g=get(cs,'g'); llims=get(cs,'limits'); lval=find(ldims==factnum); llims(lval)=[]; g(lval)=[]; % add to grid lms=limits(cs); gdims=get(cs,'griddims'); glvls=get(cs,'levels'); [gdims i]=sort([gdims factnum]); glvls(end+1)={linspace(lms(factnum,1),lms(factnum,2),3)}; glvls=glvls(i); end % set new values cs=set(set(cs,'griddims',gdims),'levels',glvls); cs=set(set(cs,'limits',llims),'g',g); ud.pointer.info=cs; % need to update half of view anyway so use full update fcn. ud=i_setvalues(ud); set(udh,'UserData',ud); i_firecb(ud); 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