@cadview/core 0.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.
- package/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/index.cjs +4048 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +510 -0
- package/dist/index.d.ts +510 -0
- package/dist/index.js +4018 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
interface Point2D {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
interface Point3D {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
z: number;
|
|
9
|
+
}
|
|
10
|
+
interface DxfDocument {
|
|
11
|
+
header: DxfHeader;
|
|
12
|
+
layers: Map<string, DxfLayer>;
|
|
13
|
+
lineTypes: Map<string, DxfLineType>;
|
|
14
|
+
styles: Map<string, DxfStyle>;
|
|
15
|
+
blocks: Map<string, DxfBlock>;
|
|
16
|
+
entities: DxfEntity[];
|
|
17
|
+
}
|
|
18
|
+
interface DxfHeader {
|
|
19
|
+
acadVersion: string;
|
|
20
|
+
extMin?: Point3D;
|
|
21
|
+
extMax?: Point3D;
|
|
22
|
+
insUnits: number;
|
|
23
|
+
measurement: number;
|
|
24
|
+
ltScale: number;
|
|
25
|
+
dwgCodePage?: string;
|
|
26
|
+
handleSeed?: string;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
interface DxfLayer {
|
|
30
|
+
name: string;
|
|
31
|
+
color: number;
|
|
32
|
+
lineType: string;
|
|
33
|
+
flags: number;
|
|
34
|
+
lineWeight: number;
|
|
35
|
+
trueColor?: number;
|
|
36
|
+
isOff: boolean;
|
|
37
|
+
isFrozen: boolean;
|
|
38
|
+
isLocked: boolean;
|
|
39
|
+
}
|
|
40
|
+
interface DxfLineType {
|
|
41
|
+
name: string;
|
|
42
|
+
description: string;
|
|
43
|
+
pattern: number[];
|
|
44
|
+
totalLength: number;
|
|
45
|
+
}
|
|
46
|
+
interface DxfStyle {
|
|
47
|
+
name: string;
|
|
48
|
+
fontName: string;
|
|
49
|
+
bigFontName: string;
|
|
50
|
+
height: number;
|
|
51
|
+
widthFactor: number;
|
|
52
|
+
obliqueAngle: number;
|
|
53
|
+
}
|
|
54
|
+
interface DxfBlock {
|
|
55
|
+
name: string;
|
|
56
|
+
basePoint: Point3D;
|
|
57
|
+
entities: DxfEntity[];
|
|
58
|
+
flags: number;
|
|
59
|
+
}
|
|
60
|
+
interface DxfEntityBase {
|
|
61
|
+
type: string;
|
|
62
|
+
handle?: string;
|
|
63
|
+
layer: string;
|
|
64
|
+
color: number;
|
|
65
|
+
trueColor?: number;
|
|
66
|
+
lineType: string;
|
|
67
|
+
lineTypeScale: number;
|
|
68
|
+
lineWeight: number;
|
|
69
|
+
visible: boolean;
|
|
70
|
+
extrusion: Point3D;
|
|
71
|
+
}
|
|
72
|
+
interface DxfLineEntity extends DxfEntityBase {
|
|
73
|
+
type: 'LINE';
|
|
74
|
+
start: Point3D;
|
|
75
|
+
end: Point3D;
|
|
76
|
+
}
|
|
77
|
+
interface DxfCircleEntity extends DxfEntityBase {
|
|
78
|
+
type: 'CIRCLE';
|
|
79
|
+
center: Point3D;
|
|
80
|
+
radius: number;
|
|
81
|
+
}
|
|
82
|
+
interface DxfArcEntity extends DxfEntityBase {
|
|
83
|
+
type: 'ARC';
|
|
84
|
+
center: Point3D;
|
|
85
|
+
radius: number;
|
|
86
|
+
startAngle: number;
|
|
87
|
+
endAngle: number;
|
|
88
|
+
}
|
|
89
|
+
interface DxfLwPolylineVertex {
|
|
90
|
+
x: number;
|
|
91
|
+
y: number;
|
|
92
|
+
bulge: number;
|
|
93
|
+
startWidth: number;
|
|
94
|
+
endWidth: number;
|
|
95
|
+
}
|
|
96
|
+
interface DxfLwPolylineEntity extends DxfEntityBase {
|
|
97
|
+
type: 'LWPOLYLINE';
|
|
98
|
+
vertices: DxfLwPolylineVertex[];
|
|
99
|
+
closed: boolean;
|
|
100
|
+
constantWidth: number;
|
|
101
|
+
elevation: number;
|
|
102
|
+
}
|
|
103
|
+
interface DxfPolylineEntity extends DxfEntityBase {
|
|
104
|
+
type: 'POLYLINE';
|
|
105
|
+
vertices: DxfLwPolylineVertex[];
|
|
106
|
+
closed: boolean;
|
|
107
|
+
is3d: boolean;
|
|
108
|
+
}
|
|
109
|
+
interface DxfEllipseEntity extends DxfEntityBase {
|
|
110
|
+
type: 'ELLIPSE';
|
|
111
|
+
center: Point3D;
|
|
112
|
+
majorAxis: Point3D;
|
|
113
|
+
minorRatio: number;
|
|
114
|
+
startParam: number;
|
|
115
|
+
endParam: number;
|
|
116
|
+
}
|
|
117
|
+
interface DxfSplineEntity extends DxfEntityBase {
|
|
118
|
+
type: 'SPLINE';
|
|
119
|
+
degree: number;
|
|
120
|
+
flags: number;
|
|
121
|
+
knots: number[];
|
|
122
|
+
controlPoints: Point3D[];
|
|
123
|
+
fitPoints: Point3D[];
|
|
124
|
+
weights: number[];
|
|
125
|
+
startTangent?: Point3D;
|
|
126
|
+
endTangent?: Point3D;
|
|
127
|
+
}
|
|
128
|
+
interface DxfTextEntity extends DxfEntityBase {
|
|
129
|
+
type: 'TEXT';
|
|
130
|
+
text: string;
|
|
131
|
+
insertionPoint: Point3D;
|
|
132
|
+
alignmentPoint?: Point3D;
|
|
133
|
+
height: number;
|
|
134
|
+
rotation: number;
|
|
135
|
+
widthFactor: number;
|
|
136
|
+
obliqueAngle: number;
|
|
137
|
+
style: string;
|
|
138
|
+
hAlign: number;
|
|
139
|
+
vAlign: number;
|
|
140
|
+
generationFlags: number;
|
|
141
|
+
}
|
|
142
|
+
interface DxfMTextEntity extends DxfEntityBase {
|
|
143
|
+
type: 'MTEXT';
|
|
144
|
+
text: string;
|
|
145
|
+
insertionPoint: Point3D;
|
|
146
|
+
height: number;
|
|
147
|
+
width: number;
|
|
148
|
+
attachmentPoint: number;
|
|
149
|
+
drawingDirection: number;
|
|
150
|
+
rotation: number;
|
|
151
|
+
lineSpacingStyle: number;
|
|
152
|
+
lineSpacingFactor: number;
|
|
153
|
+
style: string;
|
|
154
|
+
textDirection?: Point3D;
|
|
155
|
+
bgFill: number;
|
|
156
|
+
bgFillColor?: number;
|
|
157
|
+
bgFillTrueColor?: number;
|
|
158
|
+
bgFillScale: number;
|
|
159
|
+
}
|
|
160
|
+
interface DxfInsertEntity extends DxfEntityBase {
|
|
161
|
+
type: 'INSERT';
|
|
162
|
+
blockName: string;
|
|
163
|
+
insertionPoint: Point3D;
|
|
164
|
+
scaleX: number;
|
|
165
|
+
scaleY: number;
|
|
166
|
+
scaleZ: number;
|
|
167
|
+
rotation: number;
|
|
168
|
+
columnCount: number;
|
|
169
|
+
rowCount: number;
|
|
170
|
+
columnSpacing: number;
|
|
171
|
+
rowSpacing: number;
|
|
172
|
+
attribs: DxfAttrib[];
|
|
173
|
+
}
|
|
174
|
+
interface DxfAttrib {
|
|
175
|
+
tag: string;
|
|
176
|
+
text: string;
|
|
177
|
+
insertionPoint: Point3D;
|
|
178
|
+
height: number;
|
|
179
|
+
rotation: number;
|
|
180
|
+
style: string;
|
|
181
|
+
layer: string;
|
|
182
|
+
color: number;
|
|
183
|
+
}
|
|
184
|
+
interface DxfDimensionEntity extends DxfEntityBase {
|
|
185
|
+
type: 'DIMENSION';
|
|
186
|
+
blockName: string;
|
|
187
|
+
dimStyle: string;
|
|
188
|
+
dimType: number;
|
|
189
|
+
defPoint: Point3D;
|
|
190
|
+
textMidpoint: Point3D;
|
|
191
|
+
defPoint2?: Point3D;
|
|
192
|
+
defPoint3?: Point3D;
|
|
193
|
+
defPoint4?: Point3D;
|
|
194
|
+
defPoint5?: Point3D;
|
|
195
|
+
textOverride: string;
|
|
196
|
+
rotation: number;
|
|
197
|
+
textRotation: number;
|
|
198
|
+
leaderLength: number;
|
|
199
|
+
}
|
|
200
|
+
interface DxfHatchBoundaryPath {
|
|
201
|
+
type: 'polyline' | 'edges';
|
|
202
|
+
vertices?: Point2D[];
|
|
203
|
+
bulges?: number[];
|
|
204
|
+
isClosed?: boolean;
|
|
205
|
+
edges?: DxfHatchEdge[];
|
|
206
|
+
flags: number;
|
|
207
|
+
}
|
|
208
|
+
type DxfHatchEdge = {
|
|
209
|
+
type: 'line';
|
|
210
|
+
start: Point2D;
|
|
211
|
+
end: Point2D;
|
|
212
|
+
} | {
|
|
213
|
+
type: 'arc';
|
|
214
|
+
center: Point2D;
|
|
215
|
+
radius: number;
|
|
216
|
+
startAngle: number;
|
|
217
|
+
endAngle: number;
|
|
218
|
+
ccw: boolean;
|
|
219
|
+
} | {
|
|
220
|
+
type: 'ellipse';
|
|
221
|
+
center: Point2D;
|
|
222
|
+
majorAxis: Point2D;
|
|
223
|
+
minorRatio: number;
|
|
224
|
+
startAngle: number;
|
|
225
|
+
endAngle: number;
|
|
226
|
+
ccw: boolean;
|
|
227
|
+
} | {
|
|
228
|
+
type: 'spline';
|
|
229
|
+
degree: number;
|
|
230
|
+
knots: number[];
|
|
231
|
+
controlPoints: Point2D[];
|
|
232
|
+
weights?: number[];
|
|
233
|
+
};
|
|
234
|
+
interface DxfHatchEntity extends DxfEntityBase {
|
|
235
|
+
type: 'HATCH';
|
|
236
|
+
patternName: string;
|
|
237
|
+
solidFill: boolean;
|
|
238
|
+
associative: boolean;
|
|
239
|
+
hatchStyle: number;
|
|
240
|
+
patternType: number;
|
|
241
|
+
patternAngle: number;
|
|
242
|
+
patternScale: number;
|
|
243
|
+
boundaryPaths: DxfHatchBoundaryPath[];
|
|
244
|
+
}
|
|
245
|
+
interface DxfPointEntity extends DxfEntityBase {
|
|
246
|
+
type: 'POINT';
|
|
247
|
+
position: Point3D;
|
|
248
|
+
}
|
|
249
|
+
type DxfEntity = DxfLineEntity | DxfCircleEntity | DxfArcEntity | DxfLwPolylineEntity | DxfPolylineEntity | DxfEllipseEntity | DxfSplineEntity | DxfTextEntity | DxfMTextEntity | DxfInsertEntity | DxfDimensionEntity | DxfHatchEntity | DxfPointEntity;
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Error thrown when DXF parsing fails.
|
|
253
|
+
*/
|
|
254
|
+
declare class DxfParseError extends Error {
|
|
255
|
+
readonly cause?: unknown | undefined;
|
|
256
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Parse a DXF file from string or ArrayBuffer.
|
|
260
|
+
*
|
|
261
|
+
* @throws {DxfParseError} If the input is empty, malformed, or cannot be parsed.
|
|
262
|
+
*/
|
|
263
|
+
declare function parseDxf(input: string | ArrayBuffer): DxfDocument;
|
|
264
|
+
|
|
265
|
+
declare function aciToHex(aci: number): string | undefined;
|
|
266
|
+
declare function aciToDisplayColor(aci: number, isDarkTheme: boolean): string;
|
|
267
|
+
declare function trueColorToHex(trueColor: number): string;
|
|
268
|
+
|
|
269
|
+
interface ViewTransform {
|
|
270
|
+
scale: number;
|
|
271
|
+
offsetX: number;
|
|
272
|
+
offsetY: number;
|
|
273
|
+
}
|
|
274
|
+
declare function worldToScreen(vt: ViewTransform, wx: number, wy: number): [number, number];
|
|
275
|
+
declare function screenToWorld(vt: ViewTransform, sx: number, sy: number): [number, number];
|
|
276
|
+
declare function applyTransform(ctx: CanvasRenderingContext2D, vt: ViewTransform): void;
|
|
277
|
+
declare function fitToView(canvasWidth: number, canvasHeight: number, minX: number, minY: number, maxX: number, maxY: number, padding?: number): ViewTransform;
|
|
278
|
+
declare function zoomAtPoint(vt: ViewTransform, screenX: number, screenY: number, zoomFactor: number, minScale?: number, maxScale?: number): ViewTransform;
|
|
279
|
+
declare class Camera {
|
|
280
|
+
private transform;
|
|
281
|
+
private minScale;
|
|
282
|
+
private maxScale;
|
|
283
|
+
constructor(options: {
|
|
284
|
+
minZoom: number;
|
|
285
|
+
maxZoom: number;
|
|
286
|
+
});
|
|
287
|
+
getTransform(): ViewTransform;
|
|
288
|
+
setTransform(vt: ViewTransform): void;
|
|
289
|
+
pan(dx: number, dy: number): void;
|
|
290
|
+
zoom(screenX: number, screenY: number, factor: number): void;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
type Theme = 'dark' | 'light';
|
|
294
|
+
interface ThemeConfig {
|
|
295
|
+
backgroundColor: string;
|
|
296
|
+
defaultEntityColor: string;
|
|
297
|
+
selectionColor: string;
|
|
298
|
+
measureColor: string;
|
|
299
|
+
gridColor: string;
|
|
300
|
+
crosshairColor: string;
|
|
301
|
+
}
|
|
302
|
+
declare const THEMES: Record<Theme, ThemeConfig>;
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Resolve the display color for an entity.
|
|
306
|
+
*
|
|
307
|
+
* Resolution order:
|
|
308
|
+
* 1. Entity true color (code 420) - highest priority
|
|
309
|
+
* 2. Entity ACI color (code 62):
|
|
310
|
+
* - 1-255: use ACI color table
|
|
311
|
+
* - 0 (BYBLOCK): use parent INSERT color, or default if no parent
|
|
312
|
+
* - 256 (BYLAYER): use layer color
|
|
313
|
+
* 3. Layer color (from LAYER table)
|
|
314
|
+
* 4. Default theme color (fallback)
|
|
315
|
+
*/
|
|
316
|
+
declare function resolveEntityColor(entity: DxfEntityBase, layers: Map<string, DxfLayer>, theme: Theme, parentColor?: string): string;
|
|
317
|
+
|
|
318
|
+
declare class CanvasRenderer {
|
|
319
|
+
private canvas;
|
|
320
|
+
private ctx;
|
|
321
|
+
private width;
|
|
322
|
+
private height;
|
|
323
|
+
constructor(canvas: HTMLCanvasElement);
|
|
324
|
+
getContext(): CanvasRenderingContext2D;
|
|
325
|
+
getWidth(): number;
|
|
326
|
+
getHeight(): number;
|
|
327
|
+
updateSize(): void;
|
|
328
|
+
render(doc: DxfDocument, vt: ViewTransform, theme: Theme, visibleLayers: Set<string>, selectedEntityIndex: number): void;
|
|
329
|
+
renderEmpty(theme: Theme): void;
|
|
330
|
+
destroy(): void;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
declare function drawEntity(ctx: CanvasRenderingContext2D, entity: DxfEntity, doc: DxfDocument, vt: ViewTransform, theme: Theme, pixelSize: number): void;
|
|
334
|
+
|
|
335
|
+
interface SelectEvent {
|
|
336
|
+
entity: DxfEntity;
|
|
337
|
+
entityIndex: number;
|
|
338
|
+
worldPoint: Point2D;
|
|
339
|
+
screenPoint: Point2D;
|
|
340
|
+
}
|
|
341
|
+
interface MeasureEvent {
|
|
342
|
+
distance: number;
|
|
343
|
+
angle: number;
|
|
344
|
+
deltaX: number;
|
|
345
|
+
deltaY: number;
|
|
346
|
+
points: [Point2D, Point2D];
|
|
347
|
+
}
|
|
348
|
+
interface CadViewerEventMap {
|
|
349
|
+
select: SelectEvent;
|
|
350
|
+
measure: MeasureEvent;
|
|
351
|
+
viewchange: ViewTransform;
|
|
352
|
+
}
|
|
353
|
+
declare class EventEmitter<T extends Record<string, any> = Record<string, any>> {
|
|
354
|
+
private listeners;
|
|
355
|
+
on<K extends keyof T>(event: K, callback: (data: T[K]) => void): void;
|
|
356
|
+
off<K extends keyof T>(event: K, callback: (data: T[K]) => void): void;
|
|
357
|
+
emit<K extends keyof T>(event: K, data: T[K]): void;
|
|
358
|
+
removeAllListeners(): void;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
type Tool = 'pan' | 'select' | 'measure';
|
|
362
|
+
interface CadViewerOptions {
|
|
363
|
+
theme?: Theme;
|
|
364
|
+
backgroundColor?: string;
|
|
365
|
+
antialias?: boolean;
|
|
366
|
+
minZoom?: number;
|
|
367
|
+
maxZoom?: number;
|
|
368
|
+
zoomSpeed?: number;
|
|
369
|
+
initialTool?: Tool;
|
|
370
|
+
}
|
|
371
|
+
declare class CadViewer {
|
|
372
|
+
private canvas;
|
|
373
|
+
private renderer;
|
|
374
|
+
private camera;
|
|
375
|
+
private layerManager;
|
|
376
|
+
private emitter;
|
|
377
|
+
private spatialIndex;
|
|
378
|
+
private measureTool;
|
|
379
|
+
private doc;
|
|
380
|
+
private options;
|
|
381
|
+
private currentTool;
|
|
382
|
+
private inputHandler;
|
|
383
|
+
private resizeObserver;
|
|
384
|
+
private selectedEntityIndex;
|
|
385
|
+
private renderPending;
|
|
386
|
+
private destroyed;
|
|
387
|
+
private mouseScreenX;
|
|
388
|
+
private mouseScreenY;
|
|
389
|
+
constructor(canvas: HTMLCanvasElement, options?: CadViewerOptions);
|
|
390
|
+
loadFile(file: File): Promise<void>;
|
|
391
|
+
loadString(dxf: string): void;
|
|
392
|
+
loadArrayBuffer(buffer: ArrayBuffer): void;
|
|
393
|
+
/**
|
|
394
|
+
* Clear the current document and reset all state without destroying the viewer.
|
|
395
|
+
*/
|
|
396
|
+
clearDocument(): void;
|
|
397
|
+
private onDocumentLoaded;
|
|
398
|
+
fitToView(): void;
|
|
399
|
+
zoomTo(scale: number): void;
|
|
400
|
+
panTo(worldX: number, worldY: number): void;
|
|
401
|
+
getViewTransform(): ViewTransform;
|
|
402
|
+
/** @internal */
|
|
403
|
+
getZoomSpeed(): number;
|
|
404
|
+
getLayers(): DxfLayer[];
|
|
405
|
+
setLayerVisible(name: string, visible: boolean): void;
|
|
406
|
+
setLayerColor(name: string, color: string): void;
|
|
407
|
+
setTheme(theme: Theme): void;
|
|
408
|
+
getTheme(): Theme;
|
|
409
|
+
setBackgroundColor(color: string): void;
|
|
410
|
+
setTool(tool: Tool): void;
|
|
411
|
+
getTool(): Tool;
|
|
412
|
+
private getCursorForTool;
|
|
413
|
+
on<K extends keyof CadViewerEventMap>(event: K, callback: (data: CadViewerEventMap[K]) => void): void;
|
|
414
|
+
off<K extends keyof CadViewerEventMap>(event: K, callback: (data: CadViewerEventMap[K]) => void): void;
|
|
415
|
+
getDocument(): DxfDocument | null;
|
|
416
|
+
getEntities(): DxfEntity[];
|
|
417
|
+
resize(): void;
|
|
418
|
+
destroy(): void;
|
|
419
|
+
/** @internal */
|
|
420
|
+
requestRender(): void;
|
|
421
|
+
private doRender;
|
|
422
|
+
/** @internal */
|
|
423
|
+
handlePan(dx: number, dy: number): void;
|
|
424
|
+
/** @internal */
|
|
425
|
+
handleZoom(screenX: number, screenY: number, factor: number): void;
|
|
426
|
+
/** @internal */
|
|
427
|
+
handleClick(screenX: number, screenY: number): void;
|
|
428
|
+
/** @internal — called by InputHandler for mouse move */
|
|
429
|
+
handleMouseMove(screenX: number, screenY: number): void;
|
|
430
|
+
private handleSelect;
|
|
431
|
+
private computeDocumentBounds;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
declare class LayerManager {
|
|
435
|
+
private layers;
|
|
436
|
+
private visibility;
|
|
437
|
+
private colorOverrides;
|
|
438
|
+
private visibleCache;
|
|
439
|
+
setLayers(layers: Map<string, DxfLayer>): void;
|
|
440
|
+
getAllLayers(): DxfLayer[];
|
|
441
|
+
setVisible(name: string, visible: boolean): void;
|
|
442
|
+
isVisible(name: string): boolean;
|
|
443
|
+
setColorOverride(name: string, color: string): void;
|
|
444
|
+
getColorOverride(name: string): string | undefined;
|
|
445
|
+
getVisibleLayerNames(): Set<string>;
|
|
446
|
+
clear(): void;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
interface SpatialItem {
|
|
450
|
+
minX: number;
|
|
451
|
+
minY: number;
|
|
452
|
+
maxX: number;
|
|
453
|
+
maxY: number;
|
|
454
|
+
entityIndex: number;
|
|
455
|
+
}
|
|
456
|
+
declare class SpatialIndex {
|
|
457
|
+
private tree;
|
|
458
|
+
private items;
|
|
459
|
+
build(entities: DxfEntity[]): void;
|
|
460
|
+
search(minX: number, minY: number, maxX: number, maxY: number): SpatialItem[];
|
|
461
|
+
clear(): void;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Find the nearest entity to a world point.
|
|
465
|
+
* Returns entity index, or -1 if nothing is within tolerance.
|
|
466
|
+
*/
|
|
467
|
+
declare function hitTest(wx: number, wy: number, entities: DxfEntity[], spatialIndex: SpatialIndex, visibleLayers: Set<string>, scale: number): number;
|
|
468
|
+
|
|
469
|
+
type SnapType = 'endpoint' | 'midpoint' | 'center' | 'nearest';
|
|
470
|
+
interface SnapResult {
|
|
471
|
+
point: Point2D;
|
|
472
|
+
type: SnapType;
|
|
473
|
+
entityIndex: number;
|
|
474
|
+
}
|
|
475
|
+
type MeasureState = {
|
|
476
|
+
phase: 'idle';
|
|
477
|
+
} | {
|
|
478
|
+
phase: 'first-point';
|
|
479
|
+
} | {
|
|
480
|
+
phase: 'second-point';
|
|
481
|
+
firstPoint: Point2D;
|
|
482
|
+
firstSnap?: SnapResult;
|
|
483
|
+
} | {
|
|
484
|
+
phase: 'done';
|
|
485
|
+
firstPoint: Point2D;
|
|
486
|
+
secondPoint: Point2D;
|
|
487
|
+
distance: number;
|
|
488
|
+
angle: number;
|
|
489
|
+
};
|
|
490
|
+
declare class MeasureTool {
|
|
491
|
+
state: MeasureState;
|
|
492
|
+
currentSnap: SnapResult | null;
|
|
493
|
+
activate(): void;
|
|
494
|
+
deactivate(): void;
|
|
495
|
+
handleClick(wx: number, wy: number, snap: SnapResult | null): MeasureEvent | null;
|
|
496
|
+
handleMove(snap: SnapResult | null): void;
|
|
497
|
+
}
|
|
498
|
+
declare function findSnaps(wx: number, wy: number, entities: DxfEntity[], spatialIndex: SpatialIndex, scale: number, snapTypes?: Set<SnapType>): SnapResult[];
|
|
499
|
+
declare function renderMeasureOverlay(ctx: CanvasRenderingContext2D, vt: ViewTransform, measureTool: MeasureTool, mouseScreenX: number, mouseScreenY: number, theme: Theme): void;
|
|
500
|
+
|
|
501
|
+
interface BBox {
|
|
502
|
+
minX: number;
|
|
503
|
+
minY: number;
|
|
504
|
+
maxX: number;
|
|
505
|
+
maxY: number;
|
|
506
|
+
}
|
|
507
|
+
declare function computeEntitiesBounds(entities: DxfEntity[]): BBox | null;
|
|
508
|
+
declare function computeEntityBBox(entity: DxfEntity): BBox | null;
|
|
509
|
+
|
|
510
|
+
export { type BBox, CadViewer, type CadViewerEventMap, type CadViewerOptions, Camera, CanvasRenderer, type DxfArcEntity, type DxfAttrib, type DxfBlock, type DxfCircleEntity, type DxfDimensionEntity, type DxfDocument, type DxfEllipseEntity, type DxfEntity, type DxfEntityBase, type DxfHatchBoundaryPath, type DxfHatchEdge, type DxfHatchEntity, type DxfHeader, type DxfInsertEntity, type DxfLayer, type DxfLineEntity, type DxfLineType, type DxfLwPolylineEntity, type DxfLwPolylineVertex, type DxfMTextEntity, DxfParseError, type DxfPointEntity, type DxfPolylineEntity, type DxfSplineEntity, type DxfStyle, type DxfTextEntity, EventEmitter, LayerManager, type MeasureEvent, type MeasureState, MeasureTool, type Point2D, type Point3D, type SelectEvent, type SnapResult, type SnapType, SpatialIndex, THEMES, type Theme, type ThemeConfig, type Tool, type ViewTransform, aciToDisplayColor, aciToHex, applyTransform, computeEntitiesBounds, computeEntityBBox, drawEntity, findSnaps, fitToView, hitTest, parseDxf, renderMeasureOverlay, resolveEntityColor, screenToWorld, trueColorToHex, worldToScreen, zoomAtPoint };
|