|
6 | 6 | imp.reload(dwpicker) |
7 | 7 | import dwpicker.scenedata |
8 | 8 | from maya import cmds |
| 9 | +from dwpicker.namespace import maya_namespace |
9 | 10 |
|
10 | 11 |
|
11 | 12 | def shortname(fullname): |
@@ -121,10 +122,84 @@ def store(self, pickers): |
121 | 122 | def cleanup(self): |
122 | 123 | pass |
123 | 124 |
|
124 | | -#data = timeit(dwpicker.scenedata.DefaultSceneStorage().load)() |
125 | | -#data = timeit(SceneDagStorage().load)() |
126 | | -#SceneDagStorage().store(data) |
127 | | -#dwpicker.scenedata.DefaultSceneStorage().store(data) |
128 | | -#pprint.pprint(data) |
129 | | -#dwpicker.show(storage_class=SceneDagStorage) |
130 | | -#dwpicker.show(storage_class=dwpicker.scenedata.DefaultSceneStorage) |
| 125 | + |
| 126 | +def node_namespace(name): |
| 127 | + # TODO dwpicker.namespace.node_namespace do not handle |
| 128 | + # nested namespaces |
| 129 | + return (name.rsplit(':', 1)[:-1] or [None])[-1] |
| 130 | + |
| 131 | + |
| 132 | +class SceneDictDiffStorage: |
| 133 | + PICKER_HOLDER_NODE = 'DwPicker' |
| 134 | + PICKER_HOLDER_ATTRIBUTE = '_dwpicker_data' |
| 135 | + # LS_EXP = ["*." + PICKER_HOLDER_ATTRIBUTE, "*:*." + PICKER_HOLDER_ATTRIBUTE] |
| 136 | + LS_EXP = [PICKER_HOLDER_NODE, "*:" + PICKER_HOLDER_NODE] |
| 137 | + |
| 138 | + def _get_picker_holder_node(self): |
| 139 | + if cmds.objExists(self.PICKER_HOLDER_NODE): |
| 140 | + return self.PICKER_HOLDER_NODE |
| 141 | + return self._create_picker_holder_node() |
| 142 | + |
| 143 | + def _create_picker_holder_node(self): |
| 144 | + with maya_namespace(":"): |
| 145 | + node = cmds.createNode('dagContainer', name=self.PICKER_HOLDER_NODE, skipSelect=True) |
| 146 | + return node |
| 147 | + |
| 148 | + def _list_picker_holder_nodes(self): |
| 149 | + """ |
| 150 | + Look up in the scene all the nodes holding an attribute named |
| 151 | + "_dwpicker_holder" which are not set on the "_dwpicker_holder" node. |
| 152 | + This mignt happed if a node node is imported (creating a namespace or a |
| 153 | + incrementation). |
| 154 | + """ |
| 155 | + return [node.split(".")[0] for node in cmds.ls(self.LS_EXP)] |
| 156 | + |
| 157 | + def load(self): |
| 158 | + nodes = self._list_picker_holder_nodes() |
| 159 | + pickers = [] |
| 160 | + added_pickers = set() |
| 161 | + # start from root holders |
| 162 | + for node in sorted(nodes, key=lambda x: len(x)): |
| 163 | + for picker_node in cmds.listRelatives(node, children=True) or []: |
| 164 | + if picker_node in added_pickers: |
| 165 | + continue |
| 166 | + namespace = node_namespace(picker_node) |
| 167 | + data = cmds.getAttr(picker_node + '.' + self.PICKER_HOLDER_ATTRIBUTE) |
| 168 | + data = dwpicker.scenedata.decode_data(data) |
| 169 | + data = dwpicker.scenedata.ensure_retro_compatibility(data) |
| 170 | + if namespace: |
| 171 | + for s in data['shapes']: |
| 172 | + s['action.targets'] = ['{}:{}'.format(namespace, n) |
| 173 | + for n in s['action.targets']] |
| 174 | + data['source_node'] = picker_node |
| 175 | + pickers.append(data) |
| 176 | + added_pickers.add(data['source_node']) |
| 177 | + return pickers |
| 178 | + |
| 179 | + def store(self, pickers): |
| 180 | + node = self._get_picker_holder_node() |
| 181 | + for picker_node in cmds.listRelatives(node, children=True) or []: |
| 182 | + cmds.delete(picker_node) |
| 183 | + for p in pickers: |
| 184 | + picker_node = p.get('source_node') or p.get('general', {}).get('name') or 'Picker' |
| 185 | + picker_node = cmds.createNode('dagContainer', name=picker_node, parent=node, skipSelect=True) |
| 186 | + if p.get('source_node') == picker_node: |
| 187 | + del p['source_node'] |
| 188 | + cmds.addAttr( |
| 189 | + picker_node, longName=self.PICKER_HOLDER_ATTRIBUTE, dataType='string') |
| 190 | + data = dwpicker.scenedata.encode_data(p) |
| 191 | + cmds.setAttr(picker_node + '.' + self.PICKER_HOLDER_ATTRIBUTE, data, type='string') |
| 192 | + |
| 193 | + def cleanup(self): |
| 194 | + pass |
| 195 | + |
| 196 | + |
| 197 | +# data = timeit(dwpicker.scenedata.DefaultSceneStorage().load)() |
| 198 | +# data = timeit(SceneDagStorage().load)() |
| 199 | +# SceneDagStorage().store(data) |
| 200 | +# dwpicker.scenedata.DefaultSceneStorage().store(data) |
| 201 | +# pprint.pprint(data) |
| 202 | +# dwpicker.show(storage_class=SceneDagStorage) |
| 203 | +# dwpicker.show(storage_class=dwpicker.scenedata.DefaultSceneStorage) |
| 204 | +# import dwpicker.scenedata_dag |
| 205 | +# dwpicker.show(storage_class=dwpicker.scenedata_dag.SceneDictDiffStorage) |
0 commit comments