MStatus AttributeParser::parseAttribute(MFnDependencyNode & node, MObject & attr) { MStatus status; MFnAttribute fnAttr(attr, &status); if (!status) return status; MString attrName = fnAttr.name(&status); if (!status) return status; if (attr.hasFn(MFn::kCompoundAttribute)) { // TODO } else if (attr.hasFn(MFn::kEnumAttribute)) { // TODO } else if (attr.hasFn(MFn::kGenericAttribute)) { // TODO } else if (attr.hasFn(MFn::kLightDataAttribute)) { // TODO } else if (attr.hasFn(MFn::kMatrixAttribute)) { // TODO } else if (attr.hasFn(MFn::kMessageAttribute)) { // TODO } else if (attr.hasFn(MFn::kNumericAttribute)) { return parseNumericAttribute(node, attr); } else if (attr.hasFn(MFn::kTypedAttribute)) { return parseTypedAttribute(node, attr); } else if (attr.hasFn(MFn::kUnitAttribute)) { // TODO } return MS::kSuccess; }
void AttributeParser::parseAttribute(MFnDependencyNode & node, MObject & attr, std::set<String>& parsedAttributes) { AutoOnAfterAttribute onAfterAttribute(*this, node, attr); if (!onBeforeAttribute(node, attr)) { // Skip attribute return; } MStatus status; MFnAttribute fnAttr(attr, &status); if (!status) return; MString attrName = fnAttr.name(&status); if (!status) return; // First handle numeric compound types MFnNumericData::Type type; if (IsNumericCompoundAttribute(attr, type)) { MPlug plug = node.findPlug(attr, &status); if (!status) return; parseNumeric(plug, type); // Mark children as parsed MFnCompoundAttribute fnCompoundAttribute(attr, &status); if (!status) return; unsigned int numChildren = fnCompoundAttribute.numChildren(&status); if (!status) return; for (unsigned int i = 0; i < fnCompoundAttribute.numChildren(); ++i) { MObject child = fnCompoundAttribute.child(i, &status); if (!status) return; MFnAttribute childFnAttr(child); parsedAttributes.insert(childFnAttr.name().asChar()); } } // Other cases else if (attr.hasFn(MFn::kCompoundAttribute)) { parseCompoundAttribute(node, attr, parsedAttributes); } else if (attr.hasFn(MFn::kEnumAttribute)) { parseEnumAttribute(node, attr); } else if (attr.hasFn(MFn::kGenericAttribute)) { // TODO } else if (attr.hasFn(MFn::kLightDataAttribute)) { // TODO } else if (attr.hasFn(MFn::kMatrixAttribute)) { parseMatrixAttribute(node, attr); } else if (attr.hasFn(MFn::kMessageAttribute)) { parseMessageAttribute(node, attr); } else if (attr.hasFn(MFn::kNumericAttribute)) { parseNumericAttribute(node, attr); } else if (attr.hasFn(MFn::kTypedAttribute)) { parseTypedAttribute(node, attr); } else if (attr.hasFn(MFn::kUnitAttribute)) { parseUnitAttribute(node, attr); } }