@ifc-lite/drawing-2d 1.21.2 → 2.1.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 (73) hide show
  1. package/dist/color-raster.d.ts +95 -0
  2. package/dist/color-raster.d.ts.map +1 -0
  3. package/dist/color-raster.js +225 -0
  4. package/dist/color-raster.js.map +1 -0
  5. package/dist/drawing-generator.d.ts +17 -0
  6. package/dist/drawing-generator.d.ts.map +1 -1
  7. package/dist/drawing-generator.js +33 -7
  8. package/dist/drawing-generator.js.map +1 -1
  9. package/dist/edge-extractor.d.ts +17 -0
  10. package/dist/edge-extractor.d.ts.map +1 -1
  11. package/dist/edge-extractor.js +104 -1
  12. package/dist/edge-extractor.js.map +1 -1
  13. package/dist/half-space-clip.d.ts +77 -0
  14. package/dist/half-space-clip.d.ts.map +1 -0
  15. package/dist/half-space-clip.js +257 -0
  16. package/dist/half-space-clip.js.map +1 -0
  17. package/dist/hidden-line-raster.d.ts +50 -0
  18. package/dist/hidden-line-raster.d.ts.map +1 -0
  19. package/dist/hidden-line-raster.js +103 -0
  20. package/dist/hidden-line-raster.js.map +1 -0
  21. package/dist/hidden-line.d.ts +34 -21
  22. package/dist/hidden-line.d.ts.map +1 -1
  23. package/dist/hidden-line.js +107 -214
  24. package/dist/hidden-line.js.map +1 -1
  25. package/dist/index.d.ts +11 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +25 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/line-merger.d.ts.map +1 -1
  30. package/dist/line-merger.js +88 -44
  31. package/dist/line-merger.js.map +1 -1
  32. package/dist/pdf-scale.d.ts +17 -0
  33. package/dist/pdf-scale.d.ts.map +1 -1
  34. package/dist/pdf-scale.js +38 -0
  35. package/dist/pdf-scale.js.map +1 -1
  36. package/dist/polygon-builder.d.ts +31 -0
  37. package/dist/polygon-builder.d.ts.map +1 -1
  38. package/dist/polygon-builder.js +60 -3
  39. package/dist/polygon-builder.js.map +1 -1
  40. package/dist/profile-projector.js +17 -9
  41. package/dist/profile-projector.js.map +1 -1
  42. package/dist/projection-bands.d.ts +13 -6
  43. package/dist/projection-bands.d.ts.map +1 -1
  44. package/dist/projection-bands.js +15 -3
  45. package/dist/projection-bands.js.map +1 -1
  46. package/dist/raster-core.d.ts +71 -0
  47. package/dist/raster-core.d.ts.map +1 -0
  48. package/dist/raster-core.js +89 -0
  49. package/dist/raster-core.js.map +1 -0
  50. package/dist/section-cutter.d.ts +8 -0
  51. package/dist/section-cutter.d.ts.map +1 -1
  52. package/dist/section-cutter.js +59 -11
  53. package/dist/section-cutter.js.map +1 -1
  54. package/dist/sheet/index.d.ts +2 -0
  55. package/dist/sheet/index.d.ts.map +1 -1
  56. package/dist/sheet/index.js +1 -0
  57. package/dist/sheet/index.js.map +1 -1
  58. package/dist/sheet/scale-stamp.d.ts +130 -0
  59. package/dist/sheet/scale-stamp.d.ts.map +1 -0
  60. package/dist/sheet/scale-stamp.js +277 -0
  61. package/dist/sheet/scale-stamp.js.map +1 -0
  62. package/dist/types.d.ts +26 -1
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/view-plane.d.ts +99 -0
  66. package/dist/view-plane.d.ts.map +1 -0
  67. package/dist/view-plane.js +183 -0
  68. package/dist/view-plane.js.map +1 -0
  69. package/dist/world-line-seeds.d.ts +41 -0
  70. package/dist/world-line-seeds.d.ts.map +1 -0
  71. package/dist/world-line-seeds.js +43 -0
  72. package/dist/world-line-seeds.js.map +1 -0
  73. package/package.json +2 -2
