[Bf-blender-cvs] [8b501b2a7d2] asset-engine: Fix mistakes (wrong copy/paste :/ ) in previous commit.

Bastien Montagne noreply at git.blender.org
Fri Oct 20 16:17:03 CEST 2017


Commit: 8b501b2a7d23e9c02e82ad70fe64a5dfb71d94a3
Author: Bastien Montagne
Date:   Fri Oct 20 15:32:03 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB8b501b2a7d23e9c02e82ad70fe64a5dfb71d94a3

Fix mistakes (wrong copy/paste :/ ) in previous commit.

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

M	release/scripts/startup/bl_operators/amber/operators.py
M	release/scripts/startup/bl_operators/amber/repository.py

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

diff --git a/release/scripts/startup/bl_operators/amber/operators.py b/release/scripts/startup/bl_operators/amber/operators.py
index 0636d94077c..7036d5ee7e0 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -23,757 +23,327 @@
 
 import bpy
 from bpy.types import (
-        AssetEntry,
-        PropertyGroup,
+        Operator,
         )
 from bpy.props import (
         BoolProperty,
-        CollectionProperty,
         EnumProperty,
         IntProperty,
-        IntVectorProperty,
-        PointerProperty,
         StringProperty,
         )
 
-import json
 import os
-import stat
-import time
 
-from . import utils
+from . import (repository, utils)
+
+from .repository import (
+        AmberDataRepository,
+        AmberDataRepositoryList,
+        )
+
+
+class AmberOps():
+    """Base Amber asset engine operators class."""
+    @classmethod
+    def poll(cls, context):
+        space = context.space_data
+        if space and space.type == 'FILE_BROWSER':
+            ae = space.asset_engine
+            if ae and space.asset_engine_type == "AssetEngineAmber":
+                return True
+        return False
+
+
+class AmberOpsEditing(AmberOps):
+    """Base Amber asset engine operators class for editing repositories."""
+    @classmethod
+    def poll(cls, context):
+        space = context.space_data
+        wm = context.window_manager
+        if space and space.type == 'FILE_BROWSER':
+            return (space.active_operator is None) and wm.amber_enable_editing and AmberOps.poll(context)
+        return False
 
 
-###########################
-# Asset Engine data classes.
-class AmberDataTagPG(PropertyGroup):
-    def tag_update_func(self, context):
-        if not (context and context.space_data):
-            return
+class AmberOpsRepositoryAdd(Operator, AmberOpsEditing):
+    """Create a new, empty Amber repository in current directory (WARNING! No undo!)"""
+    bl_idname = "amber.repository_add"
+    bl_label = "Add Repository"
+    bl_options = set()
+
+    def execute(self, context):
         ae = context.space_data.asset_engine
-        name_prev = self.name_prev or self.name
+        path = context.space_data.params.directory
 
-        if ae.repository_pg.tag_lock_updates:
-            return
-        ae.repository_pg.tag_lock_updates = True
+        if getattr(ae, "repo", None) is not None:
+            self.report({'INFO'}, "Current directory is already an Amber repository, '%s'" % ae.repo.name)
+            return {'CANCELLED'}
+        if os.path.exists(os.path.join(path, utils.AMBER_DB_NAME)):
+            self.report({'INFO'}, "Current directory is already an Amber repository")
+            return {'CANCELLED'}
 
-        tag = ae.repository_pg.tags.get(name_prev, None)
-        if tag and tag != self:
-            tag.name_prev = tag.name = self.name
-            tag.priority = self.priority
+        repository = getattr(ae, "repository", None)
+        if repository is None:
+            repository = ae.repository = AmberDataRepository()
+        repository.clear()
 
-        for asset in ae.repository_pg.assets:
-            tag = asset.tags.get(name_prev, None)
-            if tag and tag != self:
-                tag.name_prev = tag.name = self.name
-                tag.priority = self.priority
+        repository.path = path
+        repository.name = "Amber " + os.path.split(repository.path)[0].split(os.path.sep)[-1]
+        repository.uuid = utils.uuid_repo_gen(set(AmberDataRepositoryList().repositories), repository.path, repository.name)
 
