abstract-3d 1.6.4 → 1.6.6

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 (53) hide show
  1. package/lib/abstract-3d.d.ts +1 -1
  2. package/lib/abstract-3d.d.ts.map +1 -1
  3. package/lib/abstract-3d.js +4 -4
  4. package/lib/abstract-3d.js.map +1 -1
  5. package/lib/renderers/dxf/color.d.ts +2 -0
  6. package/lib/renderers/dxf/color.d.ts.map +1 -1
  7. package/lib/renderers/dxf/color.js +3 -0
  8. package/lib/renderers/dxf/color.js.map +1 -1
  9. package/lib/renderers/dxf/dxf-encoding.d.ts +8 -8
  10. package/lib/renderers/dxf/dxf-encoding.d.ts.map +1 -1
  11. package/lib/renderers/dxf/dxf-encoding.js +36 -112
  12. package/lib/renderers/dxf/dxf-encoding.js.map +1 -1
  13. package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts.map +1 -1
  14. package/lib/renderers/dxf/dxf-geometries/dxf-box.js +7 -8
  15. package/lib/renderers/dxf/dxf-geometries/dxf-box.js.map +1 -1
  16. package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts.map +1 -1
  17. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js +7 -8
  18. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js.map +1 -1
  19. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts.map +1 -1
  20. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js +13 -16
  21. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js.map +1 -1
  22. package/lib/renderers/dxf/dxf-geometries/dxf-image.d.ts.map +1 -1
  23. package/lib/renderers/dxf/dxf-geometries/dxf-image.js +12 -79
  24. package/lib/renderers/dxf/dxf-geometries/dxf-image.js.map +1 -1
  25. package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts.map +1 -1
  26. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js +2 -2
  27. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js.map +1 -1
  28. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -1
  29. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +5 -5
  30. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -1
  31. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -1
  32. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js +37 -13
  33. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -1
  34. package/lib/renderers/dxf/dxf.d.ts.map +1 -1
  35. package/lib/renderers/dxf/dxf.js +9 -9
  36. package/lib/renderers/dxf/dxf.js.map +1 -1
  37. package/lib/renderers/svg/svg.js +4 -3
  38. package/lib/renderers/svg/svg.js.map +1 -1
  39. package/package.json +3 -3
  40. package/src/abstract-3d.ts +8 -8
  41. package/src/renderers/dxf/color.ts +5 -0
  42. package/src/renderers/dxf/dxf-encoding.ts +49 -124
  43. package/src/renderers/dxf/dxf-geometries/dxf-box.ts +7 -9
  44. package/src/renderers/dxf/dxf-geometries/dxf-cone.ts +7 -9
  45. package/src/renderers/dxf/dxf-geometries/dxf-cylinder.ts +15 -18
  46. package/src/renderers/dxf/dxf-geometries/dxf-image.ts +27 -97
  47. package/src/renderers/dxf/dxf-geometries/dxf-plane.ts +2 -3
  48. package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +5 -8
  49. package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +37 -14
  50. package/src/renderers/dxf/dxf.ts +28 -22
  51. package/src/renderers/svg/svg.ts +5 -7
  52. package/src/.DS_Store +0 -0
  53. package/src/renderers/.DS_Store +0 -0
@@ -9,8 +9,7 @@ import {
9
9
  vec3Scale,
10
10
  equals,
11
11
  } from "../../../abstract-3d.js";
12
- import { color } from "../color.js";
13
- import { dxf3DFACE, Handle } from "../dxf-encoding.js";
12
+ import { dxfQuad, dxfTriangle, Handle } from "../dxf-encoding.js";
14
13
  import { dxfPlane } from "./dxf-plane.js";
15
14
 
