refactor(rcf): code formating

This commit is contained in:
Swann Martinez
2019-04-18 15:05:48 +02:00
parent 2a9931dc0c
commit 91611f01e2
5 changed files with 122 additions and 110 deletions

View File

@ -69,21 +69,21 @@ class RCFClient(object):
self.pipe, peer = zpipe(self.ctx)
self.queue = queue.Queue()
self.agent = threading.Thread(
target=rcf_client_agent, args=(self.ctx, peer,self.queue),name="net-agent")
target=rcf_client_agent, args=(self.ctx, peer, self.queue), name="net-agent")
self.agent.daemon = True
self.agent.start()
def connect(self, id, address, port):
self.pipe.send_multipart([b"CONNECT", (id.encode() if isinstance(
id, str) else id), (address.encode() if isinstance(
address, str) else address), b'%d' % port])
address, str) else address), b'%d' % port])
def set(self, key, value=None):
"""Set new value in distributed hash table
Sends [SET][key][value] to the agent
"""
self.pipe.send_multipart(
[b"SET", umsgpack.packb(key),( umsgpack.packb(value) if value else umsgpack.packb('None') )])
[b"SET", umsgpack.packb(key), (umsgpack.packb(value) if value else umsgpack.packb('None'))])
def get(self, key):
"""Lookup value in distributed hash table
@ -157,7 +157,7 @@ class RCFClientAgent(object):
self.publisher.setsockopt(zmq.SNDHWM, 60)
self.publisher.linger = 0
self.serial, peer = zpipe(self.ctx)
self.serial_agent = threading.Thread(
self.serial_agent = threading.Thread(
target=serialization_agent, args=(self.ctx, peer), name="serial-agent")
self.serial_agent.daemon = True
self.serial_agent.start()
@ -189,9 +189,8 @@ class RCFClientAgent(object):
value = helpers.dump(key)
if value:
logger.info("{} dumped".format(key))
# Send key-value pair on to server
rcfmsg = message.RCFMessage(key=key, id=self.id, mtype="", body=value)
rcfmsg = message.RCFMessage(
key=key, id=self.id, mtype="", body=value)
rcfmsg.store(self.property_map)
rcfmsg.send(self.publisher)
@ -203,17 +202,18 @@ class RCFClientAgent(object):
key = umsgpack.unpackb(msg[0])
for k in self.property_map.keys():
if key in k:
value.append([k,self.property_map.get(k).body])
value.append([k, self.property_map.get(k).body])
# value = [self.property_map.get(key) for key in keys]
# value = self.property_map.get(key)
self.pipe.send(umsgpack.packb(value) if value else umsgpack.packb(''))
self.pipe.send(umsgpack.packb(value)
if value else umsgpack.packb(''))
elif command == b"LIST":
self.pipe.send(umsgpack.packb(list(self.property_map)))
def rcf_client_agent(ctx, pipe,queue):
def rcf_client_agent(ctx, pipe, queue):
agent = RCFClientAgent(ctx, pipe)
server = None
update_queue = queue
@ -230,7 +230,7 @@ def rcf_client_agent(ctx, pipe,queue):
server = agent.server
if agent.server:
logger.info("%s: waiting for server at %s:%d...",
agent.id.decode(),server.address, server.port)
agent.id.decode(), server.address, server.port)
server.snapshot.send(b"SNAPSHOT_REQUEST")
agent.state = State.SYNCING
server_socket = server.snapshot
@ -262,20 +262,21 @@ def rcf_client_agent(ctx, pipe,queue):
with lock:
client_dict = helpers.init_client(key=client_key)
client_store = message.RCFMessage(key=client_key, id=agent.id.decode(),body=client_dict)
client_store = message.RCFMessage(
key=client_key, id=agent.id.decode(), body=client_dict)
logger.info(client_store)
client_store.store(agent.property_map)
logger.info("snapshot complete")
agent.state = State.ACTIVE
else:
helpers.load(rcfmsg.key,rcfmsg.body)
helpers.load(rcfmsg.key, rcfmsg.body)
rcfmsg.store(agent.property_map)
elif agent.state == State.ACTIVE:
if rcfmsg.id != agent.id:
# update_queue.put((rcfmsg.key,rcfmsg.body))
with lock:
helpers.load(rcfmsg.key,rcfmsg.body)
helpers.load(rcfmsg.key, rcfmsg.body)
# logger.info("load")
# agent.serial.send_multipart([b"LOAD", umsgpack.packb(rcfmsg.key), umsgpack.packb(rcfmsg.body)])
@ -320,8 +321,7 @@ class SerializationAgent(object):
key = umsgpack.unpackb(msg[0])
value = umsgpack.unpackb(msg[1])
helpers.load(key,value)
helpers.load(key, value)
self.pipe.send_multipart([b"DONE"])
@ -345,7 +345,3 @@ def serialization_agent(ctx, pipe):
if agent.pipe in items:
agent.control_message()

17
draw.py
View File

@ -7,6 +7,7 @@ import mathutils
from bpy_extras import view3d_utils
from gpu_extras.batch import batch_for_shader
def view3d_find():
for area in bpy.data.window_managers[0].windows[0].screen.areas:
if area.type == 'VIEW_3D':
@ -60,12 +61,12 @@ def get_client_2d(coords):
if area and region and rv3d:
return view3d_utils.location_3d_to_region_2d(region, rv3d, coords)
else:
return (0,0)
return (0, 0)
class HUD(object):
def __init__(self, client_instance = None):
def __init__(self, client_instance=None):
self.d3d_items = {}
self.d2d_items = {}
self.draw3d_handle = None
@ -123,7 +124,7 @@ class HUD(object):
bbox_corners = [ob.matrix_world @ mathutils.Vector(corner) for corner in ob.bound_box]
coords = [(point.x, point.y, point.z)
for point in bbox_corners]
for point in bbox_corners]
shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
@ -132,9 +133,8 @@ class HUD(object):
batch = batch_for_shader(
shader, 'LINES', {"pos": coords}, indices=indices)
self.d3d_items["{}/{}".format(client[0],select_ob)]=(shader, batch, color)
self.d3d_items["{}/{}".format(client[0],
select_ob)] = (shader, batch, color)
def draw_clients(self):
clients = self.client.get("Client")
@ -156,8 +156,8 @@ class HUD(object):
batch = batch_for_shader(
shader, 'LINES', {"pos": position}, indices=indices)
self.d3d_items[client[0]]=(shader, batch, color)
self.d2d_items[client[0]]=(position[1], name,color)
self.d3d_items[client[0]] = (shader, batch, color)
self.d2d_items[client[0]] = (position[1], name, color)
except Exception as e:
print("Draw client exception {}".format(e))
@ -191,4 +191,3 @@ class HUD(object):
# Draw clients
self.draw_clients()
self.draw_selected_object()

View File

@ -11,6 +11,7 @@ def refresh_window():
import bpy
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
def get_selected_objects(scene):
selected_objects = []
for obj in scene.objects:
@ -20,37 +21,38 @@ def get_selected_objects(scene):
return selected_objects
# LOAD HELPERS
def load(key, value):
target = resolve_bpy_path(key)
target_type = key.split('/')[0]
if target_type == 'Object':
load_object(target=target, data=value,
create=True)
elif target_type == 'Mesh':
load_mesh(target=target, data=value,
create=True)
create=True)
elif target_type == 'Collection':
load_collection(target=target, data=value,
create=True)
elif target_type == 'Material':
load_material(target=target, data=value,
create=True)
create=True)
elif target_type == 'Grease Pencil':
load_gpencil(target=target, data=value,
create=True)
create=True)
elif target_type == 'Scene':
load_scene(target=target, data=value,
create=True)
create=True)
elif 'Light' in target_type:
load_light(target=target, data=value,
create=True)
create=True)
elif target_type == 'Camera':
load_default(target=target, data=value,
create=True, type=target_type)
create=True, type=target_type)
elif target_type == 'Client':
load_client(key.split('/')[1],value)
load_client(key.split('/')[1], value)
def resolve_bpy_path(path):
@ -69,20 +71,19 @@ def resolve_bpy_path(path):
return item
def load_client(client=None,data=None):
def load_client(client=None, data=None):
C = bpy.context
D = bpy.data
if client and data:
# localy_selected = get_selected_objects(C.scene)
# Draw client
#Load selected object
# Load selected object
if data['active_objects']:
for obj in C.scene.objects:
if obj.name in data['active_objects']:
D.objects[obj.name].hide_select = True
else:
print(data['active_objects'])
D.objects[obj.name].hide_select = False
pass
@ -182,7 +183,7 @@ def load_scene(target=None, data=None, create=False):
target.collection.objects.link(bpy.data.objects[object])
for object in target.collection.objects.keys():
if object not in data["collection"]["objects"]:
if object not in data["collection"]["objects"]:
target.collection.objects.unlink(bpy.data.objects[object])
# load collections
# TODO: Recursive link
@ -242,11 +243,10 @@ def load_material(target=None, data=None, create=False):
print("Material loading error")
def load_gpencil_layer(target=None,data=None, create=False):
def load_gpencil_layer(target=None, data=None, create=False):
dump_anything.load(target, data)
for frame in data["frames"]:
try:
tframe = target.frames[frame]
@ -258,7 +258,8 @@ def load_gpencil_layer(target=None,data=None, create=False):
tstroke = tframe.strokes[stroke]
except:
tstroke = tframe.strokes.new()
dump_anything.load(tstroke, data["frames"][frame]["strokes"][stroke])
dump_anything.load(
tstroke, data["frames"][frame]["strokes"][stroke])
for point in data["frames"][frame]["strokes"][stroke]["points"]:
p = data["frames"][frame]["strokes"][stroke]["points"][point]
@ -281,7 +282,8 @@ def load_gpencil(target=None, data=None, create=False):
gp_layer = target.layers.new(data["layers"][layer]["info"])
else:
gp_layer = target.layers[layer]
load_gpencil_layer(target=gp_layer,data=data["layers"][layer],create=create)
load_gpencil_layer(
target=gp_layer, data=data["layers"][layer], create=create)
# Load other meshes metadata
dump_anything.load(target, data)
except:
@ -310,6 +312,8 @@ def load_default(target=None, data=None, create=False, type=None):
print("default loading error")
# DUMP HELPERS
def dump(key):
target = resolve_bpy_path(key)
target_type = key.split('/')[0]
@ -318,7 +322,8 @@ def dump(key):
if target_type == 'Material':
data = dump_datablock_attibute(target, ['name', 'node_tree'], 7)
elif target_type == 'Grease Pencil':
data = dump_datablock_attibute(target, ['name', 'layers','materials'], 9)
data = dump_datablock_attibute(
target, ['name', 'layers', 'materials'], 9)
elif target_type == 'Camera':
data = dump_datablock(target, 1)
elif target_type == 'Light':
@ -374,8 +379,9 @@ def init_client(key=None):
C = bpy.context
Net = C.scene.session_settings
client_dict['location'] = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
client_dict['color'] = [Net.client_color.r,Net.client_color.g,Net.client_color.b,1]
client_dict['location'] = [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
client_dict['color'] = [Net.client_color.r,
Net.client_color.g, Net.client_color.b, 1]
client_dict['active_objects'] = get_selected_objects(C.view_layer)

View File

@ -31,7 +31,7 @@ update_list = {}
SUPPORTED_DATABLOCKS = ['collections', 'meshes', 'objects',
'materials', 'textures', 'lights', 'cameras', 'actions', 'armatures', 'grease_pencils']
SUPPORTED_TYPES = ['Material',
'Texture', 'Light', 'Camera','Mesh', 'Grease Pencil', 'Object', 'Action', 'Armature','Collection', 'Scene']
'Texture', 'Light', 'Camera', 'Mesh', 'Grease Pencil', 'Object', 'Action', 'Armature', 'Collection', 'Scene']
# UTILITY FUNCTIONS
@ -91,7 +91,7 @@ def update_selected_object(context):
key = "net/objects/{}".format(client_instance.id.decode())
data = {}
data['color'] = [session.client_instance_color.r,
session.client_instance_color.g, session.client_instance_color.b]
session.client_instance_color.g, session.client_instance_color.b]
data['object'] = session.active_object.name
client_instance.push_update(
key, 'client_instanceObject', data)
@ -101,7 +101,7 @@ def update_selected_object(context):
session.active_object = None
data = {}
data['color'] = [session.client_instance_color.r,
session.client_instance_color.g, session.client_instance_color.b]
session.client_instance_color.g, session.client_instance_color.b]
data['object'] = None
key = "net/objects/{}".format(client_instance.id.decode())
client_instance.push_update(key, 'client_instanceObject', data)
@ -115,8 +115,8 @@ def init_datablocks():
global client_instance
for datatype in SUPPORTED_TYPES:
for item in getattr(bpy.data,helpers.CORRESPONDANCE[datatype]):
key = "{}/{}".format(datatype,item.name)
for item in getattr(bpy.data, helpers.CORRESPONDANCE[datatype]):
key = "{}/{}".format(datatype, item.name)
print(key)
client_instance.set(key)
@ -160,6 +160,8 @@ def unregister_ticks():
bpy.app.timers.unregister(default_tick)
# OPERATORS
class session_join(bpy.types.Operator):
bl_idname = "session.join"
@ -186,12 +188,12 @@ class session_join(bpy.types.Operator):
username = str(context.scene.session_settings.username)
if len(net_settings.ip)<1:
if len(net_settings.ip) < 1:
net_settings.ip = "127.0.0.1"
client_instance = client.RCFClient()
client_instance.connect(net_settings.username, net_settings.ip,net_settings.port)
client_instance.connect(net_settings.username,
net_settings.ip, net_settings.port)
# net_settings.is_running = True
drawer = draw.HUD(client_instance=client_instance)
@ -293,7 +295,8 @@ class session_create(bpy.types.Operator):
global server
global client_instance
server = subprocess.Popen(['python','server.py'], shell=False, stdout=subprocess.PIPE)
server = subprocess.Popen(
['python', 'server.py'], shell=False, stdout=subprocess.PIPE)
time.sleep(0.1)
bpy.ops.session.join()
@ -342,8 +345,10 @@ class session_stop(bpy.types.Operator):
class session_settings(bpy.types.PropertyGroup):
username = bpy.props.StringProperty(
name="Username", default="user_{}".format(randomStringDigits()))
ip = bpy.props.StringProperty(name="ip", description='Distant host ip',default="127.0.0.1")
port = bpy.props.IntProperty(name="port", description='Distant host port',default=5555)
ip = bpy.props.StringProperty(
name="ip", description='Distant host ip', default="127.0.0.1")
port = bpy.props.IntProperty(
name="port", description='Distant host port', default=5555)
add_property_depth = bpy.props.IntProperty(
name="add_property_depth", default=1)
@ -409,9 +414,15 @@ classes = (
session_snapview,
)
def ordered(updates):
# sorted = sorted(updates, key=lambda tup: SUPPORTED_TYPES.index(tup[1].id.bl_rna.name))
uplist = [(SUPPORTED_TYPES.index(item[1].id.bl_rna.name),item[1].id.bl_rna.name,item[1].id.name) for item in updates.items()]
uplist = []
for item in updates.items():
if item[1].id.bl_rna.name in SUPPORTED_TYPES:
uplist.append((SUPPORTED_TYPES.index(
item[1].id.bl_rna.name), item[1].id.bl_rna.name, item[1].id.name))
uplist.sort(key=itemgetter(0))
return uplist
@ -422,7 +433,7 @@ def is_dirty(updates):
if client_keys:
if len(client_keys) > 0:
for u in updates:
key = "{}/{}".format(u.id.bl_rna.name,u.id.name)
key = "{}/{}".format(u.id.bl_rna.name, u.id.name)
if key not in client_keys:
return True
@ -433,7 +444,7 @@ def is_dirty(updates):
def depsgraph_update(scene):
global client_instance
if client_instance and client_instance.agent.is_alive():
if client_instance and client_instance.agent.is_alive():
updates = bpy.context.depsgraph.updates
if is_dirty(updates):
@ -443,12 +454,13 @@ def depsgraph_update(scene):
elif update[1] in SUPPORTED_TYPES:
client_instance.set("{}/{}".format(update[1], update[2]))
if len(bpy.context.selected_objects)>0:
updated_data = updates[0]
if updated_data.id.name == bpy.context.selected_objects[0].name:
if updated_data.is_updated_transform or updated_data.is_updated_geometry:
client_instance.set("{}/{}".format(updated_data.id.bl_rna.name, updated_data.id.name))
if hasattr(bpy.context, 'selected_objects'):
if len(bpy.context.selected_objects) > 0:
updated_data = updates[0]
if updated_data.id.name == bpy.context.selected_objects[0].name:
if updated_data.is_updated_transform or updated_data.is_updated_geometry:
client_instance.set(
"{}/{}".format(updated_data.id.bl_rna.name, updated_data.id.name))
def register():
@ -481,8 +493,6 @@ def unregister():
del client_instance
del client_keys
from bpy.utils import unregister_class
for cls in reversed(classes):
unregister_class(cls)
@ -490,5 +500,6 @@ def unregister():
del bpy.types.Scene.session_settings
del bpy.types.ID.is_dirty
if __name__ == "__main__":
register()

View File

@ -88,7 +88,7 @@ class RCFServerAgent():
# Regular update routing (Clients / Client)
elif self.collector_sock in socks:
msg = message.RCFMessage.recv(self.collector_sock)
logger.info("received object")
# logger.info("received object")
# Update all clients
msg.store(self.property_map)
msg.send(self.pub_sock)