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;