diff m-toolbox/classes/+utils/@prog/find_in_models.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/classes/+utils/@prog/find_in_models.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,132 @@
+function out = find_in_models(modelname,varargin)
+%FIND_IN_MODELS Search full block diagram hierarchy
+%  Wrapper for find_system which searches the full block diagram hierarchy,
+%  following library links and model references.  The contents of masked systems
+%  will be searched only if the LookUnderMasks option is supplied.
+%
+% out = find_in_models(modelname,varargin);
+% out = find_in_models(modelhandle,varargin);
+%
+% The first input must be the name or numeric handle of a block diagram.
+% Additional arguments are the same as those for find_system.  If a SearchDepth 
+% is specified, this will be applied when searching each model in the hierarchy.
+%
+% The return value will be a cell array of strings if:
+%   1) the first input (modelname) is a string
+%   2) the "FindAll" option is absent or "off".
+% Otherwise the return value will be a numeric array.
+%
+% However, note that if strings are returned, any block diagrams which are loaded
+% during the search will be closed again to save memory.
+% If numeric handles are returned then the block diagrams will be retained in
+% memory, though they may not be visible.  Use:
+%    find_system('SearchDepth',0)
+% to find the list of block diagrams which are in memory.
+%
+% Examples:
+%   To find all Gain blocks involved in the simulation:
+%     names = find_in_models('mymodel','BlockType','Gain');
+%
+%   To find all lines with name "voltage":
+%     handles = find_in_models('mymodel','FindAll','on','Type','line','Name','voltage')
+%
+%   To find all models in the simulation which have buffer reuse turned off:
+%     names = find_in_models('mymodel','SearchDepth',0,'BufferReuse','off')
+%
+% $Id: find_in_models.m,v 1.1 2008/06/18 13:35:11 hewitson Exp $
+%
+
+    if ~ischar(modelname) && ( ~isnumeric(modelname) || numel(modelname)~=1 )
+        error('Simulink:find_in_models:BadModelSpecifier',...
+            'First input must be single model name or handle');
+    end
+
+    % First guess at whether we need to close any block diagrams we load
+    close_after_search = ischar(modelname);
+
+    % The list of names of block diagrams currently in memory
+    loaded_mdls = find_system('SearchDepth',0);
+    
+    % The list of block diagrams we've searched already, to avoid duplication
+    % of effort where a block diagram appears in multiple locations in the hierarchy.
+    searched_mdls = {};
+    
+    % Run the search.
+    out = i_search(modelname,varargin{:});
+    
+    if close_after_search
+        % Close any block diagrams which are now open but weren't open to
+        % start with.  Since we closed models after we searched them, this will
+        % only include libraries.
+        now_loaded = find_system('SearchDepth',0);
+        for k=1:numel(now_loaded)
+            if ~ismember(now_loaded{k},loaded_mdls)
+                close_system(now_loaded{k},0);
+            end
+        end
+    end
+    
+    %-----------------------------------------------
+    % Peforms the search on the specified model and any models it references.
+    function out = i_search(thismodel,varargin)
+        
+        % Check whether we need to load this model.
+        if ischar(thismodel)
+            isloaded = ismember(thismodel,loaded_mdls);
+            if ~isloaded
+                load_system(thismodel);
+            end
+        end
+        % Perform the search.
+        out = find_system(thismodel,'FollowLinks','on',varargin{:});
+        if close_after_search && isnumeric(out)
+            % We supplied a name but got numeric handles back.  The caller must
+            % have specified the "FindAll" option.  We can't close models after
+            % searching them now, because that would make the handles invalid.
+            close_after_search = false;
+        end
+        % Look for any Model References
+        mdlrefs = find_mdlref_blocks(thismodel);
+        if ~isempty(mdlrefs)
+            % Find the names of the referenced models
+            mdls = get_param(mdlrefs,'ModelName');
+            others = cell(size(mdls));
+            for i=1:numel(mdls)
+                submodel = mdls{i};
+                submodelname = submodel; % keep a copy of the name
+                if ~ismember(submodelname,searched_mdls)
+                    % We haven't searched this model already.
+                    if ~ischar(thismodel)
+                        % We need to supply numeric handles to find_system.  First
+                        % make sure that this model is loaded.
+                        if ~ismember(submodel,loaded_mdls)
+                            load_system(submodel);
+                            loaded_mdls{end+1} = submodel; %#ok (growing in a loop, but hard to avoid)
+                        end
+                        % Now get the handle.
+                        submodel = get_param(submodel,'Handle');
+                    end
+                    % Now search the model.
+                    others{i} = i_search(submodel,varargin{:});
+                    % Record the fact that we've already searched this model,
+                    % so that we don't search it again.
+                    searched_mdls{end+1} = submodelname; %#ok (growing in a loop, but hard to avoid)
+                end
+            end
+            % Combine results for this model and all the models it references.
+            out = vertcat(out,others{:});
+        end
+        % If we're returning strings, close this model to free the memory.
+        % This may leave libraries in memory, but that will save us loading them
+        % again if they're used by another model, and we'll close them at the end.
+        if close_after_search
+            if ~isloaded
+                close_system(thismodel,0);
+            end
+        end
+
+    end
+end
+
+
+