В Maya, как я могу удалить с помощью python некоторый объект в узле Mash / Repro? - PullRequest
0 голосов
/ 06 октября 2018

В моем узле есть 56 объектов.

Я перечислил все атрибуты этого узла, но не могу понять, как удалить один (или все) объект, чтобы заменить их другим..

Существуют некоторые атрибуты, такие как: instancedGroup.instancedMesh, но нет значения / типа, которые я могу найти для доступа к нему.

введите описание изображения здесь

1 Ответ

0 голосов
/ 08 октября 2018

Довольно сложный: (* ​​1001 * РЕДАКТИРОВАТЬ: решение для удаления всех внизу )

если вы перейдете к этому файлу Python (я нашел этот модуль, включив echo all, при удаленииitem):

print(mash_repro_aetemplate.__file__)

Вы найдете скрипт месива и фрагменты, где они вызывают пользовательский интерфейс.

import maya.OpenMayaUI as mui
from shiboken2 import wrapInstance 

usingPyside2 = False
try:
    import PySide2
    usingPyside2 = True
except:
    pass
from flux.imports import *
from flux.core import pix
import flux.core as fx

import mash_repro_utils
from mash_repro_icons import MASH_REPRO_ICONS

from functools import partial
import MASH.undo as undo

def get_maya_window():
    ptr = mui.MQtUtil.mainWindow()
    if ptr is not None:
        return wrapInstance(long(ptr), qt.QMainWindow)

def refresh_all_aetemplates(force=False):
    """ Refresh all the repro aetemplates"""
    widgets = get_maya_window().findChildren(AEMASH_ReproTemplate) or []
    for widget in widgets:
        global SCENE_OPENED
        SCENE_OPENED = True
        widget.update_data(widget.node, force=force)
        SCENE_OPENED = False

вот способ найти узел repro:

widgets = get_maya_window().findChildren(qt.QWidget, 'AEMASH_ReproTemplate') or []
myRepro = widgets[0]

'myRepro' теперь является классом узла reph mash.

Qtreewidget, представляющий ваши узлы:

myRepro.objs_widget

, который вы можете использовать из этого другого класса, производного от qtree:

# work only on selection, if you want to modify this command, maybe create your own add_sel_bjects(self, objs=[])
myRepro.objs_widget.add_objects()


# work only on the selection in the qtree widget
myRepro.objs_widget.delete_item()

# you can use qtree functions instead :
# myRepro.objs_widget.clear()
items_count = myRepro.objs_widget.topLevelItemCount()

В методах delete_item есть это

mash_repro_utils.remove_mesh_group(myRepro.objs_widget.node, id)
mash_repro_utils.remove_proxy_group(self.node, self.instance_index, id)

Я не успел исследовать, но оттуда вы обнаружите:

print(mash_repro_utils.__file__)
# Result: 'maya_path/plug-ins/MASH/scripts/mash_repro_utils.py' # 

Идите туда, и там есть все функции mash Mai Python:

def remove_proxy_group(mash_repro_node, instance_index, index):
    """
    Remove a proxy object from the Repro node

    :param mash_repro_node: MASH Repro node
    :param instance_index: Object index
    :param index: Proxy index
    :return: None
    """
    with ReproUpdating(mash_repro_node):
        data = get_data_layout(mash_repro_node)
        indices = data[instance_index]['proxies'].keys()
        indices.sort()
        if index in indices:
            position = indices.index(index)
            for i in range(position, len(indices)):
                clean_proxy_index(mash_repro_node, instance_index, indices[i])
            for i in range(position + 1, len(indices)):
                if 'group' in data[instance_index]['proxies'][indices[i]]:
                    new_index = connect_proxy_group(mash_repro_node, data[instance_index]['proxies'][indices[i]]['group'], instance_index)
                    maya.cmds.setAttr("%s.instancedGroup[%d].proxyGroup[%d].proxyLod" % (mash_repro_node, instance_index, new_index), data[instance_index]['proxies'][indices[i]]['proxyLod'])
                    hasMASHFlag = maya.cmds.objExists('%s.mashOutFilter' % (data[instance_index]['proxies'][indices[i]]['group']))
                    if hasMASHFlag:
                        maya.cmds.deleteAttr( data[instance_index]['proxies'][indices[i]]['group'], at='mashOutFilter' )

Вы должны быть в состоянии исследовать оттуда.

Вы можете просто сделать свой собственный delete_all, например так:

items_count = myRepro.objs_widget.topLevelItemCount()
for id in sorted(range(items_count), reverse=True):
    mash_repro_utils.remove_mesh_group(myRepro.objs_widget.node, id)
    myRepro.objs_widget.obj_dropped.emit(None)
...