@linkiez/dxf-renew 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/.eslintrc.json +1 -16
  2. package/.github/instructions/code-patterns.instructions.md +1 -1
  3. package/.github/instructions/exdxf.instruction.md +161 -0
  4. package/.github/instructions/tdd.instructions.md +271 -0
  5. package/.yarn/install-state.gz +0 -0
  6. package/ARCHITECTURE.md +163 -0
  7. package/CHANGELOG.md +39 -0
  8. package/CONTRIBUTING.md +16 -14
  9. package/README.md +113 -16
  10. package/{PLAN.md → ROADMAP.md} +244 -102
  11. package/dist/dxf.js +2212 -454
  12. package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
  13. package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
  14. package/lib/Helper.cjs +6 -2
  15. package/lib/Helper.cjs.map +3 -3
  16. package/lib/Helper.js +6 -2
  17. package/lib/Helper.js.map +2 -2
  18. package/lib/denormalise.cjs +131 -91
  19. package/lib/denormalise.cjs.map +2 -2
  20. package/lib/denormalise.js +131 -91
  21. package/lib/denormalise.js.map +2 -2
  22. package/lib/dimensionToSVG.cjs +318 -53
  23. package/lib/dimensionToSVG.cjs.map +3 -3
  24. package/lib/dimensionToSVG.js +316 -52
  25. package/lib/dimensionToSVG.js.map +2 -2
  26. package/lib/entityToPolyline.cjs +95 -0
  27. package/lib/entityToPolyline.cjs.map +3 -3
  28. package/lib/entityToPolyline.js +95 -0
  29. package/lib/entityToPolyline.js.map +2 -2
  30. package/lib/handlers/entities.cjs +111 -27
  31. package/lib/handlers/entities.cjs.map +3 -3
  32. package/lib/handlers/entities.js +111 -27
  33. package/lib/handlers/entities.js.map +3 -3
  34. package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
  35. package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
  36. package/lib/handlers/entity/dgnUnderlay.js +71 -0
  37. package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
  38. package/lib/handlers/entity/dimension.cjs +24 -0
  39. package/lib/handlers/entity/dimension.cjs.map +2 -2
  40. package/lib/handlers/entity/dimension.js +24 -0
  41. package/lib/handlers/entity/dimension.js.map +2 -2
  42. package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
  43. package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
  44. package/lib/handlers/entity/dwfUnderlay.js +71 -0
  45. package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
  46. package/lib/handlers/entity/image.cjs +123 -0
  47. package/lib/handlers/entity/image.cjs.map +7 -0
  48. package/lib/handlers/entity/image.js +88 -0
  49. package/lib/handlers/entity/image.js.map +7 -0
  50. package/lib/handlers/entity/leader.cjs +148 -0
  51. package/lib/handlers/entity/leader.cjs.map +7 -0
  52. package/lib/handlers/entity/leader.js +113 -0
  53. package/lib/handlers/entity/leader.js.map +7 -0
  54. package/lib/handlers/entity/mleader.cjs +69 -0
  55. package/lib/handlers/entity/mleader.cjs.map +7 -0
  56. package/lib/handlers/entity/mleader.js +34 -0
  57. package/lib/handlers/entity/mleader.js.map +7 -0
  58. package/lib/handlers/entity/mline.cjs +91 -0
  59. package/lib/handlers/entity/mline.cjs.map +7 -0
  60. package/lib/handlers/entity/mline.js +56 -0
  61. package/lib/handlers/entity/mline.js.map +7 -0
  62. package/lib/handlers/entity/oleframe.cjs +98 -0
  63. package/lib/handlers/entity/oleframe.cjs.map +7 -0
  64. package/lib/handlers/entity/oleframe.js +63 -0
  65. package/lib/handlers/entity/oleframe.js.map +7 -0
  66. package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
  67. package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
  68. package/lib/handlers/entity/pdfUnderlay.js +71 -0
  69. package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
  70. package/lib/handlers/entity/ray.cjs +81 -0
  71. package/lib/handlers/entity/ray.cjs.map +7 -0
  72. package/lib/handlers/entity/ray.js +46 -0
  73. package/lib/handlers/entity/ray.js.map +7 -0
  74. package/lib/handlers/entity/region.cjs +67 -0
  75. package/lib/handlers/entity/region.cjs.map +7 -0
  76. package/lib/handlers/entity/region.js +32 -0
  77. package/lib/handlers/entity/region.js.map +7 -0
  78. package/lib/handlers/entity/shape.cjs +95 -0
  79. package/lib/handlers/entity/shape.cjs.map +7 -0
  80. package/lib/handlers/entity/shape.js +60 -0
  81. package/lib/handlers/entity/shape.js.map +7 -0
  82. package/lib/handlers/entity/table.cjs +71 -0
  83. package/lib/handlers/entity/table.cjs.map +7 -0
  84. package/lib/handlers/entity/table.js +36 -0
  85. package/lib/handlers/entity/table.js.map +7 -0
  86. package/lib/handlers/entity/tolerance.cjs +90 -0
  87. package/lib/handlers/entity/tolerance.cjs.map +7 -0
  88. package/lib/handlers/entity/tolerance.js +55 -0
  89. package/lib/handlers/entity/tolerance.js.map +7 -0
  90. package/lib/handlers/entity/trace.cjs +101 -0
  91. package/lib/handlers/entity/trace.cjs.map +7 -0
  92. package/lib/handlers/entity/trace.js +66 -0
  93. package/lib/handlers/entity/trace.js.map +7 -0
  94. package/lib/handlers/entity/wipeout.cjs +122 -0
  95. package/lib/handlers/entity/wipeout.cjs.map +7 -0
  96. package/lib/handlers/entity/wipeout.js +87 -0
  97. package/lib/handlers/entity/wipeout.js.map +7 -0
  98. package/lib/handlers/entity/xline.cjs +81 -0
  99. package/lib/handlers/entity/xline.cjs.map +7 -0
  100. package/lib/handlers/entity/xline.js +46 -0
  101. package/lib/handlers/entity/xline.js.map +7 -0
  102. package/lib/handlers/objects.cjs +299 -136
  103. package/lib/handlers/objects.cjs.map +2 -2
  104. package/lib/handlers/objects.js +299 -136
  105. package/lib/handlers/objects.js.map +2 -2
  106. package/lib/handlers/tables.cjs +96 -17
  107. package/lib/handlers/tables.cjs.map +2 -2
  108. package/lib/handlers/tables.js +96 -17
  109. package/lib/handlers/tables.js.map +2 -2
  110. package/lib/index.cjs +5 -2
  111. package/lib/index.cjs.map +3 -3
  112. package/lib/index.js +18 -16
  113. package/lib/index.js.map +3 -3
  114. package/lib/toJson.cjs +29 -0
  115. package/lib/toJson.cjs.map +7 -0
  116. package/lib/toJson.js +9 -0
  117. package/lib/toJson.js.map +7 -0
  118. package/lib/toSVG.cjs +105 -11
  119. package/lib/toSVG.cjs.map +3 -3
  120. package/lib/toSVG.js +106 -12
  121. package/lib/toSVG.js.map +2 -2
  122. package/lib/types/dimension-entity.cjs.map +1 -1
  123. package/lib/types/entity.cjs.map +1 -1
  124. package/lib/types/helper.cjs.map +1 -1
  125. package/lib/types/image-entity.cjs +17 -0
  126. package/lib/types/image-entity.cjs.map +7 -0
  127. package/lib/types/image-entity.js +1 -0
  128. package/lib/types/image-entity.js.map +7 -0
  129. package/lib/types/index.cjs +28 -0
  130. package/lib/types/index.cjs.map +2 -2
  131. package/lib/types/index.js +14 -0
  132. package/lib/types/index.js.map +2 -2
  133. package/lib/types/leader-entity.cjs +17 -0
  134. package/lib/types/leader-entity.cjs.map +7 -0
  135. package/lib/types/leader-entity.js +1 -0
  136. package/lib/types/leader-entity.js.map +7 -0
  137. package/lib/types/mleader-entity.cjs +17 -0
  138. package/lib/types/mleader-entity.cjs.map +7 -0
  139. package/lib/types/mleader-entity.js +1 -0
  140. package/lib/types/mleader-entity.js.map +7 -0
  141. package/lib/types/mline-entity.cjs +17 -0
  142. package/lib/types/mline-entity.cjs.map +7 -0
  143. package/lib/types/mline-entity.js +1 -0
  144. package/lib/types/mline-entity.js.map +7 -0
  145. package/lib/types/oleframe-entity.cjs +17 -0
  146. package/lib/types/oleframe-entity.cjs.map +7 -0
  147. package/lib/types/oleframe-entity.js +1 -0
  148. package/lib/types/oleframe-entity.js.map +7 -0
  149. package/lib/types/options.cjs.map +1 -1
  150. package/lib/types/ray-entity.cjs +17 -0
  151. package/lib/types/ray-entity.cjs.map +7 -0
  152. package/lib/types/ray-entity.js +1 -0
  153. package/lib/types/ray-entity.js.map +7 -0
  154. package/lib/types/region-entity.cjs +17 -0
  155. package/lib/types/region-entity.cjs.map +7 -0
  156. package/lib/types/region-entity.js +1 -0
  157. package/lib/types/region-entity.js.map +7 -0
  158. package/lib/types/shape-entity.cjs +17 -0
  159. package/lib/types/shape-entity.cjs.map +7 -0
  160. package/lib/types/shape-entity.js +1 -0
  161. package/lib/types/shape-entity.js.map +7 -0
  162. package/lib/types/table-entity.cjs +17 -0
  163. package/lib/types/table-entity.cjs.map +7 -0
  164. package/lib/types/table-entity.js +1 -0
  165. package/lib/types/table-entity.js.map +7 -0
  166. package/lib/types/tables.cjs.map +1 -1
  167. package/lib/types/tolerance-entity.cjs +17 -0
  168. package/lib/types/tolerance-entity.cjs.map +7 -0
  169. package/lib/types/tolerance-entity.js +1 -0
  170. package/lib/types/tolerance-entity.js.map +7 -0
  171. package/lib/types/trace-entity.cjs +17 -0
  172. package/lib/types/trace-entity.cjs.map +7 -0
  173. package/lib/types/trace-entity.js +1 -0
  174. package/lib/types/trace-entity.js.map +7 -0
  175. package/lib/types/underlay-entity.cjs +17 -0
  176. package/lib/types/underlay-entity.cjs.map +7 -0
  177. package/lib/types/underlay-entity.js +1 -0
  178. package/lib/types/underlay-entity.js.map +7 -0
  179. package/lib/types/wipeout-entity.cjs +17 -0
  180. package/lib/types/wipeout-entity.cjs.map +7 -0
  181. package/lib/types/wipeout-entity.js +1 -0
  182. package/lib/types/wipeout-entity.js.map +7 -0
  183. package/lib/types/xline-entity.cjs +17 -0
  184. package/lib/types/xline-entity.cjs.map +7 -0
  185. package/lib/types/xline-entity.js +1 -0
  186. package/lib/types/xline-entity.js.map +7 -0
  187. package/lib/util/escapeXmlText.cjs +27 -0
  188. package/lib/util/escapeXmlText.cjs.map +7 -0
  189. package/lib/util/escapeXmlText.js +7 -0
  190. package/lib/util/escapeXmlText.js.map +7 -0
  191. package/package.json +9 -18
  192. package/playwright.config.cjs +20 -0
  193. package/src/Helper.ts +8 -3
  194. package/src/denormalise.ts +182 -116
  195. package/src/dimensionToSVG.ts +466 -54
  196. package/src/entityToPolyline.ts +124 -2
  197. package/src/handlers/entities.ts +129 -34
  198. package/src/handlers/entity/dgnUnderlay.ts +94 -0
  199. package/src/handlers/entity/dimension.ts +27 -1
  200. package/src/handlers/entity/dwfUnderlay.ts +94 -0
  201. package/src/handlers/entity/image.ts +118 -0
  202. package/src/handlers/entity/leader.ts +153 -0
  203. package/src/handlers/entity/mleader.ts +46 -0
  204. package/src/handlers/entity/mline.ts +74 -0
  205. package/src/handlers/entity/oleframe.ts +62 -0
  206. package/src/handlers/entity/pdfUnderlay.ts +94 -0
  207. package/src/handlers/entity/ray.ts +52 -0
  208. package/src/handlers/entity/region.ts +42 -0
  209. package/src/handlers/entity/shape.ts +73 -0
  210. package/src/handlers/entity/table.ts +49 -0
  211. package/src/handlers/entity/tolerance.ts +75 -0
  212. package/src/handlers/entity/trace.ts +72 -0
  213. package/src/handlers/entity/wipeout.ts +114 -0
  214. package/src/handlers/entity/xline.ts +52 -0
  215. package/src/handlers/objects.ts +379 -139
  216. package/src/handlers/tables.ts +134 -21
  217. package/src/index.ts +9 -18
  218. package/src/toJson.ts +8 -0
  219. package/src/toSVG.ts +143 -10
  220. package/src/types/dimension-entity.ts +11 -0
  221. package/src/types/entity.ts +30 -0
  222. package/src/types/helper.ts +2 -1
  223. package/src/types/image-entity.ts +35 -0
  224. package/src/types/index.ts +14 -0
  225. package/src/types/leader-entity.ts +40 -0
  226. package/src/types/mleader-entity.ts +8 -0
  227. package/src/types/mline-entity.ts +12 -0
  228. package/src/types/oleframe-entity.ts +40 -0
  229. package/src/types/options.ts +48 -0
  230. package/src/types/ray-entity.ts +12 -0
  231. package/src/types/region-entity.ts +11 -0
  232. package/src/types/shape-entity.ts +19 -0
  233. package/src/types/table-entity.ts +14 -0
  234. package/src/types/tables.ts +160 -0
  235. package/src/types/tolerance-entity.ts +20 -0
  236. package/src/types/trace-entity.ts +14 -0
  237. package/src/types/underlay-entity.ts +35 -0
  238. package/src/types/wipeout-entity.ts +20 -0
  239. package/src/types/xline-entity.ts +12 -0
  240. package/src/util/escapeXmlText.ts +10 -0
  241. package/tools/browser_test_server.cjs +87 -0
  242. package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
  243. package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
  244. package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
  245. package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
  246. package/tools/ezdxf_validate_fixtures.py +165 -0
  247. package/docs/DIMENSION_SUMMARY.md +0 -248
  248. package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
  249. package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
  250. package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
  251. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
  252. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.pt-BR.md +0 -169
