feat: progress on armature support

Append modal timer operator to execute armature loading in the right context. Related to  #18
This commit is contained in:
Swann
2019-11-05 14:22:57 +01:00
parent 7e4d3e6d3f
commit 1b3c655829
2 changed files with 115 additions and 56 deletions

View File

@ -35,30 +35,25 @@ class BlArmature(BlDatablock):
if not is_object_in_master and parent_collection.name not in bpy.data.scenes[data['user_scene'][0]].collection.children:
bpy.data.scenes[data['user_scene'][0]].collection. children.link(parent_collection)
# utils.dump_anything.load(target, data)
# with Overrider(name="bpy_",parent=bpy.context) as bpy_:
area, region, rv3d = presence.view3d_find()
override = bpy.context.copy()
if override['area'] is not None:
current_mode = bpy.context.mode
current_active_object = bpy.context.view_layer.objects.active
# LOAD ARMATURE BONES
if override['mode'] != 'OBJECT':
bpy.ops.object.mode_set(override,mode='OBJECT')
bpy.context.view_layer.objects.active = parent_object
override = operators.ui_context
override['editable_objects'] =[bpy.data.objects['Armature']]
override['object'] =bpy.data.objects['Armature']
override['active_object'] = bpy.data.objects['Armature']
# override['']
# override['window'] = bpy.data.window_managers[0].windows[0]
# # override['mode'] = 'EDIT_ARMATURE'
# override['window_manager'] = bpy.data.window_managers[0]
# override['area'] = area
# override['region'] = region
# override['region_data'] = rv3d
# override['screen'] = bpy.data.window_managers[0].windows[0].screen
# bpy.ops.object.mode_set(override,mode='EDIT')
bpy.ops.object.editmode_toggle(override)
# override['mode'] = 'EDIT_ARMATURE'
bpy.ops.object.mode_set(override,mode='EDIT')
for bone in data['bones']:
if bone not in self.pointer.edit_bones:
new_bone = self.pointer.edit_bones.new(bone)
@ -71,11 +66,16 @@ class BlArmature(BlDatablock):
new_bone.head_radius = data['bones'][bone]['head_radius']
if 'parent' in data['bones'][bone]:
new_bone.parent = self.pointer.edit_bones[data['bones'][bone]['parent']['name']]
new_bone.parent = self.pointer.edit_bones[data['bones'][bone]['use_connect']['name']]
new_bone.use_connect = data['bones'][bone]['use_connect']
bpy.data.objects['Armature'].update_from_editmode()
bpy.ops.object.editmode_toggle(override)
print("toto")
bpy.ops.object.mode_set(override,mode='OBJECT')
bpy.context.view_layer.objects.active = current_active_object
# bpy.ops.object.mode_set(override,mode=current_mode)
else:
raise Exception()
# bpy.ops.object.editmode_toggle(override)
# bpy_.mode = 'EDIT_ARMATURE'
# bpy_.active_object = armature
@ -83,8 +83,21 @@ class BlArmature(BlDatablock):
def dump(self, pointer=None):
assert(pointer)
data = utils.dump_datablock(pointer, 4)
# data = utils.dump_datablock(pointer, 4)
dumper = utils.dump_anything.Dumper()
dumper.depth = 3
dumper.include_filter = [
'bones',
'tail_local',
'head_local',
'tail_radius',
'head_radius',
'use_connect',
'name',
'parent',
]
data = dumper.dump(pointer)
#get the parent Object
object_users = utils.get_datablock_users(pointer)[0]
data['user'] = object_users.name
@ -99,8 +112,8 @@ class BlArmature(BlDatablock):
assert(self.data)
self.pointer = bpy.data.armatures.get(self.data['name'])
def diff(self):
False
# def diff(self):
# False
def is_valid(self):
return bpy.data.armatures.get(self.data['name'])
@ -112,3 +125,11 @@ bl_delay_refresh = 1
bl_delay_apply = 0
bl_automatic_push = True
bl_icon = 'ARMATURE_DATA'
# override['window'] = bpy.data.window_managers[0].windows[0]
# # override['mode'] = 'EDIT_ARMATURE'
# override['window_manager'] = bpy.data.window_managers[0]
# override['area'] = area
# override['region'] = region
# override['region_data'] = rv3d
# override['screen'] = bpy.data.window_managers[0].windows[0].screen

View File

@ -20,6 +20,7 @@ from . import bl_types, delayable, environment, presence, ui, utils
from .libs.replication.replication.data import ReplicatedDataFactory
from .libs.replication.replication.exception import NonAuthorizedOperationError
from .libs.replication.replication.interface import Session
from .libs.replication.replication.constants import FETCHED
logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)
@ -27,19 +28,8 @@ logger.setLevel(logging.ERROR)
client = None
delayables = []
ui_context = None
def init_supported_datablocks(supported_types_id):
global client
for type_id in supported_types_id:
if hasattr(bpy.data, type_id):
for item in getattr(bpy.data, type_id):
if client.exist(uuid=item.uuid):
continue
else:
client.add(item)
stop_modal_executor = False
modal_executor_queue = None
# OPERATORS
class SessionStartOperator(bpy.types.Operator):
@ -137,7 +127,6 @@ class SessionStartOperator(bpy.types.Operator):
delayables.append(delayable.ClientUpdate(
client_uuid=settings.user_uuid))
delayables.append(delayable.DrawClient())
delayables.append(delayable.DynamicRightSelectTimer())
# Push all added values
@ -151,6 +140,10 @@ class SessionStartOperator(bpy.types.Operator):
for d in delayables:
d.register()
global modal_executor_queue
modal_executor_queue = queue.Queue()
bpy.ops.wm.modal_executor_operator()
self.report(
{'INFO'},
"connexion on tcp://{}:{}".format(settings.ip, settings.port))
@ -168,7 +161,9 @@ class SessionStopOperator(bpy.types.Operator):
return True
def execute(self, context):
global client, delayables
global client, delayables, stop_modal_executor
stop_modal_executor= True
settings = context.window_manager.session
settings.is_admin = False
assert(client)
@ -325,6 +320,48 @@ class SessionCommit(bpy.types.Operator):
client.push(self.target)
return {"FINISHED"}
class ModalExecutorOperator(bpy.types.Operator):
"""Operator which runs its self from a timer"""
bl_idname = "wm.modal_executor_operator"
bl_label = "Modal Executor Operator"
_timer = None
def modal(self, context, event):
global stop_modal_executor, modal_executor_queue
if stop_modal_executor:
self.cancel(context)
return {'CANCELLED'}
if event.type == 'TIMER':
global client
nodes = client.list(filter=bl_types.bl_armature.BlArmature)
for node in nodes:
node_ref = client.get(uuid=node)
if node_ref.state == FETCHED:
try:
client.apply(node)
except Exception as e:
logger.error("fail to apply {}: {}".format(node_ref.uuid,e))
return {'PASS_THROUGH'}
def execute(self, context):
wm = context.window_manager
self._timer = wm.event_timer_add(2, window=context.window)
wm.modal_handler_add(self)
return {'RUNNING_MODAL'}
def cancel(self, context):
global stop_modal_executor
wm = context.window_manager
wm.event_timer_remove(self._timer)
stop_modal_executor = False
classes = (
SessionStartOperator,
@ -334,6 +371,7 @@ classes = (
SessionPropertyRightOperator,
SessionApply,
SessionCommit,
ModalExecutorOperator,
)