www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/+mbcmodelview/+global/ModelActions.m
classdef ModelActions < handle %ModelActions Model menu actions % Copyright 2005-2016 The MathWorks, Inc. and Ford Global Technologies, Inc. properties (SetAccess=private) %ModelEdit model setup dialog ModelEdit %NewAlternative new alternative model NewAlternative %Reset reset model to test plan model Reset %SummaryStatistics open summary statistics dialog SummaryStatistics %Evaluate evaluate menu (has submenus) Evaluate %BoxCox Box-Cox transforms BoxCox %Utilities utilties (dynamic group) for model-specific actions Utilities %MakeTemplate make a template from sub models MakeTemplate %BuildModels create alternative models BuildModels %SelectModel open model selection figure SelectModel %AssignBest assign current model as best AssignBest %DeleteAlternatives delete alternative models DeleteAlternatives end properties(Access=private) %MessageService MessageService handle MessageService %ModelEditGroup model edit group ModelEditGroup %ModelSelection model selection group ModelSelection end methods function obj = ModelActions(MessageService) %GlobalModel constructor obj.MessageService = MessageService; obj.ModelEdit = mbcgui.actions.StatefulAction(@obj.onEdit,... '&Edit Model...','Edit model definition',xregrespath('gloreg.bmp')); obj.ModelEdit.TransparentColor = [255 0 255]; obj.NewAlternative = mbcgui.actions.StatefulAction(@obj.onNewAlternative,... '&Add Model...','Add alternative model',xregrespath('newglobalmod.bmp')); obj.Reset = mbcgui.actions.StatefulAction(@obj.onReset,... '&Reset','Reset model to test plan default',[]); obj.SummaryStatistics = mbcgui.actions.StatefulAction(@obj.onSummaryStats,... 'Summar&y Statistics...','Define summary statistics',[]); obj.BoxCox = mbcgui.actions.StatefulAction(@obj.onBoxCox,... '&Box-Cox Transform...','Define Box-Cox transform',xregrespath('boxcox.bmp')); % Model evaluation options obj.Evaluate = mbcgui.actions.ActionGroup('',... '&Evaluate','Evaluate current model response',[]); obj.Evaluate.MenuType = 'submenu'; obj.Evaluate.Actions = [mbcgui.actions.StatefulAction(@obj.onEvaluateFitData,'&Fit Data...') mbcgui.actions.StatefulAction(@obj.onEvaluateValData,'&Validation Data...') mbcgui.actions.StatefulAction(@obj.onEvaluateNoData,'&No Data...') mbcgui.actions.StatefulAction(@obj.onEvaluateOtherData,'&Other Data...')]; % model specific utilities obj.Utilities = mbcgui.actions.DynamicActionGroup([],... '&Utilities','Model specific functions',[]); obj.Utilities.MenuType = 'submenu'; obj.ModelEditGroup = mbcgui.actions.ActionGroup([],'Model Edit'); obj.ModelEditGroup.Actions = [obj.ModelEdit,obj.Reset,obj.SummaryStatistics,obj.BoxCox,obj.Evaluate]; obj.ModelEditGroup.MenuType = 'separate'; % model selection actions obj.MakeTemplate= mbcgui.actions.StatefulAction(@obj.onMakeTemplate,... 'Create &Template...','Create model template',[]); obj.BuildModels= mbcgui.actions.StatefulAction(@obj.onBuildModels,... '&Create Alternatives...','Create alternative models',xregrespath('buildModels.bmp')); obj.BuildModels.TransparentColor = [0 255 0]; obj.SelectModel= mbcgui.actions.StatefulAction(@obj.onSelectModel,... 'Selection &Window...','Model selection window...',[]); obj.AssignBest= mbcgui.actions.StatefulAction(@obj.onAssignBest,... '&Assign Best','Assign current model to best',xregrespath('best_gloreg.bmp')); obj.AssignBest.TransparentColor = [255 0 255]; obj.ModelSelection = mbcgui.actions.ActionGroup([],'Model Selection','Model selection functions',[]); obj.ModelSelection.Actions = [obj.MakeTemplate,obj.BuildModels,obj.SelectModel,obj.AssignBest]; obj.ModelSelection.MenuType = 'separate'; obj.DeleteAlternatives = mbcgui.actions.StatefulAction(@obj.onDeleteAlternatives,... '&Delete Alternatives','Delete alternatives',xregrespath('dataimport_struct_notok.bmp')); end function createMenus(obj,Parent) %createMenus create model menus from actions hMenu = createMenuItem(obj.ModelEditGroup,Parent); set(hMenu(1),'Accelerator','M'); set(hMenu(:),{'Tag'},{'setup','reset','stats','Ytranstool','evaluate','fitdata','valdata','nodata','otherdata'}'); createMenuItem(obj.Utilities,Parent); hMenu = createMenuItem(obj.ModelSelection,Parent); set(hMenu(:),{'Tag'},{'template','build','select','assignBest'}'); end function createUtilityFunctions(obj,hToolbar) %createUtilityFunctions create model specific utilities from actions % get actions for model actions = modelactions(obj.MessageService.ModelDev,obj.MessageService); % Changing actions for a DynamicActionGroup causes menus to be % updated if ~isempty(actions) % make an action group with a separator at the beginning AG =mbcgui.actions.ActionGroup('','Utilities'); AG.Actions = actions; AG.MenuType = 'separate'; if ~obj.MessageService.Status % disable utility actions if not fitted AG.Enabled = false; end else AG = actions; end obj.Utilities.Actions = AG; % have to create toolbar items explicitly createToolbutton(obj.Utilities,hToolbar); end function createWorkflowItems(obj,hWorkflow) %createWorkflowItems create workflow items in workflow panel AG = mbcgui.actions.ActionGroup([],'Workflow'); % could have New Model as well AG.Actions = [obj.ModelEdit,obj.NewAlternative,obj.BuildModels,obj.DeleteAlternatives]; AG.MenuType = 'separate'; createWorkflowItems(AG,hWorkflow); end function enable(obj) %enable enable actions based on state of MessageService ms = obj.MessageService; if isa(ms.ModelDev,'mdevmlerf') % MLE model node set(obj.ModelEditGroup,'Enabled',false); set(obj.ModelSelection,'Enabled',false); obj.NewAlternative.Enabled = false; obj.Evaluate.Enabled = true; obj.Utilities.Enabled = true; obj.DeleteAlternatives.Enabled = ms.CurrentNode.numChildren>0; else set(obj.ModelEditGroup,'Enabled',true); set(obj.ModelSelection,'Enabled',true); obj.NewAlternative.Enabled = true; % Turn on actions depending on whether model is fitted StatusActions = [obj.Reset,obj.SummaryStatistics,obj.BoxCox,obj.Evaluate,obj.Utilities,obj.AssignBest]; set(StatusActions,'Enabled',ms.Status~=0) obj.BoxCox.Enabled = ms.Status~=0 && (islinear(ms.Model) && ~isa(ms.Model,'xregunispline')); par = Parent(ms.ModelDev); obj.AssignBest.Enabled = (strcmp(par.class,'modeldev') && hasBest(ms.ModelDev) && ms.Status~=0); % require children to select model or make a template HasKidsActions = [obj.MakeTemplate, obj.SelectModel]; if ms.CurrentNode.numChildren>0 set(HasKidsActions,'Enabled',true); else set(HasKidsActions,'Enabled',false); end % can clean up if there are alternatives and a best model is % assigned obj.DeleteAlternatives.Enabled = ms.CurrentNode.numChildren>0 && ms.CurrentNode.hasBest; end % Evaluate with validation data obj.Evaluate.Actions(2).Enabled = ms.Status~=0 && ~isempty(ms.ValidationXData); end end methods(Access=private) function onEdit(obj,~,~) %onSetup setup model definition ms = obj.MessageService; if ms.closeSubFigures % have to close sub figures to set up a new model OldModel= reset(model(ms.ModelDev)); % open dialog [NewModel,OK] = gui_ModelSetup(OldModel,'boxcox',true); if OK && ~isequal(NewModel,OldModel) % only need to update model if OK pressed and model is % different busy(ms); setupModel(ms,NewModel); idle(ms); end end end function onNewAlternative(obj,~,~) %onNewAlternative create a new alternative ms = obj.MessageService; busy(ms) if ms.NumChildren==0 % make a copy of current model pCopy = modeldev(ms.Model,ms.CurrentNode,false,false); copyCreated = true; else copyCreated = false; end % create a new model with dialog pNew= modeldev(ms.Model,ms.CurrentNode,true); if ~isnull(pNew) if isBrowserProject(ms.ModelDev) % update tree if copyCreated treeview(MBrowser,info(pCopy),'add') end treeview(MBrowser,info(pNew),'add') end % select new node selectAlternative(ms,ms.NumChildren) elseif copyCreated % delete copy if user cancelled delete(info(pCopy)); end idle(ms); end function onReset(obj,~,~) %onReset reset model to default model for test plan resp = questdlg('The model will be reset to the default model definition for the test plan and all data will be restored. Do you want to continue?',... 'Reset Model','Yes','No','Yes'); if strcmp(resp,'Yes') ms = obj.MessageService; ResetModel(ms.ModelDev); update(ms); end end function onSummaryStats(obj,~,~) %onSummaryStats setup summary statistics for model and children ms = obj.MessageService; % apply to top level modeldev mdev= info(ms.CurrentNode); if ms.Status [m,OK]= gui_SummaryStats(ms.Model); if OK List=StatsList(m); % update the model statistics mdev= addSummaryStats(mdev,List); children(mdev,@addSummaryStats,List); % view the updated node update(ms) end end end function onBoxCox(obj,~,~) % Box-Cox GUI is modal ms = obj.MessageService; xregMdlGui.boxcox(ms.Pointer,@ms.update); end function onMakeTemplate(obj,~,~) % make a model template [fname,pth] = uiputfile(mbcGetPath('mbcmodel', 'Designs', '*.mbm'),'Model Template'); if isnumeric(fname) return end [p,f,~] = fileparts(fullfile(pth,fname)); fname = fullfile(p,[f,'.mbm']); ms = obj.MessageService; mlist = children(info(ms.CurrentNode),@model); %#ok<NASGU> save('-mat', fname, 'mlist'); end function onBuildModels(obj,~,~) %create alternative models if closeSubFigures(obj.MessageService) buildModels(obj.MessageService); end end function onSelectModel(obj,~,~) % open model selection figure msg = selectModelFigure(obj.MessageService); if ~isempty(msg) errordlg(msg,'Model Selection','modal'); end end function onAssignBest(obj,~,~) % assign current model to best assignBest(obj.MessageService); end % evaluate callbacks function onEvaluateFitData(obj,~,~) evaluateFitData(obj.MessageService); end function onEvaluateValData(obj,~,~) evaluateValData(obj.MessageService); end function onEvaluateNoData(obj,~,~) evaluateNoData(obj.MessageService); end function onEvaluateOtherData(obj,~,~) evaluateOtherData(obj.MessageService); end function onDeleteAlternatives(obj,~,~) %onDeleteAlternatives delete alternative models ms = obj.MessageService; if ms.closeSubFigures % close any sub figures before performing this task resp= questdlg('Where best models have been selected all sub-models will be deleted. Do you want to continue?','Clean-up Tree','Yes','No','Yes'); if strcmp(resp,'Yes') % delete all alternatives and select the root node pCurrentNode = ms.CurrentNode; InBrowser = isBrowserProject(info(pCurrentNode)); if ~InBrowser || SelectNode(MBrowser,xregpointer); % delete all alternatives and select the root node tidytree(info(pCurrentNode)); end if InBrowser SelectNode(MBrowser,pCurrentNode); end end end end end end