@@ -94,8 +94,28 @@ export class SectionCutter {
94
94
  const d0 = signedDistanceToPlane(v0, this.planeNormal, this.planeDistance);
95
95
  const d1 = signedDistanceToPlane(v1, this.planeNormal, this.planeDistance);
96
96
  const d2 = signedDistanceToPlane(v2, this.planeNormal, this.planeDistance);
97
+ // Plane-side classification epsilon. `dot(v, n)` sums three
98
+ // float32-quantized components, so even a vertex whose TRUE distance
99
+ // is 0 carries rounding noise proportional to its own coordinate
100
+ // magnitude (~coord · 2⁻²²), not just the fixed EPSILON. Without this
101
+ // floor, a face lying exactly on a non-axis-aligned cut plane gets its
102
+ // near-zero d0/d1 misclassified as a genuine crossing, and the
103
+ // resulting lerp — dividing one noise term by another — produces a
104
+ // wild extrapolated point instead of being skipped as coplanar.
105
+ //
106
+ // Crucially, this must be measured on the LOCAL (pre-origin) vertex
107
+ // coordinates, not `v0`/`v1`/`v2` (world = origin + local). The
108
+ // quantization noise is a property of the `Float32Array` values as
109
+ // authored, not of where the element's per-mesh RTC origin happens to
110
+ // place it in the model. Using the world-lifted magnitude here scales
111
+ // the tolerance to the element's DISTANCE FROM THE MODEL ORIGIN
112
+ // instead of its own extent — a small element far from the model
113
+ // origin would get a tolerance orders of magnitude too loose, which
114
+ // misclassifies genuine close crossings as coplanar (#2622).
115
+ const localMaxCoord = this.localMaxCoord(positions, i0, i1, i2);
116
+ const planeEps = Math.max(EPSILON, localMaxCoord * 2 ** -22);
97
117
  // Intersect triangle with plane
98
- const intersection = this.intersectTrianglePlane(v0, v1, v2, d0, d1, d2);
118
+ const intersection = this.intersectTrianglePlane(v0, v1, v2, d0, d1, d2, planeEps);
99
119
  if (intersection) {
100
120
  intersectedCount++;
101
121
  // Project 3D points to 2D. For face-picked custom planes use the
@@ -124,6 +144,11 @@ export class SectionCutter {
124
144
  // Per-sub-mesh colour so material-layer walls/slabs split per layer
125
145
  // in the polygon builder. One MeshData == one layer == one colour.
126
146
  color,
147
+ // LOCAL (pre-origin) magnitude — lets the polygon builder size its
148
+ // scale-aware weld tolerance off the element's own extent instead
149
+ // of `p0_2d`/`p1_2d`'s world-frame magnitude. See the field's
150
+ // doc comment in types.ts and `localMaxCoord` above.
151
+ localMaxCoord,
127
152
  });
128
153
  }
129
154
  }
@@ -142,14 +167,37 @@ export class SectionCutter {
142
167
  ? vec3(positions[base] + origin[0], positions[base + 1] + origin[1], positions[base + 2] + origin[2])
143
168
  : vec3(positions[base], positions[base + 1], positions[base + 2]);
144
169
  }
170
+ /**
171
+ * Max |coordinate| of a triangle's LOCAL (pre-origin) vertex positions —
172
+ * the `Float32Array` values exactly as stored, before the per-mesh RTC
173
+ * `origin` translation. This is the quantity float32 rounding noise
174
+ * actually scales with; deliberately does NOT take `origin` as a
175
+ * parameter so a future edit can't accidentally fold it back in.
176
+ */
177
+ localMaxCoord(positions, i0, i1, i2) {
178
+ let m = 0;
179
+ for (const i of [i0, i1, i2]) {
180
+ const base = i * 3;
181
+ const ax = Math.abs(positions[base]);
182
+ const ay = Math.abs(positions[base + 1]);
183
+ const az = Math.abs(positions[base + 2]);
184
+ if (ax > m)
185
+ m = ax;
186
+ if (ay > m)
187
+ m = ay;
188
+ if (az > m)
189
+ m = az;
190
+ }
191
+ return m;
192
+ }
145
193
  /**
146
194
  * Intersect a triangle with the section plane
147
195
  * Returns the two intersection points, or null if no intersection
148
196
  */
