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::SetTargets(const SdfPathVector& targets) const { SdfPathVector mappedPaths; mappedPaths.reserve(targets.size()); BOOST_FOREACH(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; } }