mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 17:57:02 +00:00
Fix dimension text rendering upside-down when drawn right-to-left
Normalize the dimension direction in both the SVG writer and the viewport decorator so text always reads left-to-right (or bottom-to-top for vertical dims) regardless of which anchor was placed first. Also guards against a pre-existing crash when two dimension endpoints project to the same screen position (zero-length vector passed to angle_signed). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -740,6 +740,10 @@ class DimensionDecorator(BaseDecorator):
|
|||||||
text_dir = p1 - p0
|
text_dir = p1 - p0
|
||||||
if text_dir.length < 1:
|
if text_dir.length < 1:
|
||||||
continue
|
continue
|
||||||
|
# Normalize so text always reads left-to-right (or bottom-to-top for
|
||||||
|
# vertical dims) regardless of which end was drawn first.
|
||||||
|
if text_dir.x < 0 or (abs(text_dir.x) < 1e-6 and text_dir.y < 0):
|
||||||
|
text_dir = -text_dir
|
||||||
perpendicular = Vector((-text_dir.y, text_dir.x)).normalized()
|
perpendicular = Vector((-text_dir.y, text_dir.x)).normalized()
|
||||||
text_offset = perpendicular * text_offset_value
|
text_offset = perpendicular * text_offset_value
|
||||||
|
|
||||||
@@ -748,7 +752,7 @@ class DimensionDecorator(BaseDecorator):
|
|||||||
"multiline": True,
|
"multiline": True,
|
||||||
"text_dir": text_dir,
|
"text_dir": text_dir,
|
||||||
}
|
}
|
||||||
base_pos = p1 if is_ordinate else p0 + text_dir * 0.5
|
base_pos = p1 if is_ordinate else (p0 + p1) / 2
|
||||||
|
|
||||||
if not show_description_only:
|
if not show_description_only:
|
||||||
segment_length = (v1 - v0).length
|
segment_length = (v1 - v0).length
|
||||||
|
|||||||
@@ -1588,8 +1588,10 @@ class SvgWriter:
|
|||||||
end = (offset + v1.xy * Vector((1, -1))) * self.svg_scale
|
end = (offset + v1.xy * Vector((1, -1))) * self.svg_scale
|
||||||
mid = ((end - start) / 2) + start
|
mid = ((end - start) / 2) + start
|
||||||
vector = end - start
|
vector = end - start
|
||||||
|
sheet_dimension = vector.length
|
||||||
|
if sheet_dimension < 1e-6:
|
||||||
|
return
|
||||||
perpendicular = Vector((vector.y, -vector.x)).normalized()
|
perpendicular = Vector((vector.y, -vector.x)).normalized()
|
||||||
sheet_dimension = (end - start).length
|
|
||||||
|
|
||||||
# if annotation can't fit offset text to the right of marker
|
# if annotation can't fit offset text to the right of marker
|
||||||
if distance_override is not None:
|
if distance_override is not None:
|
||||||
@@ -1597,6 +1599,13 @@ class SvgWriter:
|
|||||||
else:
|
else:
|
||||||
text_position = mid if sheet_dimension > 5 else (end + (3 * vector.normalized()))
|
text_position = mid if sheet_dimension > 5 else (end + (3 * vector.normalized()))
|
||||||
angle = math.degrees(vector.angle_signed(Vector((1, 0))))
|
angle = math.degrees(vector.angle_signed(Vector((1, 0))))
|
||||||
|
# Keep text readable regardless of draw direction: if the dimension runs
|
||||||
|
# right-to-left the raw angle is near ±180° which renders text upside-down.
|
||||||
|
# Flip both angle and perpendicular so text always reads left-to-right and
|
||||||
|
# stays on the same side of the dimension line.
|
||||||
|
if abs(angle) > 90:
|
||||||
|
angle += 180
|
||||||
|
perpendicular = -perpendicular
|
||||||
|
|
||||||
line = self.svg.line(start=start, end=end, class_=" ".join(classes))
|
line = self.svg.line(start=start, end=end, class_=" ".join(classes))
|
||||||
self.svg.add(line)
|
self.svg.add(line)
|
||||||
|
|||||||
Reference in New Issue
Block a user