【问题标题】:How to use Maya-MEL command "select" in c++如何在 C++ 中使用 Maya-MEL 命令“选择”
【发布时间】:2020-12-09 13:04:20
【问题描述】:

我想知道如何在 Maya-MEL 中使用“选择”。 问题是: 当我使用该软件选择一个blendshape对象(这里是FBX格式的一双眼睛),我可以通过多种方式选择它,例如“select -r |eye|eye”,“select eye_blendShapes”,“select eyeShape” "选择眼睛|眼睛"... just like this

但是,在我的 c++ 程序中它不能工作

MGlobal::executeCommand(MString("file -import -namespace \"NTemp\" -mergeNamespacesOnClash true") + "\"" + eye_file + "\"");
//MGlobal::executeCommand(MString("file -import ") + "\"" + eye_file + "\"",result);
MGlobal::executeCommand(MString("select -r eyeShape"));

我不知道如何在我的 C++ 代码中选择眼睛,有人可以帮助我吗? 非常感谢!

【问题讨论】:

标签: c++ maya mel maya-api


【解决方案1】:

你应该使用那个 python 代码

import maya.OpenMaya as om

object_name = ""
om.MGlobal.selectByName(object_name, om.MGlobal.kReplaceList)

c++代码几乎一样

【讨论】:

  • 请不要用 Python 代码回答 C++ 问题。
  • @Dominique 很像,就像c++ MString name = ""; MGlobal::selectByName(name, MGlobal::kReplaceList);
  • 我同意多米尼克的观点。 Maya C++ API 与 MEL/python 完全不同。仅仅因为 API 绑定存在于 python 中,并不意味着使用它们是一个好主意。在python中选择节点的正确方法是使用cmds.select。如您的示例所示,通过 API 进行选择是许多错误的根源:(
【解决方案2】:

API 的工作方式与 MEL 略有不同。首先,与其执行文件命令,不如使用MFileIO 接口。

在 C++ 中选择东西,嗯,不要!?!

选择是用户驱动的操作。如果你发出命令来修改 C++ 中的选择列表,那你就错了!

  1. 确定实际选择该项目吗?您实际上只是想获取对象的 Object 或 MDagPath 吗?如果是后者,则使用 MSelectionList 执行选择,并在不修改全局选择列表的情况下查询结果(这会导致显示刷新,并存储额外的撤消步骤,并且会很快惹恼您的用户!)
MSelectionList sl;
if(sl.add("eyeShape")) {
  MObject eyeShape;
  sl.getDependNode(0, eyeShape);

  /* do thing */
}
  1. 绝对确定要选择eyeShape 吗?如果我看到有人在 C++ (或 MEL 中选择一个节点!),我会有点担心。我会冒险猜测eyeShape 是 Maya 中网格的一个非常常见的名称!

一)。你确定选择的形状是正确的吗? DAG 路径呢?您是要选择 eyeShape 的每个实例,还是只关心单个实例?

b)。既然你刚刚将文件导入到命名空间,你为什么 没有使用您定义的命名空间来限定您尝试选择的内容?如果 您的用户已经在场景中有一个角色,具有 eyeShape, 您的选择命令将首先返回该节点。您的 导入的形状将第二个返回。结果:你可能有错误?

  1. 因此,如果您确定选择 eyeShape 是正确的做法,则可以修改全局选择列表来执行此操作。请更喜欢 MGlobal::selectCommand 而不是 MGlobal::select/selectByName。这只是意味着您的用户可以撤消操作。

  2. 如果您这样做是因为您将在之后立即发出另一个 MEL 调用,该调用在 eyeShape 上运行(例如,您是否要将一些 MEL 代码移植到 MPxCommand 中?)。停止。只需使用 MEL。

"select -r |eye|eye" --> MSelectionList::add(MDagPath(), kReplaceList)
"select eye_blendShapes" --> MSelectionList::add(MString(), kAddList)
"select eyeShape" --> MSelectionList::add(MObject()/MString(), kAddList)
"select eye|eye" --> MSelectionList::add(MObject()/MString(), kAddList)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2014-04-25
    • 2010-10-06
    相关资源
    最近更新 更多