Compare commits

...

2 Commits

Author SHA1 Message Date
Jesusbill 07745aa6bc Fix #2998 2023-04-27 13:26:47 +02:00
Jesusbill 45afaba63e Add face creation when adding representation for surface structural items #2999 2023-04-27 09:54:51 +02:00
3 changed files with 45 additions and 2 deletions
@@ -333,6 +333,8 @@ class Geometry(blenderbim.core.tool.Geometry):
"Curve",
"Curve2D",
"Curve3D",
"Edge",
"Face",
"FillArea",
"GeometricCurveSet",
"GeometricSet",
+2
View File
@@ -378,6 +378,8 @@ class Model(blenderbim.core.tool.Model):
@classmethod
def get_usage_type(cls, element):
if element.is_a("IfcStructuralItem"):
return
material = ifcopenshell.util.element.get_material(element, should_inherit=False)
if material:
if material.is_a("IfcMaterialLayerSetUsage"):
@@ -740,11 +740,18 @@ class Usecase:
"Vertex",
[self.create_vertex_point(self.settings["geometry"].vertices[0].co)],
)
if len(self.settings["geometry"].vertices) == 2 or len(self.settings["geometry"].polygons) == 0:
return self.file.createIfcTopologyRepresentation(
self.settings["context"],
self.settings["context"].ContextIdentifier,
"Edge",
[self.create_edge()],
)
return self.file.createIfcTopologyRepresentation(
self.settings["context"],
self.settings["context"].ContextIdentifier,
"Edge",
[self.create_edge()],
"Face",
[self.create_face()],
)
def create_vertex_point(self, point):
@@ -758,3 +765,35 @@ class Usecase:
if not points:
return
return self.file.createIfcEdge(self.create_vertex_point(points[0].co), self.create_vertex_point(points[1].co))
def create_face(self):
points = self.settings["geometry"].vertices
if not points:
return
# create plane
origin = self.file.createIfcCartesianPoint((points[0].co.x, points[0].co.y, points[0].co.z))
normal = self.settings["geometry"].polygons[0].normal
# need to define refdirection for local x axis reference
# we choose default value to be a horizontal vector on the plane
if 1 - abs(Z_AXIS.dot(normal)) < EPSILON: # normal is vertical
x_axis = self.file.createIfcDirection((1.0, 0.0, 0.0))
else:
hor_normal = Vector((normal.x, normal.y, 0))
x_vector = Z_AXIS.cross(hor_normal).normalized()
x_axis = self.file.createIfcDirection(x_vector)
z_axis = self.file.createIfcDirection(normal)
local_axes = self.file.createIfcAxis2Placement3D(origin, z_axis, x_axis)
plane = self.file.createIfcPlane(local_axes)
# create face
verts = [self.create_vertex_point(point.co) for point in points]
edges = [None] * len(verts)
for i, v in enumerate(verts):
v2_index = (i + 1) if i < len(verts) - 1 else 0
edge = self.file.createIfcEdge(v, verts[v2_index])
edges[i] = self.file.createIfcOrientedEdge(None, None, edge, True)
edge_loop = self.file.createIfcEdgeLoop(tuple(edges))
face_bound = self.file.createIfcFaceBound(edge_loop, True)
face = self.file.createIfcFaceSurface((face_bound,), plane, True)
return face