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');