dxf-json 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.
Files changed (167) hide show
  1. package/.github/FUNDING.yml +1 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. package/.github/ISSUE_TEMPLATE/custom.md +10 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. package/.github/pull_request_template.md +23 -0
  6. package/.github/workflows/npm-publish.yml +55 -0
  7. package/.swcrc +8 -0
  8. package/LICENSE +674 -0
  9. package/README.md +567 -0
  10. package/jest.config.js +20 -0
  11. package/package.json +56 -0
  12. package/src/consts/block.ts +22 -0
  13. package/src/consts/color.ts +6 -0
  14. package/src/consts/config.ts +2 -0
  15. package/src/consts/dimension.ts +69 -0
  16. package/src/consts/hatch.ts +52 -0
  17. package/src/consts/header.ts +10 -0
  18. package/src/consts/index.ts +9 -0
  19. package/src/consts/lineweight.ts +5 -0
  20. package/src/consts/measurement.ts +4 -0
  21. package/src/consts/obscuredLineTypes.ts +21 -0
  22. package/src/consts/scene.ts +2 -0
  23. package/src/consts/viewport.ts +62 -0
  24. package/src/index.ts +6 -0
  25. package/src/parser/AutoCadColorIndex.ts +265 -0
  26. package/src/parser/DxfArrayScanner.ts +161 -0
  27. package/src/parser/DxfParser.ts +108 -0
  28. package/src/parser/ParseHelpers.ts +124 -0
  29. package/src/parser/blocks/blocks.test.ts +97 -0
  30. package/src/parser/blocks/index.ts +88 -0
  31. package/src/parser/blocks/types.ts +15 -0
  32. package/src/parser/entities/arc/index.ts +2 -0
  33. package/src/parser/entities/arc/parser.ts +67 -0
  34. package/src/parser/entities/arc/types.ts +13 -0
  35. package/src/parser/entities/attdef/consts.ts +12 -0
  36. package/src/parser/entities/attdef/index.ts +3 -0
  37. package/src/parser/entities/attdef/parser.ts +119 -0
  38. package/src/parser/entities/attdef/types.ts +19 -0
  39. package/src/parser/entities/attribute/consts.ts +6 -0
  40. package/src/parser/entities/attribute/index.ts +3 -0
  41. package/src/parser/entities/attribute/parser.ts +198 -0
  42. package/src/parser/entities/attribute/types.ts +31 -0
  43. package/src/parser/entities/circle/index.ts +2 -0
  44. package/src/parser/entities/circle/parser.ts +58 -0
  45. package/src/parser/entities/circle/types.ts +11 -0
  46. package/src/parser/entities/dimension/common.ts +98 -0
  47. package/src/parser/entities/dimension/index.ts +24 -0
  48. package/src/parser/entities/dimension/types.ts +65 -0
  49. package/src/parser/entities/ellipse/index.ts +2 -0
  50. package/src/parser/entities/ellipse/parser.ts +66 -0
  51. package/src/parser/entities/ellipse/types.ts +13 -0
  52. package/src/parser/entities/entities.test.ts +86 -0
  53. package/src/parser/entities/hatch/boundaryPathData/edge.ts +190 -0
  54. package/src/parser/entities/hatch/boundaryPathData/index.ts +27 -0
  55. package/src/parser/entities/hatch/boundaryPathData/polyline.ts +43 -0
  56. package/src/parser/entities/hatch/boundaryPathData/shared.ts +16 -0
  57. package/src/parser/entities/hatch/index.ts +189 -0
  58. package/src/parser/entities/hatch/patternData.ts +57 -0
  59. package/src/parser/entities/hatch/types/boundaryPath.ts +72 -0
  60. package/src/parser/entities/hatch/types/definitionLine.ts +14 -0
  61. package/src/parser/entities/hatch/types/hatch.ts +47 -0
  62. package/src/parser/entities/hatch/types/index.ts +3 -0
  63. package/src/parser/entities/index.ts +87 -0
  64. package/src/parser/entities/insert/index.ts +2 -0
  65. package/src/parser/entities/insert/parser.ts +106 -0
  66. package/src/parser/entities/insert/types.ts +19 -0
  67. package/src/parser/entities/leader/consts.ts +6 -0
  68. package/src/parser/entities/leader/index.ts +3 -0
  69. package/src/parser/entities/leader/parser.ts +119 -0
  70. package/src/parser/entities/leader/types.ts +24 -0
  71. package/src/parser/entities/line/index.ts +2 -0
  72. package/src/parser/entities/line/parser.ts +55 -0
  73. package/src/parser/entities/line/types.ts +11 -0
  74. package/src/parser/entities/lwpolyline/consts.ts +4 -0
  75. package/src/parser/entities/lwpolyline/index.ts +3 -0
  76. package/src/parser/entities/lwpolyline/parser.ts +122 -0
  77. package/src/parser/entities/lwpolyline/types.ts +21 -0
  78. package/src/parser/entities/mtext/consts.ts +5 -0
  79. package/src/parser/entities/mtext/index.ts +3 -0
  80. package/src/parser/entities/mtext/parser.ts +195 -0
  81. package/src/parser/entities/mtext/types.ts +34 -0
  82. package/src/parser/entities/point/index.ts +2 -0
  83. package/src/parser/entities/point/parser.ts +60 -0
  84. package/src/parser/entities/point/types.ts +10 -0
  85. package/src/parser/entities/polyline/consts.ts +17 -0
  86. package/src/parser/entities/polyline/index.ts +3 -0
  87. package/src/parser/entities/polyline/parser.ts +126 -0
  88. package/src/parser/entities/polyline/types.ts +20 -0
  89. package/src/parser/entities/section/index.ts +2 -0
  90. package/src/parser/entities/section/parser.ts +104 -0
  91. package/src/parser/entities/section/types.ts +20 -0
  92. package/src/parser/entities/shared.ts +166 -0
  93. package/src/parser/entities/solid/index.ts +2 -0
  94. package/src/parser/entities/solid/parser.ts +56 -0
  95. package/src/parser/entities/solid/types.ts +10 -0
  96. package/src/parser/entities/spline/consts.ts +8 -0
  97. package/src/parser/entities/spline/index.ts +3 -0
  98. package/src/parser/entities/spline/parser.ts +121 -0
  99. package/src/parser/entities/spline/types.ts +22 -0
  100. package/src/parser/entities/text/consts.ts +21 -0
  101. package/src/parser/entities/text/index.ts +3 -0
  102. package/src/parser/entities/text/parser.ts +117 -0
  103. package/src/parser/entities/text/types.ts +21 -0
  104. package/src/parser/entities/vertex/consts.ts +10 -0
  105. package/src/parser/entities/vertex/index.ts +3 -0
  106. package/src/parser/entities/vertex/parser.ts +90 -0
  107. package/src/parser/entities/vertex/types.ts +17 -0
  108. package/src/parser/entities/viewport/index.ts +178 -0
  109. package/src/parser/entities/viewport/types.ts +58 -0
  110. package/src/parser/filterDummyBlocks.ts +49 -0
  111. package/src/parser/header/index.ts +30 -0
  112. package/src/parser/objects/common.ts +55 -0
  113. package/src/parser/objects/dictionary.ts +61 -0
  114. package/src/parser/objects/index.ts +45 -0
  115. package/src/parser/objects/layout.ts +136 -0
  116. package/src/parser/objects/plotSettings.ts +231 -0
  117. package/src/parser/objects/treefy.ts +53 -0
  118. package/src/parser/objects/types.ts +17 -0
  119. package/src/parser/shared/index.ts +21 -0
  120. package/src/parser/shared/parsePoint.ts +37 -0
  121. package/src/parser/shared/parserGenerator.test.ts +164 -0
  122. package/src/parser/shared/parserGenerator.ts +180 -0
  123. package/src/parser/shared/xdata/index.ts +3 -0
  124. package/src/parser/shared/xdata/interpreter.test.ts +85 -0
  125. package/src/parser/shared/xdata/interpreter.ts +65 -0
  126. package/src/parser/shared/xdata/parser.test.ts +66 -0
  127. package/src/parser/shared/xdata/parser.ts +140 -0
  128. package/src/parser/shared/xdata/types.ts +22 -0
  129. package/src/parser/tables/blockRecord/index.ts +2 -0
  130. package/src/parser/tables/blockRecord/parser.ts +49 -0
  131. package/src/parser/tables/blockRecord/types.ts +11 -0
  132. package/src/parser/tables/dimStyle/consts.ts +428 -0
  133. package/src/parser/tables/dimStyle/index.ts +3 -0
  134. package/src/parser/tables/dimStyle/parser.ts +37 -0
  135. package/src/parser/tables/dimStyle/types.ts +164 -0
  136. package/src/parser/tables/index.ts +2 -0
  137. package/src/parser/tables/layer/index.ts +2 -0
  138. package/src/parser/tables/layer/parser.ts +58 -0
  139. package/src/parser/tables/layer/types.ts +14 -0
  140. package/src/parser/tables/ltype/consts.ts +6 -0
  141. package/src/parser/tables/ltype/index.ts +3 -0
  142. package/src/parser/tables/ltype/parser.ts +110 -0
  143. package/src/parser/tables/ltype/types.ts +23 -0
  144. package/src/parser/tables/parser.ts +100 -0
  145. package/src/parser/tables/shared.ts +32 -0
  146. package/src/parser/tables/style/index.ts +2 -0
  147. package/src/parser/tables/style/parser.ts +70 -0
  148. package/src/parser/tables/style/types.ts +15 -0
  149. package/src/parser/tables/types.ts +15 -0
  150. package/src/parser/tables/vport/index.ts +2 -0
  151. package/src/parser/tables/vport/parser.ts +205 -0
  152. package/src/parser/tables/vport/types.ts +48 -0
  153. package/src/parser/types.ts +30 -0
  154. package/src/types/color.ts +5 -0
  155. package/src/types/dxfHeader.ts +21 -0
  156. package/src/types/entity.ts +7 -0
  157. package/src/types/index.ts +30 -0
  158. package/src/utils/binarySearch.ts +20 -0
  159. package/src/utils/disjointSet.ts +52 -0
  160. package/src/utils/flooding.ts +37 -0
  161. package/src/utils/functional.ts +124 -0
  162. package/src/utils/graph.ts +53 -0
  163. package/src/utils/index.ts +102 -0
  164. package/src/utils/queue.ts +77 -0
  165. package/src/utils/triangle.ts +28 -0
  166. package/tsconfig.json +34 -0
  167. package/webpack.config.js +46 -0
