maya renderSetupでコレクションの中身にnamespaceを足す2

https://qiita.com/9boz/items/824b95f790f669763da4

つづき

collectionが全部とれたので、中身をゲットしてネームスペースを足してく

ちょっと手動で編集してこんな感じにしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0398756d-70a9-106d-2557-223019da1bfe.png)

※余談ですが、collectionのstaticSelectionの中身はstringなので　選択 -> 編集でいじれますが
※renderSetupのGUIへは即時反映されません。
※該当レイヤーを読み直すして（目玉マーク) GUI上でコレクションを選択しなおすと反映されます。


フィルターの種類は色々あるのだけれども今回はとりあえずstaticSelectionだけ対応で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/d5d53d77-ba26-79ee-8055-65d3535a17da.png)


雑に実装
-


```python
from maya.app.renderSetup.model import renderSetup

def getRSCollectionsHierarchy(taregtNode,collections):
    #対象のノードが collectionか否か
    if taregtNode.isCollection():        
        collections.append(taregtNode)
    
    #対象のノードが　hasChildren　アトリビュートを持つか否か
    if "hasChildren" in dir(taregtNode):
        
        #対象のノードが子ノードを持つか否か
        if taregtNode.hasChildren():
            
            #対象のノードの子ノードをリスト
            chNodes = taregtNode.getChildren()

            #ぐーるぐーる
            for node in chNodes:
                collections = getRSCollectionsHierarchy(node,collections)

    return collections

def getRSCollections(layerName):
    rs = renderSetup.instance()
    layer = rs.getRenderLayer(layerName)
    chNodes  = layer.getChildren()
    collections = []
    
    #layer直下の子ノード
    for taregtNode in layer.getChildren():    
        getRSCollectionsHierarchy(taregtNode,collections)

    #layer直下のグループノード
    for taregtNode in layer.getGroups():    
        getRSCollectionsHierarchy(taregtNode,collections)
    
    return collections

## ココから今回の分
def getRSCollectionMembers(collections):
    collectionDict = {}

    for collection in collections:
        selector = collection.getSelector()        
        staticSelection = selector.staticSelection.asList()
        collectionDict[collection.name()] = staticSelection
    
    return collectionDict

collections = getRSCollections("renderSetupLayer1")
collectionDict = getRSCollectionMembers(collections)
print(collectionDict)

#{'collection1': ['|pCube1'], 'collection3': [], 'collection4': []}

```
とれた・・・かな
これを加工して戻す感じですかね

若干面倒なのが、ロングネームなところですかね

```python

from maya.app.renderSetup.model import renderSetup

def getRSCollectionsHierarchy(taregtNode,collections):
    #対象のノードが collectionか否か
    if taregtNode.isCollection():
        #名前を取りたいので .name()を一旦ついか
        collections.append(taregtNode)
    
    #対象のノードが　hasChildren　アトリビュートを持つか否か
    if "hasChildren" in dir(taregtNode):
        
        #対象のノードが子ノードを持つか否か
        if taregtNode.hasChildren():
            
            #対象のノードの子ノードをリスト
            chNodes = taregtNode.getChildren()

            #ぐーるぐーる
            for node in chNodes:
                collections = getRSCollectionsHierarchy(node,collections)

    return collections

def getRSCollections(layerName):
    rs = renderSetup.instance()
    layer = rs.getRenderLayer(layerName)
    chNodes  = layer.getChildren()
    collections = []
    
    #layer直下の子ノード
    for taregtNode in layer.getChildren():    
        getRSCollectionsHierarchy(taregtNode,collections)

    #layer直下のグループノード
    for taregtNode in layer.getGroups():    
        getRSCollectionsHierarchy(taregtNode,collections)
    
    return collections

## ココから今回の分
def getRSCollectionMembers(collections):
    collectionDict = {}

    for collection in collections:
        selector = collection.getSelector()        
        staticSelection = selector.staticSelection.asList()
        collectionDict[collection.name()] = staticSelection
    
    return collectionDict

def addNamespaceCollectionMember(namespace,collectionDict):
    replaceDict = {}

    for collectionName in list(collectionDict.keys()):
        curMembers = collectionDict[collectionName]
        editedMembers = []
        for curLongName in curMembers:        
            longNameList = curLongName.split("|")
            NSAddedlongName = ("|"+namespace + ":").join(longNameList)
            
            if cmds.objExists(NSAddedlongName):
            #登録したいノード名がネームスペースありで存在してる場合
                if NSAddedlongName not in editedMembers:
                    editedMembers.append(NSAddedlongName)
            elif cmds.objExists(curLongName):
            #登録してあるノード名がネームスペース無しで存在してる場合
                if curLongName not in editedMembers:
                    editedMembers.append(curLongName)
        
        replaceDict[collectionName] = editedMembers

    return replaceDict

def setCollectionMember(collections,collectionDict):

    for collection in collections:
        collectionName = collection.name()

        if collectionName not in list(collectionDict.keys()):
            continue

        selector = collection.getSelector()
        selector.staticSelection.set(collectionDict[collectionName])
        selector.staticSelection.asList()

collections = getRSCollections("renderSetupLayer1")
collectionDict = getRSCollectionMembers(collections)
namespace = "hako2"
replaceDict = addNamespaceCollectionMember(namespace,collectionDict)
setCollectionMember(collections,replaceDict)
```

ビフォアー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/6266c955-9548-09d2-dd58-74f9ddb515f5.png)

アフター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/c62bfc97-835a-60a6-8881-ac0ee00c96f7.png)


制限事項と改修案
-

今の制限
- staticSelectionを使用しているcollecitonに限る
- 読み込み初期staticSelectionの中身にはnamespaceを使用していない

改修で来そうなところ
- staticSelection以外のフィルターにも対応
- staticSelectionの中身にネームスペースが既に使われていた場合、ネームスペースを置き換える

などなどなど