16
15
  export function dxfCylinder(
@@ -21,41 +20,39 @@ export function dxfCylinder(
21
20
  parentRot: Vec3,
22
21
  handleRef: Handle
23
22
  ): string {
24
- const angleStart = c.angleStart ?? 0.0;
25
- const angleLength = c.angleLength ?? Math.PI * 2;
26
- const angleEnd = angleStart + angleLength;
27
- let dxfString = "";
28
23
  const pos = vec3TransRot(c.pos, parentPos, parentRot);
29
24
  const rot = vec3RotCombine(parentRot, c.rot ?? vec3Zero);
30
25
  const vec3tr = (x: number, y: number, z: number): Vec3 => vec3TransRot(vec3(x, y, z), pos, rot);
31
- const mat = m.normal;
26
+
27
+ const angleStart = c.angleStart ?? 0.0;
28
+ const angleLength = c.angleLength ?? Math.PI * 2;
29
+ const angleEnd = angleStart + angleLength;
32
30
  const angleStep = angleLength / sides;
33
31
  let currentAngle = angleStart;
32
+ let dxfString = "";
34
33
 
35
34
  const half = c.length / 2;
36
35
  const topPos = vec3tr(0, half, 0);
37
36
  const botPos = vec3tr(0, -half, 0);
38
37
 
39
- const botVec3Array = Array<Vec3>();
40
- const topVec3Array = Array<Vec3>();
41
-
38
+ let prevBot = undefined;
39
+ let prevTop = undefined;
42
40
  for (let i = 0; i <= sides; i++) {
43
41
  const x = Math.sin(currentAngle) * c.radius;
44
42
  const z = Math.cos(currentAngle) * c.radius;
45
43
  const currBot = vec3tr(x, -half, z);
46
44
  const currTop = vec3tr(x, half, z);
47
- botVec3Array.push(currBot);
48
- topVec3Array.push(currTop);
49
- if (i !== 0) {
50
- const prevBot = botVec3Array[i - 1]!;
51
- const prevTop = topVec3Array[i - 1]!;
45
+ if (i !== 0 && prevBot && prevTop) {
52
46
  if (!c.open) {
53
47
  dxfString +=
54
- dxf3DFACE(botPos, prevBot, currBot, currBot, mat, handleRef) +
55
- dxf3DFACE(topPos, prevTop, currTop, currTop, mat, handleRef);
48
+ dxfTriangle(botPos, prevBot, currBot, m.normal, handleRef) +
49
+ dxfTriangle(topPos, prevTop, currTop, m.normal, handleRef);
56
50
  }
57
- dxfString += dxf3DFACE(currBot, prevBot, prevTop, currTop, mat, handleRef);
51
+ dxfString += dxfQuad(currBot, prevBot, prevTop, currTop, m.normal, handleRef);
58
52
  }
53
+
54
+ prevBot = currBot;
55
+ prevTop = currTop;
59
56
  currentAngle += angleStep;
60
57
  }
61
58
 
@@ -9,22 +9,15 @@ import {
9
9
  vec3,
10
10
  vec3Rot,
11
11
  vec3Add,
12
- vec3Sub,
13
- vec3Normalize,
14
- vec3Cross,
15
- vec3Scale,
16
12
  } from "../../../abstract-3d.js";
17
- import { dxf3DFACE, dxfHandle, Handle } from "../dxf-encoding.js";
18
- import { dxfPlane } from "./dxf-plane.js";
13
+ import { DEFAULT_CIRCLE_SIDE_COUNT, DxfDynamicColor, dxfLine, dxfPolyline, Handle } from "../dxf-encoding.js";
19
14
 
20
15
  export function dxfImage(i: Image, parentPos: Vec3, parentRot: Vec3, handleRef: Handle): string {
21
-
22
16
  const half = vec2Scale(i.size, 0.5);
23
17
  const offset = vec3Rot(vec3(-half.x, half.y, 0), vec3Zero, i.rot ?? vec3Zero);
24
18
  const pos = vec3TransRot(vec3Add(i.pos, offset), parentPos, parentRot);
25
19
  const rot = vec3RotCombine(parentRot, i.rot ?? vec3Zero);
26
-
27
- switch(i.image.type) {
20
+ switch (i.image.type) {
28
21
  case "AbstractImage": {
29
22
  const scale = {
30
23
  x: i.size.x / i.image.image.size.width,
@@ -33,72 +26,63 @@ export function dxfImage(i: Image, parentPos: Vec3, parentRot: Vec3, handleRef:
33
26
  };
34
27
  return abstractImageToDxf3D(i.image.image, pos, rot, scale, handleRef);
35
28
  }
36
- default:
29
+ default:
37
30
  return "";
38
31
  }
39
32
  }
40
33
 
41
34
  function abstractImageToDxf3D(image: AbstractImage, pos: Vec3, rot: Vec3, scale: Vec3, handleRef: Handle): string {
42
35
  const strokeScale = Math.max(scale.x, scale.y, scale.z);
43
-
44
- let dxf = "";
45
-
46
- //create the background and place it slightly below the stroke elements
47
- // const normal = eulerToVector(rot);
48
- // const bgSize = { x: image.size.width * scale.x, y: image.size.height * scale.y, z: 1 };
49
- // const bgHalf = vec3Rot(vec3Scale(bgSize, 0.5), vec3Zero, rot);
50
- // const bgPos = vec3Add(vec3Add(pos, bgHalf), vec3Scale(normal, -1));
51
- // dxf += dxfPlane({
52
- // type: "Plane",
53
- // size: bgSize,
54
- // pos: bgPos,
55
- // rot,
56
- // }, {normal: `normal(0, 0, 1)`}, vec3Zero, vec3Zero, handleRef);
57
-
58
- for(const comp of image.components) {
59
- dxf += abstractImageComponentToDxf3D(comp, pos, rot, scale, strokeScale, handleRef);
60
- }
61
- return dxf;
36
+ return image.components.map(
37
+ (comp) =>
38
+ abstractImageComponentToDxf3D(comp, pos, rot, scale, strokeScale, handleRef)
39
+ ).join("");
62
40
  }
63
41
 
64
42
  function abstractImageComponentToDxf3D(comp: Component, pos: Vec3, rot: Vec3, scale: Vec3, strokeScale: number, handleRef: Handle): string {
65
43
  const vec3tr = (x: number, y: number): Vec3 => vec3TransRot(vec3(x * scale.x, y * scale.y, 0), pos, rot);
66
- const strokeColor: Color = { a: 255.0, r: 0.0, g: 0.0, b: 0.0 };
44
+ const strokeColor: DxfDynamicColor = 7;
67
45
 
68
46
  let dxf = "";
69
- switch(comp.type) {
47
+ switch (comp.type) {
70
48
  case "group": {
71
- for(const child of comp.children) {
72
- dxf += abstractImageComponentToDxf3D(child, pos, rot, scale, strokeScale, handleRef);
73
- }
49
+ dxf += comp.children.map(
50
+ (child) =>
51
+ abstractImageComponentToDxf3D(child, pos, rot, scale, strokeScale, handleRef)
52
+ ).join("");
74
53
  break;
54
+
75
55
  }
76
56
  case "line": {
77
- dxf += dxfLine(vec3tr(comp.start.x, comp.start.y), vec3tr(comp.end.x, comp.end.y), strokeColor, comp.strokeThickness * strokeScale, rot, handleRef);
57
+ dxf += dxfLine(
58
+ vec3tr(comp.start.x, comp.start.y),
59
+ vec3tr(comp.end.x, comp.end.y),
60
+ strokeColor,
61
+ handleRef
62
+ );
78
63
  break;
79
64
  }
80
65
  case "polyline": {
81
66
  const points = comp.points.map((p) => vec3tr(p.x, p.y));
82
- dxf += dxfPolyline(points, strokeColor, false, comp.strokeThickness * strokeScale, rot, handleRef);
67
+ dxf += dxfPolyline(points, strokeColor, false, handleRef);
83
68
  break;
84
69
  }
85
70
  case "polygon": {
86
71
  const points = comp.points.map((p) => vec3tr(p.x, p.y));
87
- dxf += dxfPolyline(points, strokeColor, true, comp.strokeThickness * strokeScale, rot, handleRef);
72
+ dxf += dxfPolyline(points, strokeColor, true, handleRef);
88
73
  break;
89
74
  }
90
75
  case "ellipse": {
91
76
  const points: Array<Vec3> = [];
92
77
  const r1 = Math.abs(comp.bottomRight.x - comp.topLeft.x) / 2.0;
93
78
  const r2 = Math.abs(comp.topLeft.y - comp.bottomRight.y) / 2.0;
94
- const numPoints = 32;
95
- for (let i = 0; i < numPoints; i++) {
96
- const t = (2 * Math.PI * i) / numPoints;
79
+ for (let i = 0; i < DEFAULT_CIRCLE_SIDE_COUNT; i++) {
80
+ const t = (2 * Math.PI * i) / DEFAULT_CIRCLE_SIDE_COUNT;
97
81
  const x = comp.topLeft.x + r1 + r1 * Math.cos(t);
98
82
  const y = comp.topLeft.y + r2 + r2 * Math.sin(t);
99
83
  points.push(vec3tr(x, y));
100
84
  }
101
- dxf += dxfPolyline(points, strokeColor, true, comp.strokeThickness * strokeScale, rot, handleRef);
85
+ dxf += dxfPolyline(points, strokeColor, true, handleRef);
102
86
  break;
103
87
  }
104
88
  case "rectangle": {
@@ -106,13 +90,13 @@ function abstractImageComponentToDxf3D(comp: Component, pos: Vec3, rot: Vec3, sc
106
90
  x: comp.bottomRight.x - comp.topLeft.x,
107
91
  y: comp.bottomRight.y - comp.topLeft.y
108
92
  };
109
- const points = [
93
+ const points = [ //these points form a loop
110
94
  vec3tr(0, 0),
111
95
  vec3tr(size.x, 0),
112
96
  vec3tr(size.x, size.y),
113
97
  vec3tr(0, size.y),
114
98
  ];
115
- dxf += dxfPolyline(points, strokeColor, true, comp.strokeThickness * strokeScale, rot, handleRef);
99
+ dxf += dxfPolyline(points, strokeColor, true, handleRef);
116
100
  break;
117
101
  }
118
102
  default:
@@ -120,58 +104,4 @@ function abstractImageComponentToDxf3D(comp: Component, pos: Vec3, rot: Vec3, sc
120
104
  }
121
105
 
122
106
  return dxf;
123
- }
124
-
125
- function dxfLine(vecStart: Vec3, vecEnd: Vec3, color: Color, strokeThickness: number, normal: Vec3, handleRef: Handle): string {
126
- const norm = eulerToVector(normal);
127
- strokeThickness = 0;
128
-
129
- const dir = vec3Normalize(vec3Sub(vecEnd, vecStart));
130
- const right = vec3Cross(dir, norm);
131
- const s1 = vec3Add(vecStart, vec3Scale(right, strokeThickness / 2));
132
- const s2 = vec3Add(vecStart, vec3Scale(right, -strokeThickness / 2));
133
- const e1 = vec3Add(vecEnd, vec3Scale(right, strokeThickness / 2));
134
- const e2 = vec3Add(vecEnd, vec3Scale(right, -strokeThickness / 2));
135
- //return dxf3DFACE(s1, e1, e2, s2, abstractImageColorToHex(color), handleRef);
136
- return dxf3DFACE(s1, e1, e2, s2, 7, handleRef);
137
- }
138
-
139
- function dxfPolyline(points: ReadonlyArray<Vec3>, color: Color, closed: boolean, strokeThickness: number, normal: Vec3, handleRef: Handle): string {
140
- let dxf = "";
141
- for(let i = 0; i < points.length - 1; i++) {
142
- const p1 = points[i];
143
- const p2 = points[i+1];
144
- if(!p1 || !p2) {
145
- continue;
146
- }
147
- dxf += dxfLine(p1, p2, color, strokeThickness, normal, handleRef);
148
- }
149
- if(closed) {
150
- const start = points[0];
151
- const end = points[points.length - 1];
152
- if(start && end) {
153
- dxf += dxfLine(start, end, color, strokeThickness, normal, handleRef);
154
- }
155
- }
156
- return dxf;
157
- }
158
-
159
- function abstractImageColorToHex(color: Color): string {
160
- const col = `rgb(${color.r}, ${color.g}, ${color.b})`;
161
- return col;
162
- }
163
-
164
- function eulerToVector(euler: Vec3): Vec3 {
165
- const cx = Math.cos(euler.x);
166
- const sx = Math.sin(euler.x);
167
- const cy = Math.cos(euler.y);
168
- const sy = Math.sin(euler.y);
169
- //const cz = Math.cos(euler.z); ?
170
- //const sz = Math.sin(euler.z); ?
171
- const norm = {
172
- x: sy,
173
- y: -sx * cy,
174
- z: cx * cy
175
- };
176
- return norm;
177
107
  }
@@ -8,15 +8,14 @@ import {
8
8
  vec3Zero,
9
9
  vec3,
10
10
  } from "../../../abstract-3d.js";
11
- import { color } from "../color.js";
12
- import { dxf3DFACE, Handle } from "../dxf-encoding.js";
11
+ import { dxfQuad, Handle } from "../dxf-encoding.js";
13
12
 
14
13
  export function dxfPlane(p: Plane, m: Material, parentPos: Vec3, parentRot: Vec3, handleRef: Handle): string {
15
14
  const half = vec2Scale(p.size, 0.5);
16
15
  const pos = vec3TransRot(p.pos, parentPos, parentRot);
17
16
  const rot = vec3RotCombine(parentRot, p.rot ?? vec3Zero);
18
17
  const vec3tr = (x: number, y: number): Vec3 => vec3TransRot(vec3(x, y, 0), pos, rot);
19
- return dxf3DFACE(
18
+ return dxfQuad(
20
19
  vec3tr(-half.x, -half.y),
21
20
  vec3tr(half.x, -half.y),
22
21
  vec3tr(half.x, half.y),
@@ -1,6 +1,5 @@
1
1
  import { Polygon, Material, Vec3, vec3TransRot, vec3RotCombine, vec3Zero } from "../../../abstract-3d.js";
2
- import { color } from "../color.js";
3
- import { dxf3DFACE, Handle } from "../dxf-encoding.js";
2
+ import { dxfQuad, dxfTriangle, Handle } from "../dxf-encoding.js";
4
3
 
5
4
  const QUAD_STRIDE = 4;
6
5
  const TRIANGLE_STRIDE = 3;
@@ -18,7 +17,7 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
18
17
  const vec3 = points[i + 2];
19
18
  const vec4 = points[i + 3];
20
19
  if(vec1 && vec2 && vec3 && vec4) {
21
- polygonString += dxf3DFACE(
20
+ polygonString += dxfQuad(
22
21
  vec1,
23
22
  vec2,
24
23
  vec3,
@@ -38,7 +37,7 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
38
37
  const vec2 = points[i - 1];
39
38
  const vec3 = points[i - 2];
40
39
  if(vec1 && vec2 && vec3) {
41
- polygonString += dxf3DFACE(vec3, vec2, vec1, vec1, col, handleRef);
40
+ polygonString += dxfTriangle(vec3, vec2, vec1, col, handleRef);
42
41
  }
43
42
  break;
44
43
  }
@@ -47,11 +46,10 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
47
46
  const vec2 = points[i - 1];
48
47
  const vec3 = points[i + 1];
49
48
  if(vec1 && vec2 && vec3) {
50
- polygonString += dxf3DFACE(
49
+ polygonString += dxfTriangle(
51
50
  vec2,
52
51
  vec1,
53
52
  vec3,
54
- vec3,
55
53
  col,
56
54
  handleRef
57
55
  );
@@ -63,11 +61,10 @@ export function dxfPolygon(p: Polygon, m: Material, parentPos: Vec3, parentRot:
63
61
  const vec2 = points[i + 1];
64
62
  const vec3 = points[i + 2];
65
63
  if(vec1 && vec2 && vec3) {
66
- polygonString += dxf3DFACE(
64
+ polygonString += dxfTriangle(
67
65
  vec1,
68
66
  vec2,
69
67
  vec3,
70
- vec3,
71
68
  col,
72
69
  handleRef
73
70
  );
@@ -1,34 +1,57 @@
1
1
  import { Shape, Material, Vec3, vec3TransRot, vec3RotCombine, vec3Zero, vec3 } from "../../../abstract-3d.js";
2
- import { color } from "../color.js";
3
- import { dxf3DFACE, Handle } from "../dxf-encoding.js";
2
+ import { dxfQuad, dxfTriangle, Handle } from "../dxf-encoding.js";
4
3
 
5
- const chunkSize = 4;
4
+ const QUAD_STRIDE = 4;
5
+ const TRIANGLE_STRIDE = 3;
6
6
 
7
7
  export function dxfPolygon(s: Shape, m: Material, parentPos: Vec3, parentRot: Vec3, handleRef: Handle): string {
8
8
  let polygonString = "";
9
9
  const pos = vec3TransRot(s.pos, parentPos, parentRot);
10
10
  const rot = vec3RotCombine(parentRot, s.rot ?? vec3Zero);
11
11
  const points = s.points.map((p) => vec3TransRot(vec3(p.x, p.y, 0), pos, rot));
12
- const mat = m.normal;
13
12
  let i = 0;
14
- if (points.length >= chunkSize) {
15
- for (i; i < points.length; i += chunkSize) {
16
- polygonString += dxf3DFACE(points[i]!, points[i + 1]!, points[i + 2]!, points[i + 3]!, mat, handleRef);
13
+ if (points.length >= QUAD_STRIDE) {
14
+ for (i; i < points.length; i += QUAD_STRIDE) {
15
+ const p1 = points[i];
16
+ const p2 = points[i + 1];
17
+ const p3 = points[i + 2];
18
+ const p4 = points[i + 3];
19
+ if(p1 && p2 && p3 && p4) {
20
+ polygonString += dxfQuad(p1, p2, p3, p4, m.normal, handleRef);
21
+ }
17
22
  }
18
23
  }
19
24
 
20
- if (i <= points.length && chunkSize - 1 <= points.length) {
25
+ if (i <= points.length && TRIANGLE_STRIDE <= points.length) {
21
26
  const lastArrayLength = points.length - i;
22
27
  switch (lastArrayLength) {
23
- case 1:
24
- polygonString += dxf3DFACE(points[i - 2]!, points[i - 1]!, points[i]!, points[i]!, mat, handleRef);
28
+ case 1: {
29
+ const p1 = points[i - 2];
30
+ const p2 = points[i - 1];
31
+ const p3 = points[i];
32
+ if(p1 && p2 && p3) {
33
+ polygonString += dxfTriangle(p1, p2, p3, m.normal, handleRef);
34
+ }
25
35
  break;
26
- case 2:
27
- polygonString += dxf3DFACE(points[i - 1]!, points[i]!, points[i + 1]!, points[i + 1]!, mat, handleRef);
36
+ }
37
+ case 2: {
38
+ const p1 = points[i - 1];
39
+ const p2 = points[i];
40
+ const p3 = points[i + 1];
41
+ if(p1 && p2 && p3) {
42
+ polygonString += dxfTriangle(p1, p2, p3, m.normal, handleRef);
43
+ }
28
44
  break;
29
- case 3:
30
- polygonString += dxf3DFACE(points[i]!, points[i + 1]!, points[i + 2]!, points[i + 2]!, mat, handleRef);
45
+ }
46
+ case 3: {
47
+ const p1 = points[i];
48
+ const p2 = points[i + 1];
49
+ const p3 = points[i + 2];
50
+ if(p1 && p2 && p3) {
51
+ polygonString += dxfTriangle(p1, p2, p3, m.normal, handleRef);
52
+ }
31
53
  break;
54
+ }
32
55
  default:
33
56
  break;
34
57
  }
@@ -15,11 +15,12 @@ import {
15
15
  bounds3Merge,
16
16
  bounds3Center,
17
17
  vec3Add,
18
- sizeCenterBoundsForCameraPos,
18
+ sizeBoundsForCameraPos,
19
19
  boundsScene,
20
20
  vec3Sub,
21
+ vec3Rot,
21
22
  } from "../../abstract-3d.js";
22
- import { dxf, dxfHandleCreate, DxfOrigin, Handle } from "./dxf-encoding.js";
23
+ import { DEFAULT_CIRCLE_SIDE_COUNT, dxf, dxfHandleCreate, DxfOrigin, Handle } from "./dxf-encoding.js";
23
24
  import { dxfPlane } from "./dxf-geometries/dxf-plane.js";
24
25
  import { dxfBox } from "./dxf-geometries/dxf-box.js";
25
26
  import { dxfCylinder } from "./dxf-geometries/dxf-cylinder.js";
@@ -28,11 +29,17 @@ import { dxfPolygon } from "./dxf-geometries/dxf-polygon.js";
28
29
  import { Optional } from "../shared.js";
29
30
  import { dxfImage } from "./dxf-geometries/dxf-image.js";
30
31
 
31
- const DEFAULT_CYLINDER_SIDE_COUNT = 18;
32
-
33
- export type DxfOptions = { readonly view: View; readonly origin: DxfOrigin; readonly cylinderSideCount: number };
32
+ export type DxfOptions = {
33
+ readonly view: View;
34
+ readonly origin: DxfOrigin;
35
+ readonly cylinderSideCount: number;
36
+ };
34
37
 
35
- export type DxfScene = { readonly scene: Scene; readonly options?: Optional<DxfOptions>; readonly pos: Vec3 };
38
+ export type DxfScene = {
39
+ readonly scene: Scene;
40
+ readonly options?: Optional<DxfOptions>;
41
+ readonly pos: Vec3;
42
+ };
36
43
 
37
44
  export function renderScenes(scenes: ReadonlyArray<DxfScene>, baseOptions?: Optional<DxfOptions>): string {
38
45
  let allGroups = "";
@@ -67,14 +74,11 @@ const renderInternal = (
67
74
  handleRef: Handle
68
75
  ): { readonly groups: string; readonly size: Vec3; readonly center: Vec3 } => {
69
76
  const unitRot = vec3RotCombine(rotationForCameraPos(options.view), scene.rotation_deprecated ?? vec3Zero);
70
- const [size, center] = sizeCenterBoundsForCameraPos(
71
- scene.size_deprecated,
72
- scene.center_deprecated ?? vec3Zero,
73
- unitRot
74
- );
75
- const bounds = bounds3FromPosAndSize(center, size);
76
- const dxfOriginOffset = originOffsetFromBounds(bounds, options.origin)
77
- const pos = vec3NegateY(vec3Add(center, vec3Add(offset, dxfOriginOffset)));
77
+ const rotatedCenter = vec3Rot(scene.center_deprecated ?? vec3Zero, vec3Zero, scene.rotation_deprecated ?? vec3Zero);
78
+ const [size] = sizeBoundsForCameraPos(scene.size_deprecated, rotatedCenter, unitRot);
79
+ const bounds = bounds3FromPosAndSize(rotatedCenter, size);
80
+ const dxfOriginOffset = originOffsetFromBounds(bounds, options.origin);
81
+ const pos = vec3NegateY(vec3Add(rotatedCenter, vec3Add(offset, dxfOriginOffset)));
78
82
  return {
79
83
  groups: scene.groups.reduce((a, c) => a + dxfGroup(c, pos, unitRot, options, handleRef), ""),
80
84
  size,
@@ -86,13 +90,13 @@ function vec3NegateY(vec: Vec3): Vec3 {
86
90
  return {
87
91
  x: vec.x,
88
92
  y: -vec.y,
89
- z: vec.z
93
+ z: vec.z,
90
94
  };
91
95
  }
92
96
 
93
97
  function originOffsetFromScenes(scenes: ReadonlyArray<DxfScene>, origin: DxfOrigin): Vec3 {
94
98
  const allBounds = Array<Bounds3>();
95
- for(const scene of scenes) {
99
+ for (const scene of scenes) {
96
100
  const center = scene.scene.center_deprecated ?? vec3Zero;
97
101
  const size = scene.scene.size_deprecated;
98
102
  allBounds.push(bounds3FromPosAndSize(center, size));
@@ -101,7 +105,7 @@ function originOffsetFromScenes(scenes: ReadonlyArray<DxfScene>, origin: DxfOrig
101
105
  }
102
106
 
103
107
  function originOffsetFromBounds(bounds: Bounds3, origin: DxfOrigin): Vec3 {
104
- switch(origin) {
108
+ switch (origin) {
105
109
  case "BottomLeftFront": {
106
110
  return vec3(Math.abs(bounds.min.x), -Math.abs(bounds.min.y), -Math.abs(bounds.min.z));
107
111
  }
@@ -158,7 +162,7 @@ function optionsDef(options: Optional<DxfOptions> | undefined): DxfOptions {
158
162
  return {
159
163
  view: options?.view ?? "front",
160
164
  origin: options?.origin ?? "BottomLeftFront",
161
- cylinderSideCount: DEFAULT_CYLINDER_SIDE_COUNT,
165
+ cylinderSideCount: DEFAULT_CIRCLE_SIDE_COUNT,
162
166
  };
163
167
  }
164
168
 
@@ -168,9 +172,11 @@ export const renderOld = (scene: Scene, options?: Optional<DxfOptions>): string
168
172
  const center = scene.center_deprecated ?? vec3Zero;
169
173
  const unitRot = vec3RotCombine(rotationForCameraPos(opts.view), scene.rotation_deprecated ?? vec3Zero);
170
174
  const bounds = bounds3FromPosAndSize(center, scene.size_deprecated);
171
- const offset =
172
- vec3Sub(opts.origin === "Center" ? vec3Zero : vec3(Math.abs(bounds.min.x), Math.abs(bounds.min.y), -bounds.max.z), center);
173
-
175
+ const offset = vec3Sub(
176
+ opts.origin === "Center" ? vec3Zero : vec3(Math.abs(bounds.min.x), Math.abs(bounds.min.y), -bounds.max.z),
177
+ center
178
+ );
179
+
174
180
  const newBounds: Bounds3 = {
175
181
  max: {
176
182
  x: bounds.max.x + offset.x,
@@ -181,7 +187,7 @@ export const renderOld = (scene: Scene, options?: Optional<DxfOptions>): string
181
187
  x: bounds.min.x + offset.x,
182
188
  y: bounds.min.y + offset.y,
183
189
  z: bounds.min.z + offset.z,
184
- }
190
+ },
185
191
  };
186
192
 
187
193
  const bounds2 = bounds3FromPosAndSize(offset, scene.size_deprecated);
@@ -15,7 +15,7 @@ import {
15
15
  vec3TransRot,
16
16
  Material,
17
17
  rotationForCameraPos,
18
- sizeCenterBoundsForCameraPos,
18
+ sizeBoundsForCameraPos,
19
19
  Bounds2,
20
20
  bounds2FromPosAndSize,
21
21
  bounds2ToSize,
@@ -97,15 +97,13 @@ function renderInternal(
97
97
  };
98
98
  const baseRot = vec3RotCombine(rotationForCameraPos(opts.view), scene.rotation_deprecated ?? vec3Zero);
99
99
  const unitRot = opts.rotation ? vec3RotCombine(vec3(0, 0, (opts.rotation * Math.PI) / 180), baseRot) : baseRot;
100
- const [unitSize, unitCenter] = sizeCenterBoundsForCameraPos(
101
- scene.size_deprecated,
102
- scene.center_deprecated ?? vec3Zero,
103
- unitRot
104
- );
100
+ const rotatedCenter = vec3Rot(scene.center_deprecated ?? vec3Zero, vec3Zero, scene.rotation_deprecated ?? vec3Zero);
101
+ const [unitSize] = sizeBoundsForCameraPos(scene.size_deprecated, rotatedCenter, unitRot);
105
102
  const svgSize = vec2(unitSize.x + 1.5 * opts.stroke_thickness, unitSize.y + 1.5 * opts.stroke_thickness);
106
103
  const svgCenter = vec2(offset.x + opts.stroke_thickness * 0.75, offset.y + opts.stroke_thickness * 0.75);
104
+
107
105
  const point = (x: number, y: number): Vec2 => vec2(svgCenter.x + x, svgCenter.y - y);
108
- const unitCenterFlipped = vec3Flip(unitCenter);
106
+ const unitCenterFlipped = vec3Flip(rotatedCenter);
109
107
 
110
108
  const elements = Array<zOrderElement>();
111
109
  for (const g of scene.groups) {
package/src/.DS_Store DELETED
Binary file
Binary file