See #6404. See #1227. Create axis context if it does not exist for walls.

This commit is contained in:
Dion Moult
2025-03-21 16:45:29 +11:00
parent 8e1e0aec79
commit 963ba5fc30
3 changed files with 21 additions and 1 deletions
@@ -73,6 +73,9 @@ def regenerate_wall_representation(
0.0)). This is a logical, consistent, and useful placement coordinate
(especially for apps that can pivot using this point).
All this functionality relies on the Plan/Axis/GRAPH_VIEW representation
context. It will be created if it does not exist.
:param wall: The IfcWall for the representation,
only Model/Body/MODEL_VIEW type of representations are currently supported.
:param length: If the wall doesn't have an axis length, this is the default
@@ -94,6 +97,13 @@ class Regenerator:
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file)
self.is_angled = False
if not self.axis:
if not (plan := ifcopenshell.util.representation.get_context(file, "Plan")):
plan = ifcopenshell.api.context.add_context(file, context_type="Plan")
self.axis = ifcopenshell.api.context.add_context(
file, context_type="Plan", context_identifier="Axis", target_view="GRAPH_VIEW", parent=plan
)
def regenerate(self, wall, length=1.0, height=1.0, angle=None):
print("-" * 100)
print(wall)
@@ -19,6 +19,7 @@
import numpy as np
import numpy.typing as npt
import ifcopenshell
import ifcopenshell.util.shape
import ifcopenshell.util.placement
from typing import Optional, Union, TypedDict, Literal, Generator, Sequence
@@ -488,4 +489,13 @@ def get_reference_line(wall: ifcopenshell.entity_instance, fallback_length: floa
if points[0][0] < points[1][0]: # An axis always goes in the +X direction
return [np.array(points[0]), np.array(points[1])]
return [np.array(points[1]), np.array(points[0])]
elif extrusions := ifcopenshell.util.shape.get_base_extrusions(wall):
for item in extrusions:
if item.is_a("IfcPolyline"):
x = [p[0][0] for p in item.Points]
elif item.is_a("IfcIndexedPolyCurve"):
x = [p[0] for p in item.Points.CoordList]
else:
continue
return [np.array((min(x), 0.0)), np.array((max(x), 0.0))]
return [np.array((0.0, 0.0)), np.array((fallback_length, 0.0))]