[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