| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | # ##### BEGIN GPL LICENSE BLOCK ##### | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | #  modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | #  as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | #  of the License, or (at your option) any later version. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | #  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | #  GNU General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | #  along with this program; if not, write to the Free Software Foundation, | 
					
						
							| 
									
										
										
										
											2010-02-12 13:34:04 +00:00
										 |  |  | #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # ##### END GPL LICENSE BLOCK ##### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | # <pep8 compliant> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | # classes for extracting info from blenders internal classes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import bpy | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  | # use to strip python paths | 
					
						
							|  |  |  | script_paths = bpy.utils.script_paths() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  | _FAKE_STRUCT_SUBCLASS = True | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-17 19:05:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  | def _get_direct_attr(rna_type, attr): | 
					
						
							|  |  |  |     props = getattr(rna_type, attr) | 
					
						
							|  |  |  |     base = rna_type.base | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if not base: | 
					
						
							| 
									
										
										
										
											2010-04-09 20:43:58 +00:00
										 |  |  |         return [prop for prop in props] | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         props_base = getattr(base, attr).values() | 
					
						
							| 
									
										
										
										
											2010-04-09 20:43:58 +00:00
										 |  |  |         return [prop for prop in props if prop not in props_base] | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_direct_properties(rna_type): | 
					
						
							|  |  |  |     return _get_direct_attr(rna_type, "properties") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_direct_functions(rna_type): | 
					
						
							|  |  |  |     return _get_direct_attr(rna_type, "functions") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-17 19:05:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  | def rna_id_ignore(rna_id): | 
					
						
							|  |  |  |     if rna_id == "rna_type": | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if "_OT_" in rna_id: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     if "_MT_" in rna_id: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     if "_PT_" in rna_id: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     if "_HT_" in rna_id: | 
					
						
							|  |  |  |         return True | 
					
						
							| 
									
										
										
										
											2010-04-11 12:05:27 +00:00
										 |  |  |     if "_KSI_" in rna_id: | 
					
						
							|  |  |  |         return True | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  |     return False | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-17 19:05:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  | def range_str(val): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |     if val < -10000000: | 
					
						
							| 
									
										
										
										
											2012-06-19 22:17:19 +00:00
										 |  |  |         return "-inf" | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |     elif val > 10000000: | 
					
						
							| 
									
										
										
										
											2012-06-19 22:17:19 +00:00
										 |  |  |         return "inf" | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |     elif type(val) == float: | 
					
						
							|  |  |  |         return '%g' % val | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         return str(val) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  | def float_as_string(f): | 
					
						
							|  |  |  |     val_str = "%g" % f | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |     if '.' not in val_str and '-' not in val_str:  # value could be 1e-05 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |         val_str += '.0' | 
					
						
							|  |  |  |     return val_str | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | class InfoStructRNA: | 
					
						
							|  |  |  |     global_lookup = {} | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |     def __init__(self, rna_type): | 
					
						
							|  |  |  |         self.bl_rna = rna_type | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.identifier = rna_type.identifier | 
					
						
							|  |  |  |         self.name = rna_type.name | 
					
						
							|  |  |  |         self.description = rna_type.description.strip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # set later | 
					
						
							|  |  |  |         self.base = None | 
					
						
							|  |  |  |         self.nested = None | 
					
						
							|  |  |  |         self.full_path = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.functions = [] | 
					
						
							|  |  |  |         self.children = [] | 
					
						
							|  |  |  |         self.references = [] | 
					
						
							|  |  |  |         self.properties = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def build(self): | 
					
						
							|  |  |  |         rna_type = self.bl_rna | 
					
						
							|  |  |  |         parent_id = self.identifier | 
					
						
							| 
									
										
										
										
											2010-04-09 20:43:58 +00:00
										 |  |  |         self.properties[:] = [GetInfoPropertyRNA(rna_prop, parent_id) for rna_prop in get_direct_properties(rna_type) if rna_prop.identifier != "rna_type"] | 
					
						
							|  |  |  |         self.functions[:] = [GetInfoFunctionRNA(rna_prop, parent_id) for rna_prop in get_direct_functions(rna_type)] | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |     def get_bases(self): | 
					
						
							|  |  |  |         bases = [] | 
					
						
							|  |  |  |         item = self | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         while item: | 
					
						
							|  |  |  |             item = item.base | 
					
						
							|  |  |  |             if item: | 
					
						
							|  |  |  |                 bases.append(item) | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         return bases | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |     def get_nested_properties(self, ls=None): | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         if not ls: | 
					
						
							|  |  |  |             ls = self.properties[:] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.nested: | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |             self.nested.get_nested_properties(ls) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return ls | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |     def _get_py_visible_attrs(self): | 
					
						
							|  |  |  |         attrs = [] | 
					
						
							|  |  |  |         py_class = getattr(bpy.types, self.identifier) | 
					
						
							|  |  |  |         for attr_str in dir(py_class): | 
					
						
							|  |  |  |             if attr_str.startswith("_"): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             attrs.append((attr_str, getattr(py_class, attr_str))) | 
					
						
							|  |  |  |         return attrs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_py_properties(self): | 
					
						
							|  |  |  |         properties = [] | 
					
						
							|  |  |  |         for identifier, attr in self._get_py_visible_attrs(): | 
					
						
							|  |  |  |             if type(attr) is property: | 
					
						
							|  |  |  |                 properties.append((identifier, attr)) | 
					
						
							|  |  |  |         return properties | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |     def get_py_functions(self): | 
					
						
							|  |  |  |         import types | 
					
						
							|  |  |  |         functions = [] | 
					
						
							|  |  |  |         for identifier, attr in self._get_py_visible_attrs(): | 
					
						
							| 
									
										
										
										
											2011-08-08 05:21:37 +00:00
										 |  |  |             if type(attr) in {types.FunctionType, types.MethodType}: | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |                 functions.append((identifier, attr)) | 
					
						
							|  |  |  |         return functions | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 10:31:50 +00:00
										 |  |  |     def get_py_c_functions(self): | 
					
						
							|  |  |  |         import types | 
					
						
							|  |  |  |         functions = [] | 
					
						
							|  |  |  |         for identifier, attr in self._get_py_visible_attrs(): | 
					
						
							| 
									
										
										
										
											2011-08-08 05:21:37 +00:00
										 |  |  |             if type(attr) in {types.BuiltinMethodType, types.BuiltinFunctionType}: | 
					
						
							| 
									
										
										
										
											2011-03-14 10:31:50 +00:00
										 |  |  |                 functions.append((identifier, attr)) | 
					
						
							|  |  |  |         return functions | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 13:09:38 +00:00
										 |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  |         txt = "" | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         txt += self.identifier | 
					
						
							|  |  |  |         if self.base: | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  |             txt += "(%s)" % self.base.identifier | 
					
						
							|  |  |  |         txt += ": " + self.description + "\n" | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for prop in self.properties: | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  |             txt += prop.__repr__() + "\n" | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for func in self.functions: | 
					
						
							| 
									
										
										
										
											2010-04-10 18:35:50 +00:00
										 |  |  |             txt += func.__repr__() + "\n" | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return txt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class InfoPropertyRNA: | 
					
						
							|  |  |  |     global_lookup = {} | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |     def __init__(self, rna_prop): | 
					
						
							|  |  |  |         self.bl_prop = rna_prop | 
					
						
							|  |  |  |         self.identifier = rna_prop.identifier | 
					
						
							|  |  |  |         self.name = rna_prop.name | 
					
						
							|  |  |  |         self.description = rna_prop.description.strip() | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         self.default_str = "<UNKNOWN>" | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def build(self): | 
					
						
							|  |  |  |         rna_prop = self.bl_prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.enum_items = [] | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |         self.min = getattr(rna_prop, "hard_min", -1) | 
					
						
							|  |  |  |         self.max = getattr(rna_prop, "hard_max", -1) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         self.array_length = getattr(rna_prop, "array_length", 0) | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |         self.collection_type = GetInfoStructRNA(rna_prop.srna) | 
					
						
							|  |  |  |         self.is_required = rna_prop.is_required | 
					
						
							|  |  |  |         self.is_readonly = rna_prop.is_readonly | 
					
						
							|  |  |  |         self.is_never_none = rna_prop.is_never_none | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.type = rna_prop.type.lower() | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |         fixed_type = getattr(rna_prop, "fixed_type", "") | 
					
						
							|  |  |  |         if fixed_type: | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |             self.fixed_type = GetInfoStructRNA(fixed_type)  # valid for pointer/collections | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             self.fixed_type = None | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |         if self.type == "enum": | 
					
						
							| 
									
										
										
										
											2011-09-15 16:15:24 +00:00
										 |  |  |             self.enum_items[:] = [(item.identifier, item.name, item.description) for item in rna_prop.enum_items] | 
					
						
							| 
									
										
										
										
											2011-02-16 10:19:14 +00:00
										 |  |  |             self.is_enum_flag = rna_prop.is_enum_flag | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.is_enum_flag = False | 
					
						
							| 
									
										
										
										
											2010-05-16 12:15:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         if self.array_length: | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             self.default = tuple(getattr(rna_prop, "default_array", ())) | 
					
						
							| 
									
										
										
										
											2011-02-16 10:19:14 +00:00
										 |  |  |         elif self.type == "enum" and self.is_enum_flag: | 
					
						
							|  |  |  |             self.default = getattr(rna_prop, "default_flag", set()) | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             self.default = getattr(rna_prop, "default", None) | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |         self.default_str = ""  # fallback | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.type == "pointer": | 
					
						
							|  |  |  |             # pointer has no default, just set as None | 
					
						
							|  |  |  |             self.default = None | 
					
						
							|  |  |  |             self.default_str = "None" | 
					
						
							|  |  |  |         elif self.type == "string": | 
					
						
							|  |  |  |             self.default_str = "\"%s\"" % self.default | 
					
						
							|  |  |  |         elif self.type == "enum": | 
					
						
							| 
									
										
										
										
											2011-02-16 10:19:14 +00:00
										 |  |  |             if self.is_enum_flag: | 
					
						
							|  |  |  |                 self.default_str = "%r" % self.default  # repr or set() | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.default_str = "'%s'" % self.default | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |         elif self.array_length: | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             self.default_str = '' | 
					
						
							|  |  |  |             # special case for floats | 
					
						
							|  |  |  |             if len(self.default) > 0: | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |                 if self.type == "float": | 
					
						
							| 
									
										
										
										
											2010-09-19 07:07:14 +00:00
										 |  |  |                     self.default_str = "(%s)" % ", ".join(float_as_string(f) for f in self.default) | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             if not self.default_str: | 
					
						
							|  |  |  |                 self.default_str = str(self.default) | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |             if self.type == "float": | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |                 self.default_str = float_as_string(self.default) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.default_str = str(self.default) | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |         self.srna = GetInfoStructRNA(rna_prop.srna)  # valid for pointer/collections | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |     def get_arg_default(self, force=True): | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |         default = self.default_str | 
					
						
							| 
									
										
										
										
											2012-10-08 08:28:05 +00:00
										 |  |  |         if default and (force or self.is_required is False): | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             return "%s=%s" % (self.identifier, default) | 
					
						
							|  |  |  |         return self.identifier | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-22 04:28:51 +00:00
										 |  |  |     def get_type_description(self, as_ret=False, as_arg=False, class_fmt="%s", collection_id="Collection"): | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |         type_str = "" | 
					
						
							|  |  |  |         if self.fixed_type is None: | 
					
						
							|  |  |  |             type_str += self.type | 
					
						
							|  |  |  |             if self.array_length: | 
					
						
							|  |  |  |                 type_str += " array of %d items" % (self.array_length) | 
					
						
							| 
									
										
										
										
											2010-05-16 12:15:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-08 05:21:37 +00:00
										 |  |  |             if self.type in {"float", "int"}: | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |                 type_str += " in [%s, %s]" % (range_str(self.min), range_str(self.max)) | 
					
						
							|  |  |  |             elif self.type == "enum": | 
					
						
							| 
									
										
										
										
											2011-02-16 10:19:14 +00:00
										 |  |  |                 if self.is_enum_flag: | 
					
						
							| 
									
										
										
										
											2011-09-15 16:15:24 +00:00
										 |  |  |                     type_str += " set in {%s}" % ", ".join(("'%s'" % s[0]) for s in self.enum_items) | 
					
						
							| 
									
										
										
										
											2011-02-16 10:19:14 +00:00
										 |  |  |                 else: | 
					
						
							| 
									
										
										
										
											2011-09-15 16:15:24 +00:00
										 |  |  |                     type_str += " in [%s]" % ", ".join(("'%s'" % s[0]) for s in self.enum_items) | 
					
						
							| 
									
										
										
										
											2010-05-03 15:52:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if not (as_arg or as_ret): | 
					
						
							|  |  |  |                 # write default property, ignore function args for this | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |                 if self.type != "pointer": | 
					
						
							|  |  |  |                     if self.default_str: | 
					
						
							|  |  |  |                         type_str += ", default %s" % self.default_str | 
					
						
							| 
									
										
										
										
											2010-05-03 15:52:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             if self.type == "collection": | 
					
						
							|  |  |  |                 if self.collection_type: | 
					
						
							| 
									
										
										
										
											2011-03-22 04:28:51 +00:00
										 |  |  |                     collection_str = (class_fmt % self.collection_type.identifier) + (" %s of " % collection_id) | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |                 else: | 
					
						
							| 
									
										
										
										
											2011-03-22 04:28:51 +00:00
										 |  |  |                     collection_str = "%s of " % collection_id | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 collection_str = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             type_str += collection_str + (class_fmt % self.fixed_type.identifier) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-03 15:52:15 +00:00
										 |  |  |         # setup qualifiers for this value. | 
					
						
							|  |  |  |         type_info = [] | 
					
						
							| 
									
										
										
										
											2010-01-17 20:59:35 +00:00
										 |  |  |         if as_ret: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         elif as_arg: | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |             if not self.is_required: | 
					
						
							| 
									
										
										
										
											2010-05-03 15:52:15 +00:00
										 |  |  |                 type_info.append("optional") | 
					
						
							| 
									
										
										
										
											2011-10-17 06:58:07 +00:00
										 |  |  |         else:  # readonly is only useful for self's, not args | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |             if self.is_readonly: | 
					
						
							| 
									
										
										
										
											2010-05-03 15:52:15 +00:00
										 |  |  |                 type_info.append("readonly") | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.is_never_none: | 
					
						
							| 
									
										
										
										
											2010-05-03 15:52:15 +00:00
										 |  |  |             type_info.append("never None") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if type_info: | 
					
						
							|  |  |  |             type_str += (", (%s)" % ", ".join(type_info)) | 
					
						
							| 
									
										
										
										
											2009-12-27 11:14:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 16:47:25 +00:00
										 |  |  |         return type_str | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 13:09:38 +00:00
										 |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2012-06-19 22:17:19 +00:00
										 |  |  |         txt = "" | 
					
						
							|  |  |  |         txt += " * " + self.identifier + ": " + self.description | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return txt | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | class InfoFunctionRNA: | 
					
						
							|  |  |  |     global_lookup = {} | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |     def __init__(self, rna_func): | 
					
						
							|  |  |  |         self.bl_func = rna_func | 
					
						
							|  |  |  |         self.identifier = rna_func.identifier | 
					
						
							|  |  |  |         # self.name = rna_func.name # functions have no name! | 
					
						
							|  |  |  |         self.description = rna_func.description.strip() | 
					
						
							| 
									
										
										
										
											2010-08-18 07:14:10 +00:00
										 |  |  |         self.is_classmethod = not rna_func.use_self | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |         self.args = [] | 
					
						
							| 
									
										
										
										
											2010-01-02 18:55:07 +00:00
										 |  |  |         self.return_values = () | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def build(self): | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         rna_func = self.bl_func | 
					
						
							|  |  |  |         parent_id = rna_func | 
					
						
							| 
									
										
										
										
											2010-01-02 18:55:07 +00:00
										 |  |  |         self.return_values = [] | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for rna_prop in rna_func.parameters.values(): | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             prop = GetInfoPropertyRNA(rna_prop, parent_id) | 
					
						
							| 
									
										
										
										
											2010-08-18 08:26:18 +00:00
										 |  |  |             if rna_prop.is_output: | 
					
						
							| 
									
										
										
										
											2010-01-02 18:55:07 +00:00
										 |  |  |                 self.return_values.append(prop) | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 self.args.append(prop) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-02 18:55:07 +00:00
										 |  |  |         self.return_values = tuple(self.return_values) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 13:09:38 +00:00
										 |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         txt = '' | 
					
						
							|  |  |  |         txt += ' * ' + self.identifier + '(' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for arg in self.args: | 
					
						
							|  |  |  |             txt += arg.identifier + ', ' | 
					
						
							|  |  |  |         txt += '): ' + self.description | 
					
						
							|  |  |  |         return txt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  | class InfoOperatorRNA: | 
					
						
							|  |  |  |     global_lookup = {} | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |     def __init__(self, rna_op): | 
					
						
							|  |  |  |         self.bl_op = rna_op | 
					
						
							|  |  |  |         self.identifier = rna_op.identifier | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |         mod, name = self.identifier.split("_OT_", 1) | 
					
						
							|  |  |  |         self.module_name = mod.lower() | 
					
						
							|  |  |  |         self.func_name = name | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |         # self.name = rna_func.name # functions have no name! | 
					
						
							|  |  |  |         self.description = rna_op.description.strip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.args = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def build(self): | 
					
						
							|  |  |  |         rna_op = self.bl_op | 
					
						
							|  |  |  |         parent_id = self.identifier | 
					
						
							|  |  |  |         for rna_id, rna_prop in rna_op.properties.items(): | 
					
						
							|  |  |  |             if rna_id == "rna_type": | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             prop = GetInfoPropertyRNA(rna_prop, parent_id) | 
					
						
							|  |  |  |             self.args.append(prop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_location(self): | 
					
						
							|  |  |  |         op_class = getattr(bpy.types, self.identifier) | 
					
						
							|  |  |  |         op_func = getattr(op_class, "execute", None) | 
					
						
							|  |  |  |         if op_func is None: | 
					
						
							|  |  |  |             op_func = getattr(op_class, "invoke", None) | 
					
						
							|  |  |  |         if op_func is None: | 
					
						
							|  |  |  |             op_func = getattr(op_class, "poll", None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if op_func: | 
					
						
							|  |  |  |             op_code = op_func.__code__ | 
					
						
							|  |  |  |             source_path = op_code.co_filename | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # clear the prefix | 
					
						
							|  |  |  |             for p in script_paths: | 
					
						
							|  |  |  |                 source_path = source_path.split(p)[-1] | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             if source_path[0] in "/\\": | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                 source_path = source_path[1:] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             return source_path, op_code.co_firstlineno | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return None, None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-19 22:17:19 +00:00
										 |  |  | def _GetInfoRNA(bl_rna, cls, parent_id=""): | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 10:43:32 +00:00
										 |  |  |     if bl_rna is None: | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     key = parent_id, bl_rna.identifier | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         return cls.global_lookup[key] | 
					
						
							| 
									
										
										
										
											2010-03-06 01:40:29 +00:00
										 |  |  |     except KeyError: | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         instance = cls.global_lookup[key] = cls(bl_rna) | 
					
						
							|  |  |  |         return instance | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def GetInfoStructRNA(bl_rna): | 
					
						
							|  |  |  |     return _GetInfoRNA(bl_rna, InfoStructRNA) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | def GetInfoPropertyRNA(bl_rna, parent_id): | 
					
						
							|  |  |  |     return _GetInfoRNA(bl_rna, InfoPropertyRNA, parent_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | def GetInfoFunctionRNA(bl_rna, parent_id): | 
					
						
							|  |  |  |     return _GetInfoRNA(bl_rna, InfoFunctionRNA, parent_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  | def GetInfoOperatorRNA(bl_rna): | 
					
						
							|  |  |  |     return _GetInfoRNA(bl_rna, InfoOperatorRNA) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-17 19:05:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | def BuildRNAInfo(): | 
					
						
							|  |  |  |     # Use for faster lookups | 
					
						
							|  |  |  |     # use rna_struct.identifier as the key for each dict | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |     rna_struct_dict = {}  # store identifier:rna lookups | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |     rna_full_path_dict = {}	 # store the result of full_rna_struct_path(rna_struct) | 
					
						
							|  |  |  |     rna_children_dict = {}  # store all rna_structs nested from here | 
					
						
							|  |  |  |     rna_references_dict = {}  # store a list of rna path strings that reference this type | 
					
						
							|  |  |  |     # rna_functions_dict = {}  # store all functions directly in this type (not inherited) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def full_rna_struct_path(rna_struct): | 
					
						
							| 
									
										
										
										
											2012-07-03 09:02:41 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         Needed when referencing one struct from another | 
					
						
							| 
									
										
										
										
											2012-07-03 09:02:41 +00:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         nested = rna_struct.nested | 
					
						
							|  |  |  |         if nested: | 
					
						
							|  |  |  |             return "%s.%s" % (full_rna_struct_path(nested), rna_struct.identifier) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return rna_struct.identifier | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # def write_func(rna_func, ident): | 
					
						
							|  |  |  |     def base_id(rna_struct): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             return rna_struct.base.identifier | 
					
						
							|  |  |  |         except: | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |             return ""  # invalid id | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     #structs = [(base_id(rna_struct), rna_struct.identifier, rna_struct) for rna_struct in bpy.doc.structs.values()] | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     structs = [] | 
					
						
							|  |  |  |     for rna_struct in bpy.doc.structs.values(): | 
					
						
							|  |  |  |         structs.append( (base_id(rna_struct), rna_struct.identifier, rna_struct) ) | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     structs = [] | 
					
						
							|  |  |  |     for rna_type_name in dir(bpy.types): | 
					
						
							|  |  |  |         rna_type = getattr(bpy.types, rna_type_name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |         rna_struct = getattr(rna_type, "bl_rna", None) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if rna_struct: | 
					
						
							|  |  |  |             #if not rna_type_name.startswith('__'): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             identifier = rna_struct.identifier | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if not rna_id_ignore(identifier): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                 structs.append((base_id(rna_struct), identifier, rna_struct)) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 # Simple lookup | 
					
						
							|  |  |  |                 rna_struct_dict[identifier] = rna_struct | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # Store full rna path 'GameObjectSettings' -> 'Object.GameObjectSettings' | 
					
						
							|  |  |  |                 rna_full_path_dict[identifier] = full_rna_struct_path(rna_struct) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # Store a list of functions, remove inherited later | 
					
						
							| 
									
										
										
										
											2010-04-09 20:43:58 +00:00
										 |  |  |                 # NOT USED YET | 
					
						
							|  |  |  |                 ## rna_functions_dict[identifier] = get_direct_functions(rna_struct) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 # fill in these later | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                 rna_children_dict[identifier] = [] | 
					
						
							|  |  |  |                 rna_references_dict[identifier] = [] | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             print("Ignoring", rna_type_name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |     structs.sort()  # not needed but speeds up sort below, setting items without an inheritance first | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Arrange so classes are always defined in the correct order | 
					
						
							|  |  |  |     deps_ok = False | 
					
						
							| 
									
										
										
										
											2012-10-08 08:28:05 +00:00
										 |  |  |     while deps_ok is False: | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         deps_ok = True | 
					
						
							|  |  |  |         rna_done = set() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for i, (rna_base, identifier, rna_struct) in enumerate(structs): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             rna_done.add(identifier) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if rna_base and rna_base not in rna_done: | 
					
						
							|  |  |  |                 deps_ok = False | 
					
						
							|  |  |  |                 data = structs.pop(i) | 
					
						
							|  |  |  |                 ok = False | 
					
						
							|  |  |  |                 while i < len(structs): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                     if structs[i][1] == rna_base: | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |                         structs.insert(i + 1, data)  # insert after the item we depend on. | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |                         ok = True | 
					
						
							|  |  |  |                         break | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                     i += 1 | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 if not ok: | 
					
						
							|  |  |  |                     print('Dependancy "%s" could not be found for "%s"' % (identifier, rna_base)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Done ordering structs | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-17 06:58:07 +00:00
										 |  |  |     # precalculate vars to avoid a lot of looping | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |     for (rna_base, identifier, rna_struct) in structs: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # rna_struct_path = full_rna_struct_path(rna_struct) | 
					
						
							|  |  |  |         rna_struct_path = rna_full_path_dict[identifier] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 20:43:58 +00:00
										 |  |  |         for rna_prop in get_direct_properties(rna_struct): | 
					
						
							|  |  |  |             rna_prop_identifier = rna_prop.identifier | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  |             if rna_prop_identifier == 'RNA' or rna_id_ignore(rna_prop_identifier): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for rna_prop_ptr in (getattr(rna_prop, "fixed_type", None), getattr(rna_prop, "srna", None)): | 
					
						
							|  |  |  |                 # Does this property point to me? | 
					
						
							|  |  |  |                 if rna_prop_ptr: | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                     rna_references_dict[rna_prop_ptr.identifier].append("%s.%s" % (rna_struct_path, rna_prop_identifier)) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 20:43:58 +00:00
										 |  |  |         for rna_func in get_direct_functions(rna_struct): | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |             for rna_prop_identifier, rna_prop in rna_func.parameters.items(): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  |                 if rna_prop_identifier == 'RNA' or rna_id_ignore(rna_prop_identifier): | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                     continue | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 20:04:37 +00:00
										 |  |  |                 rna_prop_ptr = getattr(rna_prop, "fixed_type", None) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 # Does this property point to me? | 
					
						
							|  |  |  |                 if rna_prop_ptr: | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |                     rna_references_dict[rna_prop_ptr.identifier].append("%s.%s" % (rna_struct_path, rna_func.identifier)) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Store nested children | 
					
						
							|  |  |  |         nested = rna_struct.nested | 
					
						
							|  |  |  |         if nested: | 
					
						
							|  |  |  |             rna_children_dict[nested.identifier].append(rna_struct) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Sort the refs, just reads nicer | 
					
						
							|  |  |  |     for rna_refs in rna_references_dict.values(): | 
					
						
							|  |  |  |         rna_refs.sort() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     info_structs = [] | 
					
						
							|  |  |  |     for (rna_base, identifier, rna_struct) in structs: | 
					
						
							|  |  |  |         #if rna_struct.nested: | 
					
						
							|  |  |  |         #    continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #write_struct(rna_struct, '') | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  |         info_struct = GetInfoStructRNA(rna_struct) | 
					
						
							| 
									
										
										
										
											2009-12-19 13:48:50 +00:00
										 |  |  |         if rna_base: | 
					
						
							|  |  |  |             info_struct.base = GetInfoStructRNA(rna_struct_dict[rna_base]) | 
					
						
							|  |  |  |         info_struct.nested = GetInfoStructRNA(rna_struct.nested) | 
					
						
							|  |  |  |         info_struct.children[:] = rna_children_dict[identifier] | 
					
						
							|  |  |  |         info_struct.references[:] = rna_references_dict[identifier] | 
					
						
							|  |  |  |         info_struct.full_path = rna_full_path_dict[identifier] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         info_structs.append(info_struct) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for rna_info_prop in InfoPropertyRNA.global_lookup.values(): | 
					
						
							|  |  |  |         rna_info_prop.build() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for rna_info_prop in InfoFunctionRNA.global_lookup.values(): | 
					
						
							|  |  |  |         rna_info_prop.build() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for rna_info in InfoStructRNA.global_lookup.values(): | 
					
						
							|  |  |  |         rna_info.build() | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |         for prop in rna_info.properties: | 
					
						
							|  |  |  |             prop.build() | 
					
						
							| 
									
										
										
										
											2009-12-25 09:01:23 +00:00
										 |  |  |         for func in rna_info.functions: | 
					
						
							|  |  |  |             func.build() | 
					
						
							|  |  |  |             for prop in func.args: | 
					
						
							|  |  |  |                 prop.build() | 
					
						
							| 
									
										
										
										
											2010-01-02 18:55:07 +00:00
										 |  |  |             for prop in func.return_values: | 
					
						
							|  |  |  |                 prop.build() | 
					
						
							| 
									
										
										
										
											2009-12-26 09:36:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |     if 1: | 
					
						
							|  |  |  |         for rna_info in InfoStructRNA.global_lookup.values(): | 
					
						
							|  |  |  |             for prop in rna_info.properties: | 
					
						
							|  |  |  |                 # ERROR CHECK | 
					
						
							|  |  |  |                 default = prop.default | 
					
						
							| 
									
										
										
										
											2011-08-08 05:21:37 +00:00
										 |  |  |                 if type(default) in {float, int}: | 
					
						
							| 
									
										
										
										
											2010-05-04 06:08:00 +00:00
										 |  |  |                     if default < prop.min or default > prop.max: | 
					
						
							|  |  |  |                         print("\t %s.%s, %s not in [%s - %s]" % (rna_info.identifier, prop.identifier, default, prop.min, prop.max)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |     # now for operators | 
					
						
							|  |  |  |     op_mods = dir(bpy.ops) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for op_mod_name in sorted(op_mods): | 
					
						
							| 
									
										
										
										
											2010-08-19 14:43:52 +00:00
										 |  |  |         if op_mod_name.startswith('__'): | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |             continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         op_mod = getattr(bpy.ops, op_mod_name) | 
					
						
							|  |  |  |         operators = dir(op_mod) | 
					
						
							|  |  |  |         for op in sorted(operators): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 rna_prop = getattr(op_mod, op).get_rna() | 
					
						
							|  |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 rna_prop = None | 
					
						
							|  |  |  |             except TypeError: | 
					
						
							|  |  |  |                 rna_prop = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if rna_prop: | 
					
						
							|  |  |  |                 GetInfoOperatorRNA(rna_prop.bl_rna) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for rna_info in InfoOperatorRNA.global_lookup.values(): | 
					
						
							|  |  |  |         rna_info.build() | 
					
						
							|  |  |  |         for rna_prop in rna_info.args: | 
					
						
							|  |  |  |             rna_prop.build() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-21 23:14:16 +00:00
										 |  |  |     #for rna_info in InfoStructRNA.global_lookup.values(): | 
					
						
							|  |  |  |     #    print(rna_info) | 
					
						
							| 
									
										
										
										
											2009-12-25 14:42:00 +00:00
										 |  |  |     return InfoStructRNA.global_lookup, InfoFunctionRNA.global_lookup, InfoOperatorRNA.global_lookup, InfoPropertyRNA.global_lookup | 
					
						
							| 
									
										
										
										
											2010-06-15 17:14:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     import rna_info | 
					
						
							|  |  |  |     struct = rna_info.BuildRNAInfo()[0] | 
					
						
							| 
									
										
										
										
											2010-08-10 06:27:29 +00:00
										 |  |  |     data = [] | 
					
						
							| 
									
										
										
										
											2010-06-15 17:14:21 +00:00
										 |  |  |     for struct_id, v in sorted(struct.items()): | 
					
						
							| 
									
										
										
										
											2011-10-17 06:58:07 +00:00
										 |  |  |         struct_id_str = v.identifier  #~ "".join(sid for sid in struct_id if struct_id) | 
					
						
							| 
									
										
										
										
											2010-08-10 06:27:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for base in v.get_bases(): | 
					
						
							|  |  |  |             struct_id_str = base.identifier + "|" + struct_id_str | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-10 06:27:29 +00:00
										 |  |  |         props = [(prop.identifier, prop) for prop in v.properties] | 
					
						
							| 
									
										
										
										
											2010-06-15 17:14:21 +00:00
										 |  |  |         for prop_id, prop in sorted(props): | 
					
						
							| 
									
										
										
										
											2012-06-19 22:17:19 +00:00
										 |  |  |             # if prop.type == "boolean": | 
					
						
							| 
									
										
										
										
											2010-07-15 11:51:43 +00:00
										 |  |  |             #     continue | 
					
						
							| 
									
										
										
										
											2010-08-17 02:42:30 +00:00
										 |  |  |             prop_type = prop.type | 
					
						
							|  |  |  |             if prop.array_length > 0: | 
					
						
							|  |  |  |                 prop_type += "[%d]" % prop.array_length | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             data.append("%s.%s -> %s:    %s%s    %s" % (struct_id_str, prop.identifier, prop.identifier, prop_type, ", (read-only)" if prop.is_readonly else "", prop.description)) | 
					
						
							| 
									
										
										
										
											2010-08-10 06:27:29 +00:00
										 |  |  |         data.sort() | 
					
						
							| 
									
										
										
										
											2010-06-15 17:14:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-19 12:06:34 +00:00
										 |  |  |     if bpy.app.background: | 
					
						
							| 
									
										
										
										
											2010-08-10 06:27:29 +00:00
										 |  |  |         import sys | 
					
						
							|  |  |  |         sys.stderr.write("\n".join(data)) | 
					
						
							| 
									
										
										
										
											2010-08-19 14:43:52 +00:00
										 |  |  |         sys.stderr.write("\n\nEOF\n") | 
					
						
							| 
									
										
										
										
											2010-06-19 12:06:34 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         text = bpy.data.texts.new(name="api.py") | 
					
						
							|  |  |  |         text.from_string(data) |