【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
Reference
이 문제에 관하여(【MAYA】한 인스턴스의 형제 노드를 선택한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/harayoki/items/0bd4669b3ece5763819b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
상위 인스턴스는 검색 후 선택에서 제외됩니다.
부모도 함께 선택하고 싶다 -> 다른 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
Reference
이 문제에 관하여(【MAYA】한 인스턴스의 형제 노드를 선택한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/harayoki/items/0bd4669b3ece5763819b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
Reference
이 문제에 관하여(【MAYA】한 인스턴스의 형제 노드를 선택한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/harayoki/items/0bd4669b3ece5763819b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)