Skip to content

Commit 7149c0d

Browse files
committed
Add storage implementation for referencing (wip)
1 parent 378b1d2 commit 7149c0d

1 file changed

Lines changed: 82 additions & 7 deletions

File tree

dwpicker/scenedata_dag.py

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
imp.reload(dwpicker)
77
import dwpicker.scenedata
88
from maya import cmds
9+
from dwpicker.namespace import maya_namespace
910

1011

1112
def shortname(fullname):
@@ -121,10 +122,84 @@ def store(self, pickers):
121122
def cleanup(self):
122123
pass
123124

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

Comments
 (0)