TuttleOFX
1
|
00001 #include "INode.hpp" 00002 00003 #include "ImageEffectNode.hpp" 00004 00005 #include <tuttle/host/graph/ProcessVertexData.hpp> 00006 #include <tuttle/host/graph/ProcessVertexAtTimeData.hpp> 00007 00008 #include <boost/foreach.hpp> 00009 #include <boost/algorithm/string/join.hpp> 00010 #include <boost/lexical_cast.hpp> 00011 00012 namespace tuttle { 00013 namespace host { 00014 00015 INode::~INode() {} 00016 00017 ImageEffectNode& INode::asImageEffectNode( ) 00018 { 00019 return dynamic_cast<ImageEffectNode&> ( *this ); 00020 } 00021 00022 const ImageEffectNode& INode::asImageEffectNode( ) const 00023 { 00024 return dynamic_cast<const ImageEffectNode&> ( *this ); 00025 } 00026 00027 std::string INode::getVersionStr() const 00028 { 00029 std::vector<int> vInt = getVersion(); 00030 std::vector<std::string> vStr; 00031 BOOST_FOREACH( const int v, vInt ) 00032 { 00033 vStr.push_back( boost::lexical_cast<std::string>(v) ); 00034 } 00035 return boost::algorithm::join( vStr, "." ); 00036 } 00037 00038 void INode::setProcessData( Data* data ) 00039 { 00040 _data = data; 00041 } 00042 00043 void INode::setProcessDataAtTime( DataAtTime* dataAtTime ) 00044 { 00045 TUTTLE_TLOG( TUTTLE_TRACE, "setProcessDataAtTime \"" << getName() << "\" at " << dataAtTime->_time ); 00046 _dataAtTime[dataAtTime->_time] = dataAtTime; 00047 } 00048 00049 void INode::clearProcessDataAtTime() 00050 { 00051 _dataAtTime.clear(); 00052 } 00053 00054 INode::Data& INode::getData() 00055 { 00056 if( !_data ) 00057 { 00058 BOOST_THROW_EXCEPTION( exception::Bug() 00059 << exception::dev("Process data not set.") 00060 << exception::nodeName( getName() ) ); 00061 } 00062 return *_data; 00063 } 00064 00065 const INode::Data& INode::getData() const 00066 { 00067 if( !_data ) 00068 { 00069 BOOST_THROW_EXCEPTION( exception::Bug() 00070 << exception::dev("Process data not set.") 00071 << exception::nodeName( getName() ) ); 00072 } 00073 return *_data; 00074 } 00075 00076 bool INode::hasData( const OfxTime time ) const 00077 { 00078 DataAtTimeMap::const_iterator it = _dataAtTime.find( time ); 00079 return it != _dataAtTime.end(); 00080 } 00081 00082 const INode::DataAtTime& INode::getData( const OfxTime time ) const 00083 { 00084 //TUTTLE_TLOG( TUTTLE_TRACE, "- INode::getData(" << time << ") of " << getName() ); 00085 DataAtTimeMap::const_iterator it = _dataAtTime.find( time ); 00086 if( it == _dataAtTime.end() ) 00087 { 00088 std::ostringstream ss; 00089 ss << "Defined times : "; 00090 BOOST_FOREACH( const DataAtTimeMap::value_type& v, _dataAtTime ) 00091 { 00092 ss << v.first << ", "; 00093 } 00094 BOOST_THROW_EXCEPTION( exception::Bug() 00095 << exception::dev() + "Process data at time not set.\n" 00096 + ss.str() 00097 << exception::nodeName( getName() ) 00098 //<< exception::pluginIdentifier( getPlugin().getIdentifier() ) 00099 << exception::time( time ) ); 00100 } 00101 return *it->second; 00102 } 00103 00104 INode::DataAtTime& INode::getData( const OfxTime time ) 00105 { 00106 return const_cast<DataAtTime&>( const_cast<const This*>(this)->getData(time) ); 00107 } 00108 00109 const INode::DataAtTime& INode::getFirstData() const 00110 { 00111 DataAtTimeMap::const_iterator it = _dataAtTime.begin(); 00112 if( it == _dataAtTime.end() ) 00113 { 00114 BOOST_THROW_EXCEPTION( exception::Bug() 00115 << exception::dev() + "Process data empty." 00116 << exception::nodeName( getName() ) ); 00117 } 00118 return *it->second; 00119 } 00120 00121 INode::DataAtTime& INode::getFirstData() 00122 { 00123 return const_cast<DataAtTime&>( const_cast<const This*>(this)->getFirstData() ); 00124 } 00125 00126 const INode::DataAtTime& INode::getLastData() const 00127 { 00128 DataAtTimeMap::const_reverse_iterator it = _dataAtTime.rbegin(); 00129 if( it == _dataAtTime.rend() ) 00130 { 00131 BOOST_THROW_EXCEPTION( exception::Bug() 00132 << exception::dev() + "Process data empty." 00133 << exception::nodeName( getName() ) ); 00134 } 00135 return *it->second; 00136 } 00137 00138 INode::DataAtTime& INode::getLastData() 00139 { 00140 return const_cast<DataAtTime&>( const_cast<const This*>(this)->getLastData() ); 00141 } 00142 00143 std::ostream& operator<<( std::ostream& os, const INode& v ) 00144 { 00145 return v.print(os); 00146 } 00147 00148 } 00149 }