@@ -29,11 +29,174 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var dimensionToSVG_exports = {};
30
30
  __export(dimensionToSVG_exports, {
31
31
  createArrowMarker: () => createArrowMarker,
32
- default: () => dimensionToSVG
32
+ default: () => dimensionToSVG,
33
+ getDimensionGeometryBBox: () => getDimensionGeometryBBox
33
34
  });
34
35
  module.exports = __toCommonJS(dimensionToSVG_exports);
35
36
  var import_vecks = require("vecks");
36
37
  var import_colors = __toESM(require("./util/colors"), 1);
38
+ var import_escapeXmlText = __toESM(require("./util/escapeXmlText"), 1);
39
+ var import_round10 = __toESM(require("./util/round10"), 1);
40
+ const DEFAULT_DIMENSION_DECIMALS = 2;
41
+ const AUTOSCALE_VIEWPORT_REFERENCE = 40;
42
+ const computeViewportAutoScaleFactor = (viewport, options) => {
43
+ const viewportMin = Math.min(Math.abs(viewport.width), Math.abs(viewport.height));
44
+ if (!Number.isFinite(viewportMin) || viewportMin <= 0) return 1;
45
+ const reference = options?.dimension?.autoScaleViewportReference;
46
+ const safeReference = Number.isFinite(reference) && (reference ?? 0) > 0 ? reference : AUTOSCALE_VIEWPORT_REFERENCE;
47
+ return viewportMin / safeReference;
48
+ };
49
+ const getViewportMin = (viewport) => {
50
+ const viewportMin = Math.min(Math.abs(viewport.width), Math.abs(viewport.height));
51
+ return Number.isFinite(viewportMin) ? viewportMin : Number.NaN;
52
+ };
53
+ const getViewportPercentageSize = (viewport, percent) => {
54
+ if (!Number.isFinite(percent) || (percent ?? 0) <= 0) return void 0;
55
+ const viewportMin = getViewportMin(viewport);
56
+ if (!Number.isFinite(viewportMin) || viewportMin <= 0) return void 0;
57
+ return viewportMin * (percent / 100);
58
+ };
59
+ const getDimensionGeometryBBox = (entity) => {
60
+ const bbox = new import_vecks.Box2();
61
+ const points = [
62
+ entity.start,
63
+ entity.angleVertex,
64
+ entity.arcPoint,
65
+ entity.textMidpoint,
66
+ entity.measureStart,
67
+ entity.measureEnd
68
+ ];
69
+ for (const p of points) {
70
+ if (!p) continue;
71
+ const x = p.x;
72
+ const y = p.y;
73
+ if (!Number.isFinite(x) || !Number.isFinite(y)) continue;
74
+ bbox.expandByPoint({ x, y });
75
+ }
76
+ return bbox;
77
+ };
78
+ const getScaledDimensionSizes = (dimStyle, options, viewport) => {
79
+ const autoScale = options?.dimension?.autoScale === true;
80
+ const baseArrowSize = dimStyle?.dimAsz ?? 2.5;
81
+ const baseTextHeight = dimStyle?.dimTxt ?? 2.5;
82
+ const baseExtLineOffset = dimStyle?.dimExo ?? 0.625;
83
+ const baseExtLineExtension = dimStyle?.dimExe ?? 1.25;
84
+ if (!autoScale || !viewport) {
85
+ return {
86
+ arrowSize: baseArrowSize,
87
+ textHeight: baseTextHeight,
88
+ extLineOffset: baseExtLineOffset,
89
+ extLineExtension: baseExtLineExtension
90
+ };
91
+ }
92
+ const scale = computeViewportAutoScaleFactor(viewport, options);
93
+ const perc = options?.dimension?.autoScaleViewportPercentages;
94
+ const arrowFromPct = getViewportPercentageSize(viewport, perc?.arrowSize);
95
+ const textFromPct = getViewportPercentageSize(viewport, perc?.textHeight);
96
+ const offsetFromPct = getViewportPercentageSize(viewport, perc?.extLineOffset);
97
+ const extensionFromPct = getViewportPercentageSize(viewport, perc?.extLineExtension);
98
+ return {
99
+ arrowSize: arrowFromPct ?? baseArrowSize * scale,
100
+ textHeight: textFromPct ?? baseTextHeight * scale,
101
+ extLineOffset: offsetFromPct ?? baseExtLineOffset * scale,
102
+ extLineExtension: extensionFromPct ?? baseExtLineExtension * scale
103
+ };
104
+ };
105
+ const formatDimensionValue = (value, decimals = DEFAULT_DIMENSION_DECIMALS) => {
106
+ if (!Number.isFinite(value)) return "";
107
+ const rounded = (0, import_round10.default)(value, -decimals);
108
+ return rounded.toFixed(decimals);
109
+ };
110
+ const computeRadiusFallback = (entity) => {
111
+ const cx = entity.start?.x ?? 0;
112
+ const cy = entity.start?.y ?? 0;
113
+ const x1 = entity.measureStart?.x ?? 0;
114
+ const y1 = entity.measureStart?.y ?? 0;
115
+ const x2 = entity.measureEnd?.x ?? 0;
116
+ const y2 = entity.measureEnd?.y ?? 0;
117
+ const r1 = Math.hypot(x1 - cx, y1 - cy);
118
+ const r2 = Math.hypot(x2 - cx, y2 - cy);
119
+ const chord = Math.hypot(x2 - x1, y2 - y1);
120
+ return Math.max(r1, r2, chord);
121
+ };
122
+ const computeLinearDistance = (x1, y1, x2, y2) => Math.hypot(x2 - x1, y2 - y1);
123
+ const computeAngularDegreesMinimal = (cx, cy, x1, y1, x2, y2) => {
124
+ const a1 = Math.atan2(y1 - cy, x1 - cx);
125
+ const a2 = Math.atan2(y2 - cy, x2 - cx);
126
+ let delta = Math.abs(a2 - a1);
127
+ while (delta > Math.PI * 2) delta -= Math.PI * 2;
128
+ if (delta > Math.PI) delta = Math.PI * 2 - delta;
129
+ return delta * 180 / Math.PI;
130
+ };
131
+ const computeAngularDegreesCCW = (cx, cy, x1, y1, x2, y2) => {
132
+ const a1 = Math.atan2(y1 - cy, x1 - cx);
133
+ const a2 = Math.atan2(y2 - cy, x2 - cx);
134
+ let delta = a2 - a1;
135
+ while (delta < 0) delta += Math.PI * 2;
136
+ while (delta >= Math.PI * 2) delta -= Math.PI * 2;
137
+ return delta * 180 / Math.PI;
138
+ };
139
+ const computeDimensionMeasurement = (entity) => {
140
+ const x1 = entity.measureStart?.x ?? 0;
141
+ const y1 = entity.measureStart?.y ?? 0;
142
+ const x2 = entity.measureEnd?.x ?? 0;
143
+ const y2 = entity.measureEnd?.y ?? 0;
144
+ switch (entity.dimensionType) {
145
+ case 0:
146
+ case 1:
147
+ case 6: {
148
+ const dist = computeLinearDistance(x1, y1, x2, y2);
149
+ return formatDimensionValue(dist);
150
+ }
151
+ case 3: {
152
+ const dist = computeLinearDistance(x1, y1, x2, y2);
153
+ if (dist > 0) return formatDimensionValue(dist);
154
+ const radius = computeRadiusFallback(entity);
155
+ return formatDimensionValue(radius * 2);
156
+ }
157
+ case 4: {
158
+ const dist = computeLinearDistance(x1, y1, x2, y2);
159
+ if (dist > 0) return formatDimensionValue(dist);
160
+ const radius = computeRadiusFallback(entity);
161
+ return formatDimensionValue(radius);
162
+ }
163
+ case 2: {
164
+ const cx = entity.start?.x ?? 0;
165
+ const cy = entity.start?.y ?? 0;
166
+ const degrees = computeAngularDegreesMinimal(cx, cy, x1, y1, x2, y2);
167
+ const formatted = formatDimensionValue(degrees);
168
+ return formatted ? `${formatted}\xB0` : "";
169
+ }
170
+ case 5: {
171
+ const cx = entity.angleVertex?.x ?? 0;
172
+ const cy = entity.angleVertex?.y ?? 0;
173
+ const degrees = computeAngularDegreesCCW(cx, cy, x1, y1, x2, y2);
174
+ const formatted = formatDimensionValue(degrees);
175
+ return formatted ? `${formatted}\xB0` : "";
176
+ }
177
+ default:
178
+ return "";
179
+ }
180
+ };
181
+ const resolveDimensionText = (entity) => {
182
+ const raw = typeof entity.text === "string" ? entity.text : "";
183
+ const trimmed = raw.trim();
184
+ const measured = computeDimensionMeasurement(entity);
185
+ if (!trimmed) return measured;
186
+ if (trimmed.includes("<>")) {
187
+ return trimmed.split("<>").join(measured);
188
+ }
189
+ return trimmed;
190
+ };
191
+ const expandBBoxForMarker = (bbox, x, y, size) => {
192
+ bbox.expandByPoint({ x: x - size, y: y - size });
193
+ bbox.expandByPoint({ x: x + size, y: y + size });
194
+ };
195
+ const expandBBoxForText = (bbox, x, y, height, content) => {
196
+ const textWidth = content.length * height * 0.6;
197
+ bbox.expandByPoint({ x: x - textWidth / 2, y: y - height });
198
+ bbox.expandByPoint({ x: x + textWidth / 2, y: y + height });
199
+ };
37
200
  function colorNumberToSVG(colorNumber) {
38
201
  if (colorNumber === void 0 || colorNumber < 0) {
39
202
  return "currentColor";
@@ -56,38 +219,117 @@ function getDimensionColors(dimStyle) {
56
219
  extLineWeight: dimStyle?.dimLwe ?? 0.5
57
220
  };
58
221
  }
59
- function dimensionToSVG(entity, dimStyle) {
222
+ function dimensionToSVG(entity, dimStyle, options, viewport) {
60
223
  switch (entity.dimensionType) {
61
224
  case 0:
62
225
  // Rotated, horizontal, or vertical
63
226
  case 1:
64
- return renderLinearDimension(entity, dimStyle);
227
+ return renderLinearDimension(entity, dimStyle, options, viewport);
65
228
  case 2:
66
- return renderAngularDimension(entity, dimStyle);
229
+ return renderAngularDimension(entity, dimStyle, options, viewport);
230
+ case 5:
231
+ return renderAngular3PointDimension(entity, dimStyle, options, viewport);
67
232
  case 3:
68
- return renderDiameterDimension(entity, dimStyle);
233
+ return renderDiameterDimension(entity, dimStyle, options, viewport);
69
234
  case 4:
70
- return renderRadialDimension(entity, dimStyle);
235
+ return renderRadialDimension(entity, dimStyle, options, viewport);
71
236
  case 6:
72
- return renderOrdinateDimension(entity, dimStyle);
237
+ return renderOrdinateDimension(entity, dimStyle, options, viewport);
73
238
  default:
74
239
  return renderFallbackDimension(entity);
75
240
  }
76
241
  }
77
- function createArrowMarker(id, size, color) {
78
- const arrowPath = `M 0 0 L ${size} ${size / 2} L 0 ${size} z`;
79
- return `<marker id="${id}" markerWidth="${size}" markerHeight="${size}" refX="${size}" refY="${size / 2}" orient="auto" markerUnits="strokeWidth">
242
+ function renderAngular3PointDimension(entity, dimStyle, options, viewport) {
243
+ const bbox = new import_vecks.Box2();
244
+ const elements = [];
245
+ const markers = [];
246
+ const { arrowSize, textHeight } = getScaledDimensionSizes(dimStyle, options, viewport);
247
+ const { dimLineColor, extLineColor, textColor, dimLineWeight, extLineWeight } = getDimensionColors(dimStyle);
248
+ const vertexX = entity.angleVertex?.x ?? 0;
249
+ const vertexY = entity.angleVertex?.y ?? 0;
250
+ const x1 = entity.measureStart?.x ?? 0;
251
+ const y1 = entity.measureStart?.y ?? 0;
252
+ const x2 = entity.measureEnd?.x ?? 0;
253
+ const y2 = entity.measureEnd?.y ?? 0;
254
+ const startArcX = entity.start?.x ?? 0;
255
+ const startArcY = entity.start?.y ?? 0;
256
+ const arcPointX = entity.arcPoint?.x;
257
+ const arcPointY = entity.arcPoint?.y;
258
+ const arcPointRadius = Number.isFinite(arcPointX) && Number.isFinite(arcPointY) ? Math.hypot(arcPointX - vertexX, arcPointY - vertexY) : Number.NaN;
259
+ const useArcPoint = Number.isFinite(arcPointRadius) && arcPointRadius > 1e-9;
260
+ const arcLocationX = useArcPoint ? arcPointX : startArcX;
261
+ const arcLocationY = useArcPoint ? arcPointY : startArcY;
262
+ const textX = entity.textMidpoint?.x ?? arcLocationX;
263
+ const textY = entity.textMidpoint?.y ?? arcLocationY;
264
+ bbox.expandByPoint({ x: vertexX, y: vertexY });
265
+ bbox.expandByPoint({ x: x1, y: y1 });
266
+ bbox.expandByPoint({ x: x2, y: y2 });
267
+ bbox.expandByPoint({ x: arcLocationX, y: arcLocationY });
268
+ bbox.expandByPoint({ x: textX, y: textY });
269
+ const a1 = Math.atan2(y1 - vertexY, x1 - vertexX);
270
+ const a2 = Math.atan2(y2 - vertexY, x2 - vertexX);
271
+ let radius = Math.hypot(arcLocationX - vertexX, arcLocationY - vertexY);
272
+ if (!Number.isFinite(radius) || radius <= 1e-9) {
273
+ radius = Math.hypot(textX - vertexX, textY - vertexY);
274
+ }
275
+ if (!Number.isFinite(radius) || radius <= 1e-9) {
276
+ radius = Math.max(
277
+ Math.hypot(x1 - vertexX, y1 - vertexY),
278
+ Math.hypot(x2 - vertexX, y2 - vertexY)
279
+ );
280
+ }
281
+ const arcStartX = vertexX + radius * Math.cos(a1);
282
+ const arcStartY = vertexY + radius * Math.sin(a1);
283
+ const arcEndX = vertexX + radius * Math.cos(a2);
284
+ const arcEndY = vertexY + radius * Math.sin(a2);
285
+ bbox.expandByPoint({ x: arcStartX, y: arcStartY });
286
+ bbox.expandByPoint({ x: arcEndX, y: arcEndY });
287
+ const markerId1 = `dim-angular-3p-arrow-start-${Date.now()}`;
288
+ const markerId2 = `dim-angular-3p-arrow-end-${Date.now()}`;
289
+ markers.push(
290
+ createArrowMarker(markerId1, arrowSize, dimLineColor, "backward"),
291
+ createArrowMarker(markerId2, arrowSize, dimLineColor, "forward")
292
+ );
293
+ elements.push(
294
+ `<line x1="${x1}" y1="${y1}" x2="${arcStartX}" y2="${arcStartY}" stroke="${extLineColor}" stroke-width="${extLineWeight}" />`,
295
+ `<line x1="${x2}" y1="${y2}" x2="${arcEndX}" y2="${arcEndY}" stroke="${extLineColor}" stroke-width="${extLineWeight}" />`
296
+ );
297
+ let delta = a2 - a1;
298
+ while (delta < 0) delta += Math.PI * 2;
299
+ while (delta >= Math.PI * 2) delta -= Math.PI * 2;
300
+ const largeArcFlag = delta > Math.PI ? 1 : 0;
301
+ const sweepFlag = 1;
302
+ expandBBoxForMarker(bbox, arcStartX, arcStartY, arrowSize);
303
+ expandBBoxForMarker(bbox, arcEndX, arcEndY, arrowSize);
304
+ elements.push(
305
+ `<path d="M ${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArcFlag} ${sweepFlag} ${arcEndX} ${arcEndY}" fill="none" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-start="url(#${markerId1})" marker-end="url(#${markerId2})" />`
306
+ );
307
+ const resolvedText = resolveDimensionText(entity);
308
+ if (resolvedText) {
309
+ const midAngle = a1 + delta / 2;
310
+ const textRotation = midAngle * 180 / Math.PI;
311
+ expandBBoxForText(bbox, textX, textY, textHeight, resolvedText);
312
+ elements.push(
313
+ `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(resolvedText)}</text>`
314
+ );
315
+ }
316
+ return {
317
+ bbox,
318
+ element: `<defs>${markers.join("")}</defs><g>${elements.join("")}</g>`
319
+ };
320
+ }
321
+ function createArrowMarker(id, size, color, direction = "forward") {
322
+ const arrowPath = direction === "forward" ? `M 0 0 L ${size} ${size / 2} L 0 ${size} z` : `M ${size} 0 L 0 ${size / 2} L ${size} ${size} z`;
323
+ const refX = direction === "forward" ? size : 0;
324
+ return `<marker id="${id}" markerWidth="${size}" markerHeight="${size}" refX="${refX}" refY="${size / 2}" orient="auto" markerUnits="userSpaceOnUse">
80
325
  <path d="${arrowPath}" fill="${color}" />
81
326
  </marker>`;
82
327
  }
83
- function renderLinearDimension(entity, dimStyle) {
328
+ function renderLinearDimension(entity, dimStyle, options, viewport) {
84
329
  const bbox = new import_vecks.Box2();
85
330
  const elements = [];
86
331
  const markers = [];
87
- const arrowSize = dimStyle?.dimAsz ?? 2.5;
88
- const textHeight = dimStyle?.dimTxt ?? 2.5;
89
- const extLineOffset = dimStyle?.dimExo ?? 0.625;
90
- const extLineExtension = dimStyle?.dimExe ?? 1.25;
332
+ const { arrowSize, textHeight, extLineOffset, extLineExtension } = getScaledDimensionSizes(dimStyle, options, viewport);
91
333
  const { dimLineColor, extLineColor, textColor, dimLineWeight, extLineWeight } = getDimensionColors(dimStyle);
92
334
  const defPoint1X = entity.measureStart?.x ?? 0;
93
335
  const defPoint1Y = entity.measureStart?.y ?? 0;
@@ -110,8 +352,8 @@ function renderLinearDimension(entity, dimStyle) {
110
352
  const markerId1 = `dim-arrow-start-${Date.now()}`;
111
353
  const markerId2 = `dim-arrow-end-${Date.now()}`;
112
354
  markers.push(
113
- createArrowMarker(markerId1, arrowSize, dimLineColor),
114
- createArrowMarker(markerId2, arrowSize, dimLineColor)
355
+ createArrowMarker(markerId1, arrowSize, dimLineColor, "backward"),
356
+ createArrowMarker(markerId2, arrowSize, dimLineColor, "forward")
115
357
  );
116
358
  const extLine1StartX = defPoint1X + Math.cos(perpAngle) * extLineOffset;
117
359
  const extLine1StartY = defPoint1Y + Math.sin(perpAngle) * extLineOffset;
@@ -121,15 +363,23 @@ function renderLinearDimension(entity, dimStyle) {
121
363
  const extLine2StartY = defPoint2Y + Math.sin(perpAngle) * extLineOffset;
122
364
  const extLine2EndX = dimLine2X + Math.cos(perpAngle) * extLineExtension;
123
365
  const extLine2EndY = dimLine2Y + Math.sin(perpAngle) * extLineExtension;
366
+ bbox.expandByPoint({ x: extLine1StartX, y: extLine1StartY });
367
+ bbox.expandByPoint({ x: extLine1EndX, y: extLine1EndY });
368
+ bbox.expandByPoint({ x: extLine2StartX, y: extLine2StartY });
369
+ bbox.expandByPoint({ x: extLine2EndX, y: extLine2EndY });
370
+ expandBBoxForMarker(bbox, dimLine1X, dimLine1Y, arrowSize);
371
+ expandBBoxForMarker(bbox, dimLine2X, dimLine2Y, arrowSize);
124
372
  elements.push(
125
373
  `<line x1="${extLine1StartX}" y1="${extLine1StartY}" x2="${extLine1EndX}" y2="${extLine1EndY}" stroke="${extLineColor}" stroke-width="${extLineWeight}" />`,
126
374
  `<line x1="${extLine2StartX}" y1="${extLine2StartY}" x2="${extLine2EndX}" y2="${extLine2EndY}" stroke="${extLineColor}" stroke-width="${extLineWeight}" />`,
127
375
  `<line x1="${dimLine1X}" y1="${dimLine1Y}" x2="${dimLine2X}" y2="${dimLine2Y}" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-start="url(#${markerId1})" marker-end="url(#${markerId2})" />`
128
376
  );
129
- if (entity.text) {
377
+ const resolvedText = resolveDimensionText(entity);
378
+ if (resolvedText) {
130
379
  const textRotation = angle * 180 / Math.PI;
380
+ expandBBoxForText(bbox, textX, textY, textHeight, resolvedText);
131
381
  elements.push(
132
- `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${entity.text}</text>`
382
+ `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(resolvedText)}</text>`
133
383
  );
134
384
  }
135
385
  return {
@@ -137,12 +387,11 @@ function renderLinearDimension(entity, dimStyle) {
137
387
  element: `<defs>${markers.join("")}</defs><g>${elements.join("")}</g>`
138
388
  };
139
389
  }
140
- function renderAngularDimension(entity, dimStyle) {
390
+ function renderAngularDimension(entity, dimStyle, options, viewport) {
141
391
  const bbox = new import_vecks.Box2();
142
392
  const elements = [];
143
393
  const markers = [];
144
- const arrowSize = dimStyle?.dimAsz ?? 2.5;
145
- const textHeight = dimStyle?.dimTxt ?? 2.5;
394
+ const { arrowSize, textHeight } = getScaledDimensionSizes(dimStyle, options, viewport);
146
395
  const { dimLineColor, extLineColor, textColor, dimLineWeight, extLineWeight } = getDimensionColors(dimStyle);
147
396
  const centerX = entity.start?.x ?? 0;
148
397
  const centerY = entity.start?.y ?? 0;
@@ -159,8 +408,8 @@ function renderAngularDimension(entity, dimStyle) {
159
408
  const markerId1 = `dim-angular-arrow-start-${Date.now()}`;
160
409
  const markerId2 = `dim-angular-arrow-end-${Date.now()}`;
161
410
  markers.push(
162
- createArrowMarker(markerId1, arrowSize, dimLineColor),
163
- createArrowMarker(markerId2, arrowSize, dimLineColor)
411
+ createArrowMarker(markerId1, arrowSize, dimLineColor, "backward"),
412
+ createArrowMarker(markerId2, arrowSize, dimLineColor, "forward")
164
413
  );
165
414
  elements.push(
166
415
  `<line x1="${centerX}" y1="${centerY}" x2="${x1}" y2="${y1}" stroke="${extLineColor}" stroke-width="${extLineWeight}" />`,
@@ -177,11 +426,13 @@ function renderAngularDimension(entity, dimStyle) {
177
426
  elements.push(
178
427
  `<path d="M ${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArcFlag} 1 ${arcEndX} ${arcEndY}" fill="none" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-start="url(#${markerId1})" marker-end="url(#${markerId2})" />`
179
428
  );
180
- if (entity.text) {
429
+ const resolvedText = resolveDimensionText(entity);
430
+ if (resolvedText) {
181
431
  const midAngle = (startAngle + endAngle) / 2;
182
432
  const textRotation = midAngle * 180 / Math.PI;
433
+ expandBBoxForText(bbox, textX, textY, textHeight, resolvedText);
183
434
  elements.push(
184
- `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${entity.text}</text>`
435
+ `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(resolvedText)}</text>`
185
436
  );
186
437
  }
187
438
  return {
@@ -189,12 +440,11 @@ function renderAngularDimension(entity, dimStyle) {
189
440
  element: `<defs>${markers.join("")}</defs><g>${elements.join("")}</g>`
190
441
  };
191
442
  }
192
- function renderDiameterDimension(entity, dimStyle) {
443
+ function renderDiameterDimension(entity, dimStyle, options, viewport) {
193
444
  const bbox = new import_vecks.Box2();
194
445
  const elements = [];
195
446
  const markers = [];
196
- const arrowSize = dimStyle?.dimAsz ?? 2.5;
197
- const textHeight = dimStyle?.dimTxt ?? 2.5;
447
+ const { arrowSize, textHeight } = getScaledDimensionSizes(dimStyle, options, viewport);
198
448
  const { dimLineColor, textColor, dimLineWeight } = getDimensionColors(dimStyle);
199
449
  const x1 = entity.measureStart?.x ?? 0;
200
450
  const y1 = entity.measureStart?.y ?? 0;
@@ -205,28 +455,33 @@ function renderDiameterDimension(entity, dimStyle) {
205
455
  bbox.expandByPoint({ x: x1, y: y1 });
206
456
  bbox.expandByPoint({ x: x2, y: y2 });
207
457
  bbox.expandByPoint({ x: textX, y: textY });
208
- const markerId = `dim-diameter-arrow-${Date.now()}`;
209
- markers.push(createArrowMarker(markerId, arrowSize, dimLineColor));
210
- elements.push(
211
- `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-end="url(#${markerId})" />`
212
- );
213
- const diameterText = entity.text ? `\u2300${entity.text}` : "\u2300";
458
+ const diameterLen = Math.hypot(x2 - x1, y2 - y1);
459
+ if (Number.isFinite(diameterLen) && diameterLen > 1e-6) {
460
+ const markerId = `dim-diameter-arrow-${Date.now()}`;
461
+ markers.push(createArrowMarker(markerId, arrowSize, dimLineColor, "backward"));
462
+ elements.push(
463
+ `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-end="url(#${markerId})" />`
464
+ );
465
+ expandBBoxForMarker(bbox, x2, y2, arrowSize);
466
+ }
467
+ const resolvedText = resolveDimensionText(entity);
468
+ const diameterText = resolvedText ? `\u2300${resolvedText}` : "\u2300";
214
469
  const angle = Math.atan2(y2 - y1, x2 - x1);
215
470
  const textRotation = angle * 180 / Math.PI;
471
+ expandBBoxForText(bbox, textX, textY, textHeight, diameterText);
216
472
  elements.push(
217
- `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${diameterText}</text>`
473
+ `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(diameterText)}</text>`
218
474
  );
219
475
  return {
220
476
  bbox,
221
477
  element: `<defs>${markers.join("")}</defs><g>${elements.join("")}</g>`
222
478
  };
223
479
  }
224
- function renderRadialDimension(entity, dimStyle) {
480
+ function renderRadialDimension(entity, dimStyle, options, viewport) {
225
481
  const bbox = new import_vecks.Box2();
226
482
  const elements = [];
227
483
  const markers = [];
228
- const arrowSize = dimStyle?.dimAsz ?? 2.5;
229
- const textHeight = dimStyle?.dimTxt ?? 2.5;
484
+ const { arrowSize, textHeight } = getScaledDimensionSizes(dimStyle, options, viewport);
230
485
  const { dimLineColor, textColor, dimLineWeight } = getDimensionColors(dimStyle);
231
486
  const x1 = entity.measureStart?.x ?? 0;
232
487
  const y1 = entity.measureStart?.y ?? 0;
@@ -237,26 +492,32 @@ function renderRadialDimension(entity, dimStyle) {
237
492
  bbox.expandByPoint({ x: x1, y: y1 });
238
493
  bbox.expandByPoint({ x: x2, y: y2 });
239
494
  bbox.expandByPoint({ x: textX, y: textY });
240
- const markerId = `dim-radius-arrow-${Date.now()}`;
241
- markers.push(createArrowMarker(markerId, arrowSize, dimLineColor));
242
- elements.push(
243
- `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-end="url(#${markerId})" />`
244
- );
245
- const radiusText = entity.text ? `R${entity.text}` : "R";
495
+ const radiusLen = Math.hypot(x2 - x1, y2 - y1);
496
+ if (Number.isFinite(radiusLen) && radiusLen > 1e-6) {
497
+ const markerId = `dim-radius-arrow-${Date.now()}`;
498
+ markers.push(createArrowMarker(markerId, arrowSize, dimLineColor, "backward"));
499
+ elements.push(
500
+ `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" marker-end="url(#${markerId})" />`
501
+ );
502
+ expandBBoxForMarker(bbox, x2, y2, arrowSize);
503
+ }
504
+ const resolvedText = resolveDimensionText(entity);
505
+ const radiusText = resolvedText ? `R${resolvedText}` : "R";
246
506
  const angle = Math.atan2(y2 - y1, x2 - x1);
