www.gusucode.com > mbcexpr 工具箱 matlab 源码程序 > mbcexpr/@cgslparser/findSrcBlocks.m

    function srcblock = findSrcBlocks(obj,b,varargin)
%FINDSRCBLOCKS - Find the source block(s) for this block
%
%  srcblock = findSrcBlocks(obj,b,varargin)
%  

%  Copyright 2007 The MathWorks, Inc. and Ford Global Technologies, Inc.

% special code for function block
VectorBlocks = {'Fcn','MATLABFcn','DotProduct'};
VectorMaskBlocks = {'CAGE Polynomial'};
SupportsMultiInputs = any(strcmp( get_param(b,'BlockType'), VectorBlocks)) || ...
    (strcmp( get_param(b,'BlockType'), 'SubSystem') && any(strcmp( get_param(b,'MaskType'), VectorMaskBlocks )));

porthandles = get_param(b,'porthandles');

if nargin == 2
	inports = porthandles.Inport;
else
	inports = porthandles.(varargin{1});
end

BaseSys = get_param(bdroot(b),'name');

srcblock = zeros(1,0);
for i = 1:length(inports)
    lh = get_param(inports(i),'line');
    if lh==-1
        % no line feeding into this port
        obj.assert(sprintf('Port %d of block %s must be connected.',i,get_param(b,'name')),b )
    else
        src = iGetSrc(obj,lh,BaseSys);
        if ~SupportsMultiInputs && ~isscalar(src)
            obj.assert('Block must have a single source.', b )
        end
    end
    srcblock = [srcblock src];
end


function srcblock = iGetSrc(obj,line,BaseSys)

tracedPort = get(line,'NonVirtualSrcPorts');

srcblock = zeros(1,length(tracedPort));
for i=1:length(tracedPort)
    pt = get_param(tracedPort(i),'Parent');
    SrcParent = get_param(pt,'Parent');
    while ~strcmp(SrcParent,BaseSys)
        % jump out to see if you are inside supported block
        if iscgSubSystem(obj.SLBlocks , SrcParent)
            pt = SrcParent;
            break
        else
            SrcParent = get_param(SrcParent,'Parent');
        end
    end
    srcblock(i) = get_param(pt, 'handle');
end