www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@xregmodel/gui_globalsetup.m

    function [mout,ok] = gui_globalsetup(m,action,varargin)
%GUI_GLOBALSETUP Set up global model options
%
%   [M,OK]=GUI_GLOBALSETUP(M) creates a modal,blocking dialog for editing
%   the global model type and options of the model M.

%  Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.


if nargin<2
    action='figure';
end

switch lower(action)
    case 'figure'
        [mout,ok] = i_createfig(m,varargin{:});
    case 'layout'
        % currently unsupported
end



function [mout,ok] = i_createfig(m,varargin)
if any(strcmp('global',varargin));
    nm = 'Global Model Setup';
else
    nm = 'Model Setup';
end

try
    checkmodel(m);
catch ME
    % invalid model
    msg= ME.message;
    if ~isempty(msg)
        s= strfind(msg,sprintf( '\n' ));
        if ~isempty(s)
            msg= msg(s(1)+1:end);
        end
    else
        msg= 'Invalid or corrupt template';
    end
    resp = questdlg(sprintf('The current model is corrupt.\n %s\n\nDo you want to convert to a quadratic?',msg), ...
        'Corrupt Model', 'Yes','No','Yes');
    if strcmp(resp,'Yes')
        m = xregCreateModel(@xregcubic,m);
    else
        mout= m;
        ok= false;
        return
    end
end

dlg = mbcgui.container.Dialog('Name',nm,...
    'Size',[510 400],...
    'HelpCode','xreg_globalModelSetup',...
    'Resize','off');
figh = dlg.Figure;

p = xregGui.RunTimePointer(m);
p.LinkToObject(figh);
dlg.Content = i_createlyt(figh,p,varargin{:});

closeMode = dlg.showDialog();
if strcmp(closeMode, 'OK')
    pUD = get(dlg.Content, 'UserData');
    ud = pUD.info;
    cls = gui_globalmodsetup(p.info,'getclasslevel');
    val = find( strncmp( cls,ud.Group,length(cls) ) );
    lyt = getcard(ud.cards,val);
    lyt = lyt{1};
    % Call finalise on chosen class
    mout = gui_globalmodsetup(p.info, 'finalise', lyt, p);
    ok = 1;
else
    mout = m;
    ok = 0;
end
delete(dlg);

%------------------------------------------------------------
%   SUBFUNCTION     i_createlyt
%------------------------------------------------------------
function lyt = i_createlyt(figh,p,varargin)

if ~isa(figh,'xregcontainer')
    crit = 0; %(all)
    doBoxcox = false;
    % parse out varargin
    if nargin>2
        for n= 1:2:length(varargin)
            switch lower(varargin{n})
                case 'criteria'
                    crit = find( strncmp( varargin{ n + 1 },{ 'all', 'linear', 'non-linear', '', 'global' },length(varargin{ n + 1 }) ) )-1;
                    if crit==3
                        % no difference between one-stage and global now
                        crit=0;
                    end
                case 'boxcox'
                    doBoxcox= varargin{n+1};
            end
        end
    end
    % list of model classes
    pUD = xregGui.RunTimePointer;
    pUD.LinkToObject(figh);
    ud = ModelClasses(p.info,crit);
    ud.pointer = p;
    ud.figure = figh;

    SC = xregGui.SystemColorsDbl;
    ud.class = uicontrol('Parent',figh,...
        'Style','popupmenu',...
        'Tag', 'ModelClassesPopup',...
        'String',ud.DisplayName,...
        'Interruptible','off', ...
        'BackgroundColor', SC.WINDOW_BG, ...
        'Callback', {@i_classchng,pUD});
    classtxt = xregGui.labelcontrol('Parent', figh, ...
        'string', 'Model class:', ...
        'LabelSizeMode', 'absolute', ...
        'LabelSize', 70, ...
        'Gap', 0, ...
        'ControlSize', 150, ...
        'Control', ud.class);
    
    ud.boxcox = mbcgui.widget.Spinner('Parent',figh,...
        'Tag', 'boxcox',...
        'Min',-3,...
        'Max',3,...
        'ClickIncrement',0.5,...
        'Visible','off',...
        'Callback', {@i_boxcox,pUD});
    if doBoxcox
        boxcox = xregGui.labelcontrol('Parent', figh, ...
            'string', 'Box-Cox:', ...
            'LabelSizeMode', 'absolute', ...
            'LabelSize', 70, ...
            'Gap', 0, ...
            'ControlSize', 80, ...
            'Control', ud.boxcox);
    else
       boxcox =[];
    end
    
    
    divl = xregGui.dividerline(figh,'orientation','horizontal');
    crd = xregcardlayout(figh,'numcards',length(ud.Group));
    lyt = xreggridbaglayout(figh, ...
        'dimension',[3 3],...
        'rowsizes',[20 20 -1], ...
        'colsizes',[220 -1 150], ...
        'elements',{classtxt,divl,crd,...
        [],[],[],...,
        boxcox,[],[]}, ...
        'mergeblock',{[2 2],[1 3]},... 
        'mergeblock',{[3 3],[1 3]},... 
        'userdata', pUD);
    ud.cardsdone = false(1,length(ud.Group));
    ud.cards = crd;
    
