bool RotoItem::setScriptName(const std::string & name) { ///called on the main-thread only assert( QThread::currentThread() == qApp->thread() ); if ( name.empty() ) { return false; } std::string cpy = NATRON_PYTHON_NAMESPACE::makeNameScriptFriendly(name); if ( cpy.empty() ) { return false; } RotoItemPtr existingItem = getContext()->getItemByName(name); if ( existingItem && (existingItem.get() != this) ) { return false; } std::string oldFullName = getFullyQualifiedName(); bool oldNameEmpty; { QMutexLocker l(&itemMutex); oldNameEmpty = _imp->scriptName.empty(); _imp->scriptName = cpy; } std::string newFullName = getFullyQualifiedName(); RotoContextPtr c = _imp->context.lock(); if (c) { if (!oldNameEmpty) { RotoStrokeItem* isStroke = dynamic_cast<RotoStrokeItem*>(this); ///Strokes are unsupported in Python currently if (!isStroke) { c->changeItemScriptName(oldFullName, newFullName); } } c->onItemScriptNameChanged( shared_from_this() ); } return true; }
void Node::declareAllPythonAttributes() { #ifdef NATRON_RUN_WITHOUT_PYTHON return; #endif try { declareNodeVariableToPython( getFullyQualifiedName() ); declarePythonKnobs(); declareTablePythonFields(); } catch (const std::exception& e) { qDebug() << e.what(); } }
void Node::removeParameterFromPython(const std::string& parameterName) { #ifdef NATRON_RUN_WITHOUT_PYTHON return; #endif if (getScriptName_mt_safe().empty()) { return; } PythonGILLocker pgl; std::string appID = getApp()->getAppIDString(); std::string nodeName; if (getIOContainer()) { nodeName = getIOContainer()->getFullyQualifiedName(); } else { nodeName = getFullyQualifiedName(); } std::string nodeFullName = appID + "." + nodeName; bool alreadyDefined = false; PyObject* nodeObj = NATRON_PYTHON_NAMESPACE::getAttrRecursive(nodeFullName, NATRON_PYTHON_NAMESPACE::getMainModule(), &alreadyDefined); assert(nodeObj); Q_UNUSED(nodeObj); if (!alreadyDefined) { qDebug() << QString::fromUtf8("removeParameterFromPython(): attribute ") + QString::fromUtf8( nodeFullName.c_str() ) + QString::fromUtf8(" is not defined"); throw std::logic_error(std::string("removeParameterFromPython(): attribute ") + nodeFullName + " is not defined"); } assert( PyObject_HasAttrString( nodeObj, parameterName.c_str() ) ); std::string script = "del " + nodeFullName + "." + parameterName; if ( !appPTR->isBackground() ) { getApp()->printAutoDeclaredVariable(script); } std::string err; if ( !NATRON_PYTHON_NAMESPACE::interpretPythonScript(script, &err, 0) ) { qDebug() << err.c_str(); } }
void Node::declarePythonKnobs() { #ifdef NATRON_RUN_WITHOUT_PYTHON return; #endif if (getScriptName_mt_safe().empty()) { return; } PythonGILLocker pgl; if ( !getGroup() ) { return; } std::locale locale; std::string nodeName; if (getIOContainer()) { nodeName = getIOContainer()->getFullyQualifiedName(); } else { nodeName = getFullyQualifiedName(); } std::string appID = getApp()->getAppIDString(); bool alreadyDefined = false; std::string nodeFullName = appID + "." + nodeName; PyObject* nodeObj = NATRON_PYTHON_NAMESPACE::getAttrRecursive(nodeFullName, NATRON_PYTHON_NAMESPACE::getMainModule(), &alreadyDefined); assert(nodeObj); Q_UNUSED(nodeObj); if (!alreadyDefined) { qDebug() << QString::fromUtf8("declarePythonKnobs(): attribute ") + QString::fromUtf8( nodeFullName.c_str() ) + QString::fromUtf8(" is not defined"); throw std::logic_error(std::string("declarePythonKnobs(): attribute ") + nodeFullName + " is not defined"); } std::stringstream ss; #ifdef DEBUG ss << "if not " << nodeFullName << ":\n"; ss << " print \"[BUG]: " << nodeFullName << " is not defined!\"\n"; #endif const KnobsVec& knobs = getKnobs(); for (U32 i = 0; i < knobs.size(); ++i) { const std::string& knobName = knobs[i]->getName(); if ( !knobName.empty() && (knobName.find(" ") == std::string::npos) && !std::isdigit(knobName[0], locale) ) { if ( PyObject_HasAttrString( nodeObj, knobName.c_str() ) ) { continue; } ss << nodeFullName << "." << knobName << " = "; ss << nodeFullName << ".getParam(\"" << knobName << "\")\n"; } } std::string script = ss.str(); if ( !script.empty() ) { if ( !appPTR->isBackground() ) { getApp()->printAutoDeclaredVariable(script); } std::string err; std::string output; if ( !NATRON_PYTHON_NAMESPACE::interpretPythonScript(script, &err, &output) ) { qDebug() << err.c_str(); } } } // Node::declarePythonFields