【MAYA】 어느 인스턴스의 부모를 선택 상태로 한다

9284 단어 파이썬maya
이전 게시물의 조사를 바탕으로 인스턴스를 선택하고 실행하면 상위 인스턴스를 다시 선택하는 코드를 만들어 보았으므로 붙여 둡니다. (실제는 인스턴스는 부모도 자식도 없고 모두 형제 같은데, 알기 쉽게 표현하고 있습니다.)
스크립트 편집기에 붙여넣기 위한 것입니다. 선반에 등록하면 편하게 사용할 수 있다고 생각합니다.
MAYA2018 + MacOS Sierra에서 작동 확인 중입니다.

사용법


  • 노드를 선택 상태로 만듭니다. 대상으로서는 인스턴스 메쉬 그 자체, 또는 그 부모 변환이 됩니다.
  • 스크립트를 실행합니다.
  • 상위 인스턴스 노드가 있으면 선택 상태가 됩니다. 그렇지 않으면 오류 메시지가 표시됩니다.


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


    상위 인스턴스의 상위 변환이 선택됩니다.


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


    상위 인스턴스 자체가 선택됩니다.


    자신이 부모인 경우에도 메시지가 표시됩니다.


    그룹의 인스턴스 상태 등에도 대응합니다.


    인스턴스가 없는 경우의 오류.

    지원되지 않는 패턴



    선택 노드의 직접 자녀 중 인스턴스가 없는 경우. 트리를 재귀적으로 탐색하지 않습니다.

    빠른 실행 코드


    import pymel.core as pm
    
    
    def get_first_instance(node):
        """
        インスタンスの親(=0番目のインスタンス)を得る
    
        :param node: 親を探すインスタンスノード参照
        :type node: pymel.nodetypes.DagNode
        :return: 見つかった親ノードとエラー情報ストリング
        :rtype: tuple 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.getOtherInstances()
        instance_number = node.instanceNumber()
        if instance_number == 0:
            return org_node, 'ノード自身が親です。'
        found = None
        for ins_node in instances:
            if ins_node.instanceNumber() == 0:
                found = ins_node
                break
        if found is not None:
            if target_is_children:
                parents = pm.listRelatives(found, parent=True)
                return parents[0], None
            else:
                return found, None
        return None, '親インスタンスが見つかりません。'
    
    
    def select_first_instance():
        selected = pm.selected()
        if len(selected) == 0:
            pm.confirmDialog(title='Info', message='ノードを選択して下さい。', button=['Ok'])
            return
        node = selected[0]
        first_node, error_info = get_first_instance(node)
        if error_info is not None:
            pm.confirmDialog(title='Info', message=error_info, button=['Ok'])
        if first_node is not None:
            print first_node
            pm.select(first_node)
    
    
    select_first_instance()
    del select_first_instance
    del get_first_instance
    

    좋은 웹페이지 즐겨찾기