refactor(rcf): code formating
This commit is contained in:
32
client.py
32
client.py
@ -69,7 +69,7 @@ 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()
|
||||
|
||||
@ -83,7 +83,7 @@ class RCFClient(object):
|
||||
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
|
||||
@ -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()
|
||||
|
||||
|
||||
|
||||
|
||||
|
15
draw.py
15
draw.py
@ -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
|
||||
@ -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()
|
||||
|
||||
|
30
helpers.py
30
helpers.py
@ -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,11 +21,12 @@ 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)
|
||||
@ -50,7 +52,7 @@ def load(key, value):
|
||||
load_default(target=target, data=value,
|
||||
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
|
||||
|
||||
@ -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)
|
||||
|
||||
|
43
operators.py
43
operators.py
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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:
|
||||
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))
|
||||
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()
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user