参考多叉树结构
BlockHandle: 当前模块句柄
Trace: java.util.HashSet结构,记录路径中已遍历的句柄,防止重复添加(因为simulink中模块可以连成一个环)
PointLines: 带有分支的线
TraceLines: 同Trace作用,获取路径上的线段
因为matlab的对象设计理念,线段对象line和模块对象block需要分开获取,同时line中有点Points这个属性,并不是对象,会导致排序时排完线和模块但点还留在原地,所以需要额外考虑获取点
function [Trace,PointLines,TraceLines] = GetBranch(BlockHandle,Trace,PointLines,TraceLines)
Connect = get(BlockHandle, 'PortConnectivity');
LineHandles = get(BlockHandle, 'LineHandles');
InOutLines = union(LineHandles.Inport,LineHandles.Outport);
TraceLines = union(TraceLines,InOutLines);
for i = 1 : length(InOutLines)
if InOutLines(i) > 0 && (~isempty(get_param(InOutLines(i),'LineChildren')))
PointLines = union(PointLines,InOutLines(i));
end
end
if length(Connect) == 1 && ((isempty(Connect.SrcBlock) && ...
length(Connect.DstBlock) == 1)|| isempty(Connect.DstBlock))
%到末端节点
return
end
for i = 1 : length(Connect)
if ~isempty(str2double(Connect(i).Type))
if ~isempty(Connect(i).SrcBlock)
%输入
SrcBlock = Connect(i).SrcBlock;
if ~Trace.contains(SrcBlock) && SrcBlock > 0
Trace.add(SrcBlock);
[Trace,PointLines,TraceLines] = GetBranch(SrcBlock,Trace,PointLines,TraceLines);
else
continue
end
else
%输出,不一定只有一个
DstBlocks = Connect(i).DstBlock;
for j = 1 : length(DstBlocks)
if ~Trace.contains(DstBlocks(j)) && DstBlocks(j) > 0
Trace.add(DstBlocks(j));
[Trace,PointLines,TraceLines] = GetBranch(DstBlocks(j),Trace,PointLines,TraceLines);
else
continue
end
end
end
end
end
end