diff options
Diffstat (limited to 'release/scripts/modules/bpy_types.py')
-rw-r--r-- | release/scripts/modules/bpy_types.py | 118 |
1 files changed, 99 insertions, 19 deletions
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 9d6f5ce7b2f..5030e9f4868 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -19,6 +19,7 @@ # <pep8 compliant> from _bpy import types as bpy_types +import _bpy from mathutils import Vector StructRNA = bpy_types.Struct.__bases__[0] @@ -51,7 +52,7 @@ class Library(bpy_types.ID): # See: readblenentry.c, IDTYPE_FLAGS_ISLINKABLE, we could make this an attribute in rna. attr_links = "actions", "armatures", "brushes", "cameras", \ - "curves", "gpencil", "groups", "images", \ + "curves", "grease_pencil", "groups", "images", \ "lamps", "lattices", "materials", "metaballs", \ "meshes", "node_groups", "objects", "scenes", \ "sounds", "textures", "texts", "fonts", "worlds" @@ -308,11 +309,11 @@ class Mesh(bpy_types.ID): self.add_geometry(len(verts), len(edges), len(faces)) verts_flat = [f for v in verts for f in v] - self.verts.foreach_set("co", verts_flat) + self.vertices.foreach_set("co", verts_flat) del verts_flat edges_flat = [i for e in edges for i in e] - self.edges.foreach_set("verts", edges_flat) + self.edges.foreach_set("vertices", edges_flat) del edges_flat def treat_face(f): @@ -323,7 +324,7 @@ class Mesh(bpy_types.ID): return f faces_flat = [v for f in faces for v in treat_face(f)] - self.faces.foreach_set("verts_raw", faces_flat) + self.faces.foreach_set("vertices_raw", faces_flat) del faces_flat @property @@ -371,7 +372,7 @@ class Mesh(bpy_types.ID): for f in faces: # if len(f) == 4: - if f.verts_raw[3] != 0: + if f.vertices_raw[3] != 0: edge_keys = f.edge_keys for i, edkey in enumerate(f.edge_keys): edges.setdefault(edkey, []).append(edge_keys[OTHER_INDEX[i]]) @@ -444,11 +445,11 @@ class Mesh(bpy_types.ID): if not hasattr(edges, "pop"): edges = edges[:] - edge_dict = {ed.key: ed for ed in self.edges if ed.selected} + edge_dict = {ed.key: ed for ed in self.edges if ed.select} while edges: current_edge = edges.pop() - vert_end, vert_start = current_edge.verts[:] + vert_end, vert_start = current_edge.vertices[:] line_poly = [vert_start, vert_end] ok = True @@ -459,7 +460,7 @@ class Mesh(bpy_types.ID): while i: i -= 1 ed = edges[i] - v1, v2 = ed.verts + v1, v2 = ed.vertices if v1 == vert_end: line_poly.append(v2) vert_end = line_poly[-1] @@ -494,7 +495,7 @@ class MeshEdge(StructRNA): @property def key(self): - return ord_ind(*tuple(self.verts)) + return ord_ind(*tuple(self.vertices)) class MeshFace(StructRNA): @@ -503,8 +504,8 @@ class MeshFace(StructRNA): @property def center(self): """The midpoint of the face.""" - face_verts = self.verts[:] - mesh_verts = self.id_data.verts + face_verts = self.vertices[:] + mesh_verts = self.id_data.vertices if len(face_verts) == 3: return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co) / 3.0 else: @@ -512,7 +513,7 @@ class MeshFace(StructRNA): @property def edge_keys(self): - verts = self.verts[:] + verts = self.vertices[:] if len(verts) == 3: return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[0]) @@ -524,7 +525,7 @@ class Text(bpy_types.ID): def as_string(self): """Return the text as a string.""" - return "\n".join(line.line for line in self.lines) + return "\n".join(line.body for line in self.lines) def from_string(self, string): """Replace text with this string.""" @@ -539,8 +540,83 @@ class Text(bpy_types.ID): import collections +TypeMap = {} +# Properties (IDPropertyGroup) are different from types because they need to be registered +# before adding sub properties to them, so they are registered on definition +# and unregistered on unload +PropertiesMap = {} -class OrderedMeta(type): +# Using our own loading function we set this to false +# so when running a script directly in the text editor +# registers moduals instantly. +_register_immediate = True + +def _unregister_module(module, free=True): + for t in TypeMap.get(module, ()): + try: + bpy_types.unregister(t) + except: + import traceback + print("bpy.utils._unregister_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__)) + traceback.print_exc() + + if free == True and module in TypeMap: + del TypeMap[module] + + + for t in PropertiesMap.get(module, ()): + try: + bpy_types.unregister(t) + except: + import traceback + print("bpy.utils._unload_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__)) + traceback.print_exc() + + if free == True and module in PropertiesMap: + del PropertiesMap[module] + + +def _register_module(module): + for t in TypeMap.get(module, ()): + try: + bpy_types.register(t) + except: + import traceback + print("bpy.utils._register_module(): Module '%s' failed to register class '%s.%s'" % (module, t.__module__, t.__name__)) + traceback.print_exc() + + +class RNAMeta(type): + @classmethod + def _register_immediate(cls): + return _register_immediate + + def __new__(cls, name, bases, classdict, **args): + result = type.__new__(cls, name, bases, classdict) + if bases and bases[0] != StructRNA: + module = result.__module__ + + ClassMap = TypeMap + + # Register right away if needed + if cls._register_immediate(): + bpy_types.register(result) + ClassMap = PropertiesMap + + # first part of packages only + if "." in module: + module = module[:module.index(".")] + + ClassMap.setdefault(module, []).append(result) + + return result + +class RNAMetaRegister(RNAMeta): + @classmethod + def _register_immediate(cls): + return True + +class OrderedMeta(RNAMeta): def __init__(cls, name, bases, attributes): super(OrderedMeta, cls).__init__(name, bases, attributes) @@ -549,7 +625,6 @@ class OrderedMeta(type): def __prepare__(name, bases, **kwargs): return collections.OrderedDict() - # Only defined so operators members can be used by accessing self.order class Operator(StructRNA, metaclass=OrderedMeta): __slots__ = () @@ -564,7 +639,12 @@ class Macro(StructRNA, metaclass=OrderedMeta): def define(self, opname): from _bpy import ops return ops.macro_define(self, opname) + +class IDPropertyGroup(StructRNA, metaclass=RNAMetaRegister): + __slots__ = () +class RenderEngine(StructRNA, metaclass=RNAMeta): + __slots__ = () class _GenericUI: __slots__ = () @@ -606,15 +686,15 @@ class _GenericUI: pass -class Panel(StructRNA, _GenericUI): +class Panel(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () -class Header(StructRNA, _GenericUI): +class Header(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () -class Menu(StructRNA, _GenericUI): +class Menu(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () def path_menu(self, searchpaths, operator, props_default={}): @@ -638,7 +718,7 @@ class Menu(StructRNA, _GenericUI): if f.startswith("."): continue - preset_name = bpy.utils.display_name(f) + preset_name = bpy.path.display_name(f) props = layout.operator(operator, text=preset_name) for attr, value in props_default.items(): |