mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 09:02:29 +00:00
Fixes position of zero-length segment
This commit is contained in:
@@ -91,43 +91,42 @@ def _add_segment_to_layout(file: ifcopenshell.file, layout: entity_instance, seg
|
|||||||
|
|
||||||
segment_nest = ifcopenshell.api.alignment.get_alignment_segment_nest(layout)
|
segment_nest = ifcopenshell.api.alignment.get_alignment_segment_nest(layout)
|
||||||
zero_length_segment = segment_nest.RelatedObjects[-1]
|
zero_length_segment = segment_nest.RelatedObjects[-1]
|
||||||
# DesignParameters.StartPoint for IfcAlignmentHorizontalSegment is automatically updated when the
|
mapped_segments = ifcopenshell.api.alignment.get_mapped_segments(segment)
|
||||||
# geometric representation is updated because the semantic and geometric data use the same IfcPoint.
|
mapped_segment = mapped_segments[0] if mapped_segments[1] == None else mapped_segments[1]
|
||||||
# This is not the case of IfcAlignmentVerticalSegment and IfcAlignmentCantSegment. For these
|
|
||||||
# segment types, the design parameters of the zero length segment must be updated explicitly.
|
|
||||||
if zero_length_segment.DesignParameters.is_a(
|
|
||||||
"IfcAlignmentVerticalSegment"
|
|
||||||
) or zero_length_segment.DesignParameters.is_a("IfcAlignmentCantSegment"):
|
|
||||||
# get the geometric representation for the new segment
|
|
||||||
mapped_segments = ifcopenshell.api.alignment.get_mapped_segments(segment)
|
|
||||||
mapped_segment = mapped_segments[0] if mapped_segments[1] == None else mapped_segments[1]
|
|
||||||
|
|
||||||
# compute the end point matrix
|
# compute the end point matrix
|
||||||
settings = ifcopenshell.geom.settings()
|
settings = ifcopenshell.geom.settings()
|
||||||
segment_fn = ifcopenshell_wrapper.map_shape(settings, mapped_segment.wrapped_data)
|
segment_fn = ifcopenshell_wrapper.map_shape(settings, mapped_segment.wrapped_data)
|
||||||
segment_evaluator = ifcopenshell_wrapper.function_item_evaluator(settings, segment_fn)
|
segment_evaluator = ifcopenshell_wrapper.function_item_evaluator(settings, segment_fn)
|
||||||
e = segment_evaluator.evaluate(segment_fn.end())
|
e = segment_evaluator.evaluate(segment_fn.end())
|
||||||
end = np.array(e)
|
end = np.array(e)
|
||||||
|
|
||||||
# update the zero length segment semantic representation parameters
|
# update the zero length segment semantic representation parameters
|
||||||
if zero_length_segment.DesignParameters.is_a("IfcAlignmentVerticalSegment"):
|
if zero_length_segment.DesignParameters.is_a("IfcAlignmentHorizontalSegment"):
|
||||||
y = float(end[1, 3]) / unit_scale
|
x = float(end[0, 3]) / unit_scale
|
||||||
zero_length_segment.DesignParameters.StartHeight = y
|
y = float(end[1, 3]) / unit_scale
|
||||||
dx = float(end[0, 0])
|
dx = float(end[0, 0])
|
||||||
dy = float(end[1, 0])
|
dy = float(end[1, 0])
|
||||||
zero_length_segment.DesignParameters.StartGradient = dy / dx
|
zero_length_segment.DesignParameters.StartPoint.Coordinates = (x,y)
|
||||||
zero_length_segment.DesignParameters.EndGradient = zero_length_segment.DesignParameters.StartGradient
|
zero_length_segment.DesignParameters.StartDirection = dy / dx
|
||||||
else:
|
elif zero_length_segment.DesignParameters.is_a("IfcAlignmentVerticalSegment"):
|
||||||
z = float(end[2, 3]) / unit_scale
|
y = float(end[1, 3]) / unit_scale
|
||||||
dx = float(end[0, 1])
|
zero_length_segment.DesignParameters.StartHeight = y
|
||||||
dy = float(end[1, 1])
|
dx = float(end[0, 0])
|
||||||
dz = float(end[2, 1])
|
dy = float(end[1, 0])
|
||||||
ds = math.sqrt(dx * dx + dy * dy)
|
zero_length_segment.DesignParameters.StartGradient = dy / dx
|
||||||
slope = dz / ds
|
zero_length_segment.DesignParameters.EndGradient = zero_length_segment.DesignParameters.StartGradient
|
||||||
railhead = layout.RailHeadDistance
|
else:
|
||||||
|
z = float(end[2, 3]) / unit_scale
|
||||||
|
dx = float(end[0, 1])
|
||||||
|
dy = float(end[1, 1])
|
||||||
|
dz = float(end[2, 1])
|
||||||
|
ds = math.sqrt(dx * dx + dy * dy)
|
||||||
|
slope = dz / ds
|
||||||
|
railhead = layout.RailHeadDistance
|
||||||
|
|
||||||
zero_length_segment.DesignParameters.StartCantLeft = z + slope * railhead / 2.0
|
zero_length_segment.DesignParameters.StartCantLeft = z + slope * railhead / 2.0
|
||||||
zero_length_segment.DesignParameters.StartCantRight = z - slope * railhead / 2.0
|
zero_length_segment.DesignParameters.StartCantRight = z - slope * railhead / 2.0
|
||||||
|
|
||||||
# updated the referent's name because the referent is now at a new station
|
# updated the referent's name because the referent is now at a new station
|
||||||
start_dist_along = 0.0
|
start_dist_along = 0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user