# -*- coding: utf-8 -*- """ DESCRIPTION. Subassembly models setup from SDFormat file. Script selected, transform, exported subassembly models. Support Blender compiled as a Python Module only! """ __version__ = "0.1" import logging import sys import xml.etree.ElementTree as ET import os sys.path.append('../blender/') from import_fcstd.importer import importer from utils.remove_collections import remove_collections from utils.cleanup_orphan_data import cleanup_orphan_data from remesh import asset_setup from export.stl import export_stl sys.path.append('/home/bm/bin/blender-git/blender_bin') # import blender module import bpy logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def sdf_to_subassembly(assembly_path): """ Setup scene by SDFormat file description """ assembly_sdf = os.path.join(assembly_path, 'assembly.sdf').replace('\\', '/') mytree = ET.parse(assembly_sdf) myroot = mytree.getroot() models_transforms = {} for models in myroot.iter('model'): for models_childs in models: # if hasattr(models_childs.find('pose'), 'text'): is this better? if models_childs.find('pose') is not None: pose = models_childs.find('pose').text logger.debug(models.attrib['name'], pose) pose_vectors = [float(x) * 0.001 for x in pose.split()] models_transforms[models.attrib['name']] = pose_vectors # TODO add models <==> objects compare validation for obj in bpy.context.scene.objects: if obj.name in models_transforms: obj_transforms = models_transforms[obj.name] obj.location = obj_transforms[:3] obj.rotation_mode = 'XYZ' obj.rotation_euler = obj_transforms[3:] # may be TODO else: bpy.data.objects.remove(bpy.data.objects[obj.name], do_unlink=True) logger.info(obj.name, '- is not in assemly objects. Deleted!') def asp_asset_pipeline(fcstd_path, export_path, assembly_path, tessellation=20): """ Setup FreeCAD scene to CG asset """ remove_collections() cleanup_orphan_data() importer(fcstd_path, tessellation) sdf_to_subassembly(assembly_path) asset_setup() bpy.ops.wm.save_as_mainfile(filepath=blend_path) export_stl(export_path) if __name__ == '__main__': fcstd_path = '/media/disk/robossembler/project/pipeline/asp/1.FCStd' blend_path = '/media/disk/robossembler/project/pipeline/asp/1.blend' assembly_path = '/media/disk/robossembler/project/pipeline/asp/asp-generation' assembly_meshes_path = os.path.join(assembly_path, 'meshes').replace('\\', '/') export_path = assembly_meshes_path asp_asset_pipeline(fcstd_path, export_path, assembly_path, tessellation=20) logger.info("Assets setup finished without errors")