@linkiez/dxf-renew 7.0.0 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +1 -16
- package/.github/instructions/code-patterns.instructions.md +1 -1
- package/.github/instructions/exdxf.instruction.md +161 -0
- package/.github/instructions/tdd.instructions.md +271 -0
- package/.yarn/install-state.gz +0 -0
- package/ARCHITECTURE.md +163 -0
- package/CHANGELOG.md +39 -0
- package/CONTRIBUTING.md +16 -14
- package/README.md +113 -16
- package/{PLAN.md → ROADMAP.md} +244 -102
- package/dist/dxf.js +2212 -454
- package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
- package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
- package/lib/Helper.cjs +6 -2
- package/lib/Helper.cjs.map +3 -3
- package/lib/Helper.js +6 -2
- package/lib/Helper.js.map +2 -2
- package/lib/denormalise.cjs +131 -91
- package/lib/denormalise.cjs.map +2 -2
- package/lib/denormalise.js +131 -91
- package/lib/denormalise.js.map +2 -2
- package/lib/dimensionToSVG.cjs +318 -53
- package/lib/dimensionToSVG.cjs.map +3 -3
- package/lib/dimensionToSVG.js +316 -52
- package/lib/dimensionToSVG.js.map +2 -2
- package/lib/entityToPolyline.cjs +95 -0
- package/lib/entityToPolyline.cjs.map +3 -3
- package/lib/entityToPolyline.js +95 -0
- package/lib/entityToPolyline.js.map +2 -2
- package/lib/handlers/entities.cjs +111 -27
- package/lib/handlers/entities.cjs.map +3 -3
- package/lib/handlers/entities.js +111 -27
- package/lib/handlers/entities.js.map +3 -3
- package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
- package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dgnUnderlay.js +71 -0
- package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
- package/lib/handlers/entity/dimension.cjs +24 -0
- package/lib/handlers/entity/dimension.cjs.map +2 -2
- package/lib/handlers/entity/dimension.js +24 -0
- package/lib/handlers/entity/dimension.js.map +2 -2
- package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
- package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dwfUnderlay.js +71 -0
- package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
- package/lib/handlers/entity/image.cjs +123 -0
- package/lib/handlers/entity/image.cjs.map +7 -0
- package/lib/handlers/entity/image.js +88 -0
- package/lib/handlers/entity/image.js.map +7 -0
- package/lib/handlers/entity/leader.cjs +148 -0
- package/lib/handlers/entity/leader.cjs.map +7 -0
- package/lib/handlers/entity/leader.js +113 -0
- package/lib/handlers/entity/leader.js.map +7 -0
- package/lib/handlers/entity/mleader.cjs +69 -0
- package/lib/handlers/entity/mleader.cjs.map +7 -0
- package/lib/handlers/entity/mleader.js +34 -0
- package/lib/handlers/entity/mleader.js.map +7 -0
- package/lib/handlers/entity/mline.cjs +91 -0
- package/lib/handlers/entity/mline.cjs.map +7 -0
- package/lib/handlers/entity/mline.js +56 -0
- package/lib/handlers/entity/mline.js.map +7 -0
- package/lib/handlers/entity/oleframe.cjs +98 -0
- package/lib/handlers/entity/oleframe.cjs.map +7 -0
- package/lib/handlers/entity/oleframe.js +63 -0
- package/lib/handlers/entity/oleframe.js.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
- package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.js +71 -0
- package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
- package/lib/handlers/entity/ray.cjs +81 -0
- package/lib/handlers/entity/ray.cjs.map +7 -0
- package/lib/handlers/entity/ray.js +46 -0
- package/lib/handlers/entity/ray.js.map +7 -0
- package/lib/handlers/entity/region.cjs +67 -0
- package/lib/handlers/entity/region.cjs.map +7 -0
- package/lib/handlers/entity/region.js +32 -0
- package/lib/handlers/entity/region.js.map +7 -0
- package/lib/handlers/entity/shape.cjs +95 -0
- package/lib/handlers/entity/shape.cjs.map +7 -0
- package/lib/handlers/entity/shape.js +60 -0
- package/lib/handlers/entity/shape.js.map +7 -0
- package/lib/handlers/entity/table.cjs +71 -0
- package/lib/handlers/entity/table.cjs.map +7 -0
- package/lib/handlers/entity/table.js +36 -0
- package/lib/handlers/entity/table.js.map +7 -0
- package/lib/handlers/entity/tolerance.cjs +90 -0
- package/lib/handlers/entity/tolerance.cjs.map +7 -0
- package/lib/handlers/entity/tolerance.js +55 -0
- package/lib/handlers/entity/tolerance.js.map +7 -0
- package/lib/handlers/entity/trace.cjs +101 -0
- package/lib/handlers/entity/trace.cjs.map +7 -0
- package/lib/handlers/entity/trace.js +66 -0
- package/lib/handlers/entity/trace.js.map +7 -0
- package/lib/handlers/entity/wipeout.cjs +122 -0
- package/lib/handlers/entity/wipeout.cjs.map +7 -0
- package/lib/handlers/entity/wipeout.js +87 -0
- package/lib/handlers/entity/wipeout.js.map +7 -0
- package/lib/handlers/entity/xline.cjs +81 -0
- package/lib/handlers/entity/xline.cjs.map +7 -0
- package/lib/handlers/entity/xline.js +46 -0
- package/lib/handlers/entity/xline.js.map +7 -0
- package/lib/handlers/objects.cjs +299 -136
- package/lib/handlers/objects.cjs.map +2 -2
- package/lib/handlers/objects.js +299 -136
- package/lib/handlers/objects.js.map +2 -2
- package/lib/handlers/tables.cjs +96 -17
- package/lib/handlers/tables.cjs.map +2 -2
- package/lib/handlers/tables.js +96 -17
- package/lib/handlers/tables.js.map +2 -2
- package/lib/index.cjs +5 -2
- package/lib/index.cjs.map +3 -3
- package/lib/index.js +18 -16
- package/lib/index.js.map +3 -3
- package/lib/toJson.cjs +29 -0
- package/lib/toJson.cjs.map +7 -0
- package/lib/toJson.js +9 -0
- package/lib/toJson.js.map +7 -0
- package/lib/toSVG.cjs +105 -11
- package/lib/toSVG.cjs.map +3 -3
- package/lib/toSVG.js +106 -12
- package/lib/toSVG.js.map +2 -2
- package/lib/types/dimension-entity.cjs.map +1 -1
- package/lib/types/entity.cjs.map +1 -1
- package/lib/types/helper.cjs.map +1 -1
- package/lib/types/image-entity.cjs +17 -0
- package/lib/types/image-entity.cjs.map +7 -0
- package/lib/types/image-entity.js +1 -0
- package/lib/types/image-entity.js.map +7 -0
- package/lib/types/index.cjs +28 -0
- package/lib/types/index.cjs.map +2 -2
- package/lib/types/index.js +14 -0
- package/lib/types/index.js.map +2 -2
- package/lib/types/leader-entity.cjs +17 -0
- package/lib/types/leader-entity.cjs.map +7 -0
- package/lib/types/leader-entity.js +1 -0
- package/lib/types/leader-entity.js.map +7 -0
- package/lib/types/mleader-entity.cjs +17 -0
- package/lib/types/mleader-entity.cjs.map +7 -0
- package/lib/types/mleader-entity.js +1 -0
- package/lib/types/mleader-entity.js.map +7 -0
- package/lib/types/mline-entity.cjs +17 -0
- package/lib/types/mline-entity.cjs.map +7 -0
- package/lib/types/mline-entity.js +1 -0
- package/lib/types/mline-entity.js.map +7 -0
- package/lib/types/oleframe-entity.cjs +17 -0
- package/lib/types/oleframe-entity.cjs.map +7 -0
- package/lib/types/oleframe-entity.js +1 -0
- package/lib/types/oleframe-entity.js.map +7 -0
- package/lib/types/options.cjs.map +1 -1
- package/lib/types/ray-entity.cjs +17 -0
- package/lib/types/ray-entity.cjs.map +7 -0
- package/lib/types/ray-entity.js +1 -0
- package/lib/types/ray-entity.js.map +7 -0
- package/lib/types/region-entity.cjs +17 -0
- package/lib/types/region-entity.cjs.map +7 -0
- package/lib/types/region-entity.js +1 -0
- package/lib/types/region-entity.js.map +7 -0
- package/lib/types/shape-entity.cjs +17 -0
- package/lib/types/shape-entity.cjs.map +7 -0
- package/lib/types/shape-entity.js +1 -0
- package/lib/types/shape-entity.js.map +7 -0
- package/lib/types/table-entity.cjs +17 -0
- package/lib/types/table-entity.cjs.map +7 -0
- package/lib/types/table-entity.js +1 -0
- package/lib/types/table-entity.js.map +7 -0
- package/lib/types/tables.cjs.map +1 -1
- package/lib/types/tolerance-entity.cjs +17 -0
- package/lib/types/tolerance-entity.cjs.map +7 -0
- package/lib/types/tolerance-entity.js +1 -0
- package/lib/types/tolerance-entity.js.map +7 -0
- package/lib/types/trace-entity.cjs +17 -0
- package/lib/types/trace-entity.cjs.map +7 -0
- package/lib/types/trace-entity.js +1 -0
- package/lib/types/trace-entity.js.map +7 -0
- package/lib/types/underlay-entity.cjs +17 -0
- package/lib/types/underlay-entity.cjs.map +7 -0
- package/lib/types/underlay-entity.js +1 -0
- package/lib/types/underlay-entity.js.map +7 -0
- package/lib/types/wipeout-entity.cjs +17 -0
- package/lib/types/wipeout-entity.cjs.map +7 -0
- package/lib/types/wipeout-entity.js +1 -0
- package/lib/types/wipeout-entity.js.map +7 -0
- package/lib/types/xline-entity.cjs +17 -0
- package/lib/types/xline-entity.cjs.map +7 -0
- package/lib/types/xline-entity.js +1 -0
- package/lib/types/xline-entity.js.map +7 -0
- package/lib/util/escapeXmlText.cjs +27 -0
- package/lib/util/escapeXmlText.cjs.map +7 -0
- package/lib/util/escapeXmlText.js +7 -0
- package/lib/util/escapeXmlText.js.map +7 -0
- package/package.json +9 -18
- package/playwright.config.cjs +20 -0
- package/src/Helper.ts +8 -3
- package/src/denormalise.ts +182 -116
- package/src/dimensionToSVG.ts +466 -54
- package/src/entityToPolyline.ts +124 -2
- package/src/handlers/entities.ts +129 -34
- package/src/handlers/entity/dgnUnderlay.ts +94 -0
- package/src/handlers/entity/dimension.ts +27 -1
- package/src/handlers/entity/dwfUnderlay.ts +94 -0
- package/src/handlers/entity/image.ts +118 -0
- package/src/handlers/entity/leader.ts +153 -0
- package/src/handlers/entity/mleader.ts +46 -0
- package/src/handlers/entity/mline.ts +74 -0
- package/src/handlers/entity/oleframe.ts +62 -0
- package/src/handlers/entity/pdfUnderlay.ts +94 -0
- package/src/handlers/entity/ray.ts +52 -0
- package/src/handlers/entity/region.ts +42 -0
- package/src/handlers/entity/shape.ts +73 -0
- package/src/handlers/entity/table.ts +49 -0
- package/src/handlers/entity/tolerance.ts +75 -0
- package/src/handlers/entity/trace.ts +72 -0
- package/src/handlers/entity/wipeout.ts +114 -0
- package/src/handlers/entity/xline.ts +52 -0
- package/src/handlers/objects.ts +379 -139
- package/src/handlers/tables.ts +134 -21
- package/src/index.ts +9 -18
- package/src/toJson.ts +8 -0
- package/src/toSVG.ts +143 -10
- package/src/types/dimension-entity.ts +11 -0
- package/src/types/entity.ts +30 -0
- package/src/types/helper.ts +2 -1
- package/src/types/image-entity.ts +35 -0
- package/src/types/index.ts +14 -0
- package/src/types/leader-entity.ts +40 -0
- package/src/types/mleader-entity.ts +8 -0
- package/src/types/mline-entity.ts +12 -0
- package/src/types/oleframe-entity.ts +40 -0
- package/src/types/options.ts +48 -0
- package/src/types/ray-entity.ts +12 -0
- package/src/types/region-entity.ts +11 -0
- package/src/types/shape-entity.ts +19 -0
- package/src/types/table-entity.ts +14 -0
- package/src/types/tables.ts +160 -0
- package/src/types/tolerance-entity.ts +20 -0
- package/src/types/trace-entity.ts +14 -0
- package/src/types/underlay-entity.ts +35 -0
- package/src/types/wipeout-entity.ts +20 -0
- package/src/types/xline-entity.ts +12 -0
- package/src/util/escapeXmlText.ts +10 -0
- package/tools/browser_test_server.cjs +87 -0
- package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
- package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
- package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
- package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
- package/tools/ezdxf_validate_fixtures.py +165 -0
- package/docs/DIMENSION_SUMMARY.md +0 -248
- package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
- package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
- package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.pt-BR.md +0 -169
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BaseEntity } from './base-entity'
|
|
2
|
+
import type { Point3D } from './common'
|
|
3
|
+
|
|
4
|
+
export interface MLineEntity extends BaseEntity {
|
|
5
|
+
type: 'MLINE'
|
|
6
|
+
|
|
7
|
+
startPoint?: Point3D
|
|
8
|
+
endPoint?: Point3D
|
|
9
|
+
|
|
10
|
+
vertexCount?: number
|
|
11
|
+
styleName?: string
|
|
12
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// OLEFrame entity type
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* OLEFRAME entity
|
|
7
|
+
* Legacy OLE object frame entity.
|
|
8
|
+
*/
|
|
9
|
+
export interface OleFrameEntity extends BaseEntity {
|
|
10
|
+
type: 'OLEFRAME'
|
|
11
|
+
|
|
12
|
+
/** OLE version number */
|
|
13
|
+
version?: string | number
|
|
14
|
+
/** End of object name/description */
|
|
15
|
+
name?: string | number
|
|
16
|
+
|
|
17
|
+
/** Upper-left corner X coordinate (WCS) */
|
|
18
|
+
upperLeftX?: string | number
|
|
19
|
+
/** Upper-left corner Y coordinate (WCS) */
|
|
20
|
+
upperLeftY?: string | number
|
|
21
|
+
/** Upper-left corner Z coordinate (WCS) */
|
|
22
|
+
upperLeftZ?: string | number
|
|
23
|
+
|
|
24
|
+
/** Lower-right corner X coordinate (WCS) */
|
|
25
|
+
lowerRightX?: string | number
|
|
26
|
+
/** Lower-right corner Y coordinate (WCS) */
|
|
27
|
+
lowerRightY?: string | number
|
|
28
|
+
/** Lower-right corner Z coordinate (WCS) */
|
|
29
|
+
lowerRightZ?: string | number
|
|
30
|
+
|
|
31
|
+
/** Object type (1=Link, 2=Embedded, 3=Static) */
|
|
32
|
+
objectType?: string | number
|
|
33
|
+
/** Tile mode descriptor (0=Model space, 1=Paper space) */
|
|
34
|
+
tile?: string | number
|
|
35
|
+
|
|
36
|
+
/** Length of binary data */
|
|
37
|
+
length?: string | number
|
|
38
|
+
/** Binary data (concatenated from multiple 310 codes) */
|
|
39
|
+
data: string
|
|
40
|
+
}
|
package/src/types/options.ts
CHANGED
|
@@ -4,9 +4,57 @@ export interface ToPolylinesOptions {
|
|
|
4
4
|
interpolationsPerSplineSegment?: number
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
+
export interface ToJsonOptions {
|
|
8
|
+
/** Pretty-print JSON output (defaults to false). */
|
|
9
|
+
pretty?: boolean
|
|
10
|
+
/** Indentation spaces when pretty-printing (defaults to 2). */
|
|
11
|
+
space?: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Viewport percentage controls for DIMENSION autoScale.
|
|
16
|
+
*
|
|
17
|
+
* Each value is a percentage (0..100) of the viewport minimum dimension.
|
|
18
|
+
*/
|
|
19
|
+
export interface DimensionAutoScaleViewportPercentages {
|
|
20
|
+
/** Arrowhead marker size (markerWidth/markerHeight) */
|
|
21
|
+
arrowSize?: number
|
|
22
|
+
/** Text height (`font-size`) */
|
|
23
|
+
textHeight?: number
|
|
24
|
+
/** Extension line offset from the measured points */
|
|
25
|
+
extLineOffset?: number
|
|
26
|
+
/** Extension line overshoot beyond the dimension line */
|
|
27
|
+
extLineExtension?: number
|
|
28
|
+
}
|
|
29
|
+
|
|
7
30
|
export interface ToSVGOptions {
|
|
8
31
|
width?: number
|
|
9
32
|
height?: number
|
|
33
|
+
dimension?: {
|
|
34
|
+
/**
|
|
35
|
+
* Automatically scale DIMENSION arrow size, extension endpoints, and
|
|
36
|
+
* text height estimates based on the SVG viewport size.
|
|
37
|
+
*/
|
|
38
|
+
autoScale?: boolean
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Viewport reference size used by DIMENSION autoScale.
|
|
42
|
+
* Scale factor is: min(viewBoxWidth, viewBoxHeight) / autoScaleViewportReference.
|
|
43
|
+
* Default: 40.
|
|
44
|
+
*/
|
|
45
|
+
autoScaleViewportReference?: number
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Per-element viewport-percentage overrides for DIMENSION autoScale.
|
|
49
|
+
*
|
|
50
|
+
* When provided (and `autoScale` is enabled), these values set the final
|
|
51
|
+
* sizes directly as a percentage of the viewport minimum dimension:
|
|
52
|
+
* `size = min(viewBoxWidth, viewBoxHeight) * (percent / 100)`.
|
|
53
|
+
*
|
|
54
|
+
* Percent values are expected in the `0..100` range.
|
|
55
|
+
*/
|
|
56
|
+
autoScaleViewportPercentages?: DimensionAutoScaleViewportPercentages
|
|
57
|
+
}
|
|
10
58
|
}
|
|
11
59
|
|
|
12
60
|
export interface Config {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// RAY entity type
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface RayEntity extends BaseEntity {
|
|
7
|
+
type: 'RAY'
|
|
8
|
+
/** Starting point for the ray. */
|
|
9
|
+
start: Point3D
|
|
10
|
+
/** Unit direction vector. */
|
|
11
|
+
direction: Point3D
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BaseEntity } from './base-entity'
|
|
2
|
+
|
|
3
|
+
export interface RegionEntity extends BaseEntity {
|
|
4
|
+
type: 'REGION'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* ACIS data payload (text form). This project currently parses and stores it,
|
|
8
|
+
* but does not attempt to interpret it.
|
|
9
|
+
*/
|
|
10
|
+
acisData?: string[]
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// SHAPE entity type
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface ShapeEntity extends BaseEntity {
|
|
7
|
+
type: 'SHAPE'
|
|
8
|
+
insertionPoint: Point3D
|
|
9
|
+
/** Shape name (from a loaded SHX shape file). */
|
|
10
|
+
name: string
|
|
11
|
+
/** Size in drawing units. */
|
|
12
|
+
size: number
|
|
13
|
+
rotation?: number
|
|
14
|
+
relativeXScale?: number
|
|
15
|
+
oblique?: number
|
|
16
|
+
thickness?: number
|
|
17
|
+
extrusionX?: number
|
|
18
|
+
extrusionY?: number
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BaseEntity } from './base-entity'
|
|
2
|
+
|
|
3
|
+
export interface TableEntity extends BaseEntity {
|
|
4
|
+
type: 'TABLE'
|
|
5
|
+
|
|
6
|
+
rows?: number
|
|
7
|
+
columns?: number
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Minimal extracted cell text (from group code 1).
|
|
11
|
+
* This is intentionally lossy; full TABLE semantics are not implemented.
|
|
12
|
+
*/
|
|
13
|
+
cellText?: string[]
|
|
14
|
+
}
|
package/src/types/tables.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// DXF Tables parsing types
|
|
2
2
|
|
|
3
3
|
import type { Point2D, Point3D } from './common'
|
|
4
|
+
import type { DXFTuple } from './dxf'
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Partial point for parsing (all coordinates optional)
|
|
@@ -116,6 +117,54 @@ export interface LayerInternal {
|
|
|
116
117
|
lineWeightEnum?: string | number
|
|
117
118
|
}
|
|
118
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Application ID (APPID) table entry
|
|
122
|
+
* Minimal internal representation during DXF parsing
|
|
123
|
+
*/
|
|
124
|
+
export interface AppIdInternal {
|
|
125
|
+
type: string
|
|
126
|
+
/** Application name */
|
|
127
|
+
name?: string | number
|
|
128
|
+
/** Standard flags (bit-coded) */
|
|
129
|
+
flags?: string | number
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Block Record (BLOCK_RECORD) table entry
|
|
134
|
+
* Minimal internal representation during DXF parsing
|
|
135
|
+
*/
|
|
136
|
+
export interface BlockRecordInternal {
|
|
137
|
+
type: string
|
|
138
|
+
/** Block record name */
|
|
139
|
+
name?: string | number
|
|
140
|
+
/** Standard flags (bit-coded) */
|
|
141
|
+
flags?: string | number
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* User Coordinate System (UCS) table entry
|
|
146
|
+
* Minimal internal representation during DXF parsing
|
|
147
|
+
*/
|
|
148
|
+
export interface UcsInternal {
|
|
149
|
+
type: string
|
|
150
|
+
/** UCS name */
|
|
151
|
+
name?: string | number
|
|
152
|
+
/** Standard flags (bit-coded) */
|
|
153
|
+
flags?: string | number
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* View (VIEW) table entry
|
|
158
|
+
* Minimal internal representation during DXF parsing
|
|
159
|
+
*/
|
|
160
|
+
export interface ViewInternal {
|
|
161
|
+
type: string
|
|
162
|
+
/** View name */
|
|
163
|
+
name?: string | number
|
|
164
|
+
/** Standard flags (bit-coded) */
|
|
165
|
+
flags?: string | number
|
|
166
|
+
}
|
|
167
|
+
|
|
119
168
|
/**
|
|
120
169
|
* Text Style (STYLE) table entry
|
|
121
170
|
* Internal representation during DXF parsing
|
|
@@ -408,7 +457,118 @@ export interface DimStyleInternal {
|
|
|
408
457
|
/**
|
|
409
458
|
* DXF Objects section result
|
|
410
459
|
*/
|
|
460
|
+
export interface DictionaryObject {
|
|
461
|
+
type: 'DICTIONARY'
|
|
462
|
+
handle?: string | number
|
|
463
|
+
ownerHandle?: string | number
|
|
464
|
+
entries: Record<string, string>
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export interface XRecordObject {
|
|
468
|
+
type: 'XRECORD'
|
|
469
|
+
handle?: string | number
|
|
470
|
+
ownerHandle?: string | number
|
|
471
|
+
|
|
472
|
+
/** Raw tuples for downstream consumers (excluding the initial 0/XRECORD tuple). */
|
|
473
|
+
tuples: DXFTuple[]
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export interface ImageDefObject {
|
|
477
|
+
type: 'IMAGEDEF'
|
|
478
|
+
handle?: string | number
|
|
479
|
+
|
|
480
|
+
/** Soft-pointer ID/handle to the ACAD_IMAGE_dict dictionary (when present). */
|
|
481
|
+
ownerHandle?: string | number
|
|
482
|
+
|
|
483
|
+
/** File name of the referenced image. */
|
|
484
|
+
fileName?: string
|
|
485
|
+
|
|
486
|
+
/** Image size in pixels (when available). */
|
|
487
|
+
pixelSizeX?: number
|
|
488
|
+
pixelSizeY?: number
|
|
489
|
+
|
|
490
|
+
/** Raw tuples for downstream consumers (excluding the initial 0/IMAGEDEF tuple). */
|
|
491
|
+
tuples: DXFTuple[]
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export interface ImageDefReactorObject {
|
|
495
|
+
type: 'IMAGEDEF_REACTOR'
|
|
496
|
+
handle?: string | number
|
|
497
|
+
|
|
498
|
+
/** Object ID/handle for the associated IMAGE entity (when present). */
|
|
499
|
+
imageHandle?: string | number
|
|
500
|
+
|
|
501
|
+
/** Raw tuples for downstream consumers (excluding the initial 0/IMAGEDEF_REACTOR tuple). */
|
|
502
|
+
tuples: DXFTuple[]
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export type UnderlayDefinitionObjectType =
|
|
506
|
+
| 'UNDERLAYDEFINITION'
|
|
507
|
+
| 'PDFDEFINITION'
|
|
508
|
+
| 'DWFDEFINITION'
|
|
509
|
+
| 'DGNDEFINITION'
|
|
510
|
+
|
|
511
|
+
export interface UnderlayDefinitionObject {
|
|
512
|
+
type: UnderlayDefinitionObjectType
|
|
513
|
+
handle?: string | number
|
|
514
|
+
|
|
515
|
+
/** Soft-pointer ID/handle to the owning dictionary (when present). */
|
|
516
|
+
ownerHandle?: string | number
|
|
517
|
+
|
|
518
|
+
/** File name or path of the referenced underlay. */
|
|
519
|
+
fileName?: string
|
|
520
|
+
|
|
521
|
+
/** Underlay name within the file (e.g., sheet name). */
|
|
522
|
+
underlayName?: string
|
|
523
|
+
|
|
524
|
+
/** Raw tuples for downstream consumers (excluding the initial 0/<TYPE> tuple). */
|
|
525
|
+
tuples: DXFTuple[]
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
export interface DimAssocObject {
|
|
529
|
+
type: 'DIMASSOC'
|
|
530
|
+
handle?: string | number
|
|
531
|
+
|
|
532
|
+
/** Soft-pointer ID/handle to the owning dictionary (when present). */
|
|
533
|
+
ownerHandle?: string | number
|
|
534
|
+
|
|
535
|
+
/** Raw tuples for downstream consumers (excluding the initial 0/DIMASSOC tuple). */
|
|
536
|
+
tuples: DXFTuple[]
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
export interface FieldObject {
|
|
540
|
+
type: 'FIELD'
|
|
541
|
+
handle?: string | number
|
|
542
|
+
|
|
543
|
+
/** Soft-pointer ID/handle to the owning dictionary (when present). */
|
|
544
|
+
ownerHandle?: string | number
|
|
545
|
+
|
|
546
|
+
/** Raw tuples for downstream consumers (excluding the initial 0/FIELD tuple). */
|
|
547
|
+
tuples: DXFTuple[]
|
|
548
|
+
}
|
|
549
|
+
|
|
411
550
|
export interface ParsedObjects {
|
|
412
551
|
/** Layout objects */
|
|
413
552
|
layouts: LayoutInternal[]
|
|
553
|
+
|
|
554
|
+
/** DICTIONARY objects keyed by handle */
|
|
555
|
+
dictionaries?: Record<string, DictionaryObject>
|
|
556
|
+
|
|
557
|
+
/** XRECORD objects keyed by handle */
|
|
558
|
+
xRecords?: Record<string, XRecordObject>
|
|
559
|
+
|
|
560
|
+
/** IMAGEDEF objects keyed by handle */
|
|
561
|
+
imageDefs?: Record<string, ImageDefObject>
|
|
562
|
+
|
|
563
|
+
/** IMAGEDEF_REACTOR objects keyed by handle */
|
|
564
|
+
imageDefReactors?: Record<string, ImageDefReactorObject>
|
|
565
|
+
|
|
566
|
+
/** UNDERLAYDEFINITION objects keyed by handle */
|
|
567
|
+
underlayDefinitions?: Record<string, UnderlayDefinitionObject>
|
|
568
|
+
|
|
569
|
+
/** DIMASSOC objects keyed by handle */
|
|
570
|
+
dimAssocs?: Record<string, DimAssocObject>
|
|
571
|
+
|
|
572
|
+
/** FIELD objects keyed by handle */
|
|
573
|
+
fields?: Record<string, FieldObject>
|
|
414
574
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// TOLERANCE entity type (feature control frame)
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface ToleranceEntity extends BaseEntity {
|
|
7
|
+
type: 'TOLERANCE'
|
|
8
|
+
|
|
9
|
+
/** Insertion point (WCS). */
|
|
10
|
+
insertionPoint: Point3D
|
|
11
|
+
|
|
12
|
+
/** Raw tolerance string (may include control codes like %%v). */
|
|
13
|
+
text?: string
|
|
14
|
+
|
|
15
|
+
/** Dimension style name (group code 3). */
|
|
16
|
+
dimensionStyleName?: string
|
|
17
|
+
|
|
18
|
+
/** X-axis direction vector (group codes 11/21/31). */
|
|
19
|
+
xAxisDirection?: Point3D
|
|
20
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// TRACE entity type
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface TraceEntity extends BaseEntity {
|
|
7
|
+
type: 'TRACE'
|
|
8
|
+
|
|
9
|
+
/** Four corner points (10/20/30, 11/21/31, 12/22/32, 13/23/33). */
|
|
10
|
+
corners: Point3D[]
|
|
11
|
+
|
|
12
|
+
/** Optional thickness (39). */
|
|
13
|
+
thickness?: number
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// UNDERLAY entity types (DWFUNDERLAY / DGNUNDERLAY / PDFUNDERLAY)
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface UnderlayReferenceEntityBase extends BaseEntity {
|
|
7
|
+
insertionPoint: Point3D
|
|
8
|
+
scale: Point3D
|
|
9
|
+
rotation?: number
|
|
10
|
+
normal?: Point3D
|
|
11
|
+
|
|
12
|
+
/** Hard reference to UNDERLAYDEFINITION object. */
|
|
13
|
+
underlayDefinitionHandle?: string
|
|
14
|
+
|
|
15
|
+
/** Display properties bitmask. */
|
|
16
|
+
flags?: number
|
|
17
|
+
|
|
18
|
+
/** Contrast in range [0, 100]. */
|
|
19
|
+
contrast?: number
|
|
20
|
+
|
|
21
|
+
/** Fade in range [0, 100]. */
|
|
22
|
+
fade?: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface DwfUnderlayEntity extends UnderlayReferenceEntityBase {
|
|
26
|
+
type: 'DWFUNDERLAY'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface DgnUnderlayEntity extends UnderlayReferenceEntityBase {
|
|
30
|
+
type: 'DGNUNDERLAY'
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface PdfUnderlayEntity extends UnderlayReferenceEntityBase {
|
|
34
|
+
type: 'PDFUNDERLAY'
|
|
35
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// WIPEOUT entity type
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point2D, Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface WipeoutEntity extends BaseEntity {
|
|
7
|
+
type: 'WIPEOUT'
|
|
8
|
+
|
|
9
|
+
insertionPoint: Point3D
|
|
10
|
+
uVector: Point3D
|
|
11
|
+
vVector: Point3D
|
|
12
|
+
|
|
13
|
+
clipBoundaryType?: 1 | 2
|
|
14
|
+
clipBoundaryVertices?: Point2D[]
|
|
15
|
+
|
|
16
|
+
displayProperties?: number
|
|
17
|
+
clippingState?: 0 | 1
|
|
18
|
+
classVersion?: number
|
|
19
|
+
imageSizePixels?: { u: number; v: number }
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// XLINE entity type
|
|
2
|
+
|
|
3
|
+
import type { BaseEntity } from './base-entity'
|
|
4
|
+
import type { Point3D } from './common'
|
|
5
|
+
|
|
6
|
+
export interface XLineEntity extends BaseEntity {
|
|
7
|
+
type: 'XLINE'
|
|
8
|
+
/** Base point for the infinite line. */
|
|
9
|
+
basePoint: Point3D
|
|
10
|
+
/** Unit direction vector. */
|
|
11
|
+
direction: Point3D
|
|
12
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default function escapeXmlText(value: string): string {
|
|
2
|
+
// Escape text for use inside XML/SVG text nodes.
|
|
3
|
+
// Keep it small and dependency-free.
|
|
4
|
+
return value
|
|
5
|
+
.split('&').join('&')
|
|
6
|
+
.split('<').join('<')
|
|
7
|
+
.split('>').join('>')
|
|
8
|
+
.split('"').join('"')
|
|
9
|
+
.split("'").join(''')
|
|
10
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const http = require('node:http')
|
|
2
|
+
const { createReadStream, existsSync, statSync } = require('node:fs')
|
|
3
|
+
const { extname, join, normalize, resolve } = require('node:path')
|
|
4
|
+
|
|
5
|
+
const projectRoot = resolve(__dirname, '..')
|
|
6
|
+
const port = Number(process.env.PORT || 4173)
|
|
7
|
+
|
|
8
|
+
const harnessHtmlPath = join(projectRoot, 'test', 'browser', 'harness.html')
|
|
9
|
+
const distBundlePath = join(projectRoot, 'dist', 'dxf.js')
|
|
10
|
+
const fixturesDir = join(projectRoot, 'test', 'resources')
|
|
11
|
+
|
|
12
|
+
function sendText(res, statusCode, text, contentType = 'text/plain; charset=utf-8') {
|
|
13
|
+
res.writeHead(statusCode, { 'Content-Type': contentType })
|
|
14
|
+
res.end(text)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function contentTypeForPath(filePath) {
|
|
18
|
+
const ext = extname(filePath).toLowerCase()
|
|
19
|
+
switch (ext) {
|
|
20
|
+
case '.html':
|
|
21
|
+
return 'text/html; charset=utf-8'
|
|
22
|
+
case '.js':
|
|
23
|
+
return 'text/javascript; charset=utf-8'
|
|
24
|
+
case '.dxf':
|
|
25
|
+
return 'text/plain; charset=utf-8'
|
|
26
|
+
case '.json':
|
|
27
|
+
return 'application/json; charset=utf-8'
|
|
28
|
+
default:
|
|
29
|
+
return 'application/octet-stream'
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function safeJoin(baseDir, requestedPath) {
|
|
34
|
+
const cleaned = requestedPath.replace(/^\/+/, '')
|
|
35
|
+
const target = normalize(join(baseDir, cleaned))
|
|
36
|
+
const resolvedBase = resolve(baseDir)
|
|
37
|
+
const resolvedTarget = resolve(target)
|
|
38
|
+
if (!resolvedTarget.startsWith(resolvedBase + '/')) {
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
41
|
+
return resolvedTarget
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const server = http.createServer((req, res) => {
|
|
45
|
+
const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`)
|
|
46
|
+
const pathname = url.pathname
|
|
47
|
+
|
|
48
|
+
if (pathname === '/' || pathname === '/harness') {
|
|
49
|
+
if (!existsSync(harnessHtmlPath)) {
|
|
50
|
+
return sendText(res, 500, 'Missing test/browser/harness.html')
|
|
51
|
+
}
|
|
52
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' })
|
|
53
|
+
return createReadStream(harnessHtmlPath).pipe(res)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (pathname === '/dist/dxf.js') {
|
|
57
|
+
if (!existsSync(distBundlePath)) {
|
|
58
|
+
return sendText(
|
|
59
|
+
res,
|
|
60
|
+
500,
|
|
61
|
+
'Missing dist/dxf.js. Run `yarn dist` before running browser tests.'
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
res.writeHead(200, { 'Content-Type': 'text/javascript; charset=utf-8' })
|
|
65
|
+
return createReadStream(distBundlePath).pipe(res)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (pathname.startsWith('/fixtures/')) {
|
|
69
|
+
const fixtureName = pathname.slice('/fixtures/'.length)
|
|
70
|
+
const fixturePath = safeJoin(fixturesDir, fixtureName)
|
|
71
|
+
if (!fixturePath) {
|
|
72
|
+
return sendText(res, 400, 'Invalid fixture path')
|
|
73
|
+
}
|
|
74
|
+
if (!existsSync(fixturePath) || !statSync(fixturePath).isFile()) {
|
|
75
|
+
return sendText(res, 404, 'Fixture not found')
|
|
76
|
+
}
|
|
77
|
+
res.writeHead(200, { 'Content-Type': contentTypeForPath(fixturePath) })
|
|
78
|
+
return createReadStream(fixturePath).pipe(res)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return sendText(res, 404, 'Not found')
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
server.listen(port, () => {
|
|
85
|
+
// Used by Playwright webServer readiness checks.
|
|
86
|
+
console.log(`Browser test server listening on http://localhost:${port}`)
|
|
87
|
+
})
|