mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 09:15:21 +00:00
Spatial elements without geometry are now imported too
This commit is contained in:
@@ -350,17 +350,17 @@ class IfcImporter():
|
|||||||
if progress > old_progress:
|
if progress > old_progress:
|
||||||
print("\r[" + "#" * progress + " " * (50 - progress) + "]", end="")
|
print("\r[" + "#" * progress + " " * (50 - progress) + "]", end="")
|
||||||
old_progress = progress
|
old_progress = progress
|
||||||
self.create_product(iterator.get())
|
shape = iterator.get()
|
||||||
|
if shape:
|
||||||
|
self.create_product(self.file.by_id(shape.guid), shape)
|
||||||
if not iterator.next():
|
if not iterator.next():
|
||||||
break
|
break
|
||||||
print("\rDone creating geometry" + " " * 30)
|
print("\rDone creating geometry" + " " * 30)
|
||||||
|
|
||||||
def create_product(self, shape):
|
def create_product(self, element, shape=None):
|
||||||
if shape is None:
|
if element is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
element = self.file.by_id(shape.guid)
|
|
||||||
|
|
||||||
if not self.ifc_import_settings.should_import_opening_elements \
|
if not self.ifc_import_settings.should_import_opening_elements \
|
||||||
and element.is_a('IfcOpeningElement'):
|
and element.is_a('IfcOpeningElement'):
|
||||||
return
|
return
|
||||||
@@ -371,29 +371,34 @@ class IfcImporter():
|
|||||||
|
|
||||||
self.ifc_import_settings.logger.info('Creating object {}'.format(element))
|
self.ifc_import_settings.logger.info('Creating object {}'.format(element))
|
||||||
|
|
||||||
# TODO: make names more meaningful
|
if shape:
|
||||||
mesh_name = f'mesh-{shape.geometry.id}'
|
# TODO: make names more meaningful
|
||||||
mesh = self.meshes.get(mesh_name)
|
mesh_name = f'mesh-{shape.geometry.id}'
|
||||||
if mesh is None:
|
mesh = self.meshes.get(mesh_name)
|
||||||
mesh = self.create_mesh(element, shape)
|
if mesh is None:
|
||||||
self.meshes[mesh_name] = mesh
|
mesh = self.create_mesh(element, shape)
|
||||||
|
self.meshes[mesh_name] = mesh
|
||||||
|
else:
|
||||||
|
mesh = None
|
||||||
|
|
||||||
obj = bpy.data.objects.new(self.get_name(element), mesh)
|
obj = bpy.data.objects.new(self.get_name(element), mesh)
|
||||||
|
|
||||||
m = shape.transformation.matrix.data
|
if shape:
|
||||||
mat = mathutils.Matrix(([m[0], m[1], m[2], 0],
|
m = shape.transformation.matrix.data
|
||||||
[m[3], m[4], m[5], 0],
|
mat = mathutils.Matrix(([m[0], m[1], m[2], 0],
|
||||||
[m[6], m[7], m[8], 0],
|
[m[3], m[4], m[5], 0],
|
||||||
[m[9], m[10], m[11], 1]))
|
[m[6], m[7], m[8], 0],
|
||||||
mat.transpose()
|
[m[9], m[10], m[11], 1]))
|
||||||
obj.matrix_world = mat
|
mat.transpose()
|
||||||
|
obj.matrix_world = mat
|
||||||
|
self.material_creator.create(element, obj, mesh)
|
||||||
|
|
||||||
self.material_creator.create(element, obj, mesh)
|
|
||||||
self.add_element_attributes(element, obj)
|
self.add_element_attributes(element, obj)
|
||||||
self.add_element_document_relations(element, obj)
|
self.add_element_document_relations(element, obj)
|
||||||
self.add_defines_by_type_relation(element, obj)
|
self.add_defines_by_type_relation(element, obj)
|
||||||
self.add_product_definitions(element, obj)
|
self.add_product_definitions(element, obj)
|
||||||
self.added_data[element.GlobalId] = obj
|
self.added_data[element.GlobalId] = obj
|
||||||
|
return obj
|
||||||
|
|
||||||
def merge_by_class(self):
|
def merge_by_class(self):
|
||||||
merge_set = {}
|
merge_set = {}
|
||||||
@@ -532,6 +537,10 @@ class IfcImporter():
|
|||||||
self.project = { 'ifc': self.file.by_type('IfcProject')[0] }
|
self.project = { 'ifc': self.file.by_type('IfcProject')[0] }
|
||||||
self.project['blender'] = bpy.data.collections.new('IfcProject/{}'.format(self.project['ifc'].Name))
|
self.project['blender'] = bpy.data.collections.new('IfcProject/{}'.format(self.project['ifc'].Name))
|
||||||
bpy.context.scene.collection.children.link(self.project['blender'])
|
bpy.context.scene.collection.children.link(self.project['blender'])
|
||||||
|
obj = self.create_product(self.project['ifc'])
|
||||||
|
if obj:
|
||||||
|
self.project['blender'].objects.link(obj)
|
||||||
|
del self.added_data[self.project['ifc'].GlobalId]
|
||||||
|
|
||||||
def create_spatial_hierarchy(self):
|
def create_spatial_hierarchy(self):
|
||||||
elements = self.file.by_type('IfcSpatialStructureElement')
|
elements = self.file.by_type('IfcSpatialStructureElement')
|
||||||
@@ -553,6 +562,7 @@ class IfcImporter():
|
|||||||
self.spatial_structure_elements[global_id] = {
|
self.spatial_structure_elements[global_id] = {
|
||||||
'blender': bpy.data.collections.new(name)}
|
'blender': bpy.data.collections.new(name)}
|
||||||
self.project['blender'].children.link(self.spatial_structure_elements[global_id]['blender'])
|
self.project['blender'].children.link(self.spatial_structure_elements[global_id]['blender'])
|
||||||
|
self.create_spatial_structure_obj(element)
|
||||||
elif element.is_a('IfcSpace'):
|
elif element.is_a('IfcSpace'):
|
||||||
# Spaces are treated specially as objects
|
# Spaces are treated specially as objects
|
||||||
continue
|
continue
|
||||||
@@ -561,8 +571,15 @@ class IfcImporter():
|
|||||||
'blender': bpy.data.collections.new(name)}
|
'blender': bpy.data.collections.new(name)}
|
||||||
self.spatial_structure_elements[parent_global_id]['blender'].children.link(
|
self.spatial_structure_elements[parent_global_id]['blender'].children.link(
|
||||||
self.spatial_structure_elements[global_id]['blender'])
|
self.spatial_structure_elements[global_id]['blender'])
|
||||||
|
self.create_spatial_structure_obj(element)
|
||||||
attempts += 1
|
attempts += 1
|
||||||
|
|
||||||
|
def create_spatial_structure_obj(self, element):
|
||||||
|
obj = self.create_product(element)
|
||||||
|
if obj:
|
||||||
|
self.spatial_structure_elements[element.GlobalId]['blender'].objects.link(obj)
|
||||||
|
del self.added_data[element.GlobalId]
|
||||||
|
|
||||||
def create_aggregates(self):
|
def create_aggregates(self):
|
||||||
rel_aggregates = [a for a in self.file.by_type('IfcRelAggregates')
|
rel_aggregates = [a for a in self.file.by_type('IfcRelAggregates')
|
||||||
if a.RelatingObject.is_a('IfcElement')]
|
if a.RelatingObject.is_a('IfcElement')]
|
||||||
|
|||||||
Reference in New Issue
Block a user