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