Skip to content

Commit 220d11f

Browse files
committed
add create_distribution_port function
1 parent 381de65 commit 220d11f

File tree

4 files changed

+100
-57
lines changed

4 files changed

+100
-57
lines changed

src/bim2fem/ifcplus/api/distribution_element.py

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@
2828
import ifcopenshell.util.representation
2929

3030

31-
ELBOW_RADIUS_TYPE = Literal["LONG", "SHORT"]
32-
33-
3431
def create_elbow(
3532
ifc4_file: ifcopenshell.file,
3633
horizontal_curve: bim2fem.ifcplus.util.geometry.HorizontalCurve,
@@ -59,10 +56,6 @@ def create_elbow(
5956
products=[elbow],
6057
relating_structure=spatial_element,
6158
)
62-
bim2fem.ifcplus.api.placement.edit_object_placement(
63-
product=elbow,
64-
place_object_relative_to_parent=True,
65-
)
6659

6760
if isinstance(distribution_system, ifcopenshell.entity_instance):
6861
ifcopenshell.api.system.assign_system(
@@ -100,6 +93,7 @@ def create_elbow(
10093
representation_type=cast(str, representation_type),
10194
items=[revolved_area_solid],
10295
)
96+
10397
ifcopenshell.api.geometry.assign_representation(
10498
file=ifc4_file,
10599
product=elbow,
@@ -132,65 +126,51 @@ def create_elbow(
132126
material=material,
133127
)
134128

135-
port1_origin_in_object_coordinates = (0.0, 0.0, 0.0)
136-
port1_z_axis_in_object_coordinates = (0.0, 0.0, 1.0)
137-
port1_x_axis_in_object_coordinates = (1.0, 0.0, 0.0)
138-
port1 = ifcopenshell.api.system.add_port(file=ifc4_file, element=elbow)
139-
port1.FlowDirection = "SINK"
140-
port1.PredefinedType = "PIPE"
141-
if isinstance(distribution_system, ifcopenshell.entity_instance):
142-
port1.SystemType = distribution_system.PredefinedType
143-
bim2fem.ifcplus.api.placement.edit_object_placement(
144-
product=port1,
145-
place_object_relative_to_parent=False,
146-
)
147-
port1.ObjectPlacement.PlacementRelTo = elbow.ObjectPlacement
148-
bim2fem.ifcplus.api.placement.edit_object_placement(
149-
product=port1,
150-
repositioned_origin=port1_origin_in_object_coordinates,
151-
repositioned_z_axis=port1_z_axis_in_object_coordinates,
152-
repositioned_x_axis=port1_x_axis_in_object_coordinates,
153-
place_object_relative_to_parent=True,
129+
sink_port_origin = (0.0, 0.0, 0.0)
130+
sink_port_z_axis = (0.0, 0.0, 1.0)
131+
sink_port_x_axis = (1.0, 0.0, 0.0)
132+
sink_port = bim2fem.ifcplus.api.system.create_distribution_port(
133+
ifc4_file=ifc4_file,
134+
port_origin_in_distribution_element_coordinates=sink_port_origin,
135+
port_z_axis_in_distribution_element_coordinates=sink_port_z_axis,
136+
port_x_axis_in_distribution_element_coordinates=sink_port_x_axis,
137+
distribution_element=elbow,
138+
flow_direction="SINK",
139+
predefined_type="PIPE",
140+
distribution_system=distribution_system,
154141
)
155142

156143
radius_of_curvature = horizontal_curve.radius_of_curvature
157144
central_angle = horizontal_curve.central_angle
158-
port2_origin_in_object_coordinates = (
145+
source_port_origin_in_object_coordinates = (
159146
float(radius_of_curvature - radius_of_curvature * np.cos(central_angle)),
160147
0.0,
161148
float(radius_of_curvature * np.sin(central_angle)),
162149
)
163-
port2_z_axis_in_object_coordinates = (
150+
source_port_z_axis_in_object_coordinates = (
164151
float(np.sin(horizontal_curve.central_angle)),
165152
0.0,
166153
float(np.cos(horizontal_curve.central_angle)),
167154
)
168-
port2_x_axis_in_object_coordinates = (
155+
source_port_x_axis_in_object_coordinates = (
169156
float(np.cos(horizontal_curve.central_angle)),
170157
0.0,
171158
float(-1 * np.sin(horizontal_curve.central_angle)),
172159
)
173-
port2 = ifcopenshell.api.system.add_port(file=ifc4_file, element=elbow)
174-
port2.FlowDirection = "SOURCE"
175-
port2.PredefinedType = "PIPE"
176-
if isinstance(distribution_system, ifcopenshell.entity_instance):
177-
port2.SystemType = distribution_system.PredefinedType
178-
bim2fem.ifcplus.api.placement.edit_object_placement(
179-
product=port2,
180-
place_object_relative_to_parent=False,
181-
)
182-
port2.ObjectPlacement.PlacementRelTo = elbow.ObjectPlacement
183-
bim2fem.ifcplus.api.placement.edit_object_placement(
184-
product=port2,
185-
repositioned_origin=port2_origin_in_object_coordinates,
186-
repositioned_z_axis=port2_z_axis_in_object_coordinates,
187-
repositioned_x_axis=port2_x_axis_in_object_coordinates,
188-
place_object_relative_to_parent=True,
160+
source_port = bim2fem.ifcplus.api.system.create_distribution_port(
161+
ifc4_file=ifc4_file,
162+
port_origin_in_distribution_element_coordinates=source_port_origin_in_object_coordinates,
163+
port_z_axis_in_distribution_element_coordinates=source_port_z_axis_in_object_coordinates,
164+
port_x_axis_in_distribution_element_coordinates=source_port_x_axis_in_object_coordinates,
165+
distribution_element=elbow,
166+
flow_direction="SOURCE",
167+
predefined_type="PIPE",
168+
distribution_system=distribution_system,
189169
)
190170

191171
if add_shape_representation_to_ports:
192172
bim2fem.ifcplus.api.system.add_shape_representation_to_distribution_ports(
193-
ports=[port1, port2],
173+
ports=[sink_port, source_port],
194174
arrow_size=nominal_diameter * 0.10,
195175
)
196176

src/bim2fem/ifcplus/api/placement.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
def edit_object_placement(
1414
product: ifcopenshell.entity_instance,
15-
repositioned_origin: Iterable[float] = (0, 0, 0),
16-
repositioned_z_axis: Iterable[float] = (0, 0, 1),
17-
repositioned_x_axis: Iterable[float] = (1, 0, 0),
15+
repositioned_origin: tuple[float, float, float] = (0.0, 0.0, 0.0),
16+
repositioned_z_axis: tuple[float, float, float] = (0.0, 0.0, 1.0),
17+
repositioned_x_axis: tuple[float, float, float] = (1.0, 0.0, 0.0),
1818
should_transform_children: bool = False,
1919
place_object_relative_to_parent: bool = False,
2020
):

src/bim2fem/ifcplus/api/system.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,65 @@
1010
import bim2fem.ifcplus.api.style
1111
import numpy as np
1212
import ifcopenshell.util.representation
13-
from bim2fem.ifcplus.api.distribution_element import ELBOW_RADIUS_TYPE
1413
import bim2fem.ifcplus.util.system
14+
import bim2fem.ifcplus.api.placement
15+
from typing import Literal
16+
17+
FLOW_DIRECTION = Literal[
18+
"SINK",
19+
"SOURCE",
20+
"SOURCEANDSINK",
21+
"NOTDEFINED",
22+
]
23+
24+
DISTRIBUTION_PORT_PREDEFINED_TYPE = Literal[
25+
"CABLE",
26+
"CABLECARRIER",
27+
"DUCT",
28+
"PIPE",
29+
"WIRELESS",
30+
"USERDEFINED",
31+
"NOTDEFINED",
32+
]
33+
34+
ELBOW_RADIUS_TYPE = Literal[
35+
"LONG",
36+
"SHORT",
37+
]
38+
39+
40+
def create_distribution_port(
41+
ifc4_file: ifcopenshell.file,
42+
port_origin_in_distribution_element_coordinates: tuple[float, float, float],
43+
port_z_axis_in_distribution_element_coordinates: tuple[float, float, float],
44+
port_x_axis_in_distribution_element_coordinates: tuple[float, float, float],
45+
distribution_element: ifcopenshell.entity_instance,
46+
flow_direction: FLOW_DIRECTION,
47+
predefined_type: DISTRIBUTION_PORT_PREDEFINED_TYPE,
48+
distribution_system: ifcopenshell.entity_instance | None = None,
49+
) -> ifcopenshell.entity_instance:
50+
51+
distribution_port = ifcopenshell.api.system.add_port(
52+
file=ifc4_file,
53+
element=distribution_element,
54+
)
55+
56+
distribution_port.FlowDirection = flow_direction
57+
58+
distribution_port.PredefinedType = predefined_type
59+
60+
if isinstance(distribution_system, ifcopenshell.entity_instance):
61+
distribution_port.SystemType = distribution_system.PredefinedType
62+
63+
bim2fem.ifcplus.api.placement.edit_object_placement(
64+
product=distribution_port,
65+
repositioned_origin=port_origin_in_distribution_element_coordinates,
66+
repositioned_z_axis=port_z_axis_in_distribution_element_coordinates,
67+
repositioned_x_axis=port_x_axis_in_distribution_element_coordinates,
68+
place_object_relative_to_parent=True,
69+
)
70+
71+
return distribution_port
1572

1673

1774
def add_shape_representation_to_distribution_ports(

tests/ifcplus/api/test_distribution_element.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,10 @@ def test_add_elbows(
141141
include_subtypes=False,
142142
)[0]
143143

144-
horizontal_curve_1 = (
145-
bim2fem.ifcplus.util.geometry.HorizontalCurve.from_PC_and_PT_and_CC(
146-
point_on_center_of_curvature_side=(2.0, 1.0, 0.0),
147-
point_of_curvature=(1.0, 1.0, 0.0),
148-
point_of_tangency=(2.0, 2.0, 0.0),
149-
radius_of_curvature=1.0,
150-
)
144+
bim2fem.ifcplus.api.placement.edit_object_placement(
145+
product=site,
146+
repositioned_origin=(1.0, 1.0, 0.0),
147+
place_object_relative_to_parent=False,
151148
)
152149

153150
material = bim2fem.ifcplus.api.material.add_material_with_structural_properties(
@@ -161,6 +158,15 @@ def test_add_elbows(
161158
check_for_duplicate=True,
162159
)
163160

161+
horizontal_curve_1 = (
162+
bim2fem.ifcplus.util.geometry.HorizontalCurve.from_PC_and_PT_and_CC(
163+
point_on_center_of_curvature_side=(2.0, 1.0, 0.0),
164+
point_of_curvature=(1.0, 1.0, 0.0),
165+
point_of_tangency=(2.0, 2.0, 0.0),
166+
radius_of_curvature=1.0,
167+
)
168+
)
169+
164170
bim2fem.ifcplus.api.distribution_element.create_elbow(
165171
ifc4_file=ifc_file_with_ventilation_distribution_system,
166172
horizontal_curve=horizontal_curve_1,

0 commit comments

Comments
 (0)