void TrackMarker::resetTrack() { Point curCenter; KnobDoublePtr centerKnob = getCenterKnob(); curCenter.x = centerKnob->getValue(); curCenter.y = centerKnob->getValue(DimIdx(1)); const KnobsVec& knobs = getKnobs(); for (KnobsVec::const_iterator it = knobs.begin(); it != knobs.end(); ++it) { if (*it != centerKnob) { (*it)->resetToDefaultValue(DimSpec::all(), ViewSetSpec::all()); } else { (*it)->removeAnimation(ViewSetSpec::all(), DimSpec::all(), eValueChangedReasonUserEdited); std::vector<double> values(2); values[0] = curCenter.x; values[1] = curCenter.y; centerKnob->setValueAcrossDimensions(values); } } removeAnimation(ViewSetSpec::all(), DimSpec::all(), eValueChangedReasonUserEdited); }
void TrackMarker::resetTrack() { Point curCenter; KnobDoublePtr knob = getCenterKnob(); curCenter.x = knob->getValue(0); curCenter.y = knob->getValue(1); EffectInstancePtr effect = getContext()->getNode()->getEffectInstance(); effect->beginChanges(); const KnobsVec& knobs = getKnobs(); for (KnobsVec::const_iterator it = knobs.begin(); it != knobs.end(); ++it) { if (*it != knob) { for (int i = 0; i < (*it)->getDimension(); ++i) { (*it)->resetToDefaultValue(i); } } else { for (int i = 0; i < (*it)->getDimension(); ++i) { (*it)->removeAnimation(ViewSpec::current(), i); } knob->setValue(curCenter.x, ViewSpec::current(), 0); knob->setValue(curCenter.y, ViewSpec::current(), 1); } } effect->endChanges(); removeAllUserKeyframes(); }
void TrackMarker::load(const TrackSerialization& serialization) { QMutexLocker k(&_imp->trackMutex); _imp->trackLabel = serialization._label; _imp->trackScriptName = serialization._scriptName; const KnobsVec& knobs = getKnobs(); for (std::list<KnobSerializationPtr>::const_iterator it = serialization._knobs.begin(); it != serialization._knobs.end(); ++it) { for (KnobsVec::const_iterator it2 = knobs.begin(); it2 != knobs.end(); ++it2) { if ( (*it2)->getName() == (*it)->getName() ) { (*it2)->blockValueChanges(); (*it2)->clone( (*it)->getKnob() ); (*it2)->unblockValueChanges(); break; } } } for (std::list<int>::const_iterator it = serialization._userKeys.begin(); it != serialization._userKeys.end(); ++it) { _imp->userKeyframes.insert(*it); } }
void TrackMarker::clone(const TrackMarker& other) { TrackMarkerPtr thisShared = shared_from_this(); TrackerContextPtr context = getContext(); context->s_trackAboutToClone(thisShared); { QMutexLocker k(&_imp->trackMutex); _imp->trackLabel = other._imp->trackLabel; _imp->trackScriptName = other._imp->trackScriptName; _imp->userKeyframes = other._imp->userKeyframes; _imp->enabled = other._imp->enabled; const KnobsVec& knobs = getKnobs(); KnobsVec::const_iterator itOther = other.getKnobs().begin(); for (KnobsVec::const_iterator it = knobs.begin(); it != knobs.end(); ++it, ++itOther) { (*it)->clone(*itOther); } } context->s_trackCloned(thisShared); }
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