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,[]);