@mlightcad/cad-pdf-plugin 1.8.0-preview.2 → 1.8.0-preview.4

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 (189) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +280 -186
  3. package/dist/cad-pdf-plugin-register.js +29 -11
  4. package/dist/cad-pdf-plugin-register.umd.cjs +1 -1
  5. package/dist/cad-pdf-plugin.js +17568 -8428
  6. package/dist/cad-pdf-plugin.umd.cjs +847 -13
  7. package/lib/AcApConvertToPdfCmd.d.ts.map +1 -1
  8. package/lib/AcApConvertToPdfCmd.js +14 -3
  9. package/lib/AcApConvertToPdfCmd.js.map +1 -1
  10. package/lib/AcApImportPdfCmd.d.ts +5 -3
  11. package/lib/AcApImportPdfCmd.d.ts.map +1 -1
  12. package/lib/AcApImportPdfCmd.js +5 -3
  13. package/lib/AcApImportPdfCmd.js.map +1 -1
  14. package/lib/AcApImportPdfPromptCmd.d.ts +16 -0
  15. package/lib/AcApImportPdfPromptCmd.d.ts.map +1 -0
  16. package/lib/AcApImportPdfPromptCmd.js +89 -0
  17. package/lib/AcApImportPdfPromptCmd.js.map +1 -0
  18. package/lib/AcApPdfBlockCmd.d.ts +15 -0
  19. package/lib/AcApPdfBlockCmd.d.ts.map +1 -0
  20. package/lib/AcApPdfBlockCmd.js +75 -0
  21. package/lib/AcApPdfBlockCmd.js.map +1 -0
  22. package/lib/AcApPdfDimCmd.d.ts +20 -0
  23. package/lib/AcApPdfDimCmd.d.ts.map +1 -0
  24. package/lib/AcApPdfDimCmd.js +413 -0
  25. package/lib/AcApPdfDimCmd.js.map +1 -0
  26. package/lib/AcApPdfDimSession.d.ts +82 -0
  27. package/lib/AcApPdfDimSession.d.ts.map +1 -0
  28. package/lib/AcApPdfDimSession.js +252 -0
  29. package/lib/AcApPdfDimSession.js.map +1 -0
  30. package/lib/AcApPdfFontResolver.d.ts.map +1 -1
  31. package/lib/AcApPdfFontResolver.js +2 -5
  32. package/lib/AcApPdfFontResolver.js.map +1 -1
  33. package/lib/AcApPdfHatchCmd.d.ts +33 -0
  34. package/lib/AcApPdfHatchCmd.d.ts.map +1 -0
  35. package/lib/AcApPdfHatchCmd.js +411 -0
  36. package/lib/AcApPdfHatchCmd.js.map +1 -0
  37. package/lib/AcApPdfHatchSession.d.ts +122 -0
  38. package/lib/AcApPdfHatchSession.d.ts.map +1 -0
  39. package/lib/AcApPdfHatchSession.js +357 -0
  40. package/lib/AcApPdfHatchSession.js.map +1 -0
  41. package/lib/AcApPdfImportConvertor.d.ts +47 -5
  42. package/lib/AcApPdfImportConvertor.d.ts.map +1 -1
  43. package/lib/AcApPdfImportConvertor.js +999 -108
  44. package/lib/AcApPdfImportConvertor.js.map +1 -1
  45. package/lib/AcApPdfImportOptions.d.ts +116 -0
  46. package/lib/AcApPdfImportOptions.d.ts.map +1 -0
  47. package/lib/AcApPdfImportOptions.js +31 -0
  48. package/lib/AcApPdfImportOptions.js.map +1 -0
  49. package/lib/AcApPdfImportResources.d.ts +41 -0
  50. package/lib/AcApPdfImportResources.d.ts.map +1 -0
  51. package/lib/AcApPdfImportResources.js +52 -0
  52. package/lib/AcApPdfImportResources.js.map +1 -0
  53. package/lib/AcApPdfPlugin.d.ts +3 -3
  54. package/lib/AcApPdfPlugin.d.ts.map +1 -1
  55. package/lib/AcApPdfPlugin.js +23 -5
  56. package/lib/AcApPdfPlugin.js.map +1 -1
  57. package/lib/AcApPdfScaleCmd.d.ts +22 -0
  58. package/lib/AcApPdfScaleCmd.d.ts.map +1 -0
  59. package/lib/AcApPdfScaleCmd.js +185 -0
  60. package/lib/AcApPdfScaleCmd.js.map +1 -0
  61. package/lib/AcApPdfTextCmd.d.ts +73 -0
  62. package/lib/AcApPdfTextCmd.d.ts.map +1 -0
  63. package/lib/AcApPdfTextCmd.js +777 -0
  64. package/lib/AcApPdfTextCmd.js.map +1 -0
  65. package/lib/AcApPdfTextSession.d.ts +232 -0
  66. package/lib/AcApPdfTextSession.d.ts.map +1 -0
  67. package/lib/AcApPdfTextSession.js +826 -0
  68. package/lib/AcApPdfTextSession.js.map +1 -0
  69. package/lib/acapPdfI18n.d.ts +11 -0
  70. package/lib/acapPdfI18n.d.ts.map +1 -0
  71. package/lib/acapPdfI18n.js +57 -0
  72. package/lib/acapPdfI18n.js.map +1 -0
  73. package/lib/acapPdfPrompts.d.ts +12 -0
  74. package/lib/acapPdfPrompts.d.ts.map +1 -0
  75. package/lib/acapPdfPrompts.js +100 -0
  76. package/lib/acapPdfPrompts.js.map +1 -0
  77. package/lib/index.d.ts +28 -0
  78. package/lib/index.d.ts.map +1 -1
  79. package/lib/index.js +28 -0
  80. package/lib/index.js.map +1 -1
  81. package/lib/pdfDeprecatedMatching.d.ts +27 -0
  82. package/lib/pdfDeprecatedMatching.d.ts.map +1 -0
  83. package/lib/pdfDeprecatedMatching.js +20 -0
  84. package/lib/pdfDeprecatedMatching.js.map +1 -0
  85. package/lib/pdfDimStrokeTexts.d.ts +55 -0
  86. package/lib/pdfDimStrokeTexts.d.ts.map +1 -0
  87. package/lib/pdfDimStrokeTexts.js +274 -0
  88. package/lib/pdfDimStrokeTexts.js.map +1 -0
  89. package/lib/pdfDimensionConvert.d.ts +80 -0
  90. package/lib/pdfDimensionConvert.d.ts.map +1 -0
  91. package/lib/pdfDimensionConvert.js +566 -0
  92. package/lib/pdfDimensionConvert.js.map +1 -0
  93. package/lib/pdfEntityStrokes.d.ts +13 -0
  94. package/lib/pdfEntityStrokes.d.ts.map +1 -0
  95. package/lib/pdfEntityStrokes.js +86 -0
  96. package/lib/pdfEntityStrokes.js.map +1 -0
  97. package/lib/pdfHatchRecover.d.ts +57 -0
  98. package/lib/pdfHatchRecover.d.ts.map +1 -0
  99. package/lib/pdfHatchRecover.js +315 -0
  100. package/lib/pdfHatchRecover.js.map +1 -0
  101. package/lib/pdfImportAppend.d.ts +24 -0
  102. package/lib/pdfImportAppend.d.ts.map +1 -0
  103. package/lib/pdfImportAppend.js +35 -0
  104. package/lib/pdfImportAppend.js.map +1 -0
  105. package/lib/pdfImportEntities.d.ts +63 -0
  106. package/lib/pdfImportEntities.d.ts.map +1 -0
  107. package/lib/pdfImportEntities.js +307 -0
  108. package/lib/pdfImportEntities.js.map +1 -0
  109. package/lib/pdfImportImages.d.ts +90 -0
  110. package/lib/pdfImportImages.d.ts.map +1 -0
  111. package/lib/pdfImportImages.js +294 -0
  112. package/lib/pdfImportImages.js.map +1 -0
  113. package/lib/pdfImportShapes.d.ts +63 -0
  114. package/lib/pdfImportShapes.d.ts.map +1 -0
  115. package/lib/pdfImportShapes.js +248 -0
  116. package/lib/pdfImportShapes.js.map +1 -0
  117. package/lib/pdfVectorImport.d.ts +218 -5
  118. package/lib/pdfVectorImport.d.ts.map +1 -1
  119. package/lib/pdfVectorImport.js +566 -98
  120. package/lib/pdfVectorImport.js.map +1 -1
  121. package/lib/recognition/pdfCurveRecognition.d.ts +91 -0
  122. package/lib/recognition/pdfCurveRecognition.d.ts.map +1 -0
  123. package/lib/recognition/pdfCurveRecognition.js +506 -0
  124. package/lib/recognition/pdfCurveRecognition.js.map +1 -0
  125. package/lib/recognition/pdfDimDigitRecognition.d.ts +18 -0
  126. package/lib/recognition/pdfDimDigitRecognition.d.ts.map +1 -0
  127. package/lib/recognition/pdfDimDigitRecognition.js +520 -0
  128. package/lib/recognition/pdfDimDigitRecognition.js.map +1 -0
  129. package/lib/recognition/pdfDimensionPattern.d.ts +173 -0
  130. package/lib/recognition/pdfDimensionPattern.d.ts.map +1 -0
  131. package/lib/recognition/pdfDimensionPattern.js +1023 -0
  132. package/lib/recognition/pdfDimensionPattern.js.map +1 -0
  133. package/lib/recognition/pdfFormBlocks.d.ts +58 -0
  134. package/lib/recognition/pdfFormBlocks.d.ts.map +1 -0
  135. package/lib/recognition/pdfFormBlocks.js +260 -0
  136. package/lib/recognition/pdfFormBlocks.js.map +1 -0
  137. package/lib/recognition/pdfGlyphClustering.d.ts +81 -0
  138. package/lib/recognition/pdfGlyphClustering.d.ts.map +1 -0
  139. package/lib/recognition/pdfGlyphClustering.js +1005 -0
  140. package/lib/recognition/pdfGlyphClustering.js.map +1 -0
  141. package/lib/recognition/pdfGlyphDictionary.d.ts +49 -0
  142. package/lib/recognition/pdfGlyphDictionary.d.ts.map +1 -0
  143. package/lib/recognition/pdfGlyphDictionary.js +188 -0
  144. package/lib/recognition/pdfGlyphDictionary.js.map +1 -0
  145. package/lib/recognition/pdfHatchFaces.d.ts +84 -0
  146. package/lib/recognition/pdfHatchFaces.d.ts.map +1 -0
  147. package/lib/recognition/pdfHatchFaces.js +1285 -0
  148. package/lib/recognition/pdfHatchFaces.js.map +1 -0
  149. package/lib/recognition/pdfHatchRecognition.d.ts +222 -0
  150. package/lib/recognition/pdfHatchRecognition.d.ts.map +1 -0
  151. package/lib/recognition/pdfHatchRecognition.js +3781 -0
  152. package/lib/recognition/pdfHatchRecognition.js.map +1 -0
  153. package/lib/recognition/pdfRecGeometry.d.ts +67 -0
  154. package/lib/recognition/pdfRecGeometry.d.ts.map +1 -0
  155. package/lib/recognition/pdfRecGeometry.js +365 -0
  156. package/lib/recognition/pdfRecGeometry.js.map +1 -0
  157. package/lib/recognition/pdfTextFontKind.d.ts +16 -0
  158. package/lib/recognition/pdfTextFontKind.d.ts.map +1 -0
  159. package/lib/recognition/pdfTextFontKind.js +51 -0
  160. package/lib/recognition/pdfTextFontKind.js.map +1 -0
  161. package/lib/recognition/pdfTextMerge.d.ts +71 -0
  162. package/lib/recognition/pdfTextMerge.d.ts.map +1 -0
  163. package/lib/recognition/pdfTextMerge.js +382 -0
  164. package/lib/recognition/pdfTextMerge.js.map +1 -0
  165. package/lib/recognition/pdfTextRunMerge.d.ts +28 -0
  166. package/lib/recognition/pdfTextRunMerge.d.ts.map +1 -0
  167. package/lib/recognition/pdfTextRunMerge.js +90 -0
  168. package/lib/recognition/pdfTextRunMerge.js.map +1 -0
  169. package/lib/register.d.ts +8 -2
  170. package/lib/register.d.ts.map +1 -1
  171. package/lib/register.js +29 -4
  172. package/lib/register.js.map +1 -1
  173. package/lib/ui/AcUiPdfDimPanel.d.ts +55 -0
  174. package/lib/ui/AcUiPdfDimPanel.d.ts.map +1 -0
  175. package/lib/ui/AcUiPdfDimPanel.js +347 -0
  176. package/lib/ui/AcUiPdfDimPanel.js.map +1 -0
  177. package/lib/ui/AcUiPdfHatchPanel.d.ts +57 -0
  178. package/lib/ui/AcUiPdfHatchPanel.d.ts.map +1 -0
  179. package/lib/ui/AcUiPdfHatchPanel.js +420 -0
  180. package/lib/ui/AcUiPdfHatchPanel.js.map +1 -0
  181. package/lib/ui/AcUiPdfImportDialog.d.ts +120 -0
  182. package/lib/ui/AcUiPdfImportDialog.d.ts.map +1 -0
  183. package/lib/ui/AcUiPdfImportDialog.js +673 -0
  184. package/lib/ui/AcUiPdfImportDialog.js.map +1 -0
  185. package/lib/ui/AcUiPdfTextPanel.d.ts +95 -0
  186. package/lib/ui/AcUiPdfTextPanel.d.ts.map +1 -0
  187. package/lib/ui/AcUiPdfTextPanel.js +775 -0
  188. package/lib/ui/AcUiPdfTextPanel.js.map +1 -0
  189. package/package.json +11 -11
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Builds dimension-value texts from exploded PDF text strokes so `pdfdim`
3
+ * can run before `pdftext` has turned those strokes into TEXT entities.
4
+ *
5
+ * Recognition is local and lightweight: the `pdftext` glyph dictionary, then
6
+ * a built-in digit / symbol template matcher — no LLM or network OCR.
7
+ */
8
+ var __values = (this && this.__values) || function(o) {
9
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
10
+ if (m) return m.call(o);
11
+ if (o && typeof o.length === "number") return {
12
+ next: function () {
13
+ if (o && i >= o.length) o = void 0;
14
+ return { value: o && o[i++], done: !o };
15
+ }
16
+ };
17
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
18
+ };
19
+ var __read = (this && this.__read) || function (o, n) {
20
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
21
+ if (!m) return o;
22
+ var i = m.call(o), r, ar = [], e;
23
+ try {
24
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
25
+ }
26
+ catch (error) { e = { error: error }; }
27
+ finally {
28
+ try {
29
+ if (r && !r.done && (m = i["return"])) m.call(i);
30
+ }
31
+ finally { if (e) throw e.error; }
32
+ }
33
+ return ar;
34
+ };
35
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
36
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
37
+ if (ar || !(i in from)) {
38
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
39
+ ar[i] = from[i];
40
+ }
41
+ }
42
+ return to.concat(ar || Array.prototype.slice.call(from));
43
+ };
44
+ import { pdfEntityToStroke } from './pdfEntityStrokes';
45
+ import { recognizePdfDimStrokeText } from './recognition/pdfDimDigitRecognition';
46
+ import { parsePdfDimensionValue } from './recognition/pdfDimensionPattern';
47
+ import { clusterPdfTextStrokes } from './recognition/pdfGlyphClustering';
48
+ /**
49
+ * Clusters curve entities into text line candidates (frames and long
50
+ * dimension lines are rejected by the clusterer).
51
+ */
52
+ export function acapPdfCollectDimStrokeLines(entities) {
53
+ var e_1, _a;
54
+ var strokes = [];
55
+ try {
56
+ for (var entities_1 = __values(entities), entities_1_1 = entities_1.next(); !entities_1_1.done; entities_1_1 = entities_1.next()) {
57
+ var _b = __read(entities_1_1.value, 2), id = _b[0], entity = _b[1];
58
+ var stroke = pdfEntityToStroke(entity, id);
59
+ if (stroke)
60
+ strokes.push(stroke);
61
+ }
62
+ }
63
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
64
+ finally {
65
+ try {
66
+ if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
67
+ }
68
+ finally { if (e_1) throw e_1.error; }
69
+ }
70
+ return clusterPdfTextStrokes(strokes).lines;
71
+ }
72
+ /**
73
+ * Turns clustered stroke lines into dimension texts.
74
+ *
75
+ * Lines whose `texts[i]` is a readable dimension value become real texts.
76
+ * Other lines stay as unread placeholders so linear recognition can fall
77
+ * back to the measured length and still erase the strokes.
78
+ */
79
+ export function acapPdfDimTextsFromStrokeLines(lines, texts) {
80
+ var recognized = [];
81
+ var unread = [];
82
+ var usedIds = [];
83
+ lines.forEach(function (line, i) {
84
+ var _a;
85
+ var ids = lineStrokeIds(line);
86
+ if (ids.length === 0)
87
+ return;
88
+ var value = (_a = texts[i]) === null || _a === void 0 ? void 0 : _a.trim();
89
+ if (value && parsePdfDimensionValue(value) !== undefined) {
90
+ recognized.push(pdfDimTextFromLine(line, value, ids));
91
+ usedIds.push.apply(usedIds, __spreadArray([], __read(ids), false));
92
+ return;
93
+ }
94
+ unread.push(pdfDimUnreadFromLine(line, ids));
95
+ usedIds.push.apply(usedIds, __spreadArray([], __read(ids), false));
96
+ });
97
+ return { texts: recognized, unread: unread, usedIds: usedIds };
98
+ }
99
+ /**
100
+ * Reads stroke lines: glyph dictionary first, then the built-in digit /
101
+ * symbol templates for anything still unread.
102
+ */
103
+ export function acapPdfLookupDimStrokeTexts(lines, dictionary) {
104
+ return lines.map(function (line) {
105
+ var known = dictionary.lookup(line);
106
+ if (known && parsePdfDimensionValue(known) !== undefined)
107
+ return known;
108
+ var fromDigits = recognizePdfDimStrokeText(line);
109
+ // Only keep compact dimension-like readings (digits / R / Ø / °). Fragmented
110
+ // outline strokes often misread as a run of "1"s; leave those unread so
111
+ // linear recognition can fall back to the measured length.
112
+ if (!fromDigits || !isPlausibleDimStrokeText(fromDigits, line.glyphs.length)) {
113
+ return undefined;
114
+ }
115
+ return fromDigits;
116
+ });
117
+ }
118
+ /**
119
+ * Dimension values are short and mostly numeric. Reject long misreadings from
120
+ * over-segmented outline glyphs (e.g. one "5" split into many "1" strokes).
121
+ */
122
+ function isPlausibleDimStrokeText(text, glyphCount) {
123
+ var compact = text.replace(/\s+/g, '');
124
+ if (!/^[Øø⌀R]?-?\d+([.,]\d+)?°?$/i.test(compact))
125
+ return false;
126
+ var digits = compact.replace(/\D/g, '');
127
+ // Outline "5"/"55" often over-segments into a run of "1" glyphs.
128
+ if (digits.length >= 2 && /^1+$/.test(digits))
129
+ return false;
130
+ if (glyphCount > 0 && Math.abs(compact.length - glyphCount) > 1)
131
+ return false;
132
+ // A short digit line with many glyphs is almost always over-segmentation.
133
+ if (glyphCount >= 3 && digits.length <= 2)
134
+ return false;
135
+ return parsePdfDimensionValue(compact) !== undefined;
136
+ }
137
+ /**
138
+ * Appends stroke-derived texts to a dim input and removes their strokes from
139
+ * the segment list so they are not mistaken for ticks or dimension lines.
140
+ */
141
+ export function acapPdfAttachDimStrokeTexts(input, recognized, unread) {
142
+ var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
143
+ var _e, _f;
144
+ var used = new Set();
145
+ try {
146
+ for (var recognized_1 = __values(recognized), recognized_1_1 = recognized_1.next(); !recognized_1_1.done; recognized_1_1 = recognized_1.next()) {
147
+ var text = recognized_1_1.value;
148
+ used.add(text.id);
149
+ try {
150
+ for (var _g = (e_3 = void 0, __values((_e = text.extraIds) !== null && _e !== void 0 ? _e : [])), _h = _g.next(); !_h.done; _h = _g.next()) {
151
+ var id = _h.value;
152
+ used.add(id);
153
+ }
154
+ }
155
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
156
+ finally {
157
+ try {
158
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
159
+ }
160
+ finally { if (e_3) throw e_3.error; }
161
+ }
162
+ input.texts.push(text);
163
+ }
164
+ }
165
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
166
+ finally {
167
+ try {
168
+ if (recognized_1_1 && !recognized_1_1.done && (_a = recognized_1.return)) _a.call(recognized_1);
169
+ }
170
+ finally { if (e_2) throw e_2.error; }
171
+ }
172
+ if (unread.length > 0) {
173
+ input.unreadTexts = __spreadArray(__spreadArray([], __read(((_f = input.unreadTexts) !== null && _f !== void 0 ? _f : [])), false), __read(unread), false);
174
+ try {
175
+ for (var unread_1 = __values(unread), unread_1_1 = unread_1.next(); !unread_1_1.done; unread_1_1 = unread_1.next()) {
176
+ var text = unread_1_1.value;
177
+ used.add(text.id);
178
+ try {
179
+ for (var _j = (e_5 = void 0, __values(text.extraIds)), _k = _j.next(); !_k.done; _k = _j.next()) {
180
+ var id = _k.value;
181
+ used.add(id);
182
+ }
183
+ }
184
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
185
+ finally {
186
+ try {
187
+ if (_k && !_k.done && (_d = _j.return)) _d.call(_j);
188
+ }
189
+ finally { if (e_5) throw e_5.error; }
190
+ }
191
+ }
192
+ }
193
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
194
+ finally {
195
+ try {
196
+ if (unread_1_1 && !unread_1_1.done && (_c = unread_1.return)) _c.call(unread_1);
197
+ }
198
+ finally { if (e_4) throw e_4.error; }
199
+ }
200
+ }
201
+ if (used.size === 0)
202
+ return;
203
+ input.segments = input.segments.filter(function (s) { return !used.has(s.id); });
204
+ }
205
+ /**
206
+ * Clusters stroke text in `entities`, reads values from the glyph dictionary
207
+ * and the digit templates, and attaches recognized / unread texts to `input`.
208
+ */
209
+ export function acapPdfPrepareDimStrokeTexts(input, entities, dictionary, texts) {
210
+ var lines = acapPdfCollectDimStrokeLines(entities);
211
+ if (lines.length === 0)
212
+ return { lines: lines, texts: [] };
213
+ var resolved = texts !== null && texts !== void 0 ? texts : acapPdfLookupDimStrokeTexts(lines, dictionary);
214
+ var _a = acapPdfDimTextsFromStrokeLines(lines, resolved), recognized = _a.texts, unread = _a.unread;
215
+ acapPdfAttachDimStrokeTexts(input, recognized, unread);
216
+ return { lines: lines, texts: resolved };
217
+ }
218
+ /** World-space center and height of a stroke text line. */
219
+ export function pdfDimTextPlacement(line) {
220
+ var c = Math.cos(line.rotation);
221
+ var s = Math.sin(line.rotation);
222
+ // Mid-baseline, raised by half the cap height (like a text box center).
223
+ var midU = line.width / 2;
224
+ var midV = line.height / 2;
225
+ return {
226
+ center: {
227
+ x: line.position.x + midU * c - midV * s,
228
+ y: line.position.y + midU * s + midV * c
229
+ },
230
+ height: line.height
231
+ };
232
+ }
233
+ function lineStrokeIds(line) {
234
+ var e_6, _a;
235
+ var seen = new Set();
236
+ var ids = [];
237
+ try {
238
+ for (var _b = __values(line.strokes), _c = _b.next(); !_c.done; _c = _b.next()) {
239
+ var stroke = _c.value;
240
+ if (seen.has(stroke.id))
241
+ continue;
242
+ seen.add(stroke.id);
243
+ ids.push(stroke.id);
244
+ }
245
+ }
246
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
247
+ finally {
248
+ try {
249
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
250
+ }
251
+ finally { if (e_6) throw e_6.error; }
252
+ }
253
+ return ids;
254
+ }
255
+ function pdfDimTextFromLine(line, text, ids) {
256
+ var _a = pdfDimTextPlacement(line), center = _a.center, height = _a.height;
257
+ return {
258
+ id: ids[0],
259
+ text: text,
260
+ center: center,
261
+ height: height,
262
+ extraIds: ids.slice(1)
263
+ };
264
+ }
265
+ function pdfDimUnreadFromLine(line, ids) {
266
+ var _a = pdfDimTextPlacement(line), center = _a.center, height = _a.height;
267
+ return {
268
+ id: ids[0],
269
+ extraIds: ids.slice(1),
270
+ center: center,
271
+ height: height
272
+ };
273
+ }
274
+ //# sourceMappingURL=pdfDimStrokeTexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfDimStrokeTexts.js","sourceRoot":"","sources":["../src/pdfDimStrokeTexts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { AcDb3PointAngularDimension, type AcDbDatabase, AcDbDiametricDimension, type AcDbDimStyleOverride, AcDbDimStyleTableRecord, type AcDbEntity, AcDbRadialDimension, AcDbRotatedDimension } from '@mlightcad/data-model';
2
+ import { type PdfDimensionCandidate, type PdfDimInput } from './recognition/pdfDimensionPattern';
3
+ /** Dimension style created for recovered dimensions. */
4
+ export declare const PDF_DIM_STYLE = "PDF_DIM";
5
+ /** Dimension entity created by {@link acapPdfCreateDimensions}. */
6
+ export type PdfDimEntity = AcDbRotatedDimension | AcDbRadialDimension | AcDbDiametricDimension | AcDb3PointAngularDimension;
7
+ /**
8
+ * Describes entities for {@link recognizePdfDimensions}: lines and 2-vertex
9
+ * polylines as segments, closed polylines and small solid hatches as possible
10
+ * arrowheads, circles and arcs as radial targets, and texts as dimension
11
+ * values.
12
+ */
13
+ export declare function pdfEntitiesToDimInput<Id>(entities: Map<Id, AcDbEntity>): PdfDimInput<Id>;
14
+ /** Geometry taken from recovered PDF dimensions for a dim style / overrides. */
15
+ export interface AcApPdfDimStyleMetrics {
16
+ dimscale: number;
17
+ dimtxt: number;
18
+ dimasz: number;
19
+ dimgap: number;
20
+ dimexo: number;
21
+ dimexe: number;
22
+ dimse1: 0;
23
+ dimse2: 0;
24
+ dimatfit: number;
25
+ dimtix: 0;
26
+ dimtofl: number;
27
+ dimlfac: number;
28
+ dimdec: number;
29
+ dimtad: 1;
30
+ dimsah: 0;
31
+ dimblk: string;
32
+ dimblk1: string;
33
+ dimblk2: string;
34
+ }
35
+ /**
36
+ * Measures text height, arrow size and extension from recovered candidates so
37
+ * both the style record and per-entity overrides stay in sync.
38
+ */
39
+ export declare function acapPdfDimStyleMetrics(candidates: PdfDimensionCandidate[], scale: number): AcApPdfDimStyleMetrics;
40
+ /** DXF group-code overrides that pin recovered sizes onto a dimension entity. */
41
+ export declare function acapPdfDimStyleOverrides(metrics: AcApPdfDimStyleMetrics): AcDbDimStyleOverride[];
42
+ /**
43
+ * Creates or updates a dim style with recovered paper sizes. Uses `attrs.set`
44
+ * so the write succeeds even when the record could not be opened for write.
45
+ */
46
+ export declare function acapPdfEnsureDimStyle(db: AcDbDatabase, candidates: PdfDimensionCandidate[], scale: number, styleName?: string, appearanceFrom?: string): AcDbDimStyleTableRecord;
47
+ /** Options for {@link acapPdfCreateDimensions}. */
48
+ export interface AcApPdfCreateDimensionsOptions<Id> {
49
+ layerOf?: (candidate: PdfDimensionCandidate<Id>) => string | undefined;
50
+ styleName?: string;
51
+ /** When false, dimensions are not appended to model space (transient preview). */
52
+ append?: boolean;
53
+ /**
54
+ * Existing style whose appearance (colours / text style) is blended into the
55
+ * override used while building dim blocks. Lets preview use a picked style
56
+ * without writing {@link PDF_DIM_STYLE} into the table first.
57
+ */
58
+ appearanceFrom?: string;
59
+ }
60
+ /**
61
+ * Builds dimension entities from recovered candidates.
62
+ *
63
+ * Sizes are forced through a temporary dim-style override for `createDimBlock`
64
+ * (so a large DIMSCALE on Standard cannot blow up text or hide extensions),
65
+ * then the permanent style name is restored on the entity.
66
+ *
67
+ * @returns The created dimensions (caller appends or shows as transients).
68
+ */
69
+ export declare function acapPdfCreateDimensions<Id>(db: AcDbDatabase, candidates: PdfDimensionCandidate<Id>[], scale: number, layerOf?: (candidate: PdfDimensionCandidate<Id>) => string | undefined, styleName?: string, options?: Omit<AcApPdfCreateDimensionsOptions<Id>, 'layerOf' | 'styleName'>): PdfDimEntity[];
70
+ /**
71
+ * Removes preview dimensions that were never appended to model space: drops
72
+ * their anonymous dim blocks from the block table.
73
+ */
74
+ export declare function acapPdfDisposeDimensionPreviews(db: AcDbDatabase, dimensions: PdfDimEntity[]): void;
75
+ /**
76
+ * Snaps a drawing scale to the nearest common value (1, 2, 2.5, 5 × 10ⁿ)
77
+ * when within 1 %, since dimension texts are rounded.
78
+ */
79
+ export declare function acapPdfNiceScale(scale: number): number;
80
+ //# sourceMappingURL=pdfDimensionConvert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfDimensionConvert.d.ts","sourceRoot":"","sources":["../src/pdfDimensionConvert.ts"],"names":[],"mappings":"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"}