ofs-dxf-ts 1.0.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.
Files changed (97) hide show
  1. package/API.md +411 -0
  2. package/CHANGELOG.md +26 -0
  3. package/LICENSE +21 -0
  4. package/README.md +119 -0
  5. package/dist/core/dxf-builder.d.ts +348 -0
  6. package/dist/core/dxf-builder.js +549 -0
  7. package/dist/core/dxf-document.d.ts +220 -0
  8. package/dist/core/dxf-document.js +529 -0
  9. package/dist/core/dxf-entities.d.ts +327 -0
  10. package/dist/core/dxf-entities.js +22 -0
  11. package/dist/core/dxf-serializer.d.ts +48 -0
  12. package/dist/core/dxf-serializer.js +595 -0
  13. package/dist/core/hatch-patterns.d.ts +15 -0
  14. package/dist/core/hatch-patterns.js +214 -0
  15. package/dist/core/modelspace.d.ts +106 -0
  16. package/dist/core/modelspace.js +351 -0
  17. package/dist/geometry/math.utils.d.ts +8 -0
  18. package/dist/geometry/math.utils.js +43 -0
  19. package/dist/geometry/offset.utils.d.ts +32 -0
  20. package/dist/geometry/offset.utils.js +87 -0
  21. package/dist/geometry/polyline.utils.d.ts +10 -0
  22. package/dist/geometry/polyline.utils.js +63 -0
  23. package/dist/geometry/text.utils.d.ts +15 -0
  24. package/dist/geometry/text.utils.js +28 -0
  25. package/dist/index.d.ts +23 -0
  26. package/dist/index.js +29 -0
  27. package/dist/parser/auto-cad-color-index.d.ts +8 -0
  28. package/dist/parser/auto-cad-color-index.js +265 -0
  29. package/dist/parser/dim-style-codes.d.ts +5 -0
  30. package/dist/parser/dim-style-codes.js +32 -0
  31. package/dist/parser/dxf-parser.d.ts +16 -0
  32. package/dist/parser/dxf-parser.js +824 -0
  33. package/dist/parser/entities/3dface.d.ts +5 -0
  34. package/dist/parser/entities/3dface.js +76 -0
  35. package/dist/parser/entities/arc.d.ts +5 -0
  36. package/dist/parser/entities/arc.js +34 -0
  37. package/dist/parser/entities/attdef.d.ts +5 -0
  38. package/dist/parser/entities/attdef.js +86 -0
  39. package/dist/parser/entities/attribute.d.ts +5 -0
  40. package/dist/parser/entities/attribute.js +106 -0
  41. package/dist/parser/entities/circle.d.ts +5 -0
  42. package/dist/parser/entities/circle.js +40 -0
  43. package/dist/parser/entities/dimension.d.ts +5 -0
  44. package/dist/parser/entities/dimension.js +65 -0
  45. package/dist/parser/entities/ellipse.d.ts +5 -0
  46. package/dist/parser/entities/ellipse.js +42 -0
  47. package/dist/parser/entities/hatch.d.ts +5 -0
  48. package/dist/parser/entities/hatch.js +321 -0
  49. package/dist/parser/entities/insert.d.ts +5 -0
  50. package/dist/parser/entities/insert.js +52 -0
  51. package/dist/parser/entities/line.d.ts +5 -0
  52. package/dist/parser/entities/line.js +30 -0
  53. package/dist/parser/entities/lwpolyline.d.ts +5 -0
  54. package/dist/parser/entities/lwpolyline.js +101 -0
  55. package/dist/parser/entities/mtext.d.ts +5 -0
  56. package/dist/parser/entities/mtext.js +54 -0
  57. package/dist/parser/entities/point.d.ts +5 -0
  58. package/dist/parser/entities/point.js +30 -0
  59. package/dist/parser/entities/polyline.d.ts +5 -0
  60. package/dist/parser/entities/polyline.js +85 -0
  61. package/dist/parser/entities/solid.d.ts +5 -0
  62. package/dist/parser/entities/solid.js +35 -0
  63. package/dist/parser/entities/spline.d.ts +5 -0
  64. package/dist/parser/entities/spline.js +69 -0
  65. package/dist/parser/entities/text.d.ts +5 -0
  66. package/dist/parser/entities/text.js +47 -0
  67. package/dist/parser/entities/vertex.d.ts +5 -0
  68. package/dist/parser/entities/vertex.js +59 -0
  69. package/dist/parser/extended-data-parser.d.ts +18 -0
  70. package/dist/parser/extended-data-parser.js +100 -0
  71. package/dist/parser/index.d.ts +10 -0
  72. package/dist/parser/index.js +9 -0
  73. package/dist/parser/log.d.ts +14 -0
  74. package/dist/parser/log.js +39 -0
  75. package/dist/parser/parse-helpers.d.ts +23 -0
  76. package/dist/parser/parse-helpers.js +128 -0
  77. package/dist/parser/scanner.d.ts +29 -0
  78. package/dist/parser/scanner.js +143 -0
  79. package/dist/parser/types.d.ts +78 -0
  80. package/dist/parser/types.js +5 -0
  81. package/dist/symbols/slope-symbol.d.ts +21 -0
  82. package/dist/symbols/slope-symbol.js +81 -0
  83. package/dist/symbols/structures.d.ts +9 -0
  84. package/dist/symbols/structures.js +120 -0
  85. package/dist/template/blank-document.d.ts +13 -0
  86. package/dist/template/blank-document.js +13 -0
  87. package/dist/template/block-registry.d.ts +16 -0
  88. package/dist/template/block-registry.js +135 -0
  89. package/dist/template/index.d.ts +17 -0
  90. package/dist/template/index.js +17 -0
  91. package/dist/template/template-injector.d.ts +45 -0
  92. package/dist/template/template-injector.js +487 -0
  93. package/dist/template/template-reader.d.ts +28 -0
  94. package/dist/template/template-reader.js +80 -0
  95. package/dist/types/index.d.ts +24 -0
  96. package/dist/types/index.js +8 -0
  97. package/package.json +59 -0
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Face implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,76 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class Face {
3
+ static ForEntityName = '3DFACE';
4
+ parseEntity(scanner, curr) {
5
+ const entity = { type: curr.value, vertices: [] };
6
+ curr = scanner.next();
7
+ while (true) {
8
+ if (curr.code === 0)
9
+ break;
10
+ switch (curr.code) {
11
+ case 70: // 1 = Closed shape, 128 = plinegen?, 0 = default
12
+ entity.shape = ((curr.value & 1) === 1);
13
+ entity.hasContinuousLinetypePattern = ((curr.value & 128) === 128);
14
+ break;
15
+ case 10: // X coordinate of point
16
+ entity.vertices = parse3dFaceVertices(scanner, curr);
17
+ curr = scanner.lastReadGroup;
18
+ break;
19
+ default:
20
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
21
+ break;
22
+ }
23
+ curr = scanner.next();
24
+ }
25
+ return entity;
26
+ }
27
+ }
28
+ function parse3dFaceVertices(scanner, curr) {
29
+ const vertices = [];
30
+ let vertexIsStarted = false;
31
+ let vertexIsFinished = false;
32
+ const verticesPer3dFace = 4; // there can be up to four vertices per face, although 3 is most used for TIN
33
+ for (let i = 0; i <= verticesPer3dFace; i++) {
34
+ const vertex = {};
35
+ while (true) {
36
+ if (curr.code === 0 || vertexIsFinished)
37
+ break;
38
+ switch (curr.code) {
39
+ case 10: // X0
40
+ case 11: // X1
41
+ case 12: // X2
42
+ case 13: // X3
43
+ if (vertexIsStarted) {
44
+ vertexIsFinished = true;
45
+ continue;
46
+ }
47
+ vertex.x = curr.value;
48
+ vertexIsStarted = true;
49
+ break;
50
+ case 20: // Y
51
+ case 21:
52
+ case 22:
53
+ case 23:
54
+ vertex.y = curr.value;
55
+ break;
56
+ case 30: // Z
57
+ case 31:
58
+ case 32:
59
+ case 33:
60
+ vertex.z = curr.value;
61
+ break;
62
+ default:
63
+ // it is possible to have entity codes after the vertices.
64
+ // So if code is not accounted for return to entity parser where it might be accounted for
65
+ return vertices;
66
+ }
67
+ curr = scanner.next();
68
+ }
69
+ // See https://groups.google.com/forum/#!topic/comp.cad.autocad/9gn8s5O_w6E
70
+ vertices.push(vertex);
71
+ vertexIsStarted = false;
72
+ vertexIsFinished = false;
73
+ }
74
+ scanner.rewind();
75
+ return vertices;
76
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Arc implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,34 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class Arc {
3
+ static ForEntityName = 'ARC';
4
+ parseEntity(scanner, curr) {
5
+ const entity = { type: curr.value };
6
+ curr = scanner.next();
7
+ while (true) {
8
+ if (curr.code === 0)
9
+ break;
10
+ switch (curr.code) {
11
+ case 10: // X coordinate of point
12
+ entity.center = helpers.parsePoint(scanner);
13
+ break;
14
+ case 40: // radius
15
+ entity.radius = curr.value;
16
+ break;
17
+ case 50: // start angle
18
+ entity.startAngle = Math.PI / 180 * curr.value;
19
+ break;
20
+ case 51: // end angle
21
+ entity.endAngle = Math.PI / 180 * curr.value;
22
+ break;
23
+ case 210:
24
+ entity.extrusionDirection = helpers.parsePoint(scanner);
25
+ break;
26
+ default: // ignored attribute
27
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
28
+ break;
29
+ }
30
+ curr = scanner.next();
31
+ }
32
+ return entity;
33
+ }
34
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class AttDef implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,86 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class AttDef {
3
+ static ForEntityName = 'ATTDEF';
4
+ parseEntity(scanner, curr) {
5
+ const entity = {
6
+ type: curr.value,
7
+ scale: 1,
8
+ textStyle: 'STANDARD',
9
+ };
10
+ curr = scanner.next();
11
+ while (true) {
12
+ if (curr.code === 0) {
13
+ break;
14
+ }
15
+ switch (curr.code) {
16
+ case 1:
17
+ entity.text = curr.value;
18
+ break;
19
+ case 2:
20
+ entity.tag = curr.value;
21
+ break;
22
+ case 3:
23
+ entity.prompt = curr.value;
24
+ break;
25
+ case 7:
26
+ entity.textStyle = curr.value;
27
+ break;
28
+ case 10: // X coordinate of 'first alignment point'
29
+ entity.startPoint = helpers.parsePoint(scanner);
30
+ break;
31
+ case 11: // X coordinate of 'second alignment point'
32
+ entity.endPoint = helpers.parsePoint(scanner);
33
+ break;
34
+ case 39:
35
+ entity.thickness = curr.value;
36
+ break;
37
+ case 40:
38
+ entity.textHeight = curr.value;
39
+ break;
40
+ case 41:
41
+ entity.scale = curr.value;
42
+ break;
43
+ case 50:
44
+ entity.rotation = curr.value;
45
+ break;
46
+ case 51:
47
+ entity.obliqueAngle = curr.value;
48
+ break;
49
+ case 70:
50
+ entity.hidden = !!(curr.value & 0x01);
51
+ entity.constant = !!(curr.value & 0x02);
52
+ entity.verificationRequired = !!(curr.value & 0x04);
53
+ entity.preset = !!(curr.value & 0x08);
54
+ break;
55
+ case 71:
56
+ entity.backwards = !!(curr.value & 0x02);
57
+ entity.mirrored = !!(curr.value & 0x04);
58
+ break;
59
+ case 72:
60
+ // TODO: enum values?
61
+ entity.horizontalJustification = curr.value;
62
+ break;
63
+ case 73:
64
+ entity.fieldLength = curr.value;
65
+ break;
66
+ case 74:
67
+ // TODO: enum values?
68
+ entity.verticalJustification = curr.value;
69
+ break;
70
+ case 100:
71
+ break;
72
+ case 101:
73
+ helpers.skipEmbeddedObject(scanner);
74
+ break;
75
+ case 210:
76
+ entity.extrusionDirection = helpers.parsePoint(scanner);
77
+ break;
78
+ default:
79
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
80
+ break;
81
+ }
82
+ curr = scanner.next();
83
+ }
84
+ return entity;
85
+ }
86
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Attribute implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,106 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class Attribute {
3
+ static ForEntityName = 'ATTRIB';
4
+ parseEntity(scanner, curr) {
5
+ const entity = {
6
+ type: curr.value,
7
+ scale: 1,
8
+ textStyle: 'STANDARD',
9
+ };
10
+ curr = scanner.next();
11
+ while (true) {
12
+ if (curr.code === 0) {
13
+ break;
14
+ }
15
+ switch (curr.code) {
16
+ case 1:
17
+ entity.text = curr.value;
18
+ break;
19
+ case 2:
20
+ entity.tag = curr.value;
21
+ break;
22
+ case 3:
23
+ entity.prompt = curr.value;
24
+ break;
25
+ case 7:
26
+ entity.textStyle = curr.value;
27
+ break;
28
+ case 10: // X coordinate of 'first alignment point'
29
+ entity.startPoint = helpers.parsePoint(scanner);
30
+ break;
31
+ case 11: // X coordinate of 'second alignment point'
32
+ entity.endPoint = helpers.parsePoint(scanner);
33
+ break;
34
+ case 39:
35
+ entity.thickness = curr.value;
36
+ break;
37
+ case 40:
38
+ entity.textHeight = curr.value;
39
+ break;
40
+ case 41:
41
+ entity.scale = curr.value;
42
+ break;
43
+ case 44:
44
+ entity.lineSpacingFactor = curr.value;
45
+ break;
46
+ case 45:
47
+ entity.fillBoxScale = curr.value;
48
+ break;
49
+ case 46:
50
+ entity.annotationHeight = curr.value;
51
+ break;
52
+ case 50:
53
+ entity.rotation = curr.value;
54
+ break;
55
+ case 51:
56
+ entity.obliqueAngle = curr.value;
57
+ break;
58
+ case 63:
59
+ entity.backgroundFillColor = curr.value;
60
+ break;
61
+ case 70:
62
+ entity.hidden = !!(curr.value & 0x01);
63
+ entity.constant = !!(curr.value & 0x02);
64
+ entity.verificationRequired = !!(curr.value & 0x04);
65
+ entity.preset = !!(curr.value & 0x08);
66
+ break;
67
+ case 71:
68
+ entity.attachmentPoint = curr.value;
69
+ break;
70
+ case 72:
71
+ entity.horizontalJustification = curr.value;
72
+ break;
73
+ case 73:
74
+ entity.lineSpacing = curr.value;
75
+ break;
76
+ case 74:
77
+ entity.verticalJustification = curr.value;
78
+ break;
79
+ case 90:
80
+ // TODO:: enum
81
+ // 0 = Background fill off
82
+ // 1 = Use background fill color
83
+ // 2 = Use drawing window color as background fill color
84
+ // and 420 ~ 439 background color check
85
+ entity.backgroundFillSetting = curr.value;
86
+ break;
87
+ case 100:
88
+ break;
89
+ case 210:
90
+ entity.extrusionDirection = helpers.parsePoint(scanner);
91
+ break;
92
+ case 280:
93
+ entity.lockPositionFlag = curr.value;
94
+ break;
95
+ case 340:
96
+ entity.hardPointerId = curr.value;
97
+ break;
98
+ default:
99
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
100
+ break;
101
+ }
102
+ curr = scanner.next();
103
+ }
104
+ return entity;
105
+ }
106
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Circle implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,40 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class Circle {
3
+ static ForEntityName = 'CIRCLE';
4
+ parseEntity(scanner, curr) {
5
+ const entity = { type: curr.value };
6
+ let endAngle;
7
+ curr = scanner.next();
8
+ while (true) {
9
+ if (curr.code === 0)
10
+ break;
11
+ switch (curr.code) {
12
+ case 10: // X coordinate of point
13
+ entity.center = helpers.parsePoint(scanner);
14
+ break;
15
+ case 40: // radius
16
+ entity.radius = curr.value;
17
+ break;
18
+ case 50: // start angle
19
+ entity.startAngle = Math.PI / 180 * curr.value;
20
+ break;
21
+ case 51: // end angle
22
+ endAngle = Math.PI / 180 * curr.value;
23
+ if (endAngle < entity.startAngle)
24
+ entity.angleLength = endAngle + 2 * Math.PI - entity.startAngle;
25
+ else
26
+ entity.angleLength = endAngle - entity.startAngle;
27
+ entity.endAngle = endAngle;
28
+ break;
29
+ case 210:
30
+ entity.extrusionDirection = helpers.parsePoint(scanner);
31
+ break;
32
+ default: // ignored attribute
33
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
34
+ break;
35
+ }
36
+ curr = scanner.next();
37
+ }
38
+ return entity;
39
+ }
40
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Dimension implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,65 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class Dimension {
3
+ static ForEntityName = 'DIMENSION';
4
+ parseEntity(scanner, curr) {
5
+ const entity = { type: curr.value };
6
+ curr = scanner.next();
7
+ while (true) {
8
+ if (curr.code === 0)
9
+ break;
10
+ switch (curr.code) {
11
+ case 2: // Referenced block name
12
+ entity.block = curr.value;
13
+ break;
14
+ case 3: // Dimension style name
15
+ entity.styleName = curr.value;
16
+ break;
17
+ case 10: // X coordinate of 'first alignment point'
18
+ entity.anchorPoint = helpers.parsePoint(scanner);
19
+ break;
20
+ case 11:
21
+ entity.middleOfText = helpers.parsePoint(scanner);
22
+ break;
23
+ case 12: // Insertion point for clones of a dimension
24
+ entity.insertionPoint = helpers.parsePoint(scanner);
25
+ break;
26
+ case 13: // Definition point for linear and angular dimensions
27
+ entity.linearOrAngularPoint1 = helpers.parsePoint(scanner);
28
+ break;
29
+ case 14: // Definition point for linear and angular dimensions
30
+ entity.linearOrAngularPoint2 = helpers.parsePoint(scanner);
31
+ break;
32
+ case 15: // Definition point for diameter, radius, and angular dimensions
33
+ entity.diameterOrRadiusPoint = helpers.parsePoint(scanner);
34
+ break;
35
+ case 16: // Point defining dimension arc for angular dimensions
36
+ entity.arcPoint = helpers.parsePoint(scanner);
37
+ break;
38
+ case 70: // Dimension type
39
+ entity.dimensionType = curr.value;
40
+ break;
41
+ case 71: // 5 = Middle center
42
+ entity.attachmentPoint = curr.value;
43
+ break;
44
+ case 42: // Actual measurement
45
+ entity.actualMeasurement = curr.value;
46
+ break;
47
+ case 1: // Text entered by user explicitly
48
+ entity.text = curr.value;
49
+ break;
50
+ case 50: // Angle of rotated, horizontal, or vertical dimensions
51
+ entity.angle = curr.value;
52
+ break;
53
+ case 53: // Rotation angle of the dimension text away from its default orientation (the
54
+ //direction of the dimension line)
55
+ entity.textRotation = curr.value;
56
+ break;
57
+ default: // check common entity attributes
58
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
59
+ break;
60
+ }
61
+ curr = scanner.next();
62
+ }
63
+ return entity;
64
+ }
65
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Ellipse implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }
@@ -0,0 +1,42 @@
1
+ import * as helpers from '../parse-helpers.js';
2
+ export default class Ellipse {
3
+ static ForEntityName = 'ELLIPSE';
4
+ parseEntity(scanner, curr) {
5
+ const entity = { type: curr.value };
6
+ curr = scanner.next();
7
+ while (true) {
8
+ if (curr.code === 0)
9
+ break;
10
+ switch (curr.code) {
11
+ case 10:
12
+ entity.center = helpers.parsePoint(scanner);
13
+ break;
14
+ case 11:
15
+ entity.majorAxisEndPoint = helpers.parsePoint(scanner);
16
+ break;
17
+ case 40:
18
+ entity.axisRatio = curr.value;
19
+ break;
20
+ case 41:
21
+ /* Already in radians. */
22
+ entity.startAngle = curr.value;
23
+ break;
24
+ case 42:
25
+ /* Already in radians. */
26
+ entity.endAngle = curr.value;
27
+ break;
28
+ case 2:
29
+ entity.name = curr.value;
30
+ break;
31
+ case 210:
32
+ entity.extrusionDirection = helpers.parsePoint(scanner);
33
+ break;
34
+ default: // check common entity attributes
35
+ helpers.checkCommonEntityProperties(entity, curr, scanner);
36
+ break;
37
+ }
38
+ curr = scanner.next();
39
+ }
40
+ return entity;
41
+ }
42
+ }
@@ -0,0 +1,5 @@
1
+ import { DxfEntity, DxfGroup, IEntityParser, IScanner } from '../types.js';
2
+ export default class Hatch implements IEntityParser {
3
+ static ForEntityName: string;
4
+ parseEntity(scanner: IScanner, curr: DxfGroup): DxfEntity;
5
+ }