mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 18:16:40 +00:00
fixed issue with placing end port for a bend
This commit is contained in:
@@ -767,7 +767,8 @@ class MEPAddTransition(bpy.types.Operator, tool.Ifc.Operator):
|
||||
profile_offset *= V(1, -1)
|
||||
|
||||
# world space profile offset
|
||||
profile_offset_ws = start_object_rotation @ (profile_offset * si_conversion).to_3d()
|
||||
profile_offset_si = (profile_offset * si_conversion).to_3d()
|
||||
profile_offset_ws = start_object_rotation @ profile_offset_si
|
||||
|
||||
def get_segments_length():
|
||||
start_dir = (start_point - first_segment_start).normalized()
|
||||
@@ -857,7 +858,7 @@ class MEPAddTransition(bpy.types.Operator, tool.Ifc.Operator):
|
||||
pset=pset,
|
||||
properties={"Data": json.dumps(transition_data, default=list)},
|
||||
)
|
||||
tool.System.add_ports(obj, offset_end_port=profile_offset_ws)
|
||||
tool.System.add_ports(obj, offset_end_port=profile_offset_si)
|
||||
|
||||
# NOTE: at this point we loose current blender objects selection
|
||||
# create transition element
|
||||
@@ -1022,6 +1023,7 @@ class MEPAddBend(bpy.types.Operator, tool.Ifc.Operator):
|
||||
# TODO: profile offset may need to be flipped (check transition code)
|
||||
to_start_object_space = start_object_rotation.inverted()
|
||||
profile_offset = (to_start_object_space @ end_point) - (to_start_object_space @ start_point)
|
||||
z_axis_end_object_local = to_start_object_space @ tool.Cad.get_basis_vector(end_object, 2)
|
||||
|
||||
def check_for_double_bends():
|
||||
# The theory is To avoid double bends, the profile offset should occur along only two axes:
|
||||
@@ -1035,8 +1037,6 @@ class MEPAddBend(bpy.types.Operator, tool.Ifc.Operator):
|
||||
# NOTE: some double bends are only possible for square profiles:
|
||||
# https://i.imgur.com/ZhdGbEp.png
|
||||
|
||||
z_axis_end_object = end_object.matrix_world.col[2].normalized().to_3d()
|
||||
z_axis_end_object_local = to_start_object_space @ z_axis_end_object
|
||||
lateral_axes = [i for i in range(2) if not tool.Cad.is_x(z_axis_end_object_local[i], 0)]
|
||||
|
||||
if len(lateral_axes) != 1:
|
||||
@@ -1077,6 +1077,8 @@ class MEPAddBend(bpy.types.Operator, tool.Ifc.Operator):
|
||||
ref_point_radius = self.radius + profile_dim[lateral_axis]
|
||||
radial_offset[lateral_axis] = ref_point_radius * (1 - cos(angle)) * lateral_sign
|
||||
radial_offset.z = ref_point_radius * sin(angle)
|
||||
second_object_offset = radial_offset + V(0, 0, self.start_length)
|
||||
second_object_offset += z_axis_end_object_local * (self.end_length * -end_segment_sign)
|
||||
|
||||
def get_segments_extend():
|
||||
segments_intersection = segments_intersection_ws - start_point
|
||||
@@ -1200,7 +1202,7 @@ class MEPAddBend(bpy.types.Operator, tool.Ifc.Operator):
|
||||
pset=pset,
|
||||
properties={"Data": json.dumps(bend_data, default=list)},
|
||||
)
|
||||
tool.System.add_ports(obj, offset_end_port=start_object_rotation @ (radial_offset * V(1, 1, 0)))
|
||||
tool.System.add_ports(obj, end_port_pos=second_object_offset)
|
||||
|
||||
# NOTE: at this point we loose current blender objects selection
|
||||
# create transition element
|
||||
|
||||
@@ -31,7 +31,7 @@ from enum import Enum
|
||||
|
||||
class System(blenderbim.core.tool.System):
|
||||
@classmethod
|
||||
def add_ports(cls, obj, add_start_port=True, add_end_port=True, offset_end_port=None):
|
||||
def add_ports(cls, obj, add_start_port=True, add_end_port=True, end_port_pos=None, offset_end_port=None):
|
||||
def add_port(mep_element, matrix):
|
||||
port = tool.Ifc.run("system.add_port", element=mep_element)
|
||||
port.FlowDirection = "NOTDEFINED"
|
||||
@@ -52,9 +52,13 @@ class System(blenderbim.core.tool.System):
|
||||
if add_start_port:
|
||||
ports.append(add_port(mep_element, obj.matrix_world @ Matrix()))
|
||||
if add_end_port:
|
||||
m = obj.matrix_world @ Matrix.Translation((0, 0, length))
|
||||
if offset_end_port:
|
||||
m.translation += offset_end_port
|
||||
m = obj.matrix_world
|
||||
if end_port_pos:
|
||||
m.translation = end_port_pos
|
||||
else:
|
||||
m = m @ Matrix.Translation((0, 0, length))
|
||||
if offset_end_port:
|
||||
m.translation += offset_end_port
|
||||
ports.append(add_port(mep_element, m))
|
||||
return ports
|
||||
|
||||
|
||||
Reference in New Issue
Block a user