See #1227. Fix slicing normal calculation for AXIS3 elements.

This commit is contained in:
Dion Moult
2025-03-10 18:10:05 +11:00
parent 9f1ffe6381
commit 1259607a9f
2 changed files with 18 additions and 5 deletions
+8 -4
View File
@@ -1037,13 +1037,17 @@ class Loader(bonsai.core.tool.Loader):
bm.from_mesh(mesh)
prev_co = None
# no = Vector((0.0, 1.0, 0.0))
no = cls.get_extrusion_vector(element).normalized()
if usage and usage.LayerSetDirection == "AXIS2":
if not usage:
sense_factor = 1 # Assume the extrusion vector points in the direction sense
no = cls.get_extrusion_vector(element).normalized()
co = Vector((0.0, 0.0, offset))
elif usage.LayerSetDirection == "AXIS2":
co = Vector((0.0, offset, 0.0))
no = no.cross(Vector([1.0, 0.0, 0.0]))
else:
sense_factor = 1 # If it isn't AXIS2, then the normal points in the direction sense
elif usage.LayerSetDirection == "AXIS3":
co = Vector((0.0, 0.0, offset))
no = cls.get_extrusion_vector(element).normalized()
no = Vector([0.0, 0.0, 1.0 if no.z > 0 else -1.0])
# Cache this
body = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW")
styles = {}
@@ -463,10 +463,19 @@ def get_material_style(
return style
def get_reference_line(wall: ifcopenshell.entity_instance, fallback_length: float = 1.0):
def get_reference_line(wall: ifcopenshell.entity_instance, fallback_length: float = 1.0) -> list[npt.NDArray]:
"""Fetch the reference axis that goes in the +X direction
A base line will then be offset from this reference line based on the
material usage. From that base line, the layer thicknesses will offset
again, and be extruded to form the body representation.
:param wall: ifcopenshell.entity_instance
:param fallback_length: If there is no reference axis, assume it starts at
the object placement (i.e. 0.0, 0.0) and extends for this fallback
length along the +X axis.
:return: A list of two 2D coordinates representing the start and end of the
axis. The axis always goes in the +X direction.
"""
if axis := ifcopenshell.util.representation.get_representation(wall, "Plan", "Axis", "GRAPH_VIEW"):
for item in ifcopenshell.util.representation.resolve_representation(axis).Items: