www.gusucode.com > mbcview 工具箱matlab源码程序 > mbcview/@cgfeaturenode/parseSLOutports.m

    function [featnode,OK] = parseSLOutports(featnode,sys,outports)
%parseSLOutports parse Simulink outports to create a CAGE feature
%    featnode = parseSLOutports(featnode,sys,d,outports)
%    Inputs:
%       featnode: cgfeaturenode
%       sys:      Simulink model
%       d:        CAGE view structure for feature
%       outports: array of outports to parse

%  Copyright 2012-2012 The MathWorks, Inc. and Ford Global Technologies, Inc.

CGBH = cgbrowser;
d = CGBH.getViewData;
d.sys = get_param(sys,'handle');
CGBH.setViewData(d);

try %#ok<TRYNC>
    % compile model and find variables. This updates the cache for future calls to
    % Simulink.findVars.
    Simulink.findVars(get_param(bdroot(sys),'Name'));
end

cgp = address( project(featnode) );
parser = cgslparser(cgp);
% create a
pOrig = saveptrs(info(cgp));
BackUp = infoarray( pOrig );
OK = true;

pFeatNode = mbcpointer(1,length(outports));
pFeatNode(1) = address(featnode);
for i=2:length(outports)
    block = outports(i);
    % create a new featurenode for other outports
    pFeat = xregpointer( cgfeature( get(block,'Name') ) );
    pFeatNode(i) =cgnode(pFeat.info,[],pFeat,1);
    addnodestoproject(info(cgp) ,pFeatNode(i));
end


for i=1:length(outports)
    block = outports(i);
    
    [pFeatNode(i).info,OK]=parseFeature(pFeatNode(i).info,parser,sys,block,cgp);
    if ~OK
        % restore project
        passign(pOrig,BackUp)
        cgp.UpdateConnections;
        break
    end
    
end


function [featnode,OK]=parseFeature(featnode,parser,sys,block,cgp)
% Get the pointers that are currently in the feature before starting.  This
% cannot be done after parsing because the parsing process alters the
% strategy links.
sfPtr = getdata(featnode);
eq = sfPtr.get('equation');
if isempty(eq)
    oldPtrList= [];
else
    oldPtrList=unique([eq; eq.getptrsnosf]);
    BackUp = infoarray( oldPtrList );
end


%-----------------------------------
%   Parse out simulink diagram
%-----------------------------------
blocks=find_system(get_param(sys,'Handle'),'findall','on','lookundermasks','all',...
    'Type','block');
ud = get(blocks,{'UserData'});
try

    [newsf,NewExpressions,sfDetails] = parse(parser,sys,block,sfPtr);
    OK = true;
catch ME
    % catch error and give appropriate message
    hilite_system( parser.CurrentBlock );
    uiwait( xregerror( 'CAGE Strategy Parse Error', ME.message ) );
    hilite_system( parser.CurrentBlock, 'none' );
    if ~isempty(oldPtrList)
        % restore any pointers
        passign(oldPtrList,BackUp);
    end
    OK = false;
    
    % restore block userdata
    set(blocks,{'UserData'},ud);
end



if OK && ~isempty(newsf)
    pSubFeatNode = mbcpointer(1,length(sfDetails));
    for i=length(sfDetails):-1:1
        % add subfeatures in reverse order so the top level subfeatures appear closer to main
        % features.
        
        % remove equation from feature, required for processing of new features
        sfDetails(i).Feature.info = set(sfDetails(i).Feature.info,'equation',sfDetails(i).Feature);
        pSubFeatNode(i) =cgnode(sfDetails(i).Feature.info,[],sfDetails(i).Feature,1);
        addnodestoproject(info(cgp) ,pSubFeatNode(i));
    end

    for i=1:length(sfDetails)
        % process each sub feature
        pSubFeatNode(i).info = pupdateproject(pSubFeatNode(i).info, sfDetails(i).Equation, sfDetails(i).NewExpressions, bdroot(block), []);
    end
    
    % process main feature
    featnode = pupdateproject(info(featnode), newsf, NewExpressions, bdroot(block), oldPtrList);
end