@@ -0,0 +1,198 @@
1
+ import type DxfArrayScanner from '../../DxfArrayScanner';
2
+ import type { ScannerGroup } from '../../DxfArrayScanner';
3
+ import {
4
+ Abort,
5
+ createParser,
6
+ DXFParserSnippet,
7
+ Identity,
8
+ PointParser,
9
+ ToBoolean,
10
+ } from '../../shared/parserGenerator';
11
+ import { isMatched } from '../../shared';
12
+ import { CommonEntitySnippets } from '../shared';
13
+ import { MTextEntityParserSnippets } from '../mtext';
14
+ import { AttributeEntity } from './types';
15
+
16
+ const DefaultAttributeEntity = {
17
+ thickness: 0,
18
+ rotation: 0,
19
+ scale: 1,
20
+ obliqueAngle: 0,
21
+ textStyle: 'STANDARD',
22
+ textGenerationFlag: 0,
23
+ horizontalJustification: 0,
24
+ verticalJustification: 0,
25
+ extrusionDirection: { x: 0, y: 0, z: 1 },
26
+ };
27
+
28
+ const AttributeSnippets: DXFParserSnippet[] = [
29
+ ...MTextEntityParserSnippets.slice(
30
+ MTextEntityParserSnippets.findIndex(
31
+ ({ name }) => name === 'columnType',
32
+ ),
33
+ MTextEntityParserSnippets.findIndex(
34
+ ({ name }) => name === 'subclassMarker',
35
+ ) + 1,
36
+ ),
37
+ // 67, 8은 common에 있음
38
+ {
39
+ code: 100, // AcDbEntity
40
+ },
41
+ {
42
+ // MTEXT가 필수로 따라오지 않는 경우도 있기 때문에 이 경우 탈출 필요
43
+ code: 0,
44
+ parser(curr) {
45
+ if (!isMatched(curr, 0, 'MTEXT')) return Abort;
46
+ return undefined;
47
+ },
48
+ },
49
+ {
50
+ code: 2,
51
+ name: 'definitionTag',
52
+ parser: Identity,
53
+ },
54
+ {
55
+ code: 40,
56
+ name: 'annotationScale',
57
+ parser: Identity,
58
+ },
59
+ {
60
+ code: 10,
61
+ name: 'alignmentPoint',
62
+ parser: PointParser,
63
+ },
64
+ {
65
+ code: 340,
66
+ name: 'secondaryAttributesHardId',
67
+ parser: Identity,
68
+ },
69
+ {
70
+ code: 70,
71
+ name: 'numberOfSecondaryAttributes',
72
+ parser: Identity,
73
+ },
74
+ {
75
+ code: 70,
76
+ name: 'isReallyLocked',
77
+ parser: ToBoolean,
78
+ },
79
+ {
80
+ code: 70,
81
+ name: 'mtextFlag',
82
+ parser: Identity,
83
+ },
84
+ {
85
+ code: 280,
86
+ name: 'isDuplicatedEntriesKeep',
87
+ parser: ToBoolean,
88
+ },
89
+ {
90
+ code: 100, // AcDbXRecord
91
+ },
92
+ {
93
+ code: 280,
94
+ name: 'lockPositionFlag',
95
+ parser: ToBoolean,
96
+ },
97
+ {
98
+ code: 210,
99
+ name: 'extrusionDirection',
100
+ parser: PointParser,
101
+ },
102
+ {
103
+ code: 11,
104
+ name: 'alignmentPoint',
105
+ parser: PointParser,
106
+ },
107
+ {
108
+ code: 74,
109
+ name: 'verticalJustification',
110
+ parser: Identity,
111
+ },
112
+ {
113
+ code: 72,
114
+ name: 'horizontalJustification',
115
+ parser: Identity,
116
+ },
117
+ {
118
+ code: 71,
119
+ name: 'textGenerationFlag', // attachmentPoint
120
+ parser: Identity,
121
+ },
122
+ {
123
+ code: 7,
124
+ name: 'textStyle',
125
+ parser: Identity,
126
+ },
127
+ {
128
+ code: 51,
129
+ name: 'obliqueAngle',
130
+ parser: Identity,
131
+ },
132
+ {
133
+ code: 41,
134
+ name: 'scale',
135
+ parser: Identity,
136
+ },
137
+ {
138
+ code: 50,
139
+ name: 'rotation',
140
+ parser: Identity,
141
+ },
142
+ {
143
+ code: 73, // 미사용
144
+ },
145
+ {
146
+ code: 70,
147
+ name: 'attributeFlag',
148
+ parser: Identity,
149
+ },
150
+ {
151
+ code: 2,
152
+ name: 'tag',
153
+ parser: Identity,
154
+ },
155
+ {
156
+ code: 280, // version number, 미사용
157
+ },
158
+ {
159
+ code: 100, // AcDbAttribute
160
+ name: 'subclassMarker',
161
+ parser: Identity,
162
+ },
163
+ {
164
+ code: 1,
165
+ name: 'text',
166
+ parser: Identity,
167
+ },
168
+ {
169
+ code: 40,
170
+ name: 'textHeight',
171
+ parser: Identity,
172
+ },
173
+ {
174
+ code: 10,
175
+ name: 'startPoint',
176
+ parser: PointParser,
177
+ },
178
+ {
179
+ code: 39,
180
+ name: 'thickness',
181
+ parser: Identity,
182
+ },
183
+ {
184
+ code: 100, // AcDbText
185
+ },
186
+ ...CommonEntitySnippets,
187
+ ];
188
+
189
+ export class AttributeEntityParser {
190
+ static ForEntityName = 'ATTRIB';
191
+ private parser = createParser(AttributeSnippets, DefaultAttributeEntity);
192
+
193
+ parseEntity(scanner: DxfArrayScanner, curr: ScannerGroup) {
194
+ const entity = {} as any;
195
+ this.parser(curr, scanner, entity);
196
+ return entity as AttributeEntity;
197
+ }
198
+ }
@@ -0,0 +1,31 @@
1
+ import type { Point3D } from '../../../types';
2
+ import type { CommonDxfEntity } from '../shared';
3
+
4
+ export interface AttributeEntity extends CommonDxfEntity {
5
+ type: 'ATTRIB';
6
+ subclassMarker: 'AcDbAttribute';
7
+ thickness: number;
8
+ startPoint: Point3D;
9
+ textHeight: number;
10
+ text: string;
11
+ tag: string; // cannot contain spaces
12
+ attributeFlag: number;
13
+ lineSpacing?: number;
14
+ rotation: number;
15
+ scale: number;
16
+ obliqueAngle: number;
17
+ textStyle: string;
18
+ textGenerationFlag: number;
19
+ horizontalJustification: number;
20
+ verticalJustification: number;
21
+ extrusionDirection: Point3D;
22
+ lockPositionFlag: boolean;
23
+ isDuplicatedEntriesKeep?: boolean;
24
+ mtextFlag: 2 | 4;
25
+ isReallyLocked?: boolean;
26
+ numberOfSecondaryAttributes?: number;
27
+ secondaryAttributesHardId?: string;
28
+ alignmentPoint: Point3D;
29
+ annotationScale?: number;
30
+ definitionTag?: string;
31
+ }
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ export * from './parser';
@@ -0,0 +1,58 @@
1
+ import type DxfArrayScanner from '../../DxfArrayScanner';
2
+ import type { ScannerGroup } from '../../DxfArrayScanner';
3
+ import {
4
+ createParser,
5
+ DXFParserSnippet,
6
+ Identity,
7
+ PointParser,
8
+ } from '../../shared/parserGenerator';
9
+ import { CommonEntitySnippets } from '../shared';
10
+ import type { CircleEntity } from './types';
11
+
12
+ const DefaultCircleEntity = {
13
+ thickness: 0,
14
+ extrusionDirection: { x: 0, y: 0, z: 1 },
15
+ };
16
+
17
+ const CircleEntityParserSnippets: DXFParserSnippet[] = [
18
+ {
19
+ code: 210,
20
+ name: 'extrusionDirection',
21
+ parser: PointParser,
22
+ },
23
+ {
24
+ code: 40,
25
+ name: 'radius',
26
+ parser: Identity,
27
+ },
28
+ {
29
+ code: 10,
30
+ name: 'center',
31
+ parser: PointParser,
32
+ },
33
+ {
34
+ code: 39,
35
+ name: 'thickness',
36
+ parser: Identity,
37
+ },
38
+ {
39
+ code: 100,
40
+ name: 'subclassMarker',
41
+ parser: Identity,
42
+ },
43
+ ...CommonEntitySnippets,
44
+ ];
45
+
46
+ export class CircleEntityParser {
47
+ static ForEntityName = 'CIRCLE';
48
+ private parser = createParser(
49
+ CircleEntityParserSnippets,
50
+ DefaultCircleEntity,
51
+ );
52
+
53
+ parseEntity(scanner: DxfArrayScanner, curr: ScannerGroup) {
54
+ const entity = {} as any;
55
+ this.parser(curr, scanner, entity);
56
+ return entity as CircleEntity;
57
+ }
58
+ }
@@ -0,0 +1,11 @@
1
+ import type { Point3D } from '../../../types';
2
+ import type { CommonDxfEntity } from '../shared';
3
+
4
+ export interface CircleEntity extends CommonDxfEntity {
5
+ type: 'CIRCLE';
6
+ subclassMarker: 'AcDbCircle';
7
+ thickness: number;
8
+ center: Point3D;
9
+ radius: number;
10
+ extrusionDirection: Point3D;
11
+ }
@@ -0,0 +1,98 @@
1
+ import DxfArrayScanner, { ScannerGroup } from 'parser/DxfArrayScanner';
2
+ import { Point3D } from 'types';
3
+ import * as helpers from '../../ParseHelpers';
4
+ import { parsePoint } from '../../shared/parsePoint';
5
+ import { AlignedDimensionEntity, AngularDimensionEntity, DimensionEntity, DimensionEntityCommon, OrdinateDimensionEntity, RadialDiameterDimensionEntity } from './types';
6
+
7
+ /**
8
+ * @returns Return `false` if curr is not related to common dimension group
9
+ */
10
+ export function parseDimension(entity: DimensionEntity, curr: ScannerGroup, scanner: DxfArrayScanner) {
11
+ switch (curr.code) {
12
+ case 100:
13
+ entity.subclassMarker = curr.value;
14
+ break;
15
+ case 280:
16
+ entity.version = curr.value;
17
+ break;
18
+ case 2:
19
+ entity.name = curr.value;
20
+ break;
21
+ case 10:
22
+ entity.definitionPoint = parsePoint(scanner) as Point3D;
23
+ break;
24
+ case 11:
25
+ entity.textPoint = parsePoint(scanner) as Point3D;
26
+ break;
27
+ case 12:
28
+ // for aligned
29
+ (entity as AlignedDimensionEntity).insertionPoint = parsePoint(scanner) as Point3D;
30
+ break;
31
+ case 13:
32
+ // group 13 and 14 are subclass specific definition point
33
+ // for further information, look dxf dimension specification
34
+ (entity as AlignedDimensionEntity | AngularDimensionEntity | OrdinateDimensionEntity).subDefinitionPoint1 = parsePoint(scanner) as Point3D;
35
+ break;
36
+ case 14:
37
+ (entity as AlignedDimensionEntity | AngularDimensionEntity | OrdinateDimensionEntity).subDefinitionPoint2 = parsePoint(scanner) as Point3D;
38
+ break;
39
+ case 15:
40
+ // for angular, radial, diameter
41
+ (entity as AngularDimensionEntity | RadialDiameterDimensionEntity).centerPoint = parsePoint(scanner) as Point3D;
42
+ break;
43
+ case 16:
44
+ // for angular
45
+ (entity as AngularDimensionEntity).arcPoint = parsePoint(scanner) as Point3D;
46
+ break;
47
+ case 70:
48
+ entity.dimensionType = curr.value;
49
+ break;
50
+ case 71:
51
+ entity.attachmentPoint = curr.value;
52
+ break;
53
+ case 72:
54
+ entity.textLineSpacingStyle = curr.value;
55
+ break;
56
+ case 40:
57
+ // for radial, diameter
58
+ (entity as RadialDiameterDimensionEntity).leaderLength = curr.value;
59
+ break;
60
+ case 41:
61
+ entity.textLineSpacingFactor = curr.value;
62
+ break;
63
+ case 42:
64
+ entity.measurement = curr.value;
65
+ break;
66
+ case 1:
67
+ // if value === null or "<>", measurement should be drawn as text instead
68
+ // if value === "", text is suppressed.
69
+ // otherwise text should be drawn as is.
70
+ entity.text = curr.value;
71
+ break;
72
+ case 50:
73
+ // for aligned
74
+ (entity as AlignedDimensionEntity).rotationAngle = curr.value;
75
+ break;
76
+ case 52:
77
+ // for aligned
78
+ (entity as AlignedDimensionEntity).obliqueAngle = curr.value;
79
+ break;
80
+ case 53:
81
+ entity.textRotation = curr.value;
82
+ break;
83
+ case 51:
84
+ // This group value is the negative of the angle between the OCS X axis
85
+ // and the UCS X axis. It is always in the XY plane of the OCS
86
+ entity.ocsRotation = curr.value;
87
+ break;
88
+ case 210:
89
+ entity.extrusionDirection = parsePoint(scanner) as Point3D;
90
+ break;
91
+ case 3:
92
+ entity.styleName = curr.value;
93
+ break;
94
+ default:
95
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
96
+ break;
97
+ }
98
+ }
@@ -0,0 +1,24 @@
1
+ import DxfArrayScanner, { ScannerGroup } from 'parser/DxfArrayScanner';
2
+ import { isMatched } from '../../shared';
3
+ import { parseDimension } from './common';
4
+ import { DimensionEntity } from './types';
5
+
6
+ export default class DimensionParser {
7
+ static ForEntityName = 'DIMENSION';
8
+
9
+ parseEntity(scanner: DxfArrayScanner, curr: ScannerGroup) {
10
+ const entity = {} as DimensionEntity;
11
+
12
+ while (!isMatched(curr, 0, 'EOF')) {
13
+ if (curr.code === 0) {
14
+ scanner.rewind();
15
+ return entity;
16
+ }
17
+
18
+ parseDimension(entity, curr, scanner);
19
+ curr = scanner.next();
20
+ }
21
+
22
+ return entity;
23
+ }
24
+ }
@@ -0,0 +1,65 @@
1
+ import {
2
+ AttachmentPoint,
3
+ DimensionTextLineSpacing,
4
+ DimensionType,
5
+ } from '../../../consts';
6
+ import type { Point3D } from '../../../types';
7
+ import type { CommonDxfEntity } from '../shared';
8
+
9
+ export interface DimensionEntityCommon extends CommonDxfEntity {
10
+ type: 'DIMENSION';
11
+ subclassMarker: string;
12
+ handle: string;
13
+ version: string;
14
+ // Name of the block that contains the entities that make up the dimension picture
15
+ name: string;
16
+ definitionPoint: Point3D;
17
+ textPoint: Point3D;
18
+ dimensionType: DimensionType;
19
+ attachmentPoint: AttachmentPoint;
20
+ textLineSpacingStyle?: DimensionTextLineSpacing;
21
+ textLineSpacingFactor?: number;
22
+ measurement?: number;
23
+ text?: string;
24
+ textRotation?: number;
25
+ ocsRotation?: number;
26
+ extrusionDirection?: Point3D;
27
+ styleName: string;
28
+ }
29
+
30
+ export interface AlignedDimensionEntity extends DimensionEntityCommon {
31
+ subclassMarker: 'AcDbAlignedDimension' | 'AcDbRotatedDimension';
32
+ insertionPoint?: Point3D;
33
+ subDefinitionPoint1: Point3D;
34
+ subDefinitionPoint2: Point3D;
35
+ rotationAngle: number;
36
+ obliqueAngle: number;
37
+ }
38
+
39
+ export interface AngularDimensionEntity extends DimensionEntityCommon {
40
+ subclassMarker: 'AcDb3PointAngularDimension';
41
+ subDefinitionPoint1: Point3D;
42
+ subDefinitionPoint2: Point3D;
43
+ centerPoint: Point3D;
44
+ arcPoint: Point3D;
45
+ }
46
+
47
+ export interface OrdinateDimensionEntity extends DimensionEntityCommon {
48
+ subclassMarker: 'AcDbOrdinateDimension';
49
+ subDefinitionPoint1: Point3D;
50
+ subDefinitionPoint2: Point3D;
51
+ }
52
+
53
+ export interface RadialDiameterDimensionEntity extends DimensionEntityCommon {
54
+ subclassMarker: 'AcDbRadialDimension' | 'AcDbDiametricDimension';
55
+ centerPoint: Point3D;
56
+ leaderLength: number;
57
+ }
58
+
59
+ export type DimensionEntity = DimensionEntityCommon &
60
+ (
61
+ | Partial<AlignedDimensionEntity>
62
+ | Partial<AngularDimensionEntity>
63
+ | Partial<OrdinateDimensionEntity>
64
+ | Partial<RadialDiameterDimensionEntity>
65
+ );
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ export * from './parser';
@@ -0,0 +1,66 @@
1
+ import DxfArrayScanner, { ScannerGroup } from '../../DxfArrayScanner';
2
+ import {
3
+ createParser,
4
+ DXFParserSnippet,
5
+ Identity,
6
+ PointParser,
7
+ } from '../../shared/parserGenerator';
8
+ import { CommonEntitySnippets } from '../shared';
9
+ import { EllipseEntity } from './types';
10
+
11
+ const DefaultEllipseEnitty = {
12
+ extrusionDirection: { x: 0, y: 0, z: 1 },
13
+ };
14
+
15
+ const EllipseEntityParserSnippets: DXFParserSnippet[] = [
16
+ {
17
+ code: 42,
18
+ name: 'endAngle',
19
+ parser: Identity,
20
+ },
21
+ {
22
+ code: 41,
23
+ name: 'startAngle',
24
+ parser: Identity,
25
+ },
26
+ {
27
+ code: 40,
28
+ name: 'axisRatio',
29
+ parser: Identity,
30
+ },
31
+ {
32
+ code: 210,
33
+ name: 'extrusionDirection',
34
+ parser: PointParser,
35
+ },
36
+ {
37
+ code: 11,
38
+ name: 'majorAxisEndPoint',
39
+ parser: PointParser,
40
+ },
41
+ {
42
+ code: 10,
43
+ name: 'center',
44
+ parser: PointParser,
45
+ },
46
+ {
47
+ code: 100,
48
+ name: 'subclassMarker',
49
+ parser: Identity,
50
+ },
51
+ ...CommonEntitySnippets,
52
+ ];
53
+
54
+ export class EllipseEntityParser {
55
+ static ForEntityName = 'ELLIPSE';
56
+ private parser = createParser(
57
+ EllipseEntityParserSnippets,
58
+ DefaultEllipseEnitty,
59
+ );
60
+
61
+ parseEntity(scanner: DxfArrayScanner, curr: ScannerGroup) {
62
+ const entity = {} as any;
63
+ this.parser(curr, scanner, entity);
64
+ return entity as EllipseEntity;
65
+ }
66
+ }
@@ -0,0 +1,13 @@
1
+ import type { Point3D } from '../../../types';
2
+ import type { CommonDxfEntity } from '../shared';
3
+
4
+ export interface EllipseEntity extends CommonDxfEntity {
5
+ type: 'ELLIPSE';
6
+ subclassMarker: 'AcDbEllipse';
7
+ center: Point3D;
8
+ majorAxisEndPoint: Point3D;
9
+ extrusionDirection: Point3D;
10
+ axisRatio: number;
11
+ startAngle: number; // radian
12
+ endAngle: number; // radian
13
+ }
@@ -0,0 +1,86 @@
1
+ import { parseEntities } from '.';
2
+ import DxfArrayScanner from '../DxfArrayScanner';
3
+
4
+ describe('ENTITIES section', () => {
5
+ describe('parseEntities', () => {
6
+ it('BLOCKS 섹션 안에서 parseEntities를 실행하면 scanner.next()가 <0, ENDBLK>이어야 한다.', () => {
7
+ const content = ` 0
8
+ LINE
9
+ 5
10
+ entity-0
11
+ 100
12
+ AcDbLine
13
+ 100
14
+ AcDbEntity
15
+ 0
16
+ ENDBLK
17
+ 0
18
+ EOF
19
+ `.split('\n');
20
+ const scanner = new DxfArrayScanner(content);
21
+ let curr = scanner.next();
22
+
23
+ parseEntities(curr, scanner);
24
+
25
+ curr = scanner.next();
26
+
27
+ expect(curr.code).toBe(0);
28
+ expect(curr.value).toBe('ENDBLK');
29
+ });
30
+
31
+ it('ENTITIES 섹션 안에서 parseEntities를 실행하면 scanner.next()가 <0, ENDSEC>이어야 한다.', () => {
32
+ const content = ` 0
33
+ LINE
34
+ 5
35
+ entity-0
36
+ 100
37
+ AcDbLine
38
+ 100
39
+ AcDbEntity
40
+ 0
41
+ ENDSEC
42
+ 0
43
+ EOF
44
+ `.split('\n');
45
+ const scanner = new DxfArrayScanner(content);
46
+ let curr = scanner.next();
47
+
48
+ parseEntities(curr, scanner);
49
+
50
+ curr = scanner.next();
51
+
52
+ expect(curr.code).toBe(0);
53
+ expect(curr.value).toBe('ENDSEC');
54
+ });
55
+
56
+ it('parseEntities는 모든 ENTITY를 소모하여야 한다.', () => {
57
+ const content = ` 0
58
+ LINE
59
+ 5
60
+ entity-0
61
+ 100
62
+ AcDbLine
63
+ 0
64
+ LINE
65
+ 5
66
+ entity-1
67
+ 100
68
+ AcDbLine
69
+ 100
70
+ AcDbEntity
71
+ 0
72
+ ENDBLK
73
+ 0
74
+ EOF
75
+ `.split('\n');
76
+ const scanner = new DxfArrayScanner(content);
77
+ let curr = scanner.next();
78
+
79
+ const entities = parseEntities(curr, scanner);
80
+
81
+ expect(entities.length).toBe(2);
82
+ expect(entities[0].handle).toBe('entity-0');
83
+ expect(entities[1].handle).toBe('entity-1');
84
+ });
85
+ });
86
+ });