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

    function varargout=gui_signalchooser(Inputs,Action,varargin)
%GUI_SIGNALCHOOSER GUI for selecting signals for factors
%
%  [LYT,p] = GUI_SIGNALCHOOSER(M, 'layout', FIG, PMODEL, data,StageSizes) creates a
%  layout that can be embedded in a wizard (xregwizard interface).

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

switch lower(Action)
    case 'layout'
        [lyt,p] = i_CreateLyt(varargin{:});
        % return pointer
        varargout= {lyt,p};
end




%--------------------------------------------------------------------------
function [mainFrame,p] = i_CreateLyt(fH,p,varargin)

if isa(fH,'xregcontainer')
    % Update an existing layout
    mainFrame = fH;
    pUD = get(mainFrame, 'UserData');
    ud = pUD.info;

    ud = iUserDataSetup(ud,p,varargin{:});
    
    ud = i_InitValues(ud);
    pUD.info = ud;
    return
end

SC = xregGui.SystemColorsDbl;
pUD = xregGui.RunTimePointer;

ud = iUserDataSetup(struct,p,varargin{:});

ud.List = mbcwidgets.List( 'Parent', fH,...
                'Editable', false, ...
                'Visible','off',...
                'SelectionChangedCallback',{@cbkSelectInput,pUD},...
                'SelectionMode', 'SingleRow');

% make the columns for the listview
Headers = {'Symbol','Signal Name'};
cwid = [50 100];
if length(ud.StageSizes)>1
    % add Stage column
    Headers = [Headers,{'Stage'}];
    cwid = [cwid,50];
end
ud.List.Peer.setColumnData(Headers);
ud.List.Peer.setColumnWidths(cwid);

% Make a title for this ListView
ud.MTitle = uicontrol('Parent',fH,...
    'Style','text',...
    'Visible','off',...
    'HorizontalAlignment','left',...
    'String','Model input factors:');

% Selection controls
ud.SelButton = xregGui.iconuicontrol('parent',fH,...
    'imageFile',[xregrespath,'\leftarrow.bmp'],...
    'transparentColor', [255 255 0],...
    'ToolTip','Select Data Signal',...
    'visible','off',...
    'callback',{@i_select, pUD, 'open'});

% listbox with all Names
ud.DTitle= uicontrol('Parent',fH,...
    'Style','text',...
    'Visible','off',...
    'HorizontalAlignment','left',...
    'String','All data signals:');
ud.namelist = uicontrol('Parent',fH,...
    'Style','listbox',...
    'Visible','off',...
    'Tag','Symlist2',...
    'BackgroundColor', SC.WINDOW_BG,...
    'String','',...
    'Callback',{@i_select,pUD});


% Model info pane
mframe = mbcgui.container.layoutpanel(...
    'Parent', fH,...
    'Visible', 'off', ...
    'Title','Selected input factor',...
    'BorderType', 'etchedin');
t1 = uicontrol('Parent',mframe,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'String','Units:');
ud.Units=uicontrol('Parent',mframe,...
    'Style','text',...
    'HorizontalAlignment','left');
t2 = uicontrol('Parent',mframe,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'String','Model range:');
ud.Mrange(1)= uicontrol('Parent',mframe,...
    'Style','text',...
    'HorizontalAlignment','left');
t3 = uicontrol('Parent',mframe,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'String','to');
ud.Mrange(2)= uicontrol('Parent',mframe,...
    'Style','text',...
    'HorizontalAlignment','left');

grd = xreggridbaglayout(mframe, ...
    'dimension', [2 4], ...
    'rowsizes', [15 15], ...
    'colsizes', [80 60 15 60], ...
    'gap', 5, ...
    'border', [10 10 10 5], ...
    'mergeblock', {[1 1], [2 4]}, ...
    'elements', {t1, t2, ud.Units, ud.Mrange(1), [], t3, [], ud.Mrange(2)});
set(mframe, 'LayoutComponent', {grd});

mgrid = xreggridbaglayout(fH, ...
    'dimension', [4 1], ...
    'rowsizes', [15 -1 0 65], ...
    'gapy', 2, ...
    'elements', {ud.MTitle, ud.List, [], mframe});

% Data info pane
dframe = mbcgui.container.layoutpanel(...
    'Parent', fH,...
    'Visible', 'off', ...
    'Title','Selected data signal',...
    'BorderType', 'etchedin');
t1 = uicontrol('Parent',dframe,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'String','Units:');
ud.DUnits = uicontrol('Parent',dframe,...
    'Style','text',...
    'HorizontalAlignment','left');
t2 = uicontrol('Parent',dframe,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'String','Data range:');
ud.Drange(1)= uicontrol('Parent',dframe,...
    'Style','text',...
    'HorizontalAlignment','left');
t3 = uicontrol('Parent',dframe,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'String','to');
ud.Drange(2)= uicontrol('Parent',dframe,...
    'Style','text',...
    'HorizontalAlignment','left');

grd = xreggridbaglayout(dframe, ...
    'dimension', [2 4], ...
    'rowsizes', [15 15], ...
    'colsizes', [80 60 15 60], ...
    'gap', 5, ...
    'border', [10 10 10 5], ...
    'mergeblock', {[1 1], [2 4]}, ...
    'elements', {t1, t2, ud.DUnits, ud.Drange(1), [], t3, [], ud.Drange(2)});
