From cb5f57d68ac8850da9c4cd067cf0b1d7c7859939 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 1 Apr 2021 11:58:46 +1100 Subject: [PATCH] Point connections are now treated as regular geometry, not an edge case (get it?). See #1409. Thanks @Jesusbill! --- src/blenderbim/blenderbim/bim/import_ifc.py | 24 ++++++++++++------- .../bim/module/structural/operator.py | 2 +- .../api/geometry/add_representation.py | 4 ++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 5210536c7f..4a3ffa2d75 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -725,21 +725,27 @@ class IfcImporter: def create_structural_point_connections(self): for product in self.file.by_type("IfcStructuralPointConnection"): + # TODO: make this based off ifcopenshell. See #1409 placement_matrix = ifcopenshell.util.placement.get_local_placement(product.ObjectPlacement) vertex = None - for subelement in self.file.traverse(product): + context = None + representation = None + for subelement in self.file.traverse(product.Representation): if subelement.is_a("IfcVertex") and subelement.VertexGeometry.is_a("IfcCartesianPoint"): vertex = list(subelement.VertexGeometry.Coordinates) - break - if not vertex: + elif subelement.is_a("IfcGeometricRepresentationContext"): + context = subelement + elif subelement.is_a("IfcTopologyRepresentation"): + representation = subelement + if not vertex or not context or not representation: continue # TODO implement non cartesian point vertexes - placement_matrix[0, 3] += vertex[0] * self.unit_scale - placement_matrix[1, 3] += vertex[1] * self.unit_scale - placement_matrix[2, 3] += vertex[2] * self.unit_scale - obj = bpy.data.objects.new("{}/{}".format(product.is_a(), product.Name), None) + + mesh_name = f"{context.id()}/{representation.id()}" + mesh = bpy.data.meshes.new(mesh_name) + mesh.from_pydata([mathutils.Vector(vertex) * self.unit_scale], [], []) + + obj = bpy.data.objects.new("{}/{}".format(product.is_a(), product.Name), mesh) obj.matrix_world = mathutils.Matrix(placement_matrix.tolist()) - obj.empty_display_type = "SPHERE" - obj.empty_display_size = 0.1 self.link_element(product, obj) def create_curve_products(self, products): diff --git a/src/blenderbim/blenderbim/bim/module/structural/operator.py b/src/blenderbim/blenderbim/bim/module/structural/operator.py index 904586d224..b1e51bb9ba 100644 --- a/src/blenderbim/blenderbim/bim/module/structural/operator.py +++ b/src/blenderbim/blenderbim/bim/module/structural/operator.py @@ -196,7 +196,7 @@ class LoadStructuralAnalysisModels(bpy.types.Operator): for ifc_definition_id, structural_analysis_model in Data.structural_analysis_models.items(): new = props.structural_analysis_models.add() new.ifc_definition_id = ifc_definition_id - new.name = structural_analysis_model["Name"] + new.name = structural_analysis_model["Name"] or "Unnamed" props.is_editing = True bpy.ops.bim.disable_editing_structural_analysis_model() return {"FINISHED"} diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index e9f774b040..6868b91fe2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -424,12 +424,12 @@ class Usecase: ) def create_structural_reference_representation(self): - if self.settings["blender_object"].type == "EMPTY": + if len(self.settings["geometry"].vertices) == 1: return self.file.createIfcTopologyRepresentation( self.settings["context"], self.settings["context"].ContextIdentifier, "Vertex", - [self.create_vertex_point(Vector((0, 0, 0)))], + [self.create_vertex_point(self.settings["geometry"].vertices[0].co)], ) return self.file.createIfcTopologyRepresentation( self.settings["context"],