[Bf-blender-cvs] [637206e5c54] asset-engine: Add basic addition support to create new assets.

Bastien Montagne noreply at git.blender.org
Thu Sep 21 12:29:04 CEST 2017


Commit: 637206e5c549f7ec94124b02c7fa9b55ea5f5720
Author: Bastien Montagne
Date:   Wed Sep 13 10:04:00 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB637206e5c549f7ec94124b02c7fa9b55ea5f5720

Add basic addition support to create new assets.

Again, very basic and limited, to be fleshed out later.

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

M	release/scripts/startup/bl_operators/amber/operators.py
M	release/scripts/startup/bl_operators/amber/ui.py
M	release/scripts/startup/bl_operators/amber/utils.py

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

diff --git a/release/scripts/startup/bl_operators/amber/operators.py b/release/scripts/startup/bl_operators/amber/operators.py
index 6a3f3ee0b3d..9c263043922 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -25,15 +25,10 @@ import bpy
 from bpy.types import (
         Operator,
         )
-#~ from bpy.props import (
-        #~ BoolProperty,
-        #~ CollectionProperty,
-        #~ EnumProperty,
-        #~ IntProperty,
-        #~ IntVectorProperty,
-        #~ PointerProperty,
-        #~ StringProperty,
-        #~ )
+from bpy.props import (
+        BoolProperty,
+        EnumProperty,
+        )
 
 import os
 
@@ -109,15 +104,72 @@ class AmberOpsAssetAdd(Operator, AmberOpsEditing):
     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
-        asset = ae.repository_pg.assets.add()
 
         repository = getattr(ae, "repository", None)
         if repository is None:
             repository = ae.repository = AmberDataRepository()
         repository.from_pg(ae.repository_pg)
 
+        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.size = os.stat(path_lib).st_size
+        revision.timestamp = int(time.time())
+        revision.path = os.path.join(path_lib, path_sublib)
+        revision.uuid = utils.uuid_revision_gen(set(), variant.uuid, 0, revision.size, revision.timestamp)
+        variant.revision_default = revision.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()
@@ -149,5 +201,6 @@ class AmberOpsAssetDelete(Operator, AmberOpsEditing):
 
 classes = (
     AmberOpsRepositoryAdd,
+    AmberOpsAssetAdd,
     AmberOpsAssetDelete,
     )
diff --git a/release/scripts/startup/bl_operators/amber/ui.py b/release/scripts/startup/bl_operators/amber/ui.py
index 5d0f1c7b342..415d15aa87b 100644
--- a/release/scripts/startup/bl_operators/amber/ui.py
+++ b/release/scripts/startup/bl_operators/amber/ui.py
@@ -65,7 +65,7 @@ class AMBER_PT_repositories(Panel, AmberPanel):
         row = self.layout.row()
         row.template_list("FILEBROWSER_UL_dir", "amber_repositories",
                           ae.repositories_pg, "repositories", ae.repositories_pg, "repository_index_active",
-                          item_dyntip_propname="path")
+                          item_dyntip_propname="path", rows=1)
 
         col = row.column()
         col.operator("AMBER_OT_repository_add", text="", icon='ZOOMIN')
@@ -177,9 +177,12 @@ class AMBER_PT_assets(Panel, AmberPanel):
         ae = context.space_data.asset_engine
 
         row = self.layout.row()
-        row.template_list("AMBER_UL_assets", "", ae.repository_pg, "assets", ae.repository_pg, "asset_index_active")
+        row.template_list("AMBER_UL_assets", "", ae.repository_pg, "assets", ae.repository_pg, "asset_index_active",
+                          rows=3)
 
         col = row.column()
+        col.operator("AMBER_OT_asset_add", text="", icon='OBJECT_DATA').active_type = 'OBJECT'
+        col.operator("AMBER_OT_asset_add", text="", icon='MATERIAL_DATA').active_type = 'MATERIAL'
         col.operator("AMBER_OT_asset_delete", text="", icon='ZOOMOUT')
 
 
diff --git a/release/scripts/startup/bl_operators/amber/utils.py b/release/scripts/startup/bl_operators/amber/utils.py
index 12155500a69..b16c851cef7 100644
--- a/release/scripts/startup/bl_operators/amber/utils.py
+++ b/release/scripts/startup/bl_operators/amber/utils.py
@@ -35,6 +35,22 @@ AMBER_DBK_VERSION = "version"
 
 AMBER_LIST_FILENAME = "amber_repos.json"
 
+AMBER_LOCAL_STORAGE = "LOCAL_STORAGE"
+
+
+BLENDER_TYPES_TO_PATH = {
+    bpy.types.Object: "Object",
+    bpy.types.Group: "Group",
+    bpy.types.Material: "Material",
+    # TODO complete this!
+}
+
+BLENDER_TYPES_TO_ENUMVAL = {
+    bpy.types.Object: 'OBJECT',
+    bpy.types.Group: 'GROUP',
+    bpy.types.Material: 'MATERIAL',
+    # TODO complete this!
+}
 
 ##########
 # Helpers.
@@ -80,20 +96,18 @@ def uuid_repo_gen(used_uuids, path, name):
     return uuid
 
 
-def uuid_asset_gen(used_uuids, path, name, tags):
+def uuid_asset_gen(used_uuids, repo_uuid, path, name, tags):
     uuid = _uuid_gen(used_uuids, (..., ..., 0, 1), b"", name.encode(), path, *tags)
     assert(uuid is not None)
-    return uuid
+    return repo_uuid[:2] + uuid[2:]
 
 
 def uuid_variant_gen(used_uuids, asset_uuid, name):
-    uuid_root = name.encode()[:8] + b'|'
-    return _uuid_gen(used_uuids, (0, 1, 2, 3), uuid_root, str(asset_uuid), name)
+    return _uuid_gen(used_uuids, (0, 1, 2, 3), b"", str(asset_uuid).encode(), name)
 
 
 def uuid_revision_gen(used_uuids, variant_uuid, number, size, time):
-    uuid_root = str(number).encode() + b'|'
-    return _uuid_gen(used_uuids, (0, 1, 2, 3), uuid_root, str(variant_uuid), str(number), str(size), str(timestamp))
+    return _uuid_gen(used_uuids, (0, 1, 2, 3), b"", str(variant_uuid).encode(), str(number), str(size), str(time))
 
 
 def uuid_unpack_bytes(uuid_bytes):



More information about the Bf-blender-cvs mailing list