【MAYA】あるインスタンスの親を選択状態にする

前の投稿の調査を元にインスタンスを選択して実行すると親インスタンスを選択し直すコードを作ってみたので貼っておきます。(実際はインスタンスは親も子もなくて全て兄弟ぽいのですが、わかりやすく表現しています。)
スクリプトエディタにペーストする用です。シェルフに登録すると楽に使えると思います。
MAYA2018 + MacOS Sierraで動作確認しています。

#使い方
1. ノードを選択状態にします。対象としてはインスタンスメッシュそのもの、またはその親トランスフォームとなります。
2. Scriptを実行します。
3. 親インスタンスノードがあれば選択状態になります。なければエラーメッセージが表示されます。

<img width="349" alt=" 2018-01-04 0.22.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/ce2fa5dd-e603-7688-6915-57483df2bbee.png">
最初にインスタンスの親トランスフォームが選択されていれば、

<img width="356" alt=" 2018-01-04 0.22.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/9c949e72-7fcf-3ba7-432f-99155e352a53.png">
親インスタンスの親トランスフォームが選択されます。

<img width="359" alt=" 2018-01-04 0.22.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/734e0864-41e8-684e-1374-d7eceb63163d.png">
最初にインスタンスそのものが選択されていれば、

<img width="347" alt=" 2018-01-04 0.22.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/7d288ff8-06ef-11eb-cd7a-7d2d52f279c5.png">
親インスタンスそのものが選択されます。

<img width="357" alt=" 2018-01-04 0.23.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/94b5def3-1be7-597f-2d83-8ac4195cc1b5.png">
_自身が親の場合もメッセージが表示されます。_

<img width="353" alt=" 2018-01-04 1.39.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/55b4cc95-8a45-6971-ec27-cdd5bd9ad762.png">
_グループのインスタンス状態などにも対応します。_

<img width="298" alt=" 2018-01-04 1.34.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/6b3cd0c7-25ea-5cf7-ac1a-d64532ea82ae.png">
_インスタンスがない場合のエラー。_

#対応していないパターン
選択ノードの直接の子供のうちで１つもインスタンスがない場合。ツリーを再帰的に探索はしません。

#クイック実行用コード

```python
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
```