[Bf-extensions-cvs] [f0d811c] master: adding stored views to addons contrib for development. contributors, nfloyd, CoDEmanX, meta-androcto tracker: https://developer.blender.org/T27476

Brendon Murphy noreply at git.blender.org
Sat Jul 12 18:04:25 CEST 2014


Commit: f0d811cbea8cf141d36bec0dd7678286135ba17b
Author: Brendon Murphy
Date:   Sun Jul 13 02:02:36 2014 +1000
https://developer.blender.org/rBACf0d811cbea8cf141d36bec0dd7678286135ba17b

adding stored views to addons contrib for development.
contributors, nfloyd, CoDEmanX, meta-androcto
tracker: https://developer.blender.org/T27476

Signed-off-by: Brendon Murphy <meta.androcto1 at gmail.com>

===================================================================

A	stored_views/__init__.py
A	stored_views/core.py
A	stored_views/io.py
A	stored_views/operators.py
A	stored_views/properties.py
A	stored_views/ui.py

===================================================================

diff --git a/stored_views/__init__.py b/stored_views/__init__.py
new file mode 100644
index 0000000..119fa41
--- /dev/null
+++ b/stored_views/__init__.py
@@ -0,0 +1,118 @@
+# ##### 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,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+bl_info = {
+    "name": "Stored Views",
+    "description": "Save and restore User defined views, pov, layers and display configs.",
+    "author": "nfloyd",
+    "version": (0, 3, 3, 'beta'),
+    "blender": (2, 71, 0),
+    "location": "View3D > Properties > Stored Views",
+    "warning": 'beta release, single view only',
+    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/3D_interaction/stored_views",
+    "tracker_url": "https://developer.blender.org/T27476",
+    "category": "3D View"}
+
+# ACKNOWLEDGMENT
+# ==============
+# import/export functionality is mostly based
+#   on Bart Crouch's Theme Manager Addon
+
+
+# CHANGELOG
+# =========
+# 0.1.0 : _ initial release
+# 0.2.0 : _ quadview support
+#         _ import/export functionality from/to preset files
+#           inspired - that is an euphemism - from Bart Crouch Theme Manager Addon
+#         _ import data from an another scene
+# 0.2.1 : _ improved previous / toggle logic
+#         _ fix : object reference works if name has changed
+#         _ fix for python api change 36710
+#         _ checks on data import (scene or preset file)
+# 0.2.2 : _ fix : previous / toggle
+#         _ io filtering
+#         _ stored views name display in 3d view (experimental)
+#         _ UI tweaks
+#         _ generate unique view name
+#         _ added wiki and tracker url
+# 0.3.0   _ refactor
+#         _ removed previous, io ui
+#         _ fix: POV.is_modified - use perspective_matrix insted of view_matrix
+#                                - presets are no longer backward compatible
+
+# TODO: check against 2.63
+# TODO: quadview complete support : investigate. Where's the data?
+# TODO: lock_camera_and_layers. investigate usage
+# TODO: list reordering
+
+# logging setup
+import logging
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+hdlr = logging.StreamHandler()
+fmtr = logging.Formatter('%(asctime)s %(levelname)s %(name)s : %(funcName)s - %(message)s')
+hdlr.setFormatter(fmtr)
+logger.addHandler(hdlr)
+
+
+if "bpy" in locals():
+    import imp
+    imp.reload(ui)
+    imp.reload(properties)
+    imp.reload(core)
+    imp.reload(operators)
+    imp.reload(io)
+else:
+    #from . import properties, core
+    from . import ui, properties, core, operators, io
+
+import bpy
+from bpy.props import PointerProperty
+
+
+class VIEW3D_stored_views_initialize(bpy.types.Operator):
+    bl_idname = "view3d.stored_views_initialize"
+    bl_label = "Initilize"
+
+    @classmethod
+    def poll(cls, context):
+        return not hasattr(bpy.types.Scene, 'stored_views')
+
+    def execute(self, context):
+        bpy.types.Scene.stored_views = PointerProperty(type=properties.StoredViewsData)
+        scenes = bpy.data.scenes
+        for scene in scenes:
+            core.DataStore.sanitize_data(scene)
+        return {'FINISHED'}
+
+
+def register():
+    bpy.utils.register_module(__name__)
+    # Context restricted, need to initialize different (button to be clicked by user)
+    #initialize()
+
+def unregister():
+    ui.VIEW3D_stored_views_draw.handle_remove(bpy.context)
+    bpy.utils.unregister_module(__name__)
+    if hasattr(bpy.types.Scene, "stored_views"):
+        del bpy.types.Scene.stored_views
+
+if __name__ == "__main__":
+    register()
diff --git a/stored_views/core.py b/stored_views/core.py
new file mode 100644
index 0000000..83c1fb9
--- /dev/null
+++ b/stored_views/core.py
@@ -0,0 +1,381 @@
+import logging
+module_logger = logging.getLogger(__name__)
+
+import hashlib
+
+import bpy
+
+
+class StoredView():
+    def __init__(self, mode, index=None):
+        self.logger = logging.getLogger('%s.StoredView' % __name__)
+        self.scene = bpy.context.scene
+        self.view3d = bpy.context.space_data
+        self.index = index
+        self.data_store = DataStore(mode=mode)
+
+    def save(self):
+        if self.index == -1:
+            stored_view, self.index = self.data_store.create()
+        else:
+            stored_view = self.data_store.get(self.index)
+        self.from_v3d(stored_view)
+        self.logger.debug('index: %s name: %s' % (self.data_store.current_index, stored_view.name))
+
+    def set(self):
+        stored_view = self.data_store.get(self.index)
+        self.update_v3d(stored_view)
+        self.logger.debug('index: %s name: %s' % (self.data_store.current_index, stored_view.name))
+
+    def from_v3d(self, stored_view):
+        raise NotImplementedError("Subclass must implement abstract method")
+
+    def update_v3d(self, stored_view):
+        raise NotImplementedError("Subclass must implement abstract method")
+
+    @staticmethod
+    def is_modified(context, stored_view):
+        raise NotImplementedError("Subclass must implement abstract method")
+
+
+class POV(StoredView):
+    def __init__(self, index=None):
+        super().__init__(mode='POV', index=index)
+        self.logger = logging.getLogger('%s.POV' % __name__)
+
+    def from_v3d(self, stored_view):
+        view3d = self.view3d
+        region3d = view3d.region_3d
+
+        stored_view.distance = region3d.view_distance
+        stored_view.location = region3d.view_location
+        stored_view.rotation = region3d.view_rotation
+        stored_view.perspective_matrix_md5 = POV._get_perspective_matrix_md5(region3d)
+        stored_view.perspective = region3d.view_perspective
+        stored_view.lens = view3d.lens
+        stored_view.clip_start = view3d.clip_start
+        stored_view.clip_end = view3d.clip_end
+
+        if region3d.view_perspective == 'CAMERA':
+            stored_view.camera_type = view3d.camera.type  # type : 'CAMERA' or 'MESH'
+            stored_view.camera_name = view3d.camera.name  # store string instead of object
+            stored_view.camera_pointer = view3d.camera.as_pointer()
+        if view3d.lock_object != None:
+            stored_view.lock_object_name = view3d.lock_object.name  # idem
+            stored_view.lock_object_pointer = view3d.lock_object.as_pointer()  # idem
+
+        stored_view.lock_cursor = view3d.lock_cursor
+        stored_view.cursor_location = view3d.cursor_location
+
+    def update_v3d(self, stored_view):
+        view3d = self.view3d
+        region3d = view3d.region_3d
+        region3d.view_distance = stored_view.distance
+        region3d.view_location = stored_view.location
+        region3d.view_rotation = stored_view.rotation
+        region3d.view_perspective = stored_view.perspective
+        view3d.lens = stored_view.lens
+        view3d.clip_start = stored_view.clip_start
+        view3d.clip_end = stored_view.clip_end
+        view3d.lock_cursor = stored_view.lock_cursor
+        if stored_view.lock_cursor == True:
+            # update cursor only if view is locked to cursor
+            view3d.cursor_location = stored_view.cursor_location
+
+        if stored_view.perspective == "CAMERA":
+            cam = self._get_object(stored_view.camera_name, stored_view.camera_pointer)
+            if cam:
+                # in case the camera is found by pointer, update name
+                stored_view.camera_name = cam.name
+                view3d.camera = cam
+            else:
+                # TODO: camera object not found
+                pass
+
+        if stored_view.lock_object_name != "":
+            lock_obj = self._get_object(stored_view.lock_object_name, stored_view.lock_object_pointer)
+            if lock_obj:
+                # in case the lock object is found by pointer, update name
+                stored_view.lock_object_name = lock_obj.name
+                view3d.lock_object = lock_obj
+            else:
+                # TODO: handle lock object not found
+                pass
+
+    @staticmethod
+    def _get_object(name, pointer=None):
+        obj = None
+        try:
+            obj = bpy.data.objects[name]
+        except:
+            if pointer:
+                scene_objects = bpy.data.objects
+                for o in scene_objects:
+                    p = o.as_pointer()
+                    if p == pointer:
+                        obj = o
+                        break
+        return obj
+
+    @staticmethod
+    def is_modified(context, stored_view):
+        # TODO: check for others param, currently only perspectiveand perspective_matrix are checked
+        logger = logging.getLogger('%s.POV' % __name__)
+        view3d = context.space_data
+        region3d = view3d.region_3d
+        if region3d.view_perspective != stored_view.perspective:
+            logger.debug('view_perspective')
+            return True
+
+        md5 = POV._get_perspective_matrix_md5(region3d)
+        if (md5 != stored_view.perspective_matrix_md5 and
+            region3d.view_perspective != "CAMERA"):
+            logger.debug('perspective_matrix')
+            return True
+
+        return False
+
+    @staticmethod
+    def _get_perspective_matrix_md5(region3d):
+        md5 = hashlib.md5(str(region3d.perspective_matrix).encode('utf-8')).hexdigest()
+        return md5
+
+
+class Layers(StoredView):
+    def __init__(self, index=None):
+        super().__init__(mode='LAYERS', index=index)
+        self.logger = logging.getLogger('%s.Layers' % __name__)
+
+    def from_v3d(self, stored_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list