149
- intersectTrianglePlane(v0, v1, v2, d0, d1, d2) {
197
+ intersectTrianglePlane(v0, v1, v2, d0, d1, d2, eps = EPSILON) {
150
198
  // Count vertices on each side of the plane
151
- const pos = (d0 > EPSILON ? 1 : 0) + (d1 > EPSILON ? 1 : 0) + (d2 > EPSILON ? 1 : 0);
152
- const neg = (d0 < -EPSILON ? 1 : 0) + (d1 < -EPSILON ? 1 : 0) + (d2 < -EPSILON ? 1 : 0);
199
+ const pos = (d0 > eps ? 1 : 0) + (d1 > eps ? 1 : 0) + (d2 > eps ? 1 : 0);
200
+ const neg = (d0 < -eps ? 1 : 0) + (d1 < -eps ? 1 : 0) + (d2 < -eps ? 1 : 0);
153
201
  // No intersection if all vertices on same side
154
202
  if (pos === 3 || neg === 3)
155
203
  return null;
@@ -159,16 +207,16 @@ export class SectionCutter {
159
207
  // Find intersection points on edges
160
208
  const points = [];
161
209
  // Check edge v0-v1
162
- const p01 = this.edgePlaneIntersection(v0, v1, d0, d1);
210
+ const p01 = this.edgePlaneIntersection(v0, v1, d0, d1, eps);
163
211
  if (p01)
164
212
  points.push(p01);
165
213
  // Check edge v1-v2
166
- const p12 = this.edgePlaneIntersection(v1, v2, d1, d2);
214
+ const p12 = this.edgePlaneIntersection(v1, v2, d1, d2, eps);
167
215
  if (p12)
168
216
  points.push(p12);
169
217
  // Check edge v2-v0
170
218
  if (points.length < 2) {
171
- const p20 = this.edgePlaneIntersection(v2, v0, d2, d0);
219
+ const p20 = this.edgePlaneIntersection(v2, v0, d2, d0, eps);
172
220
  if (p20)
173
221
  points.push(p20);
174
222
  }
@@ -181,15 +229,15 @@ export class SectionCutter {
181
229
  /**
182
230
  * Find intersection point of an edge with the plane
183
231
  */
184
- edgePlaneIntersection(v0, v1, d0, d1) {
232
+ edgePlaneIntersection(v0, v1, d0, d1, eps = EPSILON) {
185
233
  // Both vertices on the plane - edge lies on plane
186
- if (Math.abs(d0) < EPSILON && Math.abs(d1) < EPSILON) {
234
+ if (Math.abs(d0) < eps && Math.abs(d1) < eps) {
187
235
  return null; // Handled separately as face-on-plane
188
236
  }
189
237
  // One vertex on plane - return that vertex
190
- if (Math.abs(d0) < EPSILON)
238
+ if (Math.abs(d0) < eps)
191
239
  return v0;
192
- if (Math.abs(d1) < EPSILON)
240
+ if (Math.abs(d1) < eps)
193
241
  return v1;
194
242
  // Both vertices on same side - no intersection
195
243
  if ((d0 > 0) === (d1 > 0))
@@ -1 +1 @@
1
- {"version":3,"file":"section-cutter.js","sourceRoot":"","sources":["../src/section-cutter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"section-cutter.js","sourceRoot":"","sources":["../src/section-cutter.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export type { TitleBlockPosition, TitleBlockLayout, TitleBlockField, TitleBlockL
15
15
  export { DEFAULT_TITLE_BLOCK_FIELDS, TITLE_BLOCK_PRESETS, createTitleBlock, getDefaultTitleBlock, updateTitleBlockField, } from './title-block-types.js';
16
16
  export type { ScaleBarStyle, ScaleBarPosition, ScaleBarUnits, ScaleBarConfig, NorthArrowStyle, NorthArrowConfig, } from './scale-bar-types.js';
17
17
  export { DEFAULT_SCALE_BAR, DEFAULT_NORTH_ARROW, calculateOptimalScaleBarLength, calculateOptimalDivisions, } from './scale-bar-types.js';
18
+ export type { ScaleStampRect, ScaleStampText, ScaleStampBar, ScaleStamp, StampedSheetLayout, } from './scale-stamp.js';
19
+ export { addScaleStamp } from './scale-stamp.js';
18
20
  export type { ViewportBounds, DrawingSheet, SheetCreationOptions, } from './sheet-types.js';
19
21
  export { calculateViewportBounds, calculateDrawingTransform, } from './sheet-types.js';
20
22
  export type { FrameRenderResult, } from './frame-renderer.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sheet/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAGH,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sheet/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAGH,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAK9B,YAAY,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,UAAU,EACV,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -5,6 +5,7 @@ export { PAPER_SIZE_REGISTRY, getPaperSizesByCategory, getDefaultPaperSize, } fr
5
5
  export { FRAME_PRESETS, createFrame, getDefaultFrame, } from './frame-types.js';
6
6
  export { DEFAULT_TITLE_BLOCK_FIELDS, TITLE_BLOCK_PRESETS, createTitleBlock, getDefaultTitleBlock, updateTitleBlockField, } from './title-block-types.js';
7
7
  export { DEFAULT_SCALE_BAR, DEFAULT_NORTH_ARROW, calculateOptimalScaleBarLength, calculateOptimalDivisions, } from './scale-bar-types.js';
8
+ export { addScaleStamp } from './scale-stamp.js';
8
9
  export { calculateViewportBounds, calculateDrawingTransform, } from './sheet-types.js';
9
10
  export { renderFrame } from './frame-renderer.js';
10
11
  export { renderTitleBlock } from './title-block-renderer.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sheet/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkB/D,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAWhC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sheet/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkB/D,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAWhC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAY9B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * The scale record a to-scale sheet carries on the paper itself: a drawn scale
3
+ * bar plus the "1:N" text, laid out in millimetres in a band below the drawing
4
+ * (issue #2042).
5
+ *
6
+ * WHY A SHEET WITHOUT THIS IS DANGEROUS. A to-scale PDF whose only record of
7
+ * its scale is its filename says nothing once it is printed. The whole promise
8
+ * of the export is "measurements taken off the print are correct", and a sheet
9
+ * that carries no scale invites someone to measure it at an assumed one. The
10
+ * printed ratio fixes that for the original; the BAR fixes it for every copy
11
+ * after, because a photocopier that shrinks a sheet to 94% shrinks the bar with
12
+ * it while the text "1:100" keeps claiming a scale the paper no longer has.
13
+ * Those are two different failures, so the sheet carries both.
14
+ *
15
+ * WHAT THIS FILE MUST NEVER DO — the reason it exists as layout maths and not
16
+ * as a sheet template. `sheet-types.ts`'s `calculateDrawingTransform` fits a
17
+ * drawing into a fixed viewport (`fitScale = min(scaleX, scaleY, 1)`), which
18
+ * silently shrinks it. Adding furniture through anything that re-fits would
19
+ * turn an exact sheet into a plausible-looking wrong one, which is the single
20
+ * defect this whole feature exists to prevent. So the band is added by GROWING
21
+ * the page down (and right, only if the stamp is wider than the drawing) and
22
+ * the drawing's `PdfScaleTransform` is passed through untouched — same
23
+ * `worldToMm`, same offsets, same object. Adding a scale bar cannot move a
24
+ * single millimetre of the drawing, by construction rather than by care.
25
+ *
26
+ * The emission is deliberately not here: these are plain rectangles and text
27
+ * runs in page millimetres, so the viewer can write them with jsPDF while the
28
+ * sibling renderers in this folder keep emitting SVG strings.
29
+ */
30
+ import { type PdfPage, type PdfScaleLayout, type PdfScaleTransform } from '../pdf-scale.js';
31
+ /** One rectangle of the bar, in page millimetres from the page's top-left. */
32
+ export interface ScaleStampRect {
33
+ xMm: number;
34
+ yMm: number;
35
+ widthMm: number;
36
+ heightMm: number;
37
+ /** Painted solid when true, outline only when false. Always stroked. */
38
+ filled: boolean;
39
+ }
40
+ /** One text run of the stamp, in page millimetres from the page's top-left. */
41
+ export interface ScaleStampText {
42
+ text: string;
43
+ xMm: number;
44
+ /** The text BASELINE, which is where PDF text origins sit. */
45
+ yMm: number;
46
+ align: 'left' | 'center';
47
+ /** Nominal text height (em size) in mm, for the writer to convert to points. */
48
+ heightMm: number;
49
+ /**
50
+ * The model distance this label marks, in metres, or `null` for free text
51
+ * such as the ratio. A consumer can multiply it by the transform's
52
+ * `worldToMm` and check that the label really sits there — which is what
53
+ * makes "the bar is drawn to scale" a measurable claim rather than a hope.
54
+ */
55
+ metres: number | null;
56
+ }
57
+ /** The bar itself, kept as numbers so callers can measure it. */
58
+ export interface ScaleStampBar {
59
+ xMm: number;
60
+ yMm: number;
61
+ widthMm: number;
62
+ heightMm: number;
63
+ divisions: number;
64
+ /** Model length of one division, in metres. */
65
+ divisionMetres: number;
66
+ /** Paper length of one division: exactly `divisionMetres * worldToMm`. */
67
+ divisionWidthMm: number;
68
+ }
69
+ export interface ScaleStamp {
70
+ bar: ScaleStampBar;
71
+ rects: readonly ScaleStampRect[];
72
+ texts: readonly ScaleStampText[];
73
+ /** Extent of the band from its origin, mm. */
74
+ widthMm: number;
75
+ heightMm: number;
76
+ /** The ratio as printed, e.g. "1:100". Never a rounded stand-in. */
77
+ scaleLabel: string;
78
+ }
79
+ export interface ScaleStampOptions {
80
+ /** Millimetres of paper per metre of world: `PdfScaleTransform.worldToMm`. */
81
+ worldToMm: number;
82
+ /** Paper the band may use before the page has to grow to hold it, mm. */
83
+ availableWidthMm: number;
84
+ /** Top-left corner of the band, in page millimetres. */
85
+ originXMm: number;
86
+ originYMm: number;
87
+ }
88
+ /** A drawing layout plus the scale band underneath it. */
89
+ export interface StampedSheetLayout {
90
+ page: PdfPage;
91
+ /**
92
+ * The drawing's transform, unchanged. The band is added below and to the
93
+ * right of everything the drawing occupies, so no offset is needed and none
94
+ * is applied: this is the same object `computePdfScaleLayout` returned.
95
+ */
96
+ transform: PdfScaleTransform;
97
+ stamp: ScaleStamp;
98
+ }
99
+ /** Height of the whole band. Independent of scale, bar length and page size. */
100
+ export declare const SCALE_STAMP_HEIGHT_MM: number;
101
+ /**
102
+ * Lay out a scale bar and its ratio text with their top-left corner at
103
+ * (`originXMm`, `originYMm`).
104
+ *
105
+ * Throws on a non-finite or non-positive `worldToMm` and on non-finite
106
+ * placement: a stamp is the sheet's statement about its own scale, so emitting
107
+ * one from numbers that do not describe a scale would be worse than emitting
108
+ * none at all.
109
+ */
110
+ export declare function buildScaleStamp(options: ScaleStampOptions): ScaleStamp;
111
+ /**
112
+ * Grow `base` by a scale band under the drawing.
113
+ *
114
+ * The page gains exactly `SCALE_STAMP_HEIGHT_MM` of height, and width only if
115
+ * the band is wider than the drawing. The transform is returned as it came in
116
+ * — see {@link StampedSheetLayout.transform}.
117
+ *
118
+ * PRECONDITION on `marginMm`: the bar's end tick labels are centred on their
119
+ * ticks, so roughly half a label hangs past each end of the bar. The margin has
120
+ * to absorb that. Zero (or a very small) margin is accepted by the guard below
121
+ * and lays the band out correctly, but the outermost label can then sit partly
122
+ * off the page. The export path passes `VIEW_PDF_MARGIN_MM` (10 mm), which is
123
+ * comfortably more than any label produced by the 1-2-5 division sequence.
124
+ * This is a cosmetic bound only: it does not move the bar, so a division still
125
+ * measures exactly its labelled world length whatever the margin.
126
+ */
127
+ export declare function addScaleStamp(base: PdfScaleLayout, options: {
128
+ marginMm: number;
129
+ }): StampedSheetLayout;
130
+ //# sourceMappingURL=scale-stamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale-stamp.d.ts","sourceRoot":"","sources":["../../src/sheet/scale-stamp.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAMzB,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,aAAa,CAAC;IACnB,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC;CACnB;AAcD,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,QAOnB,CAAC;AA8BhB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAyFtE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5B,kBAAkB,CAgCpB"}
@@ -0,0 +1,277 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * The scale record a to-scale sheet carries on the paper itself: a drawn scale
6
+ * bar plus the "1:N" text, laid out in millimetres in a band below the drawing
7
+ * (issue #2042).
8
+ *
9
+ * WHY A SHEET WITHOUT THIS IS DANGEROUS. A to-scale PDF whose only record of
10
+ * its scale is its filename says nothing once it is printed. The whole promise
11
+ * of the export is "measurements taken off the print are correct", and a sheet
12
+ * that carries no scale invites someone to measure it at an assumed one. The
13
+ * printed ratio fixes that for the original; the BAR fixes it for every copy
14
+ * after, because a photocopier that shrinks a sheet to 94% shrinks the bar with
15
+ * it while the text "1:100" keeps claiming a scale the paper no longer has.
16
+ * Those are two different failures, so the sheet carries both.
17
+ *
18
+ * WHAT THIS FILE MUST NEVER DO — the reason it exists as layout maths and not
19
+ * as a sheet template. `sheet-types.ts`'s `calculateDrawingTransform` fits a
20
+ * drawing into a fixed viewport (`fitScale = min(scaleX, scaleY, 1)`), which
21
+ * silently shrinks it. Adding furniture through anything that re-fits would
22
+ * turn an exact sheet into a plausible-looking wrong one, which is the single
23
+ * defect this whole feature exists to prevent. So the band is added by GROWING
24
+ * the page down (and right, only if the stamp is wider than the drawing) and
25
+ * the drawing's `PdfScaleTransform` is passed through untouched — same
26
+ * `worldToMm`, same offsets, same object. Adding a scale bar cannot move a
27
+ * single millimetre of the drawing, by construction rather than by care.
28
+ *
29
+ * The emission is deliberately not here: these are plain rectangles and text
30
+ * runs in page millimetres, so the viewer can write them with jsPDF while the
31
+ * sibling renderers in this folder keep emitting SVG strings.
32
+ */
33
+ import { formatScaleFactorLabel, formatSheetScaleLabel, } from '../pdf-scale.js';
34
+ // ═══════════════════════════════════════════════════════════════════════════
35
+ // LAYOUT CONSTANTS (millimetres on paper, at any scale)
36
+ // ═══════════════════════════════════════════════════════════════════════════
37
+ const BAR_TOP_GAP_MM = 4;
38
+ const BAR_HEIGHT_MM = 2.5;
39
+ const TICK_LABEL_GAP_MM = 1;
40
+ const TICK_LABEL_HEIGHT_MM = 2.5;
41
+ const RATIO_TEXT_GAP_MM = 1.5;
42
+ const RATIO_TEXT_HEIGHT_MM = 3.5;
43
+ const BOTTOM_PAD_MM = 2;
44
+ /** Height of the whole band. Independent of scale, bar length and page size. */
45
+ export const SCALE_STAMP_HEIGHT_MM = BAR_TOP_GAP_MM +
46
+ BAR_HEIGHT_MM +
47
+ TICK_LABEL_GAP_MM +
48
+ TICK_LABEL_HEIGHT_MM +
49
+ RATIO_TEXT_GAP_MM +
50
+ RATIO_TEXT_HEIGHT_MM +
51
+ BOTTOM_PAD_MM;
52
+ /** Shortest bar worth printing: below this the divisions stop being readable. */
53
+ const MIN_BAR_WIDTH_MM = 20;
54
+ /** What a bar is aimed at when there is room, mm. */
55
+ const TARGET_BAR_WIDTH_MM = 60;
56
+ /**
57
+ * Division lengths a surveyor would recognise, in metres. The 1-2-5 sequence
58
+ * is what keeps the labels round ("0 1 2 3 4 m") instead of "0 1.27 2.54"; a
59
+ * bar whose ticks fall on arbitrary numbers is measurable but unreadable.
60
+ */
61
+ const DIVISION_STEPS_M = [
62
+ 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000,
63
+ ];
64
+ /** Division counts, most preferred first. */
65
+ const DIVISION_COUNTS = [4, 2];
66
+ /**
67
+ * Width of one character as a fraction of the text height. Helvetica averages
68
+ * about 0.5 em, so this OVER-estimates on purpose: the only thing it decides
69
+ * is whether the page has to grow to hold the band, and over-estimating leaves
70
+ * blank paper while under-estimating would run a label off the sheet.
71
+ */
72
+ const TEXT_WIDTH_PER_HEIGHT = 0.62;
73
+ // ═══════════════════════════════════════════════════════════════════════════
74
+ // BUILD
75
+ // ═══════════════════════════════════════════════════════════════════════════
76
+ /**
77
+ * Lay out a scale bar and its ratio text with their top-left corner at
78
+ * (`originXMm`, `originYMm`).
79
+ *
80
+ * Throws on a non-finite or non-positive `worldToMm` and on non-finite
81
+ * placement: a stamp is the sheet's statement about its own scale, so emitting
82
+ * one from numbers that do not describe a scale would be worse than emitting
83
+ * none at all.
84
+ */
85
+ export function buildScaleStamp(options) {
86
+ const { worldToMm, availableWidthMm, originXMm, originYMm } = options;
87
+ if (!Number.isFinite(worldToMm) || worldToMm <= 0) {
88
+ throw new Error(`Invalid scale for a scale bar: ${worldToMm} mm per metre. Expected a positive finite number.`);
89
+ }
90
+ if (!Number.isFinite(availableWidthMm) ||
91
+ !Number.isFinite(originXMm) ||
92
+ !Number.isFinite(originYMm)) {
93
+ throw new Error('Invalid scale bar placement: origin and available width must be finite.');
94
+ }
95
+ const { divisions, divisionMetres } = chooseBarDivisions(worldToMm, availableWidthMm);
96
+ const divisionWidthMm = divisionMetres * worldToMm;
97
+ const barWidthMm = divisions * divisionWidthMm;
98
+ const barTopMm = originYMm + BAR_TOP_GAP_MM;
99
+ // Alternating filled and hollow divisions: the classic bar, and the one that
100
+ // still reads at a glance after a photocopy has washed out the tick labels.
101
+ const rects = [];
102
+ for (let i = 0; i < divisions; i++) {
103
+ rects.push({
104
+ xMm: originXMm + i * divisionWidthMm,
105
+ yMm: barTopMm,
106
+ widthMm: divisionWidthMm,
107
+ heightMm: BAR_HEIGHT_MM,
108
+ filled: i % 2 === 0,
109
+ });
110
+ }
111
+ const tickBaselineMm = barTopMm + BAR_HEIGHT_MM + TICK_LABEL_GAP_MM + TICK_LABEL_HEIGHT_MM;
112
+ const texts = [];
113
+ for (let i = 0; i <= divisions; i++) {
114
+ const metres = i * divisionMetres;
115
+ // Same rounding rule as the ratio below (2 dp, trailing zeros trimmed):
116
+ // one rule for every number this package prints on a sheet, rather than a
117
+ // second one here that could disagree about, say, 0.30000000000000004.
118
+ const value = formatScaleFactorLabel(metres);
119
+ texts.push({
120
+ // The unit rides on the last label only: repeating "m" under every tick
121
+ // is clutter, and omitting it everywhere leaves the bar unitless.
122
+ text: i === divisions ? `${value} m` : value,
123
+ xMm: originXMm + i * divisionWidthMm,
124
+ yMm: tickBaselineMm,
125
+ align: 'center',
126
+ heightMm: TICK_LABEL_HEIGHT_MM,
127
+ metres,
128
+ });
129
+ }
130
+ // The ratio goes through the shared formatter, so a 1:99.5 sheet prints
131
+ // "1:99.5" and never the materially different "1:100" (#2119). `worldToMm`
132
+ // IS the scale the drawing was laid out at, so deriving the label from it
133
+ // rather than from a separately passed factor removes the whole class of
134
+ // sheet-says-one-thing-drawn-at-another defects.
135
+ //
136
+ // And when 2 decimals cannot hold the factor — "as displayed" delivers
137
+ // 1:87.3456 — the label says "about", because a bare "1:87.35" would be a
138
+ // number an engineer trusts and should not. The bar below it stays exact.
139
+ const scaleLabel = formatSheetScaleLabel(1000 / worldToMm);
140
+ const ratioBaselineMm = tickBaselineMm + RATIO_TEXT_GAP_MM + RATIO_TEXT_HEIGHT_MM;
141
+ texts.push({
142
+ text: `Scale ${scaleLabel}`,
143
+ xMm: originXMm,
144
+ yMm: ratioBaselineMm,
145
+ align: 'left',
146
+ heightMm: RATIO_TEXT_HEIGHT_MM,
147
+ metres: null,
148
+ });
149
+ return {
150
+ bar: {
151
+ xMm: originXMm,
152
+ yMm: barTopMm,
153
+ widthMm: barWidthMm,
154
+ heightMm: BAR_HEIGHT_MM,
155
+ divisions,
156
+ divisionMetres,
157
+ divisionWidthMm,
158
+ },
159
+ rects,
160
+ texts,
161
+ widthMm: stampWidthMm(originXMm, barWidthMm, texts),
162
+ heightMm: SCALE_STAMP_HEIGHT_MM,
163
+ scaleLabel,
164
+ };
165
+ }
166
+ /**
167
+ * Grow `base` by a scale band under the drawing.
168
+ *
169
+ * The page gains exactly `SCALE_STAMP_HEIGHT_MM` of height, and width only if
170
+ * the band is wider than the drawing. The transform is returned as it came in
171
+ * — see {@link StampedSheetLayout.transform}.
172
+ *
173
+ * PRECONDITION on `marginMm`: the bar's end tick labels are centred on their
174
+ * ticks, so roughly half a label hangs past each end of the bar. The margin has
175
+ * to absorb that. Zero (or a very small) margin is accepted by the guard below
176
+ * and lays the band out correctly, but the outermost label can then sit partly
177
+ * off the page. The export path passes `VIEW_PDF_MARGIN_MM` (10 mm), which is
178
+ * comfortably more than any label produced by the 1-2-5 division sequence.
179
+ * This is a cosmetic bound only: it does not move the bar, so a division still
180
+ * measures exactly its labelled world length whatever the margin.
181
+ */
182
+ export function addScaleStamp(base, options) {
183
+ const { marginMm } = options;
184
+ if (!Number.isFinite(marginMm) || marginMm < 0) {
185
+ throw new Error(`Invalid sheet margin: ${marginMm}mm. Expected a non-negative finite number.`);
186
+ }
187
+ if (!Number.isFinite(base.page.widthMm) || !Number.isFinite(base.page.heightMm) ||
188
+ base.page.widthMm <= 0 || base.page.heightMm <= 0) {
189
+ throw new Error('Cannot add a scale bar to a page that has no usable size.');
190
+ }
191
+ const stamp = buildScaleStamp({
192
+ worldToMm: base.transform.worldToMm,
193
+ availableWidthMm: Math.max(0, base.page.widthMm - marginMm * 2),
194
+ originXMm: marginMm,
195
+ // The drawing's bottom edge: `computePdfScaleLayout` puts it exactly one
196
+ // margin above the page bottom, so the band starts where the ink stops.
197
+ originYMm: base.page.heightMm - marginMm,
198
+ });
199
+ const page = {
200
+ widthMm: Math.max(base.page.widthMm, marginMm * 2 + stamp.widthMm),
201
+ heightMm: base.page.heightMm + stamp.heightMm,
202
+ };
203
+ if (!Number.isFinite(page.widthMm) || !Number.isFinite(page.heightMm)) {
204
+ throw new Error(`Adding a scale bar produced a non-finite page (${page.widthMm}x${page.heightMm}mm).`);
205
+ }
206
+ return { page, transform: base.transform, stamp };
207
+ }
208
+ // ═══════════════════════════════════════════════════════════════════════════
209
+ // INTERNALS
210
+ // ═══════════════════════════════════════════════════════════════════════════
211
+ /**
212
+ * Pick the division count and length whose bar comes closest to
213
+ * `TARGET_BAR_WIDTH_MM` without exceeding the space available.
214
+ *
215
+ * When nothing readable fits — a drawing narrower than the shortest useful bar
216
+ * — the shortest readable bar wins anyway and the caller's page grows to hold
217
+ * it. A bar squeezed to 3 mm would be present, in scale, and useless, which is
218
+ * the one outcome worse than a slightly wider sheet.
219
+ */
220
+ function chooseBarDivisions(worldToMm, availableWidthMm) {
221
+ let fitting = null;
222
+ let fittingScore = Infinity;
223
+ let smallest = null;
224
+ let smallestWidth = Infinity;
225
+ let largest = null;
226
+ let largestWidth = -Infinity;
227
+ for (const divisions of DIVISION_COUNTS) {
228
+ for (const divisionMetres of DIVISION_STEPS_M) {
229
+ const widthMm = divisions * divisionMetres * worldToMm;
230
+ if (!Number.isFinite(widthMm) || widthMm <= 0)
231
+ continue;
232
+ const candidate = { divisions, divisionMetres };
233
+ if (widthMm > largestWidth) {
234
+ largest = candidate;
235
+ largestWidth = widthMm;
236
+ }
237
+ if (widthMm >= MIN_BAR_WIDTH_MM && widthMm < smallestWidth) {
238
+ smallest = candidate;
239
+ smallestWidth = widthMm;
240
+ }
241
+ if (widthMm >= MIN_BAR_WIDTH_MM && widthMm <= availableWidthMm) {
242
+ const score = Math.abs(widthMm - TARGET_BAR_WIDTH_MM);
243
+ if (score < fittingScore) {
244
+ fitting = candidate;
245
+ fittingScore = score;
246
+ }
247
+ }
248
+ }
249
+ }
250
+ const chosen = fitting ?? smallest ?? largest;
251
+ if (!chosen) {
252
+ throw new Error(`No scale bar length is expressible at ${worldToMm} mm per metre. Choose a less extreme scale.`);
253
+ }
254
+ return chosen;
255
+ }
256
+ /**
257
+ * How far right of `originXMm` the band reaches — the number that decides
258
+ * whether the page has to grow.
259
+ *
260
+ * Tick labels are deliberately NOT counted. Each is centred on its tick, so the
261
+ * last one overhangs the bar's end by half its width: about 2 mm of a 10 mm
262
+ * margin, on blank paper, and counting it would widen every sheet by that much
263
+ * for nothing. Only the bar and the left-aligned runs can actually reach past
264
+ * the drawing.
265
+ */
266
+ function stampWidthMm(originXMm, barWidthMm, texts) {
267
+ let right = originXMm + barWidthMm;
268
+ for (const text of texts) {
269
+ if (text.align !== 'left')
270
+ continue;
271
+ const textRight = text.xMm + text.text.length * text.heightMm * TEXT_WIDTH_PER_HEIGHT;
272
+ if (textRight > right)
273
+ right = textRight;
274
+ }
275
+ return right - originXMm;
276
+ }
277
+ //# sourceMappingURL=scale-stamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale-stamp.js","sourceRoot":"","sources":["../../src/sheet/scale-stamp.ts"],"names":[],"mappings":"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"}