# -*- coding: utf-8 -*- # Copyright (C) 2023 Ilia Kurochkin # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. ''' DESCRIPTION. Collecting all parents and reconstruct this hierarhy in bledner. ''' __version__ = '0.2' import logging import bpy logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def placement(bobj, obj, scale): ''' blender object, freecad object, scale factor ''' bobj.location = obj.Placement.Base.multiply(scale) m = bobj.rotation_mode bobj.rotation_mode = 'QUATERNION' if obj.Placement.Rotation.Angle: # FreeCAD Quaternion is XYZW while Blender is WXYZ q = (obj.Placement.Rotation.Q[3],)+obj.Placement.Rotation.Q[:3] bobj.rotation_quaternion = (q) bobj.rotation_mode = m return bobj def hierarchy(bobj, obj, scale): ''' blender object, freecad object, scale factor ''' obj_parent = obj.getParentGeoFeatureGroup() obj_child_name = None parents = [] while obj_parent: if bpy.data.objects.get(obj_parent.Label): empty = bpy.data.objects[obj_parent.Label] else: empty = bpy.data.objects.new(obj_parent.Label, None) empty.empty_display_type = 'CUBE' empty.empty_display_size = 0.01 placement(empty, obj_parent, scale) parents.append(empty) if not bobj.parent: bobj.parent = empty else: bpy.data.objects[obj_child_name].parent = empty obj_child_name = obj_parent.Label obj_parent = obj_parent.getParentGeoFeatureGroup() empty.select_set(False) logger.debug('Add parent %s to object %s', empty.name, bobj.name) return parents