78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
![]() |
# -*- 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")
|