void Expression::addPlug( ValuePlug *parentPlug, const std::string &plugPath ) { Node *p = parent<Node>(); if( !p ) { throw IECore::Exception( "No parent" ); } ValuePlug *plug = p->descendant<ValuePlug>( plugPath ); if( !plug ) { throw IECore::Exception( boost::str( boost::format( "Plug \"%s\" does not exist" ) % plugPath ) ); } PlugPtr childPlug = plug->createCounterpart( "p0", parentPlug->direction() ); childPlug->setFlags( Plug::Dynamic, true ); parentPlug->addChild( childPlug ); if( childPlug->direction() == Plug::In ) { childPlug->setInput( plug ); } else { plug->setInput( childPlug ); } }
void Expression::updatePlugs( const std::string &dstPlugPath, std::vector<std::string> &srcPlugPaths ) { Node *p = parent<Node>(); // if the expression was invalid, remove our plugs if( !dstPlugPath.size() ) { Plug *in = getChild<Plug>( "in" ); if( in ) { removeChild( in ); } Plug *out = getChild<Plug>( "out" ); if( out ) { removeChild( out ); } return; } // otherwise try to create connections to the plugs the expression wants ValuePlug *dstPlug = p->descendant<ValuePlug>( dstPlugPath ); if( !dstPlug ) { throw IECore::Exception( boost::str( boost::format( "Destination plug \"%s\" does not exist" ) % dstPlugPath ) ); } CompoundPlugPtr inPlugs = new CompoundPlug( "in", Plug::In, Plug::Default | Plug::Dynamic ); setChild( "in", inPlugs ); for( std::vector<std::string>::const_iterator it = srcPlugPaths.begin(); it!=srcPlugPaths.end(); it++ ) { ValuePlug *srcPlug = p->descendant<ValuePlug>( *it ); if( !srcPlug ) { throw IECore::Exception( boost::str( boost::format( "Source plug \"%s\" does not exist" ) % *it ) ); } PlugPtr inPlug = srcPlug->createCounterpart( "plug", Plug::In ); inPlugs->addChild( inPlug ); inPlug->setInput( srcPlug ); } PlugPtr outPlug = dstPlug->createCounterpart( "out", Plug::Out ); setChild( "out", outPlug ); dstPlug->setInput( outPlug ); }