// ------------------------------------------------------
    // Unlike Maya's default behavior, we want to consider set membership to be inheritable
    bool SetHelper::isMemberOfSet ( const MDagPath& dagPath, MFnSet& Set )
    {
        if ( Set.isMember ( dagPath ) )
        {
            return true;
        }

        else
        {
            MFnDagNode dagNode ( dagPath );
            MSelectionList setMembers;
            Set.getMembers ( setMembers, true );

            for ( unsigned int i = 0; i < setMembers.length(); ++i )
            {
                MObject memberObject;

                if ( setMembers.getDependNode ( i, memberObject ) )
                {
                    if ( dagNode.isChildOf ( memberObject ) )
                    {
                        return true;
                    }
                }
            }
        }

        return false;
    }
Example #2
0
MObject createShadingGroup(const MString& iName)
{
    MStatus status;

    MFnSet fnSet;
    MSelectionList selList;
    MObject shadingGroup = fnSet.create(selList,
                                        MFnSet::kRenderableOnly,
                                        &status);
    if (status != MS::kSuccess)
    {
        MString theError("Could not create shading engine: ");
        theError += iName;
        MGlobal::displayError(theError);

        return shadingGroup;
    }

    fnSet.setName(iName);

    return shadingGroup;
}
MStatus AlembicAssignFacesetCommand::doIt(const MArgList& args)
{
  ESS_PROFILE_SCOPE("AlembicAssignFacesetCommand::doIt");

  MStatus status;
  MArgParser argData(syntax(), args, &status);

  if (argData.isFlagSet("help"))
  {
    MGlobal::displayInfo("[ExocortexAlembic]: ExocortexAlembic_assignFaceset command:");
    MGlobal::displayInfo("                    -a : attribute of the shape with the faceset indices");
    MGlobal::displayInfo("                    -m : mesh to assign the faceset on");
    //MGlobal::displayInfo("                    -s : set to assign the faceset on");
    return MS::kSuccess;
  }

  /*
  if (!argData.isFlagSet("xset"))
  {
    MGlobal::displayError("[ExocortexAlembic]: ExocortexAlembic_assignFaceSets command missing set");
    return MS::kFailure;
  }
  //*/

  if (!argData.isFlagSet("attribute"))
  {
    MGlobal::displayError("[ExocortexAlembic]: ExocortexAlembic_assignFaceSets command missing attribute");
    return MS::kFailure;
  }

  if (!argData.isFlagSet("mesh"))
  {
    MGlobal::displayError("[ExocortexAlembic]: ExocortexAlembic_assignFaceSets command missing mesh");
    return MS::kFailure;
  }

  // load the mesh!
  MString argstr;
  MSelectionList sl;
  argstr = argData.flagArgumentString("mesh", 0);
  sl.add(argstr);
  MDagPath dagp;
  sl.getDagPath(0, dagp);
  MFnMesh fnMesh(dagp, &status);
  if (status != MS::kSuccess)
  {
    MGlobal::displayError("invalid mesh shape");
    return MS::kFailure;
  }

  // check if the attribute is valid
  argstr = argData.flagArgumentString("attribute", 0);
  MObject attr = fnMesh.attribute(argstr);
  MFnAttribute mfnAttr(attr);
  MPlug plug = fnMesh.findPlug(attr, true);

  if (!mfnAttr.isReadable() || plug.isNull())
  {
    MGlobal::displayError("invalid attribute");
    return MS::kFailure;
  }

  MFnIntArrayData arr(plug.asMObject(), &status);   // read the attribute
  if (status != MS::kSuccess || arr.length() == 0)
  {
    MGlobal::displayError("invalid attribute");
    return MS::kFailure;
  }

  {
    MObject oMesh = fnMesh.object();
    MSelectionList faces;
    int pol_idx = 0, facesetIdx = 0;
    for (MItMeshPolygon iter(oMesh); !iter.isDone(); iter.next(), ++pol_idx)
    {
      if (pol_idx == arr[facesetIdx])
      {
        faces.add(iter.currentItem());
        ++facesetIdx;

        if (facesetIdx == arr.length())
          break;
      }
    }

    MFnSet fnSet;
    MObject oSet = fnSet.create(sl, MFnSet::kFacetsOnly, &status);
    if (!status)
    {
      MGlobal::displayError("invalid set: " + status.errorString());
      return MS::kFailure;
    }
    setResult(fnSet.name());
  }
  return MS::kSuccess;
}