UsdGeomXformOp UsdGeomXformable::AddXformOp( UsdGeomXformOp::Type const opType, UsdGeomXformOp::Precision const precision, TfToken const &opSuffix, bool isInverseOp) const { VtTokenArray xformOpOrder; _GetXformOpOrderValue(&xformOpOrder); // Check if the xformOp we're about to add already exists in xformOpOrder TfToken opName = UsdGeomXformOp::GetOpName(opType, opSuffix, isInverseOp); VtTokenArray::iterator it = std::find(xformOpOrder.begin(), xformOpOrder.end(), opName); if (it != xformOpOrder.end()) { TF_CODING_ERROR("The xformOp '%s' already exists in xformOpOrder [%s].", opName.GetText(), TfStringify(xformOpOrder).c_str()); return UsdGeomXformOp(); } TfToken const &xformOpAttrName = UsdGeomXformOp::GetOpName(opType, opSuffix); UsdGeomXformOp result; if (UsdAttribute xformOpAttr = GetPrim().GetAttribute(xformOpAttrName)) { // Check if the attribute's typeName has the requested precision level. UsdGeomXformOp::Precision existingPrecision = UsdGeomXformOp::GetPrecisionFromValueTypeName( xformOpAttr.GetTypeName()); if (existingPrecision != precision) { TF_CODING_ERROR("XformOp <%s> has typeName '%s' which does not " "match the requested precision '%s'. Proceeding to " "use existing typeName / precision.", xformOpAttr.GetPath().GetText(), xformOpAttr.GetTypeName().GetAsToken().GetText(), TfEnum::GetName(precision).c_str()); } result = UsdGeomXformOp(xformOpAttr, isInverseOp); } else { result = UsdGeomXformOp(GetPrim(), opType, precision, opSuffix, isInverseOp); } if (result) { xformOpOrder.push_back(result.GetOpName()); CreateXformOpOrderAttr().Set(xformOpOrder); } else { TF_CODING_ERROR("Unable to add xform op of type %s and precision %s on " "prim at path <%s>. opSuffix=%s, isInverseOp=%d", TfEnum::GetName(opType).c_str(), TfEnum::GetName(precision).c_str(), GetPath().GetText(), opSuffix.GetText(), isInverseOp); return UsdGeomXformOp(); } return result; }
static TfToken _GetOpName(const UsdGeomXformOp &self) { return self.GetOpName(); }