@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.
- package/.eslintrc.json +1 -16
- package/.github/instructions/code-patterns.instructions.md +1 -1
- package/.github/instructions/exdxf.instruction.md +161 -0
- package/.github/instructions/tdd.instructions.md +271 -0
- package/.yarn/install-state.gz +0 -0
- package/ARCHITECTURE.md +163 -0
- package/CHANGELOG.md +39 -0
- package/CONTRIBUTING.md +16 -14
- package/README.md +113 -16
- package/{PLAN.md → ROADMAP.md} +244 -102
- package/dist/dxf.js +2212 -454
- package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
- package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
- package/lib/Helper.cjs +6 -2
- package/lib/Helper.cjs.map +3 -3
- package/lib/Helper.js +6 -2
- package/lib/Helper.js.map +2 -2
- package/lib/denormalise.cjs +131 -91
- package/lib/denormalise.cjs.map +2 -2
- package/lib/denormalise.js +131 -91
- package/lib/denormalise.js.map +2 -2
- package/lib/dimensionToSVG.cjs +318 -53
- package/lib/dimensionToSVG.cjs.map +3 -3
- package/lib/dimensionToSVG.js +316 -52
- package/lib/dimensionToSVG.js.map +2 -2
- package/lib/entityToPolyline.cjs +95 -0
- package/lib/entityToPolyline.cjs.map +3 -3
- package/lib/entityToPolyline.js +95 -0
- package/lib/entityToPolyline.js.map +2 -2
- package/lib/handlers/entities.cjs +111 -27
- package/lib/handlers/entities.cjs.map +3 -3
- package/lib/handlers/entities.js +111 -27
- package/lib/handlers/entities.js.map +3 -3
- package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
- package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dgnUnderlay.js +71 -0
- package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
- package/lib/handlers/entity/dimension.cjs +24 -0
- package/lib/handlers/entity/dimension.cjs.map +2 -2
- package/lib/handlers/entity/dimension.js +24 -0
- package/lib/handlers/entity/dimension.js.map +2 -2
- package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
- package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dwfUnderlay.js +71 -0
- package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
- package/lib/handlers/entity/image.cjs +123 -0
- package/lib/handlers/entity/image.cjs.map +7 -0
- package/lib/handlers/entity/image.js +88 -0
- package/lib/handlers/entity/image.js.map +7 -0
- package/lib/handlers/entity/leader.cjs +148 -0
- package/lib/handlers/entity/leader.cjs.map +7 -0
- package/lib/handlers/entity/leader.js +113 -0
- package/lib/handlers/entity/leader.js.map +7 -0
- package/lib/handlers/entity/mleader.cjs +69 -0
- package/lib/handlers/entity/mleader.cjs.map +7 -0
- package/lib/handlers/entity/mleader.js +34 -0
- package/lib/handlers/entity/mleader.js.map +7 -0
- package/lib/handlers/entity/mline.cjs +91 -0
- package/lib/handlers/entity/mline.cjs.map +7 -0
- package/lib/handlers/entity/mline.js +56 -0
- package/lib/handlers/entity/mline.js.map +7 -0
- package/lib/handlers/entity/oleframe.cjs +98 -0
- package/lib/handlers/entity/oleframe.cjs.map +7 -0
- package/lib/handlers/entity/oleframe.js +63 -0
- package/lib/handlers/entity/oleframe.js.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
- package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.js +71 -0
- package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
- package/lib/handlers/entity/ray.cjs +81 -0
- package/lib/handlers/entity/ray.cjs.map +7 -0
- package/lib/handlers/entity/ray.js +46 -0
- package/lib/handlers/entity/ray.js.map +7 -0
- package/lib/handlers/entity/region.cjs +67 -0
- package/lib/handlers/entity/region.cjs.map +7 -0
- package/lib/handlers/entity/region.js +32 -0
- package/lib/handlers/entity/region.js.map +7 -0
- package/lib/handlers/entity/shape.cjs +95 -0
- package/lib/handlers/entity/shape.cjs.map +7 -0
- package/lib/handlers/entity/shape.js +60 -0
- package/lib/handlers/entity/shape.js.map +7 -0
- package/lib/handlers/entity/table.cjs +71 -0
- package/lib/handlers/entity/table.cjs.map +7 -0
- package/lib/handlers/entity/table.js +36 -0
- package/lib/handlers/entity/table.js.map +7 -0
- package/lib/handlers/entity/tolerance.cjs +90 -0
- package/lib/handlers/entity/tolerance.cjs.map +7 -0
- package/lib/handlers/entity/tolerance.js +55 -0
- package/lib/handlers/entity/tolerance.js.map +7 -0
- package/lib/handlers/entity/trace.cjs +101 -0
- package/lib/handlers/entity/trace.cjs.map +7 -0
- package/lib/handlers/entity/trace.js +66 -0
- package/lib/handlers/entity/trace.js.map +7 -0
- package/lib/handlers/entity/wipeout.cjs +122 -0
- package/lib/handlers/entity/wipeout.cjs.map +7 -0
- package/lib/handlers/entity/wipeout.js +87 -0
- package/lib/handlers/entity/wipeout.js.map +7 -0
- package/lib/handlers/entity/xline.cjs +81 -0
- package/lib/handlers/entity/xline.cjs.map +7 -0
- package/lib/handlers/entity/xline.js +46 -0
- package/lib/handlers/entity/xline.js.map +7 -0
- package/lib/handlers/objects.cjs +299 -136
- package/lib/handlers/objects.cjs.map +2 -2
- package/lib/handlers/objects.js +299 -136
- package/lib/handlers/objects.js.map +2 -2
- package/lib/handlers/tables.cjs +96 -17
- package/lib/handlers/tables.cjs.map +2 -2
- package/lib/handlers/tables.js +96 -17
- package/lib/handlers/tables.js.map +2 -2
- package/lib/index.cjs +5 -2
- package/lib/index.cjs.map +3 -3
- package/lib/index.js +18 -16
- package/lib/index.js.map +3 -3
- package/lib/toJson.cjs +29 -0
- package/lib/toJson.cjs.map +7 -0
- package/lib/toJson.js +9 -0
- package/lib/toJson.js.map +7 -0
- package/lib/toSVG.cjs +105 -11
- package/lib/toSVG.cjs.map +3 -3
- package/lib/toSVG.js +106 -12
- package/lib/toSVG.js.map +2 -2
- package/lib/types/dimension-entity.cjs.map +1 -1
- package/lib/types/entity.cjs.map +1 -1
- package/lib/types/helper.cjs.map +1 -1
- package/lib/types/image-entity.cjs +17 -0
- package/lib/types/image-entity.cjs.map +7 -0
- package/lib/types/image-entity.js +1 -0
- package/lib/types/image-entity.js.map +7 -0
- package/lib/types/index.cjs +28 -0
- package/lib/types/index.cjs.map +2 -2
- package/lib/types/index.js +14 -0
- package/lib/types/index.js.map +2 -2
- package/lib/types/leader-entity.cjs +17 -0
- package/lib/types/leader-entity.cjs.map +7 -0
- package/lib/types/leader-entity.js +1 -0
- package/lib/types/leader-entity.js.map +7 -0
- package/lib/types/mleader-entity.cjs +17 -0
- package/lib/types/mleader-entity.cjs.map +7 -0
- package/lib/types/mleader-entity.js +1 -0
- package/lib/types/mleader-entity.js.map +7 -0
- package/lib/types/mline-entity.cjs +17 -0
- package/lib/types/mline-entity.cjs.map +7 -0
- package/lib/types/mline-entity.js +1 -0
- package/lib/types/mline-entity.js.map +7 -0
- package/lib/types/oleframe-entity.cjs +17 -0
- package/lib/types/oleframe-entity.cjs.map +7 -0
- package/lib/types/oleframe-entity.js +1 -0
- package/lib/types/oleframe-entity.js.map +7 -0
- package/lib/types/options.cjs.map +1 -1
- package/lib/types/ray-entity.cjs +17 -0
- package/lib/types/ray-entity.cjs.map +7 -0
- package/lib/types/ray-entity.js +1 -0
- package/lib/types/ray-entity.js.map +7 -0
- package/lib/types/region-entity.cjs +17 -0
- package/lib/types/region-entity.cjs.map +7 -0
- package/lib/types/region-entity.js +1 -0
- package/lib/types/region-entity.js.map +7 -0
- package/lib/types/shape-entity.cjs +17 -0
- package/lib/types/shape-entity.cjs.map +7 -0
- package/lib/types/shape-entity.js +1 -0
- package/lib/types/shape-entity.js.map +7 -0
- package/lib/types/table-entity.cjs +17 -0
- package/lib/types/table-entity.cjs.map +7 -0
- package/lib/types/table-entity.js +1 -0
- package/lib/types/table-entity.js.map +7 -0
- package/lib/types/tables.cjs.map +1 -1
- package/lib/types/tolerance-entity.cjs +17 -0
- package/lib/types/tolerance-entity.cjs.map +7 -0
- package/lib/types/tolerance-entity.js +1 -0
- package/lib/types/tolerance-entity.js.map +7 -0
- package/lib/types/trace-entity.cjs +17 -0
- package/lib/types/trace-entity.cjs.map +7 -0
- package/lib/types/trace-entity.js +1 -0
- package/lib/types/trace-entity.js.map +7 -0
- package/lib/types/underlay-entity.cjs +17 -0
- package/lib/types/underlay-entity.cjs.map +7 -0
- package/lib/types/underlay-entity.js +1 -0
- package/lib/types/underlay-entity.js.map +7 -0
- package/lib/types/wipeout-entity.cjs +17 -0
- package/lib/types/wipeout-entity.cjs.map +7 -0
- package/lib/types/wipeout-entity.js +1 -0
- package/lib/types/wipeout-entity.js.map +7 -0
- package/lib/types/xline-entity.cjs +17 -0
- package/lib/types/xline-entity.cjs.map +7 -0
- package/lib/types/xline-entity.js +1 -0
- package/lib/types/xline-entity.js.map +7 -0
- package/lib/util/escapeXmlText.cjs +27 -0
- package/lib/util/escapeXmlText.cjs.map +7 -0
- package/lib/util/escapeXmlText.js +7 -0
- package/lib/util/escapeXmlText.js.map +7 -0
- package/package.json +9 -18
- package/playwright.config.cjs +20 -0
- package/src/Helper.ts +8 -3
- package/src/denormalise.ts +182 -116
- package/src/dimensionToSVG.ts +466 -54
- package/src/entityToPolyline.ts +124 -2
- package/src/handlers/entities.ts +129 -34
- package/src/handlers/entity/dgnUnderlay.ts +94 -0
- package/src/handlers/entity/dimension.ts +27 -1
- package/src/handlers/entity/dwfUnderlay.ts +94 -0
- package/src/handlers/entity/image.ts +118 -0
- package/src/handlers/entity/leader.ts +153 -0
- package/src/handlers/entity/mleader.ts +46 -0
- package/src/handlers/entity/mline.ts +74 -0
- package/src/handlers/entity/oleframe.ts +62 -0
- package/src/handlers/entity/pdfUnderlay.ts +94 -0
- package/src/handlers/entity/ray.ts +52 -0
- package/src/handlers/entity/region.ts +42 -0
- package/src/handlers/entity/shape.ts +73 -0
- package/src/handlers/entity/table.ts +49 -0
- package/src/handlers/entity/tolerance.ts +75 -0
- package/src/handlers/entity/trace.ts +72 -0
- package/src/handlers/entity/wipeout.ts +114 -0
- package/src/handlers/entity/xline.ts +52 -0
- package/src/handlers/objects.ts +379 -139
- package/src/handlers/tables.ts +134 -21
- package/src/index.ts +9 -18
- package/src/toJson.ts +8 -0
- package/src/toSVG.ts +143 -10
- package/src/types/dimension-entity.ts +11 -0
- package/src/types/entity.ts +30 -0
- package/src/types/helper.ts +2 -1
- package/src/types/image-entity.ts +35 -0
- package/src/types/index.ts +14 -0
- package/src/types/leader-entity.ts +40 -0
- package/src/types/mleader-entity.ts +8 -0
- package/src/types/mline-entity.ts +12 -0
- package/src/types/oleframe-entity.ts +40 -0
- package/src/types/options.ts +48 -0
- package/src/types/ray-entity.ts +12 -0
- package/src/types/region-entity.ts +11 -0
- package/src/types/shape-entity.ts +19 -0
- package/src/types/table-entity.ts +14 -0
- package/src/types/tables.ts +160 -0
- package/src/types/tolerance-entity.ts +20 -0
- package/src/types/trace-entity.ts +14 -0
- package/src/types/underlay-entity.ts +35 -0
- package/src/types/wipeout-entity.ts +20 -0
- package/src/types/xline-entity.ts +12 -0
- package/src/util/escapeXmlText.ts +10 -0
- package/tools/browser_test_server.cjs +87 -0
- package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
- package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
- package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
- package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
- package/tools/ezdxf_validate_fixtures.py +165 -0
- package/docs/DIMENSION_SUMMARY.md +0 -248
- package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
- package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
- package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.pt-BR.md +0 -169
package/lib/dimensionToSVG.cjs
CHANGED
|
@@ -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
|
|
78
|
-
const
|
|
79
|
-
|
|
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
|
|
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
|
-
|
|
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})">${
|
|
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
|
|
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
|
-
|
|
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})">${
|
|
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
|
|
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
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
|
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
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
|
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
|
-
|
|
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})">${
|
|
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
|
-
|
|
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})">${
|
|
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
|