bool UsdRelationship::SetTargets(const SdfPathVector& targets) const { SdfPathVector mappedPaths; mappedPaths.reserve(targets.size()); for (const SdfPath &target: targets) { std::string errMsg; mappedPaths.push_back(_GetTargetForAuthoring(target, &errMsg)); if (mappedPaths.back().IsEmpty()) { TF_CODING_ERROR("Cannot set target <%s> on relationship <%s>: %s", target.GetText(), GetPath().GetText(), errMsg.c_str()); return false; } } // NOTE! Do not insert any code that modifies scene description between the // changeblock and the call to _CreateSpec! Explanation: _CreateSpec calls // code that inspects the composition graph and then does some authoring. // We want that authoring to be inside the change block, but if any scene // description changes are made after the block is created but before we // call _CreateSpec, the composition structure may be invalidated. SdfChangeBlock block; SdfRelationshipSpecHandle relSpec = _CreateSpec(); if (!relSpec) return false; relSpec->GetTargetPathList().ClearEditsAndMakeExplicit(); for (const SdfPath &path: mappedPaths) { relSpec->GetTargetPathList().Add(path); } return true; }
bool UsdRelationship::ClearTargets(bool removeSpec) const { // NOTE! Do not insert any code that modifies scene description between the // changeblock and the call to _CreateSpec! Explanation: _CreateSpec calls // code that inspects the composition graph and then does some authoring. // We want that authoring to be inside the change block, but if any scene // description changes are made after the block is created but before we // call _CreateSpec, the composition structure may be invalidated. SdfChangeBlock block; SdfRelationshipSpecHandle relSpec = _CreateSpec(); if (!relSpec) return false; if (removeSpec){ SdfPrimSpecHandle owner = TfDynamic_cast<SdfPrimSpecHandle>(relSpec->GetOwner()); owner->RemoveProperty(relSpec); } else { relSpec->GetTargetPathList().ClearEdits(); } return true; }
bool UsdRelationship::RemoveTarget(const SdfPath& target) const { std::string errMsg; const SdfPath targetToAuthor = _GetTargetForAuthoring(target, &errMsg); if (targetToAuthor.IsEmpty()) { TF_CODING_ERROR("Cannot remove target <%s> from relationship <%s>: %s", target.GetText(), GetPath().GetText(), errMsg.c_str()); return false; } // NOTE! Do not insert any code that modifies scene description between the // changeblock and the call to _CreateSpec! Explanation: _CreateSpec calls // code that inspects the composition graph and then does some authoring. // We want that authoring to be inside the change block, but if any scene // description changes are made after the block is created but before we // call _CreateSpec, the composition structure may be invalidated. SdfChangeBlock block; SdfRelationshipSpecHandle relSpec = _CreateSpec(); if (!relSpec) return false; relSpec->GetTargetPathList().Remove(targetToAuthor); return true; }
bool UsdRelationship::BlockTargets() const { // NOTE! Do not insert any code that modifies scene description between the // changeblock and the call to _CreateSpec! Explanation: _CreateSpec calls // code that inspects the composition graph and then does some authoring. // We want that authoring to be inside the change block, but if any scene // description changes are made after the block is created but before we // call _CreateSpec, the composition structure may be invalidated. SdfChangeBlock block; SdfRelationshipSpecHandle relSpec = _CreateSpec(); if (!relSpec) return false; relSpec->GetTargetPathList().ClearEditsAndMakeExplicit(); return true; }