Also added per button callbacks, so each button can have its own python functions.
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Blender.Registry module
 | |
| 
 | |
| """
 | |
| The Blender.Registry submodule.
 | |
| 
 | |
| B{New}: L{GetKey} and L{SetKey} have been updated to save and load scripts
 | |
| *configuration data* to files.
 | |
| 
 | |
| Registry
 | |
| ========
 | |
| 
 | |
| This module provides a way to create, retrieve and edit B{persistent data} in
 | |
| Blender.
 | |
| 
 | |
| When a script is executed it has its own private global dictionary,
 | |
| which is deleted when the script exits. This is done to avoid problems with
 | |
| name clashes and garbage collecting.  But because of this, the data created by
 | |
| a script isn't kept after it leaves: the data is not persistent.  The Registry
 | |
| module was created to give programmers a way around this limitation.
 | |
| 
 | |
| Possible uses:
 | |
| 	- saving arbitrary data from a script that itself or another one will need
 | |
| 		to access later.
 | |
| 	- saving configuration data for a script: users can view and edit this data
 | |
| 		using the "Scripts Configuration Editor" script.
 | |
| 	- saving the current state of a script's GUI (its button values) to restore it
 | |
| 		when the script is executed again.
 | |
| 
 | |
| Example::
 | |
| 
 | |
| 	import Blender
 | |
| 	from Blender import Registry
 | |
| 
 | |
| 	# this function updates the Registry when we need to:
 | |
| 	def update_Registry():
 | |
| 		d = {}
 | |
| 		d['myvar1'] = myvar1
 | |
| 		d['myvar2'] = myvar2
 | |
| 		d['mystr'] = mystr
 | |
| 		# cache = True: data is also saved to a file
 | |
| 		Blender.Registry.SetKey('MyScript', d, True)
 | |
| 
 | |
| 	# first declare global variables that should go to the Registry:
 | |
| 	myvar1 = 0
 | |
| 	myvar2 = 3.2
 | |
| 	mystr = "hello"
 | |
| 
 | |
| 	# then check if they are already there (saved on a
 | |
| 	# previous execution of this script):
 | |
| 	rdict = Registry.GetKey('MyScript', True) # True to check on disk also
 | |
| 	if rdict: # if found, get the values saved there
 | |
| 		try:
 | |
| 			myvar1 = rdict['myvar1']
 | |
| 			myvar2 = rdict['myvar2']
 | |
| 			mystr = rdict['mystr']
 | |
| 		except: update_Registry() # if data isn't valid rewrite it
 | |
| 
 | |
| 	# ...
 | |
| 	# here goes the main part of the script ...
 | |
| 	# ...
 | |
| 
 | |
| 	# if at some point the data is changed, we update the Registry:
 | |
| 	update_Registry()
 | |
| 
 | |
| @note: In Python terms, the Registry holds a dictionary of dictionaries.
 | |
| 	Technically any Python or BPython object can be stored: there are no
 | |
| 	restrictions, but ...
 | |
| 
 | |
| @note: We have a few recommendations:
 | |
| 
 | |
| 	Data saved to the Registry is kept in memory, so if you decide to store large
 | |
| 	amounts your script users should be clearly informed about it --
 | |
| 	always keep in mind that you have no idea about their resources and the
 | |
| 	applications they are running at a given time (unless you are the only
 | |
| 	user), so let them decide.
 | |
| 
 | |
| 	There are restrictions to the data that gets automatically saved to disk by
 | |
| 	L{SetKey}(keyname, dict, True):  this feature is only meant for simple data
 | |
| 	(bools, ints, floats, strings and dictionaries or sequences of these types).
 | |
| 
 | |
| 	For more demanding needs, it's of course trivial to save data to another 
 | |
| 	file or to a L{Blender Text<Text>}.
 | |
| """
 | |
| 
 | |
| def Keys ():
 | |
| 	"""
 | |
| 	Get all keys currently in the Registry's dictionary.
 | |
| 	"""
 | |
| 
 | |
| def GetKey (key, cached = False):
 | |
| 	"""
 | |
| 	Get key 'key' from the Registry.
 | |
| 	@type key: string
 | |
| 	@param key: a key from the Registry dictionary.
 | |
| 	@type cached: bool
 | |
| 	@param cached: if True and the requested key isn't already loaded in the
 | |
| 		Registry, it will also be searched on the user or default scripts config
 | |
| 		data dir (config subdir in L{Blender.Get}('datadir')).
 | |
| 	@return: the dictionary called 'key'.
 | |
| 	"""
 | |
| 
 | |
| def SetKey (key, dict, cache = False):
 | |
| 	"""
 | |
| 	Store a new entry in the Registry.
 | |
| 	@type key: string
 | |
| 	@param key: the name of the new entry, tipically your script's name.
 | |
| 	@type dict: dictionary
 | |
| 	@param dict: a dict with all data you want to save in the Registry.
 | |
| 	@type cache: bool
 | |
| 	@param cache: if True the given key data will also be saved as a file
 | |
| 		in the config subdir of the scripts user or default data dir (see
 | |
| 		L{Blender.Get}).
 | |
| 	@warn: as stated in the notes above, there are restrictions to what can
 | |
| 		be automatically stored in config files.
 | |
| 	"""
 | |
| 
 | |
| def RemoveKey (key):
 | |
| 	"""
 | |
| 	Remove the dictionary with key 'key' from the Registry.
 | |
| 	@type key: string
 | |
| 	@param key: the name of an existing Registry key.
 | |
| 	"""
 |