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