【MAYA】한 인스턴스의 형제 노드를 선택한다

10329 단어 파이썬maya
또한 계속됩니다. 인스턴스를 선택하고 실행하면 형제 인스턴스를 다시 선택하는 코드도 만들어 보았습니다.
여기서 말하는 형제 인스턴스란, 인스턴스의 동료 중, 부모 인스턴스를 제외한 것입니다.
스크립트 편집기에 붙여넣기 위한 것입니다. 선반에 등록하면 편하게 사용할 수 있다고 생각합니다.
MAYA2018 + MacOS Sierra에서 작동 확인 중입니다.

사용법



1. 노드를 선택 상태로 만듭니다. 대상으로서는 인스턴스 메쉬 그 자체, 또는 그 부모 변환이 됩니다.
2.Script를 실행합니다.
3. 형제 인스턴스 노드가 있으면 선택 상태가 됩니다. 상위 노드는 선택 대상이 아닙니다. 선택해야 할 항목이 없으면 오류 메시지가 표시됩니다.


먼저 인스턴스의 상위 변환이 선택되면,


형제 인스턴스의 상위 변환이 선택됩니다. (자신도 선택한 채.)


먼저 인스턴스 자체가 선택되면,


형제 인스턴스도 그 자체가 선택됩니다. (자신도 선택한 채.)


상위 인스턴스를 선택하면,


형제 인스턴스가 다시 선택됩니다. (부모의 선택은 해제된다.)


상위 인스턴스 하나와 하위 인스턴스 하나만 있는 경우 상위 인스턴스를 선택하고 처리를 실행하면 하위 인스턴스로 선택이 이동합니다. 하위 인스턴스를 선택하고 처리를 수행하면 선택이 유지되고 아무 일도 일어나지 않습니다.


인스턴스를 찾을 수 없으면 오류가 발생합니다.

지원되지 않는 패턴



상위 인스턴스는 검색 후 선택에서 제외됩니다.
부모도 함께 선택하고 싶다 -> 다른 script로 부모를 찾아서 수동으로 추가 선택하십시오.

자신은 탐색 후 선택 대상에 포함됩니다.
자신은 형제와 함께 선택하고 싶지 않다 -> 수동으로 추가 선택 해제하십시오.

UI를 만들면 여러가지 패턴에 대응할 수 있습니다만, 거기까지 해내면 ​​힘들기 때문에… (이므로 퀵 실행용 코드라고 하는 표현을 하고 있다.)

빠른 실행 코드


import pymel.core as pm


def get_instance_siblings(node, exclude_first_instance=True):
    """
    インスタンスの兄弟を得る

    :param node: 兄弟を探すインスタンスノード参照
    :type node: pymel.nodetypes.DagNode
    :param exclude_first_instance: 親インスタンスを除くか
    :type exclude_first_instance: bool
    :return: 見つかった兄弟ノードとエラー情報ストリング
    :rtype: tuple of (list of DagNode) and str
    """
    org_node = node
    target_is_children = False
    is_instanced = node.isInstanced()
    if not is_instanced:
        # 選択がインスタンスでない場合は子供を探す
        target_is_children = True
        children = pm.listRelatives(node)
        node = None
        for child_node in children:
            if child_node.isInstanced():
                node = child_node
                break
        if node is None:
            return None, '対象インスタンスが見つかりません。'
    instances = node.getInstances()
    if exclude_first_instance:
        instances = [x for x in instances if x.instanceNumber() != 0]
    if target_is_children:
        instances_ = []
        for ins_node in instances:
            parents = pm.listRelatives(ins_node, parent=True)
            if len(parents) == 1:
                instances_.append(parents[0])
        instances = instances_
    if len(instances) == 0:
        return [], '兄弟インスタンスが存在しません。'
    return instances, None


def select_instance_siblings():
    selected = pm.selected()
    if len(selected) == 0:
        pm.confirmDialog(title='Info', message='ノードを選択して下さい。', button=['Ok'])
        return
    node = selected[0]
    siblings, error_info = get_instance_siblings(node)
    if error_info is not None:
        pm.confirmDialog(title='Info', message=error_info, button=['Ok'])
    if siblings is not None:
        for sibling in siblings:
            print (sibling)
        pm.select(siblings)


select_instance_siblings()
del select_instance_siblings
del get_instance_siblings

좋은 웹페이지 즐겨찾기