else
    pUD = get(figh, 'UserData');
    ud = pUD.info;
end

ud=i_setvalues(ud);
pUD.info = ud;

%------------------------------------------------------------
%   SUBFUNCTION     i_setvalues
%------------------------------------------------------------
function ud = i_setvalues(ud)
% Decide which card to show
% Ask the gui_globalmodsetup which level it is operating at
cls = gui_globalmodsetup(ud.pointer.info,'getclasslevel');
val = find( strncmp( cls,ud.Group,length(cls) ) );
m= ud.pointer.info;
bc= get(m,'boxcox');
ud.boxcox.Value=bc;

set(ud.class,'Value',val);
if ~ud.cardsdone(val)
    % need to create card
    lyt = gui_globalmodsetup(ud.pointer.info,'layout',ud.figure,ud.pointer);
    attach(ud.cards,lyt,val);
    ud.cardsdone(val) = true;
else
    % update existing layout
    lyt = getcard(ud.cards,val);
    lyt = lyt{1};
    gui_globalmodsetup(ud.pointer.info,'layout',lyt,ud.pointer);
end
set(ud.cards,'currentcard',val);



%------------------------------------------------------------
%   SUBFUNCTION     i_classchng
%------------------------------------------------------------
function i_classchng(~, ~, pUD)
ud = pUD.info;
val = get(ud.class,'Value');
if val~=get(ud.cards,'currentcard')
    set(ud.figure,'Pointer','watch');
    %change needed
    m = ud.pointer.info;
    % try to create new model class
    try
        mnew = xregCreateModel(ud.fCreate{val},m);
    catch e
        dispstr = e.message;
        
        fig = errordlg(['Error creating model.  ' dispstr], ...
            'Model Creation Error', 'modal');
        waitfor(fig);
        % return to previous setting
        val = find( strncmp( class( m ),ud.Group,length(class( m )) ) );
        if isempty(val)
            brk = false;
            val = 0;
            while ~brk && val<=length(ud.Group)
                val = val+1;
                if isa(m,ud.Group{val})
                    brk = true;
                end
            end
            if val<1 || val>length(ud.Group)
                val = 1;
            end
        end
        set(ud.class,'Value',val);
        set(ud.figure,'Pointer','arrow');
        return
    end

    ud.pointer.info = mnew;

    % update options space
    if ~ud.cardsdone(val)
        % need to create card
        set(ud.cards, 'packstatus', 'off');
        lyt = gui_globalmodsetup(mnew,'layout',ud.figure,ud.pointer);
        attach(ud.cards,lyt,val);
        ud.cardsdone(val) = 1;
    else
        % update existing layout
        lyt = getcard(ud.cards,val);
        lyt = lyt{1};
        gui_globalmodsetup(mnew,'layout',lyt,ud.pointer);
    end
    set(ud.cards,'packstatus','on', 'currentcard',val);
    pUD.info = ud;
    set(ud.figure,'Pointer','arrow');

end

%--------------------------------------------------------------------------
function i_boxcox(~, ~, pUD)
ud = pUD.info;
m = ud.pointer.info;
bc= ud.boxcox.Value;
set(m,'boxcox',bc);
ud.pointer.info= m;