www.gusucode.com > mbcview 工具箱matlab源码程序 > mbcview/+cgcalsetup/NormalizerEditor.m
classdef NormalizerEditor < handle %NORMALIZEREDITOR component for editing normalizers for calibration setup % % obj = NormalizerEditor(fh,C,index); % Copyright 2009-2013 The MathWorks, Inc. and Ford Global Technologies, Inc. properties %Layout main layout for normalizer editor Layout %Index index for normalizer (1 or 2) Index = 1; %Data TableData object storage Data; %pNorm pointer to normalizer pNorm end properties (Access= protected) %hAxis popup control to select variable input hAxis %hNormalizer popup control to select normalizer (new or list of %existing normalizers) hNormalizer %hSize clickedit control for normalizer size hSize %hNormTable java table for normalizer editor hNormTable %hNormLabel label for normalizer name hNormLabel %hEditBreakpoints pushbutton to edit breakpoints by dialog hEditBreakpoints %Listeners storage for listeners Listeners end methods function obj = NormalizerEditor(fh,C,index) %NORMALIZEREDITOR constructor if index ==1 label = 'Y'; dimLabel = 'rows'; else label = 'X'; dimLabel = 'columns'; end obj.Data = C; obj.Index = index; jt1 = com.mathworks.toolbox.mbc.gui.peer.NormaliserTablePeer; obj.hNormTable = mbcwidgets.Table1D(jt1, ... 'Parent', fh, ... 'SelectionMode', 'MultiRegion'); obj.hNormLabel = mbcgui.widget.Label('Parent', fh, ... 'HorizontalAlignment', 'left'); obj.hSize = mbcgui.widget.Spinner('Parent', fh, ... 'Min', 2, ... 'Rule', 'int', ... 'Tag', sprintf('table%s',dimLabel), ... 'Callback', {@cbEditBPLength, obj}); obj.hEditBreakpoints = xregGui.iconuicontrol('Parent', fh, ... 'ImageFile', fullfile(cgrespath,'autospace.bmp'), ... 'ToolTipString', 'Edit breakpoints', ... 'TransparentColor', [255 255 0],... 'Tag', sprintf('%s-axis autospace',label), ... 'Callback', {@cbEditVectorDialog,obj}); hTableSize = xregGui.labelcontrol('Parent', fh, ... 'String', sprintf('Table %s:',dimLabel), ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 85, ... 'ControlSizeMode', 'absolute', ... 'ControlSize', 60, ... 'Gap', 5, ... 'Control',obj.hSize ); sizelyt = xreggridbaglayout(fh,... 'dimension',[1 2],... 'colsizes',[150 -1],... 'gapx',3,... 'border',[0 0 0 0],... 'elements',{hTableSize,obj.hEditBreakpoints }); SC = xregGui.SystemColorsDbl; obj.hAxis = uicontrol('Parent', fh, ... 'Style', 'Popupmenu', ... 'String', {''}, ... 'BackgroundColor', SC.WINDOW_BG, ... 'Tag', sprintf('%s-axis input',label), ... 'Callback', {@cbChangeAxisVariable,obj}); hAxisLabel = xregGui.labelcontrol('Parent', fh, ... 'String', sprintf('%s-axis input:',label), ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 85, ... 'ControlSizeMode', 'absolute', ... 'ControlSize', 115, ... 'Gap', 5, ... 'Control', obj.hAxis); obj.hNormalizer = uicontrol('Parent', fh, ... 'Style', 'Popupmenu', ... 'String', {''}, ... 'BackgroundColor', SC.WINDOW_BG, ... 'Tag', sprintf('%sNorm',label), ... 'Callback', {@cbExistingNorm,obj}); hNormalizerLabel = xregGui.labelcontrol('Parent', fh, ... 'String', 'Normalizer:', ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 85, ... 'ControlSizeMode', 'absolute', ... 'ControlSize', 115, ... 'Gap', 5, ... 'Control', obj.hNormalizer); % make a layout lyt = xreggridbaglayout(fh,... 'dimension',[5,1],... 'rowsizes',[20 20 20 15 -1],... 'gapy',3,... 'UserData',obj,... 'elements',{hAxisLabel,hNormalizerLabel,sizelyt,obj.hNormLabel,obj.hNormTable }); obj.Layout = lyt; obj.Listeners =createBPListener(obj); % initialize object initialize(obj); end function initialize(obj) %INITIALIZE initializer normalizer editor with current settings C = obj.Data; index = obj.Index; bp = C.BreakPoints{index}; pInput = C.pTableInputs(index); pTabInputs = C.TabInputList; % list possible model inputs available for normalizer inputs InpList = pveceval(pTabInputs,@getname); [~,loc]= ismember(pInput.getname,InpList); set(obj.hAxis,'String',InpList,'Value',loc); setTable(obj,bp); obj.hNormLabel.String = sprintf('%s normalizer:',pInput.getname); % list of normalizers in project with pInput as the input A = C.Project.getConnections; NormInd = find(A,'Type','Normalizer'); %there is always the ability to create a new normalizer NormNames = {'<New>'}; pNorms = A.pData(NormInd); Selected = false(size(pNorms)); for i= 1:length(pNorms) Selected(i) = ~C.UseOpPoints && getinputs(pNorms(i).info) == pInput; end obj.pNorm = pNorms(Selected); NormNames = [NormNames pveceval(obj.pNorm,@getname)]; if any(C.pNorm(obj.Index) == obj.pNorm) % selected normalizer SelNorm = find(C.pNorm(obj.Index) == obj.pNorm) + 1; else SelNorm = 1; end set(obj.hNormalizer,'String',NormNames,'Value',SelNorm); if C.UseOpPoints % disable editing when using operating points obj.hNormTable.Enable = 'off'; obj.hNormTable.Editable = false; obj.hSize.Enable = 'off'; set(obj.hNormalizer,'Enable','off'); set(obj.hEditBreakpoints,'Enable','off'); else EditNormState = mbconoff(SelNorm==1); obj.hSize.Enable = EditNormState; obj.hNormTable.Enable = EditNormState; obj.hNormTable.Editable = SelNorm==1; set(obj.hNormalizer,'Enable','on'); set(obj.hEditBreakpoints,'Enable',EditNormState); end end function enableListeners(obj,State) %enableListeners - remember to disable listeners when leaving %the normalizer page otherwise there will be strange side %effects % % enableListeners(obj,State) for i=1:length(obj.Listeners) if isa(obj.Listeners{i},'handle.listener') obj.Listeners{i}.Enabled = State; else obj.Listeners{i}.Enabled = strcmp(State,'on'); end end end function setTable(obj,bp) %setTable set normalizer data in java table % % setTable(obj,bp) set(obj.hSize,'Value',length(bp)); nrows = length(bp); obj.hNormTable.Peer.setNormaliserData([bp(:), (0:nrows-1)'], ... {'Input', 'Output'}, [], false); end end methods (Access=private) function L = createBPListener(obj) %CREATEBPLISTENER react to certain TableData changes % % TableInputs, UseOpPoints % These listeners enable the two normalizer editors to keep in % sync (for example, when switching the order of the % normalizers or reverting to UseOpPoints (set from main % NormalizerPage control). C= obj.Data; L = {handle.listener(obj.hNormTable, 'ValueChanged',{@cbEditBPs, obj}); event.proplistener(C, C.findprop('TableInputs'),'PostSet',@(h,evt) cbChangeOtherAxis(h,evt,obj))}; end end end function cbEditBPLength(~,~,obj) %CBEDITBPLENGTH callback for changing length of normalizer C = obj.Data; index = obj.Index; changeBreakpointSize(C,index,obj.hSize.Value) bp = C.BreakPoints{index}; % update normalizer table nrows = length(bp); obj.hNormTable.Peer.setNormaliserData([bp(:), (0:nrows-1)'], ... {'Input', 'Output'}, [], false); end function cbChangeAxisVariable(h,~,obj) %CBCHANGEAXISVARIABLE callback for changing axis variable C = obj.Data; index = obj.Index; loc = get(h,'Value'); if loc~=C.TableInputs(index) % reinitialize normalizer C.TableInputs(index) = loc; defineItems(C); initialize(obj) end end function cbChangeOtherAxis(~,evt,obj) %CBCHANGEAXIS swap other axis if necessary C = evt.AffectedObject; pInpList = C.TabInputList; pInput = C.pTableInputs(obj.Index); loc = get(obj.hAxis,'Value'); if loc> length(pInpList) || pInput ~= pInpList(loc) % update all normalizer controls initialize(obj) end end function cbExistingNorm(h,~,obj) %CBEXISTINGNORM use an existing normalizer NormInd = get(h,'Value')-1; C= obj.Data; if ~NormInd %enable controls to edit normalizer obj.hSize.Enable = 'on'; obj.hNormTable.Enable = 'on'; obj.hNormTable.Editable = true; C.pNorm(obj.Index) = xregpointer; else % set table from normalizer data C.BreakPoints{obj.Index} = get(obj.pNorm(NormInd).info,'breakpoints'); C.pNorm(obj.Index) = obj.pNorm(NormInd); setTable(obj,C.BreakPoints{obj.Index}); %disable editing obj.hSize.Enable = 'off'; obj.hNormTable.Enable = 'off'; obj.hNormTable.Editable = false; end end function cbEditBPs(~,evt,obj) %CBEDITBPS callback for editing normalizer C = obj.Data; index = obj.Index; data = evt.Data.NewValue; if isvector(data) % Get new breakpoints for setup thisbp = C.BreakPoints{index}; thisbp(evt.data.Rows) = data(:); % update breakpoints C.BreakPoints{index} = thisbp; end end function cbEditVectorDialog(~,~,obj) %cbEditVectorDialog edit breakpoint values via vector dialog C = obj.Data; index = obj.Index; bp = C.BreakPoints{index}; bp = bp(:)'; if isequal(linspace(bp(1),bp(end),length(bp)),bp) % equispaced points vectorEditor = com.mathworks.toolbox.mbc.gui.peer.VectorEditorDialogPeer(min(bp),max(bp),length(bp)); else %freeform vector vectorEditor = com.mathworks.toolbox.mbc.gui.peer.VectorEditorDialogPeer(bp); end hDlg = mbcwidgets.javawindow(vectorEditor); hDlg.setTitle(sprintf('Edit Breakpoints for %s',C.pTableInputs(index).getname)); hDlg.centerWindow( ancestor(obj.hNormalizer,'figure')); % set breakpoint mode so points are unique, increasing, and at least 2 points vectorEditor.setBreakpointMode(true); hDlg.blockingShow; if vectorEditor.getOK vals = javaMethodEDT('getNumericValue',vectorEditor); C.BreakPoints{index} = vals; initialize(obj); end end