set(dframe, 'LayoutComponent', {grd});
dgrid = xreggridbaglayout(fH, ...
    'dimension', [4 1], ...
    'rowsizes', [15 -1 0 65], ...
    'gapy', 2, ...
    'elements', {ud.DTitle, ud.namelist, [], dframe});

mainFrame = xreggridbaglayout(fH,...
    'dimension',[4 3],...
    'gapy', 5, ...
    'gapx', 10, ...
    'rowsizes', [30 80 20 -1], ...
    'colsizes', [-1 80 -1], ...
    'mergeblock', {[1 4], [1 1]}, ...
    'mergeblock', {[1 4], [3 3]}, ...
    'elements', {mgrid, [], [], [], [], ud.SelButton, [], [], dgrid}, ...
    'userdata', pUD);

% make the first node selected in the List box

pUD.info = ud;
i_InitValues(ud);


function ud = iUserDataSetup(ud,p,data,StageSizes)

Inputs =  p.info;
if nargin<4
    StageSizes = length(Inputs);
end
Inputs = ChannelMatch(Inputs,data);
p.info = Inputs;
ud.Data = data;
ud.pointer = p;
ud.StageSizes = StageSizes;
    
%--------------------------------------------------------------------------
function ud = i_InitValues(ud)

Inputs = ud.pointer.info;
Stage=1;
StageSizes= cumsum(ud.StageSizes);
if length(ud.StageSizes)>1
    Data = cell(length(Inputs),3);
else
    Data = cell(length(Inputs),2);
end
for i=1:length(Inputs)
    Data(i,1:2) = {Inputs(i).Symbol,Inputs(i).Name};
    if length(StageSizes)>1
        if i>StageSizes(Stage);
            Stage= Stage+1;
        end
        Data{i,3} = Stage;
    end
end
ud.List.Peer.setData(Data);
i_setValues(ud,1);
ud.List.selectRows(1);



%--------------------------------------------------------------------------
function i_setValues(ud,Ind)

Inputs = ud.pointer.info;
CurrentInput = Inputs(Ind);

DataList= ud.Data;
AllNames= get(DataList,'Name');

mind= find(strcmp(CurrentInput.Name,AllNames));
set(ud.namelist,...
    'String',AllNames,...
    'Value',mind,....
    'ListboxTop',max(mind-5,1));

Bnds= CurrentInput.Range;
set(ud.Mrange(1),'String',num2str(Bnds(1)) );
set(ud.Mrange(2),'String',num2str(Bnds(2)) );

muc= CurrentInput.Units;
set(ud.Units,'String',char(muc))

DataList= DataList(:,mind);
i_showDataRanges(ud,DataList);

%--------------------------------------------------------------------------
function i_showDataRanges(ud,d)

uc= get(d,'Units');
uc= uc{1};
set(ud.DUnits,'String',char(uc))
d= double(d);
minD= min(d);
maxD= max(d);
set(ud.Drange(1),'String',minD,'UserData',minD);
set(ud.Drange(2),'String',maxD,'UserData',maxD);


%--------------------------------------------------------------------------
function [d,DataList]= i_GetData(ud)

DataList= ud.Data;

dind= get(ud.namelist,'Value');
if dind>size(DataList,2);
    dind=1;
end
d= DataList(:,dind);

%--------------------------------------------------------------------------
function i_select(h,~,pUD,mode)

if nargin<4
    mode = get(get(h, 'Parent'),'SelectionType');
end
Next = strcmp(mode,'open');

% get the info we need whatever mode we are in
ud = pUD.info;
Inputs = ud.pointer.info;

switch mode
    case 'normal'
        % data ranges
        d= i_GetData(ud);
        i_showDataRanges(ud,d);
    case 'open'

        % get handles
        curInd =ud.List.getSelectedRows;
        if isempty(curInd)
            % don't do anything if no row selected
            errordlg('You must select an input before selecting a signal.',...
                'Input Selection','modal');
            return
        end
        curlst=ud.namelist;

        % get the variable name to change
        AllNames=get(curlst,'String');
        Ind= get(curlst,'Value');
        curName=AllNames{Ind};

        % set the target name to be curname
        ud.List.Peer.setDataAt(curName,curInd-1,1);

        % Get the number of nodes
        N= length(Inputs);
        
        CurrentInput = Inputs(curInd);
        d= i_GetData(ud);
        name = get(d,'Name');
        units = get(d,'Units');
        CurrentInput.Name = name{1};
        % update model input names
        CurrentInput.Units = units{1};
        Inputs(curInd) = CurrentInput;
        ud.pointer.info  = Inputs;

        pUD.info = ud;

        if Next
            newInd = curInd+1;
            if newInd>N
                newInd=1;
            end
            ud.List.selectRows(newInd);
        else
            newInd=curInd;
        end

        i_setValues(ud,newInd);
end




function cbkSelectInput(~,~,pUD)
       
ud = pUD.info;
ind =ud.List.getSelectedRows;
if ~isempty(ind)
    i_setValues(ud,ind);
end