feat: image support
fix: material dump memory leak
This commit is contained in:
11
client.py
11
client.py
@ -23,7 +23,7 @@ DUMP_AGENTS_NUMBER = 1
|
|||||||
|
|
||||||
lock = threading.Lock()
|
lock = threading.Lock()
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
logging.basicConfig(level=environment)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
instance = None
|
instance = None
|
||||||
|
|
||||||
|
|
||||||
@ -412,22 +412,21 @@ def net_worker(ctx, store, pipe, serial_product, serial_feed, stop_event,externa
|
|||||||
logger.debug("snapshot from {} stored".format(msg.id))
|
logger.debug("snapshot from {} stored".format(msg.id))
|
||||||
elif agent.state == State.ACTIVE:
|
elif agent.state == State.ACTIVE:
|
||||||
if msg.id != agent.id:
|
if msg.id != agent.id:
|
||||||
|
logger.debug("PULL: {} from {}".format(msg.key,msg.id))
|
||||||
|
|
||||||
# with lock:
|
|
||||||
# helpers.load(msg.key, msg.body)
|
|
||||||
msg.store(agent.property_map)
|
msg.store(agent.property_map)
|
||||||
# net_product.put(('LOAD', msg.key, msg.body))
|
|
||||||
params = []
|
params = []
|
||||||
params.append(msg.key)
|
params.append(msg.key)
|
||||||
params.append(msg.body)
|
params.append(msg.body)
|
||||||
external_executor.put((helpers.load,params))
|
external_executor.put((helpers.load,params))
|
||||||
else:
|
|
||||||
logger.debug("{} nothing to do".format(agent.id))
|
|
||||||
|
|
||||||
# Serialisation thread => Net thread
|
# Serialisation thread => Net thread
|
||||||
if not net_feed.empty():
|
if not net_feed.empty():
|
||||||
key, value = net_feed.get()
|
key, value = net_feed.get()
|
||||||
if value:
|
if value:
|
||||||
|
logger.debug("SERIAL => NET: {} ".format(key))
|
||||||
|
|
||||||
# Stamp with id
|
# Stamp with id
|
||||||
value['id'] = agent.id.decode()
|
value['id'] = agent.id.decode()
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import logging
|
import logging
|
||||||
import yaml
|
|
||||||
import collections
|
import collections
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -61,6 +60,8 @@ ORDERED_TYPES = [
|
|||||||
rtypes = []
|
rtypes = []
|
||||||
|
|
||||||
def load_config():
|
def load_config():
|
||||||
|
import yaml
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(CONFIG, 'r') as config_file:
|
with open(CONFIG, 'r') as config_file:
|
||||||
return yaml.safe_load(config_file)
|
return yaml.safe_load(config_file)
|
||||||
@ -70,12 +71,16 @@ def load_config():
|
|||||||
return DEFAULT_CONFIG
|
return DEFAULT_CONFIG
|
||||||
|
|
||||||
def genereate_replicated_types(replicated_types):
|
def genereate_replicated_types(replicated_types):
|
||||||
|
rtypes.clear()
|
||||||
|
|
||||||
for t in ORDERED_TYPES:
|
for t in ORDERED_TYPES:
|
||||||
if replicated_types[t]:
|
if replicated_types[t]:
|
||||||
rtypes.append(t)
|
rtypes.append(t)
|
||||||
|
|
||||||
|
|
||||||
def save_config(config):
|
def save_config(config):
|
||||||
|
import yaml
|
||||||
|
|
||||||
logger.info("saving config")
|
logger.info("saving config")
|
||||||
with open(CONFIG, 'w') as outfile:
|
with open(CONFIG, 'w') as outfile:
|
||||||
yaml.dump(config, outfile, default_flow_style=False)
|
yaml.dump(config, outfile, default_flow_style=False)
|
||||||
|
44
helpers.py
44
helpers.py
@ -2,6 +2,7 @@ import logging
|
|||||||
import sys
|
import sys
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
import mathutils
|
import mathutils
|
||||||
@ -70,7 +71,7 @@ def load(key, value):
|
|||||||
target = resolve_bpy_path(key)
|
target = resolve_bpy_path(key)
|
||||||
target_type = key.split('/')[0]
|
target_type = key.split('/')[0]
|
||||||
|
|
||||||
logger.debug("load {}".format(key))
|
logger.debug("load{}, {}".format(target_type, key))
|
||||||
if value == "None":
|
if value == "None":
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ def load(key, value):
|
|||||||
load_object(target=target, data=value,
|
load_object(target=target, data=value,
|
||||||
create=True)
|
create=True)
|
||||||
if target_type == 'Image':
|
if target_type == 'Image':
|
||||||
load_object(target=target, data=value)
|
load_image(target=target, data=value)
|
||||||
elif target_type == 'Mesh':
|
elif target_type == 'Mesh':
|
||||||
load_mesh(target=target, data=value,
|
load_mesh(target=target, data=value,
|
||||||
create=True)
|
create=True)
|
||||||
@ -137,7 +138,9 @@ def load_client(client=None, data=None):
|
|||||||
|
|
||||||
draw.renderer.draw_client_selected_objects(data)
|
draw.renderer.draw_client_selected_objects(data)
|
||||||
|
|
||||||
|
|
||||||
def load_image(target=None, data=None):
|
def load_image(target=None, data=None):
|
||||||
|
try:
|
||||||
if not target:
|
if not target:
|
||||||
image = bpy.data.image.new(
|
image = bpy.data.image.new(
|
||||||
name=data['name'],
|
name=data['name'],
|
||||||
@ -149,7 +152,12 @@ def load_image(target=None, data=None):
|
|||||||
else:
|
else:
|
||||||
image = target
|
image = target
|
||||||
|
|
||||||
dump_anything.load(target, data)
|
image.source = 'FILE'
|
||||||
|
image.filepath = data['filepath']
|
||||||
|
|
||||||
|
# dump_anything.load(target, data)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(e)
|
||||||
|
|
||||||
|
|
||||||
def load_armature(target=None, data=None, create=False):
|
def load_armature(target=None, data=None, create=False):
|
||||||
@ -246,7 +254,7 @@ def load_mesh(target=None, data=None, create=False):
|
|||||||
|
|
||||||
target.id = data['id']
|
target.id = data['id']
|
||||||
else:
|
else:
|
||||||
logger.debug("Mesh can't be loaded")
|
logger.error("Mesh can't be loaded")
|
||||||
|
|
||||||
|
|
||||||
def load_object(target=None, data=None, create=False):
|
def load_object(target=None, data=None, create=False):
|
||||||
@ -556,9 +564,11 @@ def dump(key):
|
|||||||
if target_type == 'Image':
|
if target_type == 'Image':
|
||||||
data = dump_datablock(target, 2)
|
data = dump_datablock(target, 2)
|
||||||
data['pixels'] = dump_image(target)
|
data['pixels'] = dump_image(target)
|
||||||
|
data = dump_datablock_attibute(target,['filepath','source'], 2, data)
|
||||||
elif target_type == 'Material':
|
elif target_type == 'Material':
|
||||||
data = dump_datablock(target, 2)
|
data = dump_datablock(target, 2)
|
||||||
dump_datablock_attibute(target, ['node_tree'], 7, data)
|
dump_datablock_attibute(target.node_tree, ["nodes","links"] , 3, data['node_tree'])
|
||||||
|
logger.debug("Material {} dumped".format(key))
|
||||||
elif target_type == 'GreasePencil':
|
elif target_type == 'GreasePencil':
|
||||||
data = dump_datablock(target, 2)
|
data = dump_datablock(target, 2)
|
||||||
dump_datablock_attibute(
|
dump_datablock_attibute(
|
||||||
@ -637,15 +647,21 @@ def dump_datablock_attibute(datablock=None, attributes=[], depth=1, dickt=None):
|
|||||||
|
|
||||||
|
|
||||||
def dump_image(image):
|
def dump_image(image):
|
||||||
pixels = []
|
pixels = None
|
||||||
# for x in range(image.size[0]*image.size[1]):
|
if image.source == "GENERATED":
|
||||||
# px = [
|
img_name = "{}.png".format(image.name)
|
||||||
# image.pixels[x],
|
|
||||||
# image.pixels[x+1],
|
image.filepath_raw = os.path.join(environment.CACHE_DIR,img_name)
|
||||||
# image.pixels[x+2],
|
image.file_format = "PNG"
|
||||||
# image.pixels[x+3]
|
image.save()
|
||||||
# ]
|
|
||||||
# pixels.append(px)
|
if image.source == "FILE":
|
||||||
|
|
||||||
|
file = open(image.filepath_raw, "rb")
|
||||||
|
pixels = file.read()
|
||||||
|
logger.debug("Reading image file {}".format(image.name))
|
||||||
|
else:
|
||||||
|
logger.error("image format not supported")
|
||||||
return pixels
|
return pixels
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ def update_client_selected_object(context):
|
|||||||
def init_datablocks():
|
def init_datablocks():
|
||||||
for datatype in environment.rtypes:
|
for datatype in environment.rtypes:
|
||||||
if bpy.context.window_manager.session.supported_datablock[datatype].is_replicated:
|
if bpy.context.window_manager.session.supported_datablock[datatype].is_replicated:
|
||||||
|
logger.debug("INIT: {}".format(datatype))
|
||||||
for item in getattr(bpy.data, helpers.BPY_TYPES[datatype]):
|
for item in getattr(bpy.data, helpers.BPY_TYPES[datatype]):
|
||||||
item.id = bpy.context.window_manager.session.username
|
item.id = bpy.context.window_manager.session.username
|
||||||
key = "{}/{}".format(datatype, item.name)
|
key = "{}/{}".format(datatype, item.name)
|
||||||
|
Reference in New Issue
Block a user