www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@cset_lhs/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); % Lyt=propertypage(cs,'enable',lyt,enstate); % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. switch lower(action) case 'layout' out=i_createlyt(obj, varargin{:}); case 'update' out=i_update(varargin{:}); case 'finalise' out=i_finalise(varargin{:}); case 'enable' out=i_setenable(varargin{:}); end function lyt=i_createlyt(obj, figh,varargin) pUD = xregGui.RunTimePointer; % create new layout in figure ud.pointer=[]; ud.figure=figh; ud.model=[]; ud.callback=''; ud.OriginalShowGUI=0; ud.OriginalRecalc=1; ud.editablePoints = true; for n=1:2:length(varargin) switch lower(varargin{n}) case 'callback' ud.callback=varargin{n+1}; case 'editablepoints' ud.editablePoints = varargin{n+1}; end end SC = xregGui.SystemColorsDbl; if ud.editablePoints ud.Size = mbcgui.widget.Spinner('Parent', figh,... 'Min',2,... 'Max',2^52,... 'ClickIncrement',10,... 'Rule','int', ... 'Callback',{@iNChange,pUD}); else ud.Size = uicontrol('Parent', figh, ... 'Style', 'text', ... 'String', '', ... 'HorizontalAlignment','left'); end ud.SizeLabel = xregGui.labelcontrol('parent',figh,... 'string','Latin hypercube size:',... 'ControlSize', 70, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 110, ... 'Control', ud.Size); ud.Criteria = uicontrol('Parent',figh,... 'Style','popupmenu',... 'BackgroundColor',SC.WINDOW_BG,... 'String',{'Maximize minimum distance','Minimize maximum distance','Minimize discrepancy',... 'Minimize RMS variation from CDF', 'Minimize maximum variation from CDF'}, ... 'Callback',{@iCritChange,pUD}); ud.CriteriaLabel = xregGui.labelcontrol('parent',figh,... 'string','Selection criteria:',... 'ControlSizeMode', 'relative', ... 'ControlSize', 1, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 90, ... 'Control', ud.Criteria); ud.Symmetry = uicontrol('Parent',figh,... 'Style','checkbox',... 'String','Enforce symmetrical points',... 'Callback',{@iSymChange,pUD}); [ud.RangeTable, ud.RangeTableUpdate] = pRangeEditor(obj, figh, ... ud.pointer, ud.model, ud.callback); ud.RangeLabel = uicontrol('Parent',figh, ... 'Style', 'text', ... 'HorizontalAlignment', 'left', ... 'String', 'Range of values:'); lyt = xreggridbaglayout(figh, ... 'userdata', pUD, ... 'dimension', [8 3], ... 'rowsizes', [20 10 20 10 15 10 15 -1], ... 'colsizes', [180 120 -1], ... 'mergeblock', {[1 1], [1 2]}, ... 'mergeblock', {[3 3], [1 2]}, ... 'mergeblock', {[8 8], [1 3]}, ... 'elements', {ud.SizeLabel, [], ud.CriteriaLabel, [], ud.Symmetry, [], ... ud.RangeLabel, ud.RangeTable}); ud.layout = lyt; pUD.info = ud; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % External update function. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function lyt = i_update(lyt,p,m) pUD = get(lyt, 'UserData'); % update current layout ud = pUD.info; if ~isempty(ud.pointer) % Restore the showgui flag on previous object ud.pointer.info = set(ud.pointer.info, 'showgui', ud.OriginalShowGUI); ud.pointer.info = set(ud.pointer.info, 'DoRecalc', ud.OriginalRecalc); end ud.pointer = p; ud.model = m; if ~isempty(ud.pointer) % Save the showgui flag on new object, and set it to 1 for the duration % of the current editing ud.OriginalShowGUI = get(ud.pointer.info, 'showgui'); ud.OriginalRecalc = get(ud.pointer.info, 'DoRecalc'); ud.pointer.info = set(ud.pointer.info, 'showgui', 1); ud.pointer.info = set(ud.pointer.info, 'DoRecalc', 0); end ud = i_setvalues(ud); pUD.info = ud; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Set all strings, values etc from data in ud % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ud = i_setvalues(ud) cs = ud.pointer.info; % Set values from cs into the UI if ud.editablePoints set(ud.Size,'Value',get(cs,'n')); else set(ud.Size,'String',sprintf('%d',get(cs,'n'))); end str = get(cs,'costmethod'); val = find( strcmp( str,{ 'maximin', 'minimax', 'discrepancy', 'cdfvariance', 'cdfmaximum' } ) ); set(ud.Criteria,'Value',val); set(ud.Symmetry, 'Value', get(cs, 'symmetric')); % Set up the range table ud.RangeTableUpdate(ud.pointer, ud.model); function lyt=i_finalise(lyt) pUD = get(lyt, 'UserData'); ud = pUD.info; if ~isempty(ud.pointer) cs = ud.pointer.info; cs = set(cs, 'DoRecalc', ud.OriginalRecalc); % Generate the object if it needs to be. This sequence effectively % ignores the DoRecalc setting used above, because currently the LHS % designs created in the Model Browser have it set to 0, but need to be % generated. if ~isGenerated(cs) cs = generate(cs); end % Restore the showgui flag on object cs = set(cs, 'showgui', ud.OriginalShowGUI); ud.pointer.info = cs; end function lyt = i_setenable(lyt,state) pUD = get(lyt,'UserData'); ud = pUD.info; set(ud.Symmetry,'Enable',state); set(ud.SizeLabel, 'Enable', state); set(ud.CriteriaLabel, 'Enable', state); set(ud.RangeTable, 'Enable', state); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Callbacks from each object % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function iNChange(~,~,pUD) ud = pUD.info; val = get(ud.Size,'Value'); ud.pointer.info = set(ud.pointer.info,'N',val); i_firecb(ud); function iCritChange(~,~,pUD) ud = pUD.info; val = get(ud.Criteria,'Value'); strs = {'maximin','minimax','discrepancy','cdfvariance','cdfmaximum'}; ud.pointer.info = set(ud.pointer.info,'costmethod',strs{val}); i_firecb(ud); function iSymChange(~,~,pUD) ud = pUD.info; val = get(ud.Symmetry,'Value'); cs = ud.pointer.info; if val~=get(cs,'symmetric') ud.pointer.info = set(cs,'symmetric',val); i_firecb(ud); end function i_firecb(ud) xregcallback(ud.callback,ud.layout,[]);