247
507
  const textRotation = angle * 180 / Math.PI;
508
+ expandBBoxForText(bbox, textX, textY, textHeight, radiusText);
248
509
  elements.push(
249
- `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${radiusText}</text>`
510
+ `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(radiusText)}</text>`
250
511
  );
251
512
  return {
252
513
  bbox,
253
514
  element: `<defs>${markers.join("")}</defs><g>${elements.join("")}</g>`
254
515
  };
255
516
  }
256
- function renderOrdinateDimension(entity, dimStyle) {
517
+ function renderOrdinateDimension(entity, dimStyle, options, viewport) {
257
518
  const bbox = new import_vecks.Box2();
258
519
  const elements = [];
259
- const textHeight = dimStyle?.dimTxt ?? 2.5;
520
+ const { textHeight } = getScaledDimensionSizes(dimStyle, options, viewport);
260
521
  const { dimLineColor, textColor, dimLineWeight } = getDimensionColors(dimStyle);
261
522
  const x1 = entity.measureStart?.x ?? 0;
262
523
  const y1 = entity.measureStart?.y ?? 0;
@@ -270,11 +531,13 @@ function renderOrdinateDimension(entity, dimStyle) {
270
531
  elements.push(
271
532
  `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${dimLineColor}" stroke-width="${dimLineWeight}" />`
272
533
  );
273
- if (entity.text) {
534
+ const resolvedText = resolveDimensionText(entity);
535
+ if (resolvedText) {
274
536
  const angle = Math.atan2(y2 - y1, x2 - x1);
275
537
  const textRotation = angle * 180 / Math.PI;
538
+ expandBBoxForText(bbox, textX, textY, textHeight, resolvedText);
276
539
  elements.push(
277
- `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${entity.text}</text>`
540
+ `<text x="${textX}" y="${textY}" font-size="${textHeight}" fill="${textColor}" text-anchor="middle" transform="rotate(${-textRotation} ${textX} ${textY}) scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(resolvedText)}</text>`
278
541
  );
279
542
  }
280
543
  return {
@@ -289,9 +552,10 @@ function renderFallbackDimension(entity) {
289
552
  const textX = entity.textMidpoint.x ?? 0;
290
553
  const textY = entity.textMidpoint.y ?? 0;
291
554
  bbox.expandByPoint({ x: textX, y: textY });
292
- if (entity.text) {
555
+ const resolvedText = resolveDimensionText(entity);
556
+ if (resolvedText) {
293
557
  elements.push(
294
- `<text x="${textX}" y="${textY}" font-size="2.5" text-anchor="middle" transform="scale(1,-1) translate(0 ${-2 * textY})">${entity.text}</text>`
558
+ `<text x="${textX}" y="${textY}" font-size="2.5" text-anchor="middle" transform="scale(1,-1) translate(0 ${-2 * textY})">${(0, import_escapeXmlText.default)(resolvedText)}</text>`
295
559
  );
296
560
  }
297
561
  }
@@ -302,6 +566,7 @@ function renderFallbackDimension(entity) {
302
566
  }
303
567
  // Annotate the CommonJS export names for ESM import in node:
304
568
  0 && (module.exports = {
305
- createArrowMarker
569
+ createArrowMarker,
570
+ getDimensionGeometryBBox
306
571
  });
307
572
  //# sourceMappingURL=dimensionToSVG.cjs.map