mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
See #1227. Fix slicing normal calculation for AXIS3 elements.
This commit is contained in:
@@ -1037,13 +1037,17 @@ class Loader(bonsai.core.tool.Loader):
|
|||||||
bm.from_mesh(mesh)
|
bm.from_mesh(mesh)
|
||||||
prev_co = None
|
prev_co = None
|
||||||
# no = Vector((0.0, 1.0, 0.0))
|
# no = Vector((0.0, 1.0, 0.0))
|
||||||
no = cls.get_extrusion_vector(element).normalized()
|
if not usage:
|
||||||
if usage and usage.LayerSetDirection == "AXIS2":
|
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))
|
co = Vector((0.0, offset, 0.0))
|
||||||
no = no.cross(Vector([1.0, 0.0, 0.0]))
|
no = no.cross(Vector([1.0, 0.0, 0.0]))
|
||||||
else:
|
elif usage.LayerSetDirection == "AXIS3":
|
||||||
sense_factor = 1 # If it isn't AXIS2, then the normal points in the direction sense
|
|
||||||
co = Vector((0.0, 0.0, offset))
|
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
|
# Cache this
|
||||||
body = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW")
|
body = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW")
|
||||||
styles = {}
|
styles = {}
|
||||||
|
|||||||
@@ -463,10 +463,19 @@ def get_material_style(
|
|||||||
return 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
|
"""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 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"):
|
if axis := ifcopenshell.util.representation.get_representation(wall, "Plan", "Axis", "GRAPH_VIEW"):
|
||||||
for item in ifcopenshell.util.representation.resolve_representation(axis).Items:
|
for item in ifcopenshell.util.representation.resolve_representation(axis).Items:
|
||||||
|
|||||||
Reference in New Issue
Block a user