99from dwpicker .namespace import maya_namespace
1010
1111
12- PICKER_HOLDER_NODE = '_dwpicker_data'
13- PICKER_HOLDER_ATTRIBUTE = '_dwpicker_data'
14- LS_EXP = ["*." + PICKER_HOLDER_ATTRIBUTE , "*:*." + PICKER_HOLDER_ATTRIBUTE ]
15-
16-
17- def get_picker_holder_node ():
18- if cmds .objExists (PICKER_HOLDER_NODE ):
19- return PICKER_HOLDER_NODE
20- return create_picker_holder_node ()
21-
22-
23- def create_picker_holder_node ():
24- with maya_namespace (":" ):
25- node = cmds .createNode ('script' , name = PICKER_HOLDER_NODE )
26- cmds .setAttr (node + '.nodeState' , 1 )
27- cmds .addAttr (node , longName = PICKER_HOLDER_ATTRIBUTE , dataType = 'string' )
28- return node
29-
30-
31- def store_local_picker_data (pickers ):
32- data = encode_data (pickers )
33- node = get_picker_holder_node ()
34- cmds .setAttr (node + '.' + PICKER_HOLDER_ATTRIBUTE , data , type = 'string' )
35- clean_stray_picker_holder_nodes ()
36-
37-
38- def load_local_picker_data ():
39- nodes = list_picker_holder_nodes ()
40- pickers = []
41- for node in nodes :
42- data = cmds .getAttr (node + '.' + PICKER_HOLDER_ATTRIBUTE )
43- data = decode_data (data )
44- pickers .extend (ensure_retro_compatibility (p ) for p in data )
45- return pickers
46-
47-
4812def encode_data (pickers ):
4913 data = json .dumps (pickers )
5014 if not cmds .optionVar (query = USE_BASE64_DATA_ENCODING ):
@@ -62,28 +26,63 @@ def decode_data(data):
6226 return json .loads (base64 .b64decode (data ))
6327
6428
65- def list_picker_holder_nodes ():
66- """
67- Look up in the scene all the nodes holding an attribute named
68- "_dwpicker_holder" which are not set on the "_dwpicker_holder" node.
69- This mignt happed if a node node is imported (creating a namespace or a
70- incrementation).
71- """
72- return [node .split ("." )[0 ] for node in cmds .ls (LS_EXP )]
73-
74-
75- def clean_stray_picker_holder_nodes ():
76- """
77- If the scene contains multiple picker holder nodes, we remove them
78- automatically to avoid repeated pickers.
79- """
80- for node in list_picker_holder_nodes ():
81- if node == PICKER_HOLDER_NODE :
82- continue
83- try :
84- cmds .delete (node )
85- except :
86- # Node is locked or in reference and cannot be removed.
87- # As we cant remove it, we reset his data to avoid double pickers.
88- cmds .setAttr (
89- node + "." + PICKER_HOLDER_ATTRIBUTE , "" , dataType = "string" )
29+ class DefaultSceneStorage :
30+ PICKER_HOLDER_NODE = '_dwpicker_data'
31+ PICKER_HOLDER_ATTRIBUTE = '_dwpicker_data'
32+ LS_EXP = ["*." + PICKER_HOLDER_ATTRIBUTE , "*:*." + PICKER_HOLDER_ATTRIBUTE ]
33+
34+ def _get_picker_holder_node (self ):
35+ if cmds .objExists (self .PICKER_HOLDER_NODE ):
36+ return self .PICKER_HOLDER_NODE
37+ return self ._create_picker_holder_node ()
38+
39+ def _create_picker_holder_node (self ):
40+ with maya_namespace (":" ):
41+ node = cmds .createNode ('script' , name = self .PICKER_HOLDER_NODE )
42+ cmds .setAttr (node + '.nodeState' , 1 )
43+ cmds .addAttr (
44+ node , longName = self .PICKER_HOLDER_ATTRIBUTE , dataType = 'string' )
45+ return node
46+
47+ def _list_picker_holder_nodes (self ):
48+ """
49+ Look up in the scene all the nodes holding an attribute named
50+ "_dwpicker_holder" which are not set on the "_dwpicker_holder" node.
51+ This mignt happed if a node node is imported (creating a namespace or a
52+ incrementation).
53+ """
54+ return [node .split ("." )[0 ] for node in cmds .ls (self .LS_EXP )]
55+
56+ def load (self ):
57+ nodes = self ._list_picker_holder_nodes ()
58+ pickers = []
59+ for node in nodes :
60+ data = cmds .getAttr (node + '.' + self .PICKER_HOLDER_ATTRIBUTE )
61+ data = decode_data (data )
62+ pickers .extend (ensure_retro_compatibility (p ) for p in data )
63+ return pickers
64+
65+ def store (self , pickers ):
66+ data = encode_data (pickers )
67+ node = self ._get_picker_holder_node ()
68+ cmds .setAttr (
69+ node + '.' + self .PICKER_HOLDER_ATTRIBUTE , data , type = 'string' )
70+ self .cleanup ()
71+
72+ def cleanup (self ):
73+ """
74+ If the scene contains multiple picker holder nodes, we remove them
75+ automatically to avoid repeated pickers.
76+ """
77+ for node in self ._list_picker_holder_nodes ():
78+ if node == self .PICKER_HOLDER_NODE :
79+ continue
80+ try :
81+ cmds .delete (node )
82+ except :
83+ # Node is locked or in reference and cannot be removed.
84+ # As we cant remove it, we reset his data to avoid double
85+ # pickers.
86+ cmds .setAttr (
87+ node + "." + self .PICKER_HOLDER_ATTRIBUTE , "" ,
88+ dataType = "string" )
0 commit comments