www.gusucode.com > sldv工具箱matlab源码程序 > sldv/sldv/+Sldv/+xform/@MdlHierInfo/constructCompGraph.m

    function [compGraph, subsystemHNodeMap] = constructCompGraph(obj, modelH)            

%   Copyright 2010-2013 The MathWorks, Inc.

    isTopCompiled = Sldv.xform.MdlInfo.isMdlCompiled(modelH);    
    assert(isTopCompiled,getString(message('Sldv:xform:MdlHierInfo:MdlHierInfo:ModelInCompiled', getfullname(modelH))));
    
    subsystemHNodeMap = containers.Map('KeyType', 'double', 'ValueType', 'any');
            
    objModel =  get_param(modelH,'object'); 
    graphs = getGraph(objModel);    
    root = graphs(2);
    
    compGraph = obj.constructCompGraphNode(modelH);    
    rootSubsystemTreeNode = compGraph;
            
    subsystemHNodeMap(modelH) = rootSubsystemTreeNode;
    
    childSubsystems = Sldv.xform.SubSystemTreeNode.findChildSubsystems(root);
    if ~isempty(childSubsystems)     
        subsystemQueue = {};    
        for i=1:length(childSubsystems)   
            [subsystemH, subsystemObj] = findSubsystemH(childSubsystems{i}.FullPath);                     
            if ~isempty(subsystemObj) && ~subsystemObj.isSynthesized && ...
                    strcmp(subsystemObj.BlockType,'SubSystem')
                subsystemNode = obj.constructCompGraphNode(subsystemH,...
                    rootSubsystemTreeNode);     
                subsystemHNodeMap(subsystemH) = subsystemNode;
            else
                subsystemNode = [];
            end
            ssInfo.GraphNode = childSubsystems{i};
            ssInfo.TreeNode = subsystemNode;
            ssInfo.ParentNode = rootSubsystemTreeNode;
            subsystemQueue{end+1} = ssInfo;               %#ok<AGROW>
        end        
        %  Continue to the next level on BFS search
        startNodeIdx = 1;
        while startNodeIdx <= length(subsystemQueue)
            startNode = subsystemQueue{startNodeIdx};
            childSubsystems = Sldv.xform.SubSystemTreeNode.findChildSubsystems(startNode.GraphNode);
            if isempty(childSubsystems)
                startNodeIdx = startNodeIdx+1;
                continue;
            end
            if ~isempty(startNode.TreeNode)
                rootNodeToConnect = startNode.TreeNode;
            else
                % The subsystem represented by the startNode is synthesized
                rootNodeToConnect = startNode.ParentNode;
            end
            for i=1:length(childSubsystems)  
                [subsystemH, subsystemObj] = findSubsystemH(childSubsystems{i}.FullPath);                
                if ~isempty(subsystemObj) && ~subsystemObj.isSynthesized && ...
                        strcmp(subsystemObj.BlockType,'SubSystem')                   
                    subsystemNode = obj.constructCompGraphNode(subsystemH,...
                        rootNodeToConnect);                
                    subsystemHNodeMap(subsystemH) = subsystemNode;
                else                    
                    subsystemNode = [];
                end                              
                ssInfo.GraphNode = childSubsystems{i};
                ssInfo.TreeNode = subsystemNode;
                ssInfo.ParentNode = rootNodeToConnect;
                subsystemQueue{end+1} = ssInfo; %#ok<AGROW>
            end
            startNodeIdx = startNodeIdx+1; 
        end
    end     
end

function [subsystemH, subsystemObj] = findSubsystemH(subsystemPath)
    try
        subsystemH = get_param(subsystemPath,'Handle');
        subsystemObj = get_param(subsystemH,'Object');
    catch Mex %#ok<NASGU>
        subsystemH = [];
        subsystemObj = [];
    end
end
% LocalWords:  BFS