Simulink递归获取模块句柄

参考多叉树结构
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值