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