www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@xregmulti/gui_globalmodsetup.m
function [m,ok]=gui_globalmodsetup(m,action,varargin) %GUI_GLOBALMODSETUP GUI for altering xregmulti settings % % [M,OK]=GUI_GLOBALMODSETUP(M) creates a blocking GUI for choosing the % subclass of xreglinear and altering its settings. OK indicates whether % the user pressed 'OK' or 'Cancel'. % % LYT=GUI_GLOBALMODSETUP(M,'layout',FIG,P) creates a layout in figure FIG, % using the dynamic copy of a model in P. % Copyright 2000-2011 The MathWorks, Inc. and Ford Global Technologies, Inc. if nargin<2 action='figure'; end switch lower(action) case 'figure' [m,ok] = gui_ModelDialog(m,'Multiple Model Setup', varargin{:}); case 'layout' ok=1; m=i_createlyt(varargin{:}); case 'getclasslevel' m=mfilename('class'); case 'finalise' % Nothing to do for this class. otherwise error(message('mbc:xregmulti:InvalidArgument')); end function lyt = i_createlyt(figh,p, varargin) if ~isa(figh,'xregcontainer') % Parse out optional arguments ud.ModelEditFcn = @gui_globalsetup; ud.EditWeights = true; ud.ShowWeights = true; for n = 1:2:length(varargin) switch lower(varargin{n}) case 'modeleditfcn' ud.ModelEditFcn = varargin{n+1}; case 'allowweightediting' ud.EditWeights = varargin{n+1}; case 'showweights' ud.ShowWeights = varargin{n+1}; end end ud.pointer=p; ud.figure=figh; modelFrame = mbcgui.container.layoutpanel(... 'Parent', figh, ... 'Visible', 'off'); ud.add = uicontrol('Parent',modelFrame,... 'Style','pushbutton',... 'Position',[0 0 80 25],... 'String','Add...', ... 'Tag', 'xregmultiUserData'); ud.editmod = uicontrol('Parent',modelFrame,... 'Style','pushbutton',... 'Position',[0 0 80 25],... 'String','Edit Model...'); ud.delete = uicontrol('Parent',modelFrame,... 'Style','pushbutton',... 'Position',[0 0 80 25],... 'String','Delete'); ud.list = uicontrol('Parent',modelFrame,... 'Style','listbox',... 'BackgroundColor','w'); grd = xreggridbaglayout(modelFrame, ... 'packstatus', 'off', ... 'dimension', [4 2], ... 'rowsizes', [25 25 25 -1], ... 'colsizes', [-1 80], ... 'gapx', 20, ... 'gapy', 10, ... 'mergeblock', {[1 4], [1 1]}, ... 'elements', {ud.list, [], [], [], ud.add, ud.editmod, ud.delete}); set(modelFrame, 'LayoutComponent', {grd}); lyt = modelFrame; udh=ud.add; % callbacks set(ud.list,'Callback',{@i_modelsel, udh}); set(ud.add,'Callback',{@i_add, udh}); set(ud.editmod,'Callback',{@i_edit, udh}); set(ud.delete,'Callback',{@i_deletemodel, udh}); if ud.ShowWeights set(modelFrame, ... 'BorderType', 'etchedin', ... 'Title', 'Models'); set(modelFrame, ... 'LayoutBorder', [10 10 10 5]); optsFrame = mbcgui.container.layoutpanel(... 'Parent', figh, ... 'Visible', 'off', ... 'Title', 'Options', ... 'BorderType', 'etchedin'); ud.weighttxt = uicontrol('Parent',optsFrame,... 'Style','text',... 'HorizontalAlignment','left',... 'String','Weighting factor for ',... 'Position',[0 0 300 30]); ud.weightedt = mbcgui.widget.Spinner('Parent', optsFrame,... 'Position',[0 0 85 20],... 'Min',0,... 'Max',1,... 'ClickIncrement',.1); ud.primetxt = uicontrol('Parent',optsFrame,... 'Style','text',... 'HorizontalAlignment','left',... 'String','Primary model: ',... 'Position',[0 0 300 30]); ud.primepush = uicontrol('Parent',optsFrame,... 'Style','pushbutton',... 'Position',[0 0 85 25],... 'String','Use Selected'); set(ud.weightedt,'Callback',{@i_weightchng, udh}); set(ud.primepush,'Callback',{@i_selectmodel, udh}); flw2=xregflowlayout(optsFrame,'orientation','left/center',... 'elements',{ud.weighttxt,ud.weightedt},'gap',10,'border',[-10 0 0 0]); flw3=xregflowlayout(optsFrame,'orientation','left/center',... 'elements',{ud.primetxt,ud.primepush},'gap',10,'border',[-10 0 0 0]); grd=xreggridbaglayout(optsFrame,... 'dimension',[2 1],... 'border', [10 10 10 5], ... 'elements',{flw2,flw3}); set(optsFrame, 'LayoutComponent', {grd}); lyt = xreggridbaglayout(figh, ... 'dimension', [2 1], ... 'rowsizes', [-1 100], ... 'gapy', 10, ... 'elements', {modelFrame, optsFrame}); end else % find the userdata button lyt=figh; udh = findobj(get(lyt, 'Parent'), 'Tag', 'xregmultiUserData'); ud=get(udh,'UserData'); ud.pointer=p; end ud=i_setvalues(ud); set(udh,'UserData',ud); function ud=i_setvalues(ud) m=ud.pointer.info; % populate listbox with model descriptions mdls = get(m,'models'); ud.weights = get(m,'weights'); nmdls=length(mdls); str=cell(nmdls,1); for n=1:nmdls; str(n)={sprintf(['(%d) ' str_func(mdls{n},0)],n)}; end % save base model strings for faster updating after a weight change ud.strs = str; if ud.ShowWeights % add weights for n=1:nmdls str(n) = {[str{n} sprintf(' Weight: %.3f',ud.weights(n))]}; end % set primary model text set(ud.primetxt,'String',['Primary model:' char(10) ud.strs{get(m,'currentindex')}]); % set weight text and weight value set(ud.weighttxt,'String',['Weighting factor for model: ' char(10) ud.strs{1} ' :']); set(ud.weightedt,'Value',ud.weights(1)); end set(ud.list,'String',str,'Value',1); % set enable status of delete button if nmdls==1 set(ud.delete,'Enable','off'); end function i_weightchng(srcobj,evt,udh) ud=get(udh,'UserData'); val=get(ud.weightedt, 'Value'); selval=get(ud.list,'Value'); nmdls=length(ud.weights); if nmdls==1 % can't change weight! set(ud.weightedt,'Value',1); else ud.weights(selval) = val; m=ud.pointer.info; m = set(m,'weights',ud.weights); % get sorted out weights %ud.weights = get(m,'weights'); str=get(ud.list,'String'); % Alter list box str(selval) = {[ud.strs{selval} sprintf(' Weight: %.3f',ud.weights(selval))]}; set(ud.list,'String',str); ud.pointer.info = m; set(udh,'UserData',ud); end function i_modelsel(srcobj,evt,udh) ud = get(udh,'UserData'); if ud.ShowWeights selval=get(ud.list,'Value'); % update weight text set(ud.weighttxt,'String',['Weighting factor for model:' char(10) ud.strs{selval} ' :']); set(ud.weightedt,'Value',ud.weights(selval)); end function i_selectmodel(srcobj,evt,udh) ud=get(udh,'UserData'); selval=get(ud.list,'Value'); m=ud.pointer.info; set(m,'currentindex',selval); if ud.ShowWeights set(ud.primetxt,'String',['Primary model: ' char(10) ud.strs{selval}]); end ud.pointer.info=m; function i_deletemodel(srcobj,evt,udh) ud=get(udh,'UserData'); selval=get(ud.list,'Value'); ud.strs(selval)=[]; m=ud.pointer.info; if length(m.models)>1 m=remove(m,selval); if ud.ShowWeights ud.weights = get(m,'weights'); end % rebuild listbox string mdls=get(m,'models'); nmdls=length(mdls); str=cell(nmdls,1); for n=1:nmdls; str(n)={sprintf(['(%d) ' str_func(mdls{n},0)],n)}; end ud.strs=str; if selval>length(str) newselval=length(str); else newselval=selval; end if ud.ShowWeights % Alter list box fpr weights for i=1:length(ud.weights) str(i) = {[str{i} sprintf(' Weight: %.3f',ud.weights(i))]}; end % alter weight set(ud.weighttxt,'String',['Weighting factor for model:' char(10) ud.strs{newselval} ' :']); set(ud.weightedt,'Value',ud.weights(newselval)); % alter primary prime=get(m,'currentindex'); set(ud.primetxt,'String',['Primary model: ' char(10) ud.strs{prime}]); end set(ud.list,'String',str,'Value',newselval); % check enable status of delete if length(m.models)==1 set(ud.delete,'Enable','off'); end set(udh,'UserData',ud); ud.pointer.info=m; end function i_add(srcobj,evt,udh) ud=get(udh,'UserData'); set(ud.figure,'Pointer','watch'); m=ud.pointer.info; % add a default model m=add(m); mdls=get(m,'models'); [newm,ok] = feval(ud.ModelEditFcn, mdls{end}); if ok mdls(end)={newm}; set(m,'models',mdls); ud.strs(end+1)={sprintf(['(%d) ' str_func(mdls{end},0)],length(mdls))}; str=ud.strs; if ud.ShowWeights ud.weights = get(m,'weights'); % Alter list box for i=1:length(mdls) str(i) = {[str{i} sprintf(' Weight: %.3f',ud.weights(i))]}; end % reset weight box selval=get(ud.list,'Value'); set(ud.weightedt,'Value',ud.weights(selval)); end set(ud.list,'String',str); % enable delete set(ud.delete,'Enable','on'); ud.pointer.info=m; set(udh,'UserData',ud); end set(ud.figure,'Pointer','arrow'); function i_edit(srcobj,evt,udh) ud=get(udh,'UserData'); set(ud.figure,'Pointer','watch'); selval=get(ud.list,'Value'); m=ud.pointer.info; mdls = get(m,'models'); [newm,ok] = feval(ud.ModelEditFcn, mdls{selval}); if ok mdls(selval)={newm}; set(m,'models',mdls); ud.strs(selval)={sprintf(['(%d) ' str_func(mdls{selval},0)],selval)}; str=get(ud.list,'String'); if ud.ShowWeights str(selval) = {[ud.strs{selval} sprintf(' Weight: %.3f',ud.weights(selval))]}; set(ud.weighttxt,'String',['Weighting factor for model:' char(10) ud.strs{selval} ' :']); if selval==get(m,'currentindex') set(ud.primetxt,'String',['Primary model: ' char(10) ud.strs{selval}]); end else str(selval) = ud.strs(selval); end set(ud.list,'String',str); ud.pointer.info=m; set(udh,'UserData',ud); end set(ud.figure,'Pointer','arrow');