-        self.name_prev = self.name
+        # TODO more default settings, probably default set of basic tags...
+
+        repository.to_pg(ae.repository_pg)
+        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+
+        bpy.ops.file.refresh()
+
+        return {'FINISHED'}
+
+
+class AmberOpsAssetAdd(Operator, AmberOpsEditing):
+    """Add an Amber asset to the repository (WARNING! No undo!)"""
+    bl_idname = "amber.asset_add"
+    bl_label = "Add Asset"
+    bl_options = set()
+
+    active_type = EnumProperty(items=(('OBJECT', "Object/Group", "Active Object or Group in Blender"),
+                                      ('MATERIAL', "Material", "Active material from active Object"),
+                                      # TODO More options?
+                                     ),
+                               name="Asset Type", description="Type of active datablock to create the asset from")
+
+    copy_local = BoolProperty(name="Copy Local",
+                              description="Copy selected datablock and its dependencies into a library .blend file "
+                                          "local to the repository (mandatory when current .blend file is not saved)")
+
+
+    def execute(self, context):
+        import time
+
+        ae = context.space_data.asset_engine
 
         repository = getattr(ae, "repository", None)
         if repository is None:
             repository = ae.repository = AmberDataRepository()
         repository.from_pg(ae.repository_pg)
 
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+        datablock = None
+        if self.active_type == 'OBJECT':
+            datablock = context.active_object
+            if datablock.dupli_type == 'GROUP' and datablock.dupli_group is not None:
+                datablock = datablock.dupli_group
+        elif self.active_type == 'MATERIAL':
+            datablock = context.active_object.material_slots[context.active_object.active_material_index].material
+
+        if datablock is None:
+            self.report({'INFO'}, "No suitable active datablock found to create a new asset")
+            return {'CANCELLED'}
+
+        if bpy.data.is_dirty or not bpy.data.filepath:
+            self.report({'WARNING'}, "Current .blend file not saved on disk, enforcing copying data into local repository storage")
+            self.copy_local = True
+
+        path_sublib = os.path.join(utils.BLENDER_TYPES_TO_PATH[type(datablock)], datablock.name)
+        path_lib = bpy.data.filepath
+
+        asset = ae.repository_pg.assets.add()
+        asset.name = datablock.name
+        asset.file_type = 'BLENLIB'
+        asset.blender_type = utils.BLENDER_TYPES_TO_ENUMVAL[type(datablock)]
+        asset.uuid = utils.uuid_asset_gen(set(repository.assets.keys()), ae.repository_pg.uuid, path_sublib, asset.name, [])
+
+        if self.copy_local:
+            path_dir = os.path.join(repository.path, utils.AMBER_LOCAL_STORAGE)
+            if not os.path.exists(path_dir):
+                os.mkdir(path_dir)
+            path_lib = os.path.join(path_dir, asset.name + "_" + utils.uuid_pack(asset.uuid) + ".blend")
+            bpy.data.libraries.write(path_lib, {datablock}, relative_remap=True, fake_user=True, compress=True)
+
+        variant = asset.variants.add()
+        variant.name = "default"
+        variant.uuid = utils.uuid_variant_gen(set(), asset.uuid, variant.name)
+        asset.variant_default = variant.uuid
+
+        revision = variant.revisions.add()
+        revision.timestamp = int(time.time())
+        revision.uuid = utils.uuid_revision_gen(set(), variant.uuid, 0, revision.timestamp)
+        variant.revision_default = revision.uuid
+
+        view = revision.views.add()
+        view.name = "default"
+        view.size = os.stat(path_lib).st_size
+        view.timestamp = revision.timestamp
+        view.path = os.path.join(path_lib, path_sublib)
+        view.uuid = utils.uuid_view_gen(set(), revision.uuid, view.name, view.size, view.timestamp)
+        revision.view_default = view.uuid
+
+        repository.from_pg(ae.repository_pg)
+        repository.wrt_repo(os.path.join(ae.repository.path, utils.AMBER_DB_NAME), ae.repository.to_dict())
 
         bpy.ops.file.refresh()
 
-        ae.repository_pg.tag_lock_updates = False
-
-    name = StringProperty(name="Name", description="Tag name", update=tag_update_func)
-    priority = IntProperty(name="Priority", default=0, description="Tag priority (used to order tags, highest priority go first)", update=tag_update_func)
-
-    name_prev = StringProperty(options={'HIDDEN'})
-
-    def include_update(self, context):
-        if self.use_include:
-            self.use_exclude = False
-        sd = context.space_data
-        if sd and sd.type == 'FILE_BROWSER' and sd.asset_engine:
-            sd.asset_engine.is_dirty_filtering = True
-    use_include = BoolProperty(name="Include", default=False, description="This tag must exist in filtered items",
-                               update=include_update)
-
-    def exclude_update(self, context):
-        if self.use_exclude:
-            self.use_include = False
-        sd = context.space_data
-        if sd and sd.type == 'FILE_BROWSER' and sd.asset_engine:
-            sd.asset_engine.is_dirty_filtering = True
-    use_exclude = BoolProperty(name="Exclude", default=False, description="This tag must not exist in filtered items",
-                               update=exclude_update)
-
-    @staticmethod
-    def from_dict(tags, tags_dict):
-        tags.clear()
-        tags.update(tags_dict)
-
-    @staticmethod
-    def to_dict(tags):
-        return tags.copy()
-
-    @staticmethod
-    def from_pg(tags, pg):
-        tags.clear()
-        tags.update({t.name: t.priority for t in pg})
-
-    @staticmethod
-    def to_pg(pg, tags, subset=None, do_clear=False):
-        if do_clear:
-            pg.clear()
-            for tag_name, tag_priority in tags.items():
-                if subset is not None and tag_name not in subset:
-                    continue
-                tag_pg = pg.add()
-                tag_pg.name_prev = tag_pg.name = tag_name
-                tag_pg.priority = tag_priority
-        else:
-            removed_tags = set(t.name for t in pg) - set(subset or tags)
-            added_tags = set(subset or tags) - set(t.name for t in pg)
-            for tag_name in removed_tags:
-                pg.remove(pg.find(tag_name))
-            for tag_pg in pg:
-                tag_pg.priority = ta

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list