[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