Maya - выделение объектов в окне просмотра через Python - PullRequest
2 голосов
/ 04 апреля 2019

Кто-нибудь может мне помочь?Можно ли сделать скрипт на Python для автоматического выбора каждого объекта в окне просмотра Maya?

Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 04 апреля 2019

Это очень возможно, хотя вы должны использовать API Майи, чтобы сделать это.Вы можете использовать OpenMayaUI.MDrawTraversal, чтобы собрать все объекты в пределах камеры.

Это может показаться более длинным, чем при использовании OpenMaya.MGlobal.selectFromScreen, но дает вам несколько преимуществ:

  1. Вы можете сделать это на любой камере, несмотря на то, что она не используется в качестве активного вида.
  2. Вы можете выполнять все, что вам нужно, все делать в памяти без выбора и принудительного перерисовки.
  3. OpenMaya.MGlobal.selectFromScreen будет зависеть от интерфейса, что означает, что его невозможно выполнить в пакетных заданиях Maya.Это будет работать в любом случае.

Тем не менее, вот пример, который создаст несколько случайных блоков, создаст камеру, смотрящую на них, затем выберет все поля, которые находятся в поле зрения камеры:

import random

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya
import maya.OpenMayaUI as OpenMayaUI


# Create a new camera.
cam, cam_shape = cmds.camera()
cmds.move(15, 10, 15, cam)
cmds.rotate(-25, 45, 0, cam)
cmds.setAttr("{}.focalLength".format(cam), 70)
cmds.setAttr("{}.displayCameraFrustum".format(cam), True)

# Create a bunch of boxes at random positions.
val = 10
for i in range(50):
    new_cube, _ = cmds.polyCube()
    cmds.move(random.uniform(-val, val), random.uniform(-val, val), random.uniform(-val, val), new_cube)

# Add camera to MDagPath.
mdag_path = OpenMaya.MDagPath()
sel = OpenMaya.MSelectionList()
sel.add(cam)
sel.getDagPath(0, mdag_path)

# Create frustum object with camera.
draw_traversal = OpenMayaUI.MDrawTraversal()
draw_traversal.setFrustum(mdag_path, cmds.getAttr("defaultResolution.width"), cmds.getAttr("defaultResolution.height"))  # Use render's resolution.
draw_traversal.traverse()  # Traverse scene to get all objects in the camera's view.

frustum_objs = []

# Loop through objects within frustum.
for i in range(draw_traversal.numberOfItems()):
    # It will return shapes at first, so we need to fetch its transform.
    shape_dag_path = OpenMaya.MDagPath()
    draw_traversal.itemPath(i, shape_dag_path)
    transform_dag_path = OpenMaya.MDagPath()
    OpenMaya.MDagPath.getAPathTo(shape_dag_path.transform(), transform_dag_path)

    # Get object's long name and make sure it's a valid transform.
    obj = transform_dag_path.fullPathName()
    if cmds.objExists(obj):
        frustum_objs.append(obj)


# At this point we have a list of objects that we can filter by type and do whatever we want.
# In this case just select them.
cmds.select(frustum_objs)

Надеюсь, что это даст вам лучшее направление.

3 голосов
/ 04 апреля 2019

вы можете попробовать следующий скрипт

import maya.OpenMaya as om
import maya.OpenMayaUI as omUI
view = omUI.M3dView.active3dView()
om.MGlobal.selectFromScreen( 0, 0, view.portWidth(), view.portHeight(),om.MGlobal.kReplaceList)

Я нашел этот фрагмент на https://forums.cgsociety.org/t/list-objects-in-viewport/1463426,, и, похоже, он добился цели.Вы можете прочитать обсуждение для получения дополнительной информации

...