build-dxf 0.0.1

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/README.md ADDED
@@ -0,0 +1 @@
1
+ # build-dxf
package/package.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "build-dxf",
3
+ "version": "0.0.1",
4
+ "description": "线段构建双线墙壁的dxf版本",
5
+ "main": "./src/index.js",
6
+ "types": "./src/index.d.ts",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1"
9
+ },
10
+ "author": "夏过初秋",
11
+ "license": "ISC"
12
+ }
@@ -0,0 +1,4 @@
1
+ const __viteBrowserExternal = {};
2
+ export {
3
+ __viteBrowserExternal as default
4
+ };
package/src/index.d.ts ADDED
@@ -0,0 +1,483 @@
1
+ import { EventDispatcher as EventDispatcher_2 } from 'three';
2
+
3
+ declare class Box2 {
4
+ minX: number;
5
+ maxX: number;
6
+ minY: number;
7
+ maxY: number;
8
+ get points(): Point[];
9
+ get width(): number;
10
+ get height(): number;
11
+ get center(): Point;
12
+ constructor(minX?: number, maxX?: number, minY?: number, maxY?: number);
13
+ /**
14
+ * 判断线段是与包围盒相交
15
+ * @description Liang-Barsky算法的变种
16
+ * @param line
17
+ */
18
+ intersectLineSegment(line: LineSegment): boolean;
19
+ /**
20
+ * 判断线段是在包围盒内
21
+ * @param line
22
+ */
23
+ containsLineSegment(line: LineSegment): boolean;
24
+ /**
25
+ * 判断矩形与包围盒相交
26
+ * @param rectangle
27
+ */
28
+ intersectRectangle(rectangle: Rectangle): boolean;
29
+ /**
30
+ * 判断矩形是在包围盒内
31
+ * @param rectangle
32
+ */
33
+ containsRectangle(rectangle: Rectangle): boolean;
34
+ /**
35
+ * 判断包围盒与包围盒相交
36
+ * @param box
37
+ */
38
+ intersectBox(box: Box2): boolean;
39
+ /**
40
+ * 判断包围盒是在包围盒内
41
+ * @param box
42
+ */
43
+ containsBox(box: Box2): boolean;
44
+ /**
45
+ *
46
+ * @param minX
47
+ * @param minY
48
+ * @param maxX
49
+ * @param maxY
50
+ * @returns
51
+ */
52
+ set(minX: number, minY: number, maxX: number, maxY: number): this;
53
+ /**
54
+ *
55
+ * @param maxWidth
56
+ * @param maxHeight
57
+ * @param mode
58
+ * @returns
59
+ */
60
+ scaleSize(maxWidth: number, maxHeight: number, mode?: 'min' | 'max'): number;
61
+ /**
62
+ *
63
+ * @param scalar
64
+ * @returns
65
+ */
66
+ multiplyScalar(scalar: number): this;
67
+ /**
68
+ *
69
+ * @returns
70
+ */
71
+ clone(): Box2;
72
+ /**
73
+ *
74
+ * @param points
75
+ * @returns
76
+ */
77
+ static fromByPoints(...points: Point[]): Box2;
78
+ }
79
+
80
+ declare class Component<TEventMap extends {} = {}> extends EventDispatcher<{
81
+ addFromParent: {
82
+ parent: ComponentManager;
83
+ };
84
+ removeFromParent: {
85
+ parent: ComponentManager;
86
+ };
87
+ update: {};
88
+ } & TEventMap> {
89
+ parent?: ComponentManager;
90
+ constructor(...arg: any[]);
91
+ onAddFromParent(parent: ComponentManager): void;
92
+ onRemoveFromParent(parent: ComponentManager): void;
93
+ destroy(): void;
94
+ }
95
+
96
+ declare class ComponentManager<TEventMap extends {} = {}> extends EventDispatcher<TEventMap & EventTypeMap> {
97
+ static readonly EventType: {
98
+ ADD_COMPONENT: string;
99
+ };
100
+ components: Component[];
101
+ /**
102
+ * 添加组件
103
+ * @param component
104
+ */
105
+ addComponent(component: Component): this;
106
+ /**
107
+ * 移除组件
108
+ * @param component
109
+ */
110
+ removeComponent(component: Component): void;
111
+ /**
112
+ * 查找符合条件的第一个组件
113
+ * @param callBack
114
+ */
115
+ findComponent(predicate: (component: Component, index: number) => boolean): Component<{}> | undefined;
116
+ /**
117
+ * 查找所有符合条件的组件
118
+ * @param callBack
119
+ */
120
+ findComponents(predicate: (component: Component, index: number) => boolean): Component<{}> | undefined;
121
+ /**
122
+ *
123
+ * @param type
124
+ */
125
+ findComponentByType<T extends typeof Component>(type: T): InstanceType<T> | null;
126
+ }
127
+
128
+ /**
129
+ * [开始点, 结束点, 相交点, 是否是门, 索引]
130
+ */
131
+ declare type DataItem = [Point, Point, number[], boolean, number];
132
+
133
+ /**
134
+ * 将点云结构转换为DXF格式
135
+ */
136
+ declare class Dxf extends Component<{
137
+ setDta: {
138
+ originalData: OriginalDataItem[];
139
+ data: DataItem[];
140
+ };
141
+ lineOffset: {
142
+ wallsGroup: Point[][];
143
+ };
144
+ createGroup: {
145
+ groups: Point[][][];
146
+ };
147
+ }> {
148
+ width: number;
149
+ scale: number;
150
+ originalData: OriginalDataItem[];
151
+ data: DataItem[];
152
+ originalBox: Box2;
153
+ box: Box2;
154
+ pointsGroups: Point[][][];
155
+ wallsGroup: Point[][];
156
+ doors: DataItem[];
157
+ originalZAverage: number;
158
+ static EndType: {
159
+ etOpenSquare: number;
160
+ etOpenRound: number;
161
+ etOpenButt: number;
162
+ };
163
+ static JoinType: {
164
+ jtSquare: number;
165
+ jtRound: number;
166
+ jtMiter: number;
167
+ };
168
+ /** 原始数据组
169
+ */
170
+ get lines(): Point[][];
171
+ /**初始化
172
+ * @param data 点云数据
173
+ * @param width 墙体宽度
174
+ * @param scale 缩放比例
175
+ */
176
+ constructor(width?: number, scale?: number);
177
+ /**
178
+ * 设置
179
+ * @param data
180
+ * @param width
181
+ * @param scale
182
+ */
183
+ set(data: OriginalDataItem[], width?: number, scale?: number): void;
184
+ /** 创建分组
185
+ * @description 根据相交数组insetionArr, 把相交的线段,划分到一组内,方便后续路径查找合并使用
186
+ * @returns
187
+ */
188
+ private createGroups;
189
+ /** 计算当前墙体数据的边界框
190
+ * @description 根据分组数据pointsGroups,计算包围盒, pointsGroups数据为缩放后数据。
191
+ * @description 可通过box属性查看计算结果。
192
+ * @returns
193
+ */
194
+ computedSize(): Box2;
195
+ /** 线路拓扑
196
+ * @description 处理线路拓扑,使线路有序链接,形成长路径
197
+ * @param lines
198
+ */
199
+ private lineTopology;
200
+ /** etOpenRound 去除毛刺
201
+ * @description 检查连续的短线段数量,去除合并后产生的毛刺
202
+ */
203
+ private squareRemoveBurr;
204
+ /** 线偏移
205
+ * @description 使用 ClipperLib 对每个点组进行线偏移处理,生成具有指定宽度的墙体路径
206
+ */
207
+ lineOffset(endType?: number, joinType?: number, scale?: number): Point[][];
208
+ /**
209
+ * 将点云结构转换为Float32Array
210
+ */
211
+ to3DArray(scale: number): Float32Array<ArrayBuffer>;
212
+ /**
213
+ * 将点云结构转换为string
214
+ */
215
+ toDxfString(): string;
216
+ /**
217
+ * 将点云结构转换为DXF格式
218
+ * @returns
219
+ */
220
+ toDxfBlob(): Blob;
221
+ /**
222
+ * 下载
223
+ * @param filename
224
+ */
225
+ download(filename: string, path?: string): Promise<void>;
226
+ /**
227
+ * 计算原始数据的边界框
228
+ * @description 计算所有线段的起点和终点的最小最大值,形成一个边界框
229
+ * @returns
230
+ */
231
+ private computedOriginalSize;
232
+ /**
233
+ * 创建数据
234
+ * @param pointsGroups
235
+ * @returns
236
+ */
237
+ static createData(pointsGroups: Point[][], sealed?: boolean): OriginalDataItem[];
238
+ }
239
+
240
+ export declare class DxfSystem extends ComponentManager {
241
+ Dxf: Dxf;
242
+ Variable: Variable;
243
+ wallWidth: number;
244
+ constructor(wallWidth?: number, scale?: number);
245
+ usePlugin(plugin: (this: DxfSystem, dxfSystem: DxfSystem) => void): this;
246
+ destroy(): void;
247
+ }
248
+
249
+ declare type EventData<T> = {
250
+ value: T;
251
+ oldValue: T;
252
+ };
253
+
254
+ declare class EventDispatcher<TEventMap extends {} = {}> extends EventDispatcher_2<TEventMap> {
255
+ uuid: string;
256
+ }
257
+
258
+ declare interface EventType {
259
+ originalLineVisible: EventData<boolean>;
260
+ dxfVisible: EventData<boolean>;
261
+ whiteModelVisible: EventData<boolean>;
262
+ isLook: EventData<boolean>;
263
+ currentWheel: EventData<number>;
264
+ pointerMove: EventData<{
265
+ x: number;
266
+ y: number;
267
+ }>;
268
+ currentKeyUp: EventData<string>;
269
+ }
270
+
271
+ declare interface EventTypeMap {
272
+ addComponent: {
273
+ component: Component;
274
+ };
275
+ removeComponent: {
276
+ component: Component;
277
+ };
278
+ }
279
+
280
+ /**
281
+ * 非轴对称线段
282
+ */
283
+ declare class LineSegment {
284
+ points: Point[];
285
+ get center(): Point;
286
+ constructor(p1?: Point, p2?: Point);
287
+ /**
288
+ * 计算线段的长度
289
+ * @returns 线段的长度
290
+ */
291
+ getLength(): number;
292
+ /**
293
+ * 获取方向
294
+ * @returns
295
+ */
296
+ direction(): Point;
297
+ /**
298
+ * 计算一条线段在另一条直线上的投影,并裁剪超出目标线段的部分
299
+ * @param line 要投影的线段
300
+ * @returns 投影并裁剪后的线段
301
+ */
302
+ projectLineSegment(line: LineSegment): LineSegment;
303
+ clone(): LineSegment;
304
+ }
305
+
306
+ declare interface OriginalDataItem {
307
+ start: {
308
+ x: number;
309
+ y: number;
310
+ z: number;
311
+ };
312
+ end: {
313
+ x: number;
314
+ y: number;
315
+ z: number;
316
+ };
317
+ insetionArr: {
318
+ index: number;
319
+ p: {
320
+ x: number;
321
+ y: number;
322
+ z: number;
323
+ };
324
+ }[];
325
+ isDoor?: boolean;
326
+ }
327
+
328
+ declare class Point {
329
+ x: number;
330
+ y: number;
331
+ get X(): number;
332
+ get Y(): number;
333
+ /**
334
+ *
335
+ * @param x
336
+ * @param y
337
+ */
338
+ constructor(x?: number, y?: number);
339
+ setX(x: number): this;
340
+ setY(y: number): this;
341
+ /**
342
+ *
343
+ * @param point
344
+ * @returns
345
+ */
346
+ equal(point: Point): boolean;
347
+ /**
348
+ *
349
+ * @param arr
350
+ */
351
+ setByArray(arr: number[]): this;
352
+ /**
353
+ *
354
+ */
355
+ toArray(): [number, number];
356
+ /**
357
+ * multiplyScalar
358
+ * @param scalar
359
+ */
360
+ mutiplyScalar(scalar: number): this;
361
+ /**
362
+ *
363
+ * @param scalar
364
+ * @returns
365
+ */
366
+ divisionScalar(scalar: number): this;
367
+ /**
368
+ * 减法
369
+ * @description 将当前点的坐标减去指定点的坐标
370
+ * @param point
371
+ * @returns
372
+ */
373
+ division(point: Point): this;
374
+ /**
375
+ * 加法
376
+ * @description 将当前点的坐标加上指定点的坐标
377
+ * @param point
378
+ * @returns
379
+ */
380
+ add(point: Point): this;
381
+ /**
382
+ * 保留小数位数
383
+ * @param count
384
+ */
385
+ fixed(count: number): this;
386
+ /**
387
+ * 归一化
388
+ * @description 将当前点的坐标归一化为单位向量
389
+ * @returns
390
+ */
391
+ normalize(): this;
392
+ /**
393
+ * 获取单位法向量
394
+ * @description 计算当前点到指定点的方向向量,并返回逆时针旋转90度后的单位法向量
395
+ * @param point
396
+ * @returns
397
+ */
398
+ normal(point: Point): Point;
399
+ /**
400
+ * 获取单位方向向量
401
+ * @description 计算当前点到指定点的方向向量,并返回单位方向
402
+ * @param point
403
+ * @returns
404
+ */
405
+ direction(point: Point): Point;
406
+ /**
407
+ * 计算模长
408
+ * @returns
409
+ */
410
+ magnitude(): number;
411
+ /**
412
+ * 计算点点积
413
+ * @param point
414
+ * @returns
415
+ */
416
+ dot(point: Point): number;
417
+ /** 计算两个向量夹角
418
+ * @description 公式:a · b = |a| × |b| × cosθ
419
+ * @param point
420
+ * @returns
421
+ */
422
+ angleBetween(point: Point): number;
423
+ /** 获取向量长度
424
+ */
425
+ length(): number;
426
+ /**
427
+ * 获取两个点长度
428
+ * @param point
429
+ */
430
+ distance(point: Point): number;
431
+ /**
432
+ * 克隆
433
+ * @returns
434
+ */
435
+ clone(): Point;
436
+ static from(arr: any): Point;
437
+ static zero(): Point;
438
+ }
439
+
440
+ /**
441
+ * 非轴对称矩形
442
+ */
443
+ declare class Rectangle {
444
+ points: Point[];
445
+ get path(): number[];
446
+ constructor(points: Point[]);
447
+ /**
448
+ * 判断线段是否与矩形相交
449
+ * @param line 线段
450
+ * @returns 是否与矩形相交
451
+ */
452
+ intersectLineSegment(line: LineSegment): boolean;
453
+ /**
454
+ * 判断线段是否完全位于矩形内部
455
+ * @param line 线段
456
+ * @returns 是否完全在矩形内部
457
+ */
458
+ containsLineSegment(line: LineSegment): boolean;
459
+ /**
460
+ *
461
+ * @param line
462
+ * @param width
463
+ * @returns
464
+ */
465
+ static fromByLineSegment(line: LineSegment, width?: number, horizontal?: boolean, hScale?: number): Rectangle;
466
+ }
467
+
468
+ declare class Variable extends Component<EventType> {
469
+ originalLineVisible: boolean;
470
+ dxfVisible: boolean;
471
+ whiteModelVisible: boolean;
472
+ isLook: boolean;
473
+ currentWheel: number;
474
+ pointerMove: {
475
+ x: number;
476
+ y: number;
477
+ };
478
+ currentKeyUp: string;
479
+ set<KeyT extends keyof EventType>(key: KeyT, value: any): void;
480
+ get<KeyT extends keyof EventType>(key: KeyT): this[KeyT] | undefined;
481
+ }
482
+
483
+ export { }