www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@cset_stratlattice/propertypage.m
function out=propertypage(obj,action,varargin) % PROPERTYPAGE Create a property gui for CandidateSet % % % This should be overloaded by child classes % % Interface: Lyt=propertypage(cs,'layout',fig); % Lyt=propertypage(cs,'update',lyt,p_cs,model); % 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=''; 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'); lattsztxt=uicontrol('Parent',figh,... 'Style','text',... 'String','Lattice size:',... 'Position',[0 0 70 15],... 'HorizontalAlignment','left'); ud.lattszedt=mbcgui.widget.Spinner('Parent', figh,... 'Min',2,... 'Max',1e6,... 'ClickIncrementMode','auto',... 'Rule','int',... 'Position',[0 0 70 20]); ud.mintxt=uicontrol('Parent',figh,... 'Style','text',... 'HorizontalAlignment','left',... 'Position',[0 0 110 15]); ud.maxtxt=uicontrol('Parent',figh,... 'Style','text',... 'HorizontalAlignment','left',... 'Position',[0 0 110 15]); ud.minedt=uicontrol('Parent',figh,... 'Style','edit',... 'BackgroundColor','w',... 'Position',[0 0 70 20],... 'Interruptible','off'); ud.maxedt=uicontrol('Parent',figh,... 'Style','edit',... 'BackgroundColor','w',... 'Position',[0 0 70 20],... 'Interruptible','off'); ud.gtxt=uicontrol('Parent',figh,... 'Style','text',... 'HorizontalAlignment','left',... 'Position',[0 0 110 15]); ud.gedt=mbcgui.widget.Spinner('Parent', figh,... 'Min',2,... 'Rule','prime',... 'Position',[0 0 70 20]); frm = mbcgui.container.layoutpanel( ... 'Parent', figh, ... 'Title','Stratification',... 'BorderType', 'etchedin', ... 'LayoutBorder', [10 0 10 5]); ud.dostratify=uicontrol('Parent',frm,... 'Style','checkbox',... 'String','Stratify levels for X',... 'Interruptible','off'); ud.strattxt=uicontrol('Parent',frm,... 'Style','text',... 'HorizontalAlignment','left',... 'Position',[0 0 120 15]); ud.stratedt=mbcgui.widget.Spinner('Parent', frm,... 'Rule','list',... 'List',(2:100),... 'Position',[0 0 70 20]); udh=ud.lstbox; % callbacks set(ud.lstbox,'Callback',{@i_factchng,udh}); set(ud.minedt,'Callback',{@i_minchng,udh}); set(ud.maxedt,'Callback',{@i_maxchng,udh}); set(ud.gedt,'Callback',{@i_gchng,udh}); set(ud.lattszedt,'Callback',{@i_Nchng,udh}); set(ud.dostratify,'Callback',{@i_stratchng,udh}); set(ud.stratedt,'Callback',{@i_stratchng,udh}); flw1=xregflowlayout(figh,'orientation','left/center','gap',10,... 'border',[-10 0 0 0],'elements',{ud.mintxt,ud.minedt}); flw2=xregflowlayout(figh,'orientation','left/center','gap',10,... 'border',[-10 0 0 0],'elements',{ud.maxtxt,ud.maxedt}); flw3=xregflowlayout(figh,'orientation','left/center','gap',10,... 'border',[-10 0 0 0],'elements',{ud.gtxt,ud.gedt}); flw4=xregflowlayout(frm,'orientation','left/center','gap',10,... 'border',[-10 0 0 0],'elements',{ud.strattxt,ud.stratedt}); grd=xreggridlayout(frm,'correctalg','on', ... 'dimension',[2 1],... 'rowsizes', [20 20], ... 'gap', 5, ... 'elements',{ud.dostratify,flw4}); set(frm, 'LayoutComponent', {grd}); grd=xreggridlayout(figh,'dimension',[4 1],'correctalg','on','gapy',5,... 'elements',{flw1,flw2,flw3, frm},'rowsizes',[20 20 20 80]); flwbtm=xregflowlayout(figh,'orientation','left/center','gap',5,'border',[-5 10 0 0],... 'elements',{lattsztxt,ud.lattszedt}); spl=xregsplitlayout(figh,... 'left',ud.lstbox,... 'right',grd,... 'split',[.25 .75],... 'leftinnerborder',[0 5 0 0],... 'rightinnerborder',[0 0 0 5],... 'resizable','off'); lyt=xreggridlayout(figh,... 'correctalg','on',... 'dimension',[2 1],... 'rowsizes',[30 -1],... 'elements',{flwbtm,spl}); ud.layout=lyt; set(udh,'UserData',ud); return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % External update function. Finds udh the dirty way % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function lyt=i_update(lyt,p,m) % update current layout el=get(lyt,'elements'); el=get(el{2},'left'); ud=get(el,'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.gtxt;ud.strattxt;ud.dostratify],{'String'},... {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];... ['Prime number for ' fact ':'];['Number of levels for ' fact ':'];['Stratify levels for ' fact]}); lims=get(cs,'limits'); lims=invcode(ud.model,lims{factnum}',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.gedt,'Max',maxg,'Value',g(factnum)); nl=get(cs,'nlevels'); if nl(factnum) % stratify levels are list-taken+my one lst=(2:100); lst=setxor(lst,setxor(nl(nl~=0),nl(factnum))); set(ud.dostratify,'Value',1); set(ud.stratedt,'List',lst,'Value',nl(factnum),'Enable','on'); set(ud.strattxt,'Enable','on'); set(ud.gtxt,'Enable','off'); set(ud.gedt,'Enable','off'); else % stratify levels are list-taken+my one lst=(2:100); lst=setxor(lst,nl(nl~=0)); set(ud.dostratify,'Value',0); set(ud.stratedt,'List',lst,'Value',nl(factnum),'Enable','off'); set(ud.strattxt,'Enable','off'); set(ud.gtxt,'Enable','on'); set(ud.gedt,'Enable','on'); end return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Callbacks from each object % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function i_factchng(obj,nul,udh) ud=get(udh,'UserData'); ud=i_setvalues(ud); set(udh,'UserData',ud); return function i_minchng(obj,nul,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; lims=get(cs,'limits'); mxval=lims{factnum}(2); if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval) % reset display lims=invcode(ud.model,lims{factnum}(:),factnum); set(ud.minedt,'String',min(lims)); else lims{factnum}(1)=mnval; cs=set(cs,'limits',lims); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end return function i_maxchng(obj,nul,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; lims=get(cs,'limits'); mnval=lims{factnum}(1); if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval) % reset display lims=invcode(ud.model,lims{factnum}(:),factnum); set(ud.maxedt,'String',max(lims)); else lims{factnum}(2)=mxval; cs=set(cs,'limits',lims); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); end return function i_Nchng(obj,nul,udh) ud=get(udh,'UserData'); val=get(ud.lattszedt,'Value'); cs=set(ud.pointer.info,'N',val); p=primes(val); p=p(end); set(ud.gedt,'Max',p); % check the g values are all below Nmax g=get(cs,'g'); if any(g>p) % uh-oh g(g>p)=p; cs=set(cs,'g',g); factnum=get(ud.lstbox,'Value'); set(ud.gedt,'Value',g(factnum)); end ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); return function i_gchng(obj,nul,udh) ud=get(udh,'UserData'); factnum=get(ud.lstbox,'Value'); % increment prime numbers g=get(ud.pointer.info,'g'); p=get(ud.gedt,'Value'); g(factnum)=p; cs=set(ud.pointer.info,'g',g); ud.pointer.info=cs; set(udh,'UserData',ud); i_firecb(ud); return function i_stratchng(obj,nul,udh) ud=get(udh,'UserData'); factnum=get(ud.lstbox,'Value'); cs=ud.pointer.info; strat=get(cs,'nlevels'); newval=get(ud.dostratify,'Value'); if newval strat(factnum)=get(ud.stratedt,'Value'); set(ud.strattxt,'Enable','on'); set(ud.stratedt,'Enable','on'); set(ud.gtxt,'Enable','off'); set(ud.gedt,'Enable','off'); else strat(factnum)=0; set(ud.strattxt,'Enable','off'); set(ud.stratedt,'Enable','off'); set(ud.gtxt,'Enable','on'); set(ud.gedt,'Enable','on'); end cs=set(cs,'nlevels',strat); ud.pointer.info=cs; i_firecb(ud); 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