Mercurial > hg > ltpda
diff m-toolbox/m/gui/gltpda/pan2param.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/m/gui/gltpda/pan2param.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,604 @@ +function pan2param(varargin) +% This is the GUI m-file able to read the list of parameters to be set for +% the function/block currently selected and to build the window with the +% parameters panel accordingly. +% +% $Id: pan2param.m,v 1.64 2009/02/01 17:20:04 nicola Exp $ + +global oldparams params paramEnabled oldparamEnabled paramSets currPanel +global LTPDAinvar selBlocks objName noParamsReq functionName guiFontSize %#ok<NUSED> + +%% + +currPanel = varargin{1}; +panelDimens = get(currPanel, 'Position'); +backColor = get(currPanel, 'BackgroundColor'); +selBlocks = 0; +set(gcf,'NextPlot','new'); + GUIprefs = getappdata(0, 'GUIpreferences'); + if ~isfield(GUIprefs,'CAD'), GUIprefs.CAD = 0; end + if ~isfield(GUIprefs,'Copied'), GUIprefs.Copied = 0; end + if ~isfield(GUIprefs,'Detach'), GUIprefs.Detach = 0; end + setappdata(0, 'GUIpreferences',GUIprefs); + +guiFontSize = getappdata(0, 'ltpda_gui_fontsize'); +if isempty(guiFontSize), guiFontSize = 10; setappdata(0, 'ltpda_gui_fontsize',10); end +set(gcf,'NextPlot','new') +alltimers = timerfindall; + stop(alltimers(1)); + set(alltimers(1),'TimerFcn',@g_ContinuousParamCheck,'Period',0.3); + start(alltimers(1)); + + +%% + %---------------------------------------------------------------------- + function buildplistFigureParam(varargin) + %---------------------------------------------------------------------- + panelDimens = get(currPanel, 'Position'); + lineSpacing = 25 * guiFontSize/10; + setappdata(0,'ltpda_gui_LineSpacing',lineSpacing); + if ~isempty(findobj(gcf,'Tag','apply')) + notredrawn = 0; undoStatus = get(findobj(gcf,'Tag','undo'),'enable'); + % deletes only the dynamical part of the panel: + for i = 1:numel(objName), try delete(objName{i}); catch, end; end + delete(findobj('Parent',currPanel,'TooltipString','Remove this parameter')) + else + notredrawn = 1; undoStatus = 'off'; + % deletes all, to redraw the entire panel: + delete(findobj(gcf,'Parent',currPanel)); + end + objName = []; + close(findobj('Tag','expandedEditField')) +if notredrawn % Executes the STATIC part too only if it's not just an update of the panel + +% ========================================================================= +% ========================================================================= +% ========================== Build STATIC panel =========================== +% ========================================================================= +% ========================================================================= + +% ------------------------------------------------------------------------- +% Retrieve the parameters: +% ------------------------------------------------------------------------- + if isempty(oldparams) && isempty(params) % the user has just selected another block + paramcommand = get_param(gcbh,'Description'); + noParamsReq=0; + if isempty(paramcommand) + paramcommand = g_RetrievePlist(); + selBlocks = utils.prog.gcbsh; + for kk=1:length(selBlocks) + set_param(selBlocks(kk),'Description',paramcommand); + end + end + eval(paramcommand) + if ~isempty(oldparams), params = oldparams; end + oldparamEnabled = paramEnabled; + end + + if ~exist('paramEnabled','var') && isempty(find(params,'Sets')) && noParamsReq==0 + paramEnabled = zeros(1,nparams(params)); + oldparamEnabled = paramEnabled; + end + childpath = find_system(gcbh,'LookUnderMasks','all','BlockType','M-S-Function'); + setappdata(0,'ltpda_currFunctionName',get_param(childpath,'Tag')); + + y = nparams(params); + + if y==0 && ~exist('paramSets','var') && noParamsReq==0 + paramcommand=[paramcommand,'noParamsReq=1;']; + selBlocks = utils.prog.gcbsh; + for kk=1:length(selBlocks), set_param(selBlocks(kk),'Description',paramcommand); end + buildplistFigureParam([],[],get(findobj('Tag','paramsPage'),'UserData')) + end + +% ------------------------------------------------------------------------- +% Fixed buttons: +% ------------------------------------------------------------------------- +% Help Button + uicontrol('Parent',currPanel,'Units','pixels','HorizontalAlignment','center','Position',[20 10 45 guiFontSize*16/10],'FontAngle','italic','FontSize',guiFontSize,'String','?','TooltipString','Open the Help associated to this function','Visible','on','Callback',@g_HelpButtonCallback,'Style','pushbutton'); +% Reset Parameters Button + uicontrol('Parent',currPanel,'Units','pixels','HorizontalAlignment','center','Position',[75 10 75 guiFontSize*16/10],'FontAngle','italic','FontSize',guiFontSize,'String','Reset','TooltipString','Reset the parameters for this block','Visible','on','Callback',@g_ResetButtonCallback,'Style','pushbutton'); +% 'Set name' checkbox: + setName = get(gcbh,'UserData'); + if isempty(setName), setName = 0; end + uicontrol('Parent',currPanel,'Units','pixels','BackgroundColor',backColor,'HorizontalAlignment','left','Position',[170 10 140 guiFontSize*16/10],'FontAngle','italic','FontSize',guiFontSize-2,'String','Set name','TooltipString','Set the signal name equal to the block name','Visible','on','Callback',@g_SetNameCallback,'Value',setName,'Style','checkbox'); +% Keep local result + probe = get_param(gcbh,'MaskHelp'); + if ~isempty(probe) && isa(probe,'char') && strcmp(probe,'probe'), keepRes = 1; else keepRes = 0; end + uicontrol('Parent',currPanel,'Units','pixels','BackgroundColor',backColor,'HorizontalAlignment','left','Position',[250 10 220 guiFontSize*16/10],'FontAngle','italic','FontSize',guiFontSize-2,'String','Keep local result','TooltipString','Do not delete the result of this block at the end of the analysis calculation','Visible','on','Callback',@g_KeepResultCallback,'Value',keepRes,'Style','checkbox'); +% Number of data inputs: + uicontrol('Parent',currPanel,'TooltipString','Set the number of input expected by this block','BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','right','Position',[370 5 70 guiFontSize*20/10],'String','Inputs: ','FontAngle','italic','FontSize',guiFontSize-2,'Visible','on','Style','text'); + paramFromSimulink = 0; + for ii=1:y + paramkeys{ii} = params.params(ii).key; + paramvals{ii} = params.params(ii).val; + if isa(paramvals{ii},'char') && numel(paramvals{ii})>2 && strcmp(paramvals{ii},'-->'), paramFromSimulink = paramFromSimulink + 1; end + end + inports = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','Inport'); + uicontrol('Parent',currPanel,'TooltipString','Set the number of input expected by this block','BackgroundColor',backColor,'Units','pixels','Position',[450 8 40 guiFontSize*20/10],'String',num2str(numel(inports)-paramFromSimulink),'FontSize',guiFontSize,'Visible','on','Enable','on','UserData',numel(inports)-paramFromSimulink,'Callback',@g_numberDataInput,'Tag','numbDataInputs','Style','edit'); + +% The function has different sets of parameters: + if exist('paramSets','var') && ~isempty(paramSets) + sets = find(paramSets,'sets'); + currSet = find(paramSets,'currSet'); + % Sets popup menu: + uicontrol('Parent',currPanel,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[40 panelDimens(4)-30 250 20],'String',sets,'Value',currSet,'Visible','on','UserData',sets,'Callback',@g_SetsUpdate,'Style','popup'); + panelDimens(4) = panelDimens(4)-20; + end + +% ------------------------------------------------------------------------- +% Button to add user-defined params: +% ------------------------------------------------------------------------- + paramTypes = {'double/char','specwin','pzmodel','-->'}; + for kk=1:y, paramTypes(strmatch(class(params.params(kk).val),paramTypes,'exact'))=[]; end + paramTypes = [paramTypes(1:end-1),{'pz','unit'},paramTypes(end)]; +% ParamType popup + hparamType = uicontrol('Parent',currPanel,'Tag','addparamspopup','TooltipString','Add a user-defined parameter','BackgroundColor',backColor,'Units','pixels','Position',[20 40 100 20],'String',paramTypes,'Value',1,'Visible','on','Enable','on','Style','popupmenu'); +% Add params button + uicontrol('Parent',currPanel,'TooltipString','Add a user-defined parameter','Units','pixels','Position',[130 40 20 20],'String','+','Visible','on','Enable','on','Callback', @g_AddParamCallback,'UserData',hparamType,'Style','pushbutton'); + +% ------------------------------------------------------------------------- +% Buttons to apply or undo: +% ------------------------------------------------------------------------- +% Apply button + uicontrol('Parent',currPanel,'Units','pixels','Position',[panelDimens(3)-70 40 60 guiFontSize*20/10],'HorizontalAlignment','right','FontSize',guiFontSize,'String','Apply','Visible','on','Enable','off','Callback', @g_ApplyButtonCallback,'DeleteFcn',{@g_ApplyButtonCallback,0},'UserData',hparamType,'Tag','apply','Style','pushbutton'); +% Undo button + uicontrol('Parent',currPanel,'Units','pixels','Position',[panelDimens(3)-70 10 60 guiFontSize*20/10],'HorizontalAlignment','right','FontSize',guiFontSize,'String','Undo','Visible','on','Enable',undoStatus,'Callback', @g_UndoButtonCallback,'UserData',hparamType,'Tag','undo','Style','pushbutton'); + + + paramPagePosition = panelDimens + [3 65+guiFontSize*16/10 -6 -(80+guiFontSize*16/10)]; + +else % The part above was executed only if it's not an update of the panel + y = nparams(params); + for pp=1:y + paramkeys{pp} = params.params(pp).key; + paramvals{pp} = params.params(pp).val; + end + if exist('paramSets','var') && ~isempty(paramSets), panelDimens(4) = panelDimens(4)-20; end + paramPagePosition = panelDimens + [3 65+guiFontSize*16/10 -6 -(80+guiFontSize*16/10)]; +end + + +if nargin>2 && isa(varargin{3},'cell'), varargin{3} = varargin{3}{1}; end +if nargin<3, currPage = 1; else currPage = varargin{3}; if isa(currPage,'cell'), currPage = currPage{1}; end; end +uipanel('Parent',currPanel,'BackgroundColor',backColor,'FontSize',7,'Units','pixels','Position',paramPagePosition,'Tag','paramsPage','UserData',currPage); + + GUIprefs = getappdata(0, 'GUIpreferences'); +% Check if the parameters panel has to be drawn detached: + if GUIprefs.Detach + drawn = g_drawParPanel(); + if drawn, return; end; + end + + + +% ========================================================================= +% ========================================================================= +% ========================= Build DYNAMIC panel =========================== +% ========================================================================= +% ========================================================================= + + totalGaps = 0; + paramThisPage = 0; + lastParamGap = 0; + paramPages = []; + for ii=1:y + paramThisPage = paramThisPage+1; +% ------------------------------------------------------------------------- +% Cycle to verify whether gaps (= extra lines for complex params, such as +% pzmodels) are necessary or not: + switch class(paramvals{ii}) + case 'pzmodel' + if numel(paramvals{ii}.poles)>1 || numel(paramvals{ii}.zeros)>1 + totalGaps = totalGaps+1; + lastParamGap = 1; + end + case 'pz' + if numel(paramvals{ii})>1 + totalGaps = totalGaps+1; + lastParamGap = 1; + end + end +% ------------------------------------------------------------------------- +% Check if it's necessary to draw multiple parameters pages: + if (paramThisPage+totalGaps)*lineSpacing > paramPagePosition(4)-20 + paramPages = [paramPages , paramThisPage-1]; + if ii==y, paramPages = [paramPages,1]; end + paramThisPage = 1; + totalGaps = lastParamGap; + lastParamGap = 0; + elseif ii==y + paramPages = [paramPages , paramThisPage]; + end + end + + currGap = 0; +% The vector 'paramPages' contains how many params are contained into every page. + if numel(paramPages) > 1 + set(findobj('Tag','paramsPage'),'Title',['Page number ', num2str(currPage)] ); + uicontrol('Parent',currPanel,'BackgroundColor',backColor,'Tag','gotoparamspage','HorizontalAlignment','left','Position',[200 39 100 20],'String','Go to page: ','FontName','Times New Roman','FontSize',guiFontSize+2,'FontWeight','bold','Visible','on','Style','text'); + for ii = 0:numel(paramPages)-1 + uicontrol('Parent',currPanel,'Tag','gotoparamspage','Units','pixels','Position',[300+ii*(30) 40 20 20],'String',num2str(ii+1),'Visible','on','Enable','on','Callback', {@buildplistFigureParam,ii+1},'Style','pushbutton'); + end + elseif numel(paramPages) == 1 + delete(findobj('Tag','gotoparamspage')) + elseif isempty(paramPages) + paramPages = 0; + end + firstParam = 1; + if nargin>1 + if varargin{3}>numel(paramPages), varargin{3} = numel(paramPages); end + for ii = 1:varargin{3}-1 + firstParam = firstParam + paramPages(ii); + end + lastParam = firstParam + paramPages(varargin{3})-1; + else + lastParam = paramPages(1); + end + currParam = 0; + +for ii = firstParam:lastParam + currParam = currParam + 1; + addedPar = 0; + % Checkbox to enable input setting: + objName{ii,1} = uicontrol('Parent',currPanel,'Units','pixels','Position',[10,panelDimens(4)-lineSpacing*(currParam+1+currGap),14,14],'Value',paramEnabled(ii),'Visible','on','Enable','on','Callback', @g_EnableCallback,'Tag',paramkeys{ii},'UserData',ii,'Style','checkbox'); + % Remove Param Button: + try %#ok<ALIGN> + if strcmpi(paramkeys{ii}(1:7),'addPar_') + uicontrol('Parent',currPanel,'Units','pixels','Position',[panelDimens(3)-30 panelDimens(4)-lineSpacing*(currParam+1+currGap) 20 20],'String','-','TooltipString','Remove this parameter','Visible','on','Enable','on','UserData',ii,'Callback', @g_RemParamCallback,'Style','pushbutton'); + addedPar = 1; + paramkeys{ii}(1:7) = []; + end + catch, end + + switch class(paramvals{ii}) + + % ========================================================================== + case {'double'} + % ========================================================================== + % Key value: + objName{ii,2} = uicontrol('Parent',currPanel,'TooltipString','Key (name of the parameter)','Units','pixels','Position',[50 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 guiFontSize*20/10],'String',paramkeys{ii},'FontSize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editNameCallback,'Style','edit'); + if ~noParamsReq && ~addedPar + set(objName{ii,2},'Style','text','BackgroundColor',backColor,'Position',[50 panelDimens(4)-(4+lineSpacing*(currParam+1+currGap)) 120 20]); + end + % Val value: + data = mat2str(paramvals{ii}); + objName{ii,3} = uicontrol('Parent',currPanel,'TooltipString','Val (value of the parameter)','Units','pixels','Position',[200 panelDimens(4)-lineSpacing*(currParam+1+currGap) 200 guiFontSize*20/10],'String',data,'Fontsize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editValueCallback,'Style','edit'); + objName{ii,4} = uicontrol('UserData',objName{ii,3},'TooltipString','Expand the edit field','Parent',currPanel,'BackgroundColor',[0.7 0.7 0.7],'HorizontalAlignment','left','Position',[405 panelDimens(4)+3-lineSpacing*(currParam+1+currGap) 13 13],'Visible','on','Callback',@g_ExpandEdit,'Style','pushbutton'); + % Enable parameters from Simulink: + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[450 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',0,'Visible','on','Tag',num2str(ii),'UserData',[],'Callback',@g_fromSimulinkCallback,'Style','checkbox'); + if strcmp(paramvals{ii},'-->') + set(objName{ii,3},'Visible','off'); + set(objName{ii,4},'Visible','off'); + set(objName{ii,10},'Value',1); + end + + % ========================================================================== + case {'char'} + % ========================================================================== + % Key value: + objName{ii,2} = uicontrol('Parent',currPanel,'Units','pixels','Position',[120 panelDimens(4)-lineSpacing*(currParam+1+currGap) 60 20],'String',paramkeys{ii},'FontSize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editNameCallback,'Style','edit'); + if ~noParamsReq && ~addedPar + set(objName{ii,2},'Style','text','BackgroundColor',backColor,'Position',[50 panelDimens(4)-(4+lineSpacing*(currParam+1+currGap)) 120 20]); + end + if strcmpi(paramkeys{ii},'filename') + % Browse button: + currFilename = paramvals{ii}; + if isempty(currFilename), currFilename = 'Browse'; end + if numel(currFilename)>30, currFilename = ['...',currFilename(end-29:end)]; end + objName{ii,3} = uicontrol('Parent',currPanel,'Units','pixels','Position',[200 panelDimens(4)-lineSpacing*(currParam+1+currGap) 300 20],'String',currFilename,'Visible','on','Enable','off','Callback',@g_browseCallback,'Style','pushbutton'); + else + % Val value: + objName{ii,3} = uicontrol('Parent',currPanel,'Units','pixels','Position',[200 panelDimens(4)-lineSpacing*(currParam+1+currGap) 200 20],'String',['''',strrep(paramvals{ii},'''',''''''),''''],'Fontsize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editValueCallback,'Style','edit'); + objName{ii,4} = uicontrol('UserData',objName{ii,3},'TooltipString','Expand the edit field','Parent',currPanel,'BackgroundColor',[0.7 0.7 0.7],'HorizontalAlignment','left','Position',[405 panelDimens(4)+3-lineSpacing*(currParam+1+currGap) 13 13],'Visible','on','Callback',@g_ExpandEdit,'Style','pushbutton'); + end + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[450 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',0,'Visible','on','Tag',num2str(ii),'UserData',[],'Callback',@fromSimulinkCallback,'Style','checkbox'); + if strcmp(paramvals{ii},'-->') + set(objName{ii,3},'Visible','off'); + set(objName{ii,4},'Visible','off'); + set(objName{ii,10},'Value',1); + else + set(objName{ii,10},'Visible','off'); + end + + % ========================================================================== + case {'unit'} + % ========================================================================== + % Key value: + objName{ii,2} = uicontrol('Parent',currPanel,'Units','pixels','Position',[120 panelDimens(4)-lineSpacing*(currParam+1+currGap) 60 20],'String',paramkeys{ii},'FontSize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editNameCallback,'Style','edit'); + if ~noParamsReq && ~addedPar + set(objName{ii,2},'Style','text','BackgroundColor',backColor,'Position',[50 panelDimens(4)-(4+lineSpacing*(currParam+1+currGap)) 120 20]); + end + % Val value: + unitVal = paramvals{ii}.strs; if isempty(unitVal), unitVal = {''}; end + allunits = unit.supportedUnits; + unitsTooltip = 'Supported units: '; + for kk=1:numel(allunits), unitsTooltip = [unitsTooltip,allunits{kk},',']; end + unitsTooltip(end)=[]; + objName{ii,3} = uicontrol('Parent',currPanel,'TooltipString',unitsTooltip,'Units','pixels','Position',[200 panelDimens(4)-lineSpacing*(currParam+1+currGap) 200 20],'String',['''',unitVal{1},''''],'Fontsize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_unitValCallback,'Style','edit'); + + % ========================================================================== + case {'logical'} + % ========================================================================== + % Key value: + objName{ii,2} = uicontrol('Parent',currPanel,'Units','pixels','Position',[120 panelDimens(4)-lineSpacing*(currParam+1+currGap) 60 20],'String',paramkeys{ii},'FontSize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editNameCallback,'Style','edit'); + if ~noParamsReq && ~addedPar + set(objName{ii,2},'Style','text','BackgroundColor',backColor,'Position',[50 panelDimens(4)-(4+lineSpacing*(currParam+1+currGap)) 120 20]); + end + % Val value: + objName{ii,3} = uicontrol('Parent',currPanel,'Units','pixels','Position',[200 panelDimens(4)-lineSpacing*(currParam+1+currGap) 100 20],'String',{'false','true'},'Value',paramvals{ii}+1,'Fontsize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_logicValCallback,'Style','popupmenu'); + + % ========================================================================== + case 'specwin' + % ========================================================================== + selectWind = paramvals{ii}.type; + listWindows = ['Kaiser',specwin.getTypes]; + selectWindValue = strmatch(selectWind,listWindows,'exact'); + % Window text: + objName{ii,2} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[40 panelDimens(4)-lineSpacing*(currParam+1+currGap)-5 60 20],'String','Window:','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text'); + % Window type popup: + objName{ii,3} = uicontrol('Parent',currPanel,'Units','pixels','Position',[105 panelDimens(4)-lineSpacing*(currParam+1+currGap)-2 90 20],'String',listWindows,'TooltipString','Window names','Value',selectWindValue,'Visible','on','Enable','off','Tag',paramkeys{ii},'UserData',ii,'Callback', @g_WindListCallback,'Style','popupmenu'); + % Length value: + currLength = num2str(length(params.params(ii).val.win)); + objName{ii,4} = uicontrol('Parent',currPanel,'Units','pixels','Position',[200 panelDimens(4)-lineSpacing*(currParam+1+currGap)-2 70 20],'String',num2str(currLength),'TooltipString','Window Length','Visible','on','Enable','off','UserData',ii,'Callback', @g_WindlengthCallback,'Style','edit'); + if strcmp(selectWind,'Kaiser') + % PSL value if Kaiser: + currPSL = params.params(ii).val.psll; + objName{ii,5} = uicontrol('Parent',currPanel,'Units','pixels','Position',[275 panelDimens(4)-lineSpacing*(currParam+1+currGap)-2 60 20],'String',num2str(currPSL),'TooltipString','Peak Sidelobe','Visible','on','Enable','off','UserData',ii,'Callback',@g_WindPSLCallback,'Style','edit'); + end + % Simulink checkbox: + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[450 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',0,'Visible','on','Tag',num2str(ii),'UserData',paramvals{ii},'Callback',@g_fromSimulinkCallback,'Style','checkbox'); + + % ========================================================================== + case 'pzmodel' + % ========================================================================== + % Simulink checkbox: + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[500 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',0,'Visible','on','Tag',num2str(ii),'UserData',paramvals{ii},'Callback',@g_fromSimulinkCallback,'Style','checkbox'); + + clear pzObj currPoles poleFreqs poleQs poleFQs currZeros zeroFreqs zeroQs zeroFQs + pzObj = params.params(ii).val; + currPoles = pzObj.poles; + currZeros = pzObj.zeros; + % Load button: + objName{ii,3} = uicontrol('Parent',currPanel,'HorizontalAlignment','left','Position',[50 panelDimens(4)-(3+lineSpacing*(currParam+1+currGap)) 50 20],'String','Load','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','UserData',ii,'Callback',@g_pzmodelLoad,'enable','off','Style','pushbutton'); + % Gain text: + objName{ii,4} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[120 panelDimens(4)-lineSpacing*(currParam+1+currGap)-5 40 20*guiFontSize/10],'String','Gain:','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text'); + % Gain value: + currGain = pzObj.gain; + objName{ii,5} = uicontrol('Parent',currPanel,'Units','pixels','Position',[155 panelDimens(4)-(2+lineSpacing*(currParam+1+currGap)) 60 20],'String',num2str(currGain),'FontSize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_pzmodelGainEdit,'Style','edit'); + % Poles text: + objName{ii,6} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[240 panelDimens(4)-lineSpacing*(currParam+1+currGap)-5 40 20],'String','Poles:','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text'); + % Zeros text: + objName{ii,7} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[355 panelDimens(4)-lineSpacing*(currParam+1+currGap)-5 40 20],'String','Zeros:','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text'); + % Poles value: + for kk=1:numel(currPoles) + poleFreqs(kk,1) = currPoles(kk).f; + poleQs(kk,1) = currPoles(kk).q; + if ~isnan(poleQs(kk,1)) + poleFQs{kk,1}=strcat(num2str(poleFreqs(kk,1)),',',num2str(poleQs(kk,1))); + else + poleFQs{kk,1}=num2str(poleFreqs(kk,1)); + end + end + if numel(currPoles)>1 || numel(currZeros)>1 + currGap=currGap+1; + end + if isempty(currPoles) + poleFQs = ''; + else + poleFQs=char(poleFQs); + end + objName{ii,8} = uicontrol('Parent',currPanel,'Units','pixels','Position',[280 panelDimens(4)-(2+lineSpacing*(currParam+1+currGap))-(lineSpacing-30)*(max(numel(currPoles),numel(currZeros))>1) 60 (20+(max(numel(currPoles),numel(currZeros))>1)*lineSpacing)*guiFontSize/10],'Max',2,'String',poleFQs,'FontSize',guiFontSize+1,'TooltipString','Insert ''freq'' or ''freq,q'' on multiple lines','Visible','on','Enable','off','UserData',ii,'Callback',{@g_pzmodelPZEdit,1},'Style','edit'); + % Zeros value: + for kk=1:numel(currZeros) + zeroFreqs(kk,1) = currZeros(kk).f; + zeroQs(kk,1) = currZeros(kk).q; + if ~isnan(zeroQs(kk,1)) + zeroFQs{kk,1}=strcat(num2str(zeroFreqs(kk,1)),',',num2str(zeroQs(kk,1))); + else + zeroFQs{kk,1}=num2str(zeroFreqs(kk,1)); + end + end + if isempty(currZeros) + zeroFQs = ''; + else + zeroFQs = char(zeroFQs); + end + objName{ii,9} = uicontrol('Parent',currPanel,'Units','pixels','Position',[395 panelDimens(4)-(2+lineSpacing*(currParam+1+currGap))-(lineSpacing-30)*(max(numel(currPoles),numel(currZeros))>1) 60 (20+(max(numel(currPoles),numel(currZeros))>1)*lineSpacing)*guiFontSize/10],'Max',2,'String',zeroFQs,'FontSize',guiFontSize+1,'TooltipString','Insert ''freq'' or ''freq,q'' on multiple lines','Visible','on','Enable','off','UserData',ii,'Callback',{@g_pzmodelPZEdit,0},'Style','edit'); + + % ========================================================================== + case 'pz' + % ========================================================================== + % Simulink checkbox: + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[500 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',0,'Visible','on','Tag',num2str(ii),'UserData',paramvals{ii},'Callback',@g_fromSimulinkCallback,'Style','checkbox'); + + currPoles = params.params(ii).val; + clear poleFreqs poleQs poleFQs + for kk=1:numel(currPoles) + poleFreqs(kk,1) = currPoles(kk).f; + poleQs(kk,1) = currPoles(kk).q; + if isnan(poleQs(kk,1)) + poleFQs{kk,1}=num2str(poleFreqs(kk,1)); + else + poleFQs{kk,1}=strcat(num2str(poleFreqs(kk,1)),',',num2str(poleQs(kk,1))); + end + + end + poleFQs=char(poleFQs); + % Poles text: + objName{ii,2} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[50 panelDimens(4)-(4+lineSpacing*(currParam+1+currGap)) 120 20],'String','PZ','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Enable','off','Style','text'); + if numel(currPoles)>1, currGap=currGap+1; end + % Poles value: + objName{ii,3} = uicontrol('Parent',currPanel,'Units','pixels','Position',[250 panelDimens(4)-(2+lineSpacing*(currParam+1+currGap))-(lineSpacing-30)*(numel(currPoles)>1) 100 (20+(numel(currPoles)>1)*lineSpacing)*guiFontSize/10],'String',poleFQs,'Max',2,'FontSize',guiFontSize,'TooltipString','Insert ''freq'' or ''freq,q''','Visible','on','Enable','on','UserData',ii,'Callback',@g_poleEdit,'Style','edit'); + + % ========================================================================== + case 'cell' + % ========================================================================== + if isa(paramvals{ii}{1},'char') && strcmp(paramvals{ii}{1},'-->') + % Key value: + objName{ii,2} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'Units','pixels','Position',[50 panelDimens(4)-5-lineSpacing*(currParam+1+currGap) 120 20],'String',paramkeys{ii},'Visible','on','Enable','on','UserData',ii,'Callback',@g_editNameCallback,'Style','text'); + % Text: from Simulink environment: + objName{ii,3} = uicontrol('TooltipString','Retrieve from Simulink','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[230 panelDimens(4)-6-lineSpacing*(currParam+1+currGap) 200 20],'String','From Simulink environment','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text'); + fromSimulink = 1; + else + % Key value: + objName{ii,2} = uicontrol('Parent',currPanel,'Units','pixels','Position',[120 panelDimens(4)-lineSpacing*(currParam+1+currGap) 60 20],'String',paramkeys{ii},'Visible','on','Enable','off','UserData',ii,'Callback',@g_editNameCallback,'Style','edit'); + if ~noParamsReq && ~addedPar + set(objName{ii,2},'Style','text','BackgroundColor',backColor,'Position',[50 panelDimens(4)-5-lineSpacing*(currParam+1+currGap) 120 20]); + end + % Val value: + data = utils.prog.cell2str(paramvals{ii}); + objName{ii,3} = uicontrol('Parent',currPanel,'Units','pixels','Position',[250 panelDimens(4)-lineSpacing*(currParam+1+currGap) 130 20],'String',data,'Visible','on','Enable','on','UserData',ii,'Callback',@g_editValueCallback,'Style','edit'); + fromSimulink = 0; + end + + % Simulink checkbox: + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[500 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',fromSimulink,'Visible','on','Tag',num2str(ii),'UserData',paramvals{ii},'Callback',@g_fromSimulinkCallback,'Style','checkbox'); + + + % ========================================================================== + otherwise % Other types of param? + % ========================================================================== + % Key value: + objName{ii,3} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'Units','pixels','Position',[50 panelDimens(4)-5-lineSpacing*(currParam+1+currGap) 120 20],'String',paramkeys{ii},'FontSize',guiFontSize+1,'Visible','on','Enable','off','UserData',ii,'Callback',@g_editNameCallback,'Style','text'); + % Text: input not supported. Please construct by proper block. + objName{ii,4} = uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[250 panelDimens(4)-4-lineSpacing*(currParam+1+currGap) 200 20],'String','Unsupported yet','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text'); + fromSimulink = 0; + + % Simulink checkbox: + objName{ii,10} = uicontrol('TooltipString','Retrieve from Simulink','String','From Simulink','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[450 panelDimens(4)-lineSpacing*(currParam+1+currGap) 120 20],'Max',1,'Min',0,'Value',fromSimulink,'Visible','on','Tag',num2str(ii),'UserData',paramvals{ii},'Callback',@g_fromSimulinkCallback,'Style','checkbox'); + + % ============================================================================== + end % of SWITCH the param type + % Cycle to activate enabled params: + if paramEnabled(ii) || noParamsReq==1 + [xx,yy] = size(objName); + jj=2; + while jj<=yy && ~isempty(objName{ii,jj}) + try set(objName{ii,jj},'Enable','on'); set(objName{ii,jj},'ForegroundColor',[0 0 0]); catch, end + jj=jj+1; + end + end + +end % of cycle among params + + end % of buildplistFigureParam function + %---------------------------------------------------------------------- + +%% ========================= Selection Check ============================== +% ========================================================================= + %---------------------------------------------------------------------- + function g_ContinuousParamCheck(varargin) + % This is the function to execute a continuous check on the status + % of the current selection (system and block). + + currSelection = utils.prog.gcbsh; + % set(findobj('Tag','LTPDAGUI'),'Name',[strtok(get(findobj('Tag','LTPDAGUI'),'Name'),' - '),' - ',bdroot]); + if isnan(selBlocks), buildplistFigureParam([],[],get(findobj('Tag','paramsPage'),'UserData')); end + + % Clear the figure if nothing is and was selected OR nothing is and something was selected OR is selected a library + if (isempty(selBlocks) && isempty(currSelection)) || (~isempty(selBlocks) && isempty(currSelection)) || strcmp(get_param(bdroot,'BlockDiagramType'),'library') + delete(findobj(gcf,'Parent',currPanel)) + try close(findobj('Tag','parampanelFigure')); catch, end; + selBlocks = []; + uicontrol('Parent',currPanel,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[0 (panelDimens(4)+30)/2 panelDimens(3) 30],'String','Nothing currently selected','Visible','on','Style','text'); + return + end + + % Check that it's selected a ltpda simulink analysis diagram: + if ~isempty(bdroot) && ~isempty(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model')) + + if ((numel(selBlocks)==1 && selBlocks~=gcbh) || length(selBlocks)~=length(currSelection)) || selBlocks(1)~=currSelection(1) && ~isempty(currSelection) + delete(findobj(gcf,'Parent',currPanel)) + try close(findobj('Tag','parampanelFigure')); catch, end; + GUIprefs = getappdata(0, 'GUIpreferences'); + if GUIprefs.CAD + if GUIprefs.Copied + if length(currSelection)<1, return; end + currSelection = g_copyfcnCallback(selBlocks,currSelection); + GUIprefs.Copied = 0; + setappdata(0, 'GUIpreferences',GUIprefs) + end + end + for i=1:length(currSelection) + set_param(currSelection(i),'LinkStatus','inactive'); + currentTags{i}=get_param(currSelection(i),'Tag'); + end + + if strcmp(currentTags{1},'') + delete(findobj(gcf,'Parent',currPanel)) + selBlocks = currSelection; + uicontrol('Parent',currPanel,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[0 (panelDimens(4)+30)/2 panelDimens(3) 30],'String','Not a valid LTPDA block','Visible','on','Style','text'); + return + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if numel(currSelection)>1 % then the user has selected multiple blocks + % Check for consistency: all methods? same class? + for i=1:numel(currentTags) + if ~strcmp(currentTags{i},currentTags{1}) + g_ErrorSelectionInconsistent(currPanel); + selBlocks = currSelection; + return; + end + end + % Check for consistency: same method?: + for i=1:numel(currSelection) + childpath = find_system(currSelection(i),'LookUnderMasks','all','BlockType','M-S-Function'); + functionname{i}=get_param(childpath,'Tag'); + if ~strcmp(functionname{i},functionname{1}) % different functions, inconsistent selection + g_ErrorSelectionInconsistent(currPanel); + selBlocks = currSelection; + return; + end + end + end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + delete(findobj(gcf,'Parent',currPanel)) + selBlocks = currSelection; + oldparams = []; params = []; paramEnabled = []; oldparamEnabled = []; functionName = ''; paramSets = []; + + % Get the new functionName: + childpath = find_system(gcbh,'LookUnderMasks','all','BlockType','M-S-Function'); + functionName = get_param(childpath,'Tag'); + if isempty(functionName) + description = get_param(gcbh,'Description'); + funcname = findstr('functionName=',description); + if funcname + i = funcname+14; + while ~strcmp(description(i),';'), i=i+1; end + functionName = description(funcname+14:i-2); + end + end + funcType = strtok(get(gcbh,'Tag')); + if isempty(functionName) && strcmp(funcType,'method') + functionName = g_setmethod(); + end + + switch funcType + % ========================================================= + case {'function','freepl','method'} + buildplistFigureParam() + % ========================================================= + case 'arithmetic' + g_arithmetic(currPanel); + % ========================================================= + case 'input' + g_LoadInputParamCallback(currPanel); + % ========================================================= + case {'mux','demux'} + g_LoadMuxParamCallback(); + % ========================================================= + case 'from' + g_LoadFromBlockCallback(currPanel); + % ========================================================= + end % of switch + + end % end of blocks selection + end % end of system selection check + + end + %---------------------------------------------------------------------- + +end \ No newline at end of file