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.
- package/lib/abstract-3d.d.ts +1 -1
- package/lib/abstract-3d.d.ts.map +1 -1
- package/lib/abstract-3d.js +4 -4
- package/lib/abstract-3d.js.map +1 -1
- package/lib/renderers/dxf/color.d.ts +2 -0
- package/lib/renderers/dxf/color.d.ts.map +1 -1
- package/lib/renderers/dxf/color.js +3 -0
- package/lib/renderers/dxf/color.js.map +1 -1
- package/lib/renderers/dxf/dxf-encoding.d.ts +8 -8
- package/lib/renderers/dxf/dxf-encoding.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-encoding.js +36 -112
- package/lib/renderers/dxf/dxf-encoding.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-box.js +7 -8
- package/lib/renderers/dxf/dxf-geometries/dxf-box.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.js +7 -8
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js +13 -16
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-image.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-image.js +12 -79
- package/lib/renderers/dxf/dxf-geometries/dxf-image.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.js +2 -2
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +5 -5
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.js +37 -13
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -1
- package/lib/renderers/dxf/dxf.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf.js +9 -9
- package/lib/renderers/dxf/dxf.js.map +1 -1
- package/lib/renderers/svg/svg.js +4 -3
- package/lib/renderers/svg/svg.js.map +1 -1
- package/package.json +3 -3
- package/src/abstract-3d.ts +8 -8
- package/src/renderers/dxf/color.ts +5 -0
- package/src/renderers/dxf/dxf-encoding.ts +49 -124
- package/src/renderers/dxf/dxf-geometries/dxf-box.ts +7 -9
- package/src/renderers/dxf/dxf-geometries/dxf-cone.ts +7 -9
- package/src/renderers/dxf/dxf-geometries/dxf-cylinder.ts +15 -18
- package/src/renderers/dxf/dxf-geometries/dxf-image.ts +27 -97
- package/src/renderers/dxf/dxf-geometries/dxf-plane.ts +2 -3
- package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +5 -8
- package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +37 -14
- package/src/renderers/dxf/dxf.ts +28 -22
- package/src/renderers/svg/svg.ts +5 -7
- package/src/.DS_Store +0 -0
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
-
|
|
48
|
+
dxfTriangle(botPos, prevBot, currBot, m.normal, handleRef) +
|
|
49
|
+
dxfTriangle(topPos, prevTop, currTop, m.normal, handleRef);
|
|
56
50
|
}
|
|
57
|
-
dxfString +=
|
|
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 {
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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:
|
|
44
|
+
const strokeColor: DxfDynamicColor = 7;
|
|
67
45
|
|
|
68
46
|
let dxf = "";
|
|
69
|
-
switch(comp.type) {
|
|
47
|
+
switch (comp.type) {
|
|
70
48
|
case "group": {
|
|
71
|
-
|
|
72
|
-
|
|
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(
|
|
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,
|
|
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,
|
|
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
|
-
|
|
95
|
-
|
|
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,
|
|
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,
|
|
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 {
|
|
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
|
|
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 {
|
|
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 +=
|
|
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 +=
|
|
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 +=
|
|
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 +=
|
|
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 {
|
|
3
|
-
import { dxf3DFACE, Handle } from "../dxf-encoding.js";
|
|
2
|
+
import { dxfQuad, dxfTriangle, Handle } from "../dxf-encoding.js";
|
|
4
3
|
|
|
5
|
-
const
|
|
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 >=
|
|
15
|
-
for (i; i < points.length; i +=
|
|
16
|
-
|
|
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 &&
|
|
25
|
+
if (i <= points.length && TRIANGLE_STRIDE <= points.length) {
|
|
21
26
|
const lastArrayLength = points.length - i;
|
|
22
27
|
switch (lastArrayLength) {
|
|
23
|
-
case 1:
|
|
24
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
}
|
package/src/renderers/dxf/dxf.ts
CHANGED
|
@@ -15,11 +15,12 @@ import {
|
|
|
15
15
|
bounds3Merge,
|
|
16
16
|
bounds3Center,
|
|
17
17
|
vec3Add,
|
|
18
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
export type DxfOptions = {
|
|
33
|
+
readonly view: View;
|
|
34
|
+
readonly origin: DxfOrigin;
|
|
35
|
+
readonly cylinderSideCount: number;
|
|
36
|
+
};
|
|
34
37
|
|
|
35
|
-
export type DxfScene = {
|
|
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
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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:
|
|
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
|
-
|
|
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);
|
package/src/renderers/svg/svg.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
vec3TransRot,
|
|
16
16
|
Material,
|
|
17
17
|
rotationForCameraPos,
|
|
18
|
-
|
|
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
|
|
101
|
-
|
|
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(
|
|
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
|
package/src/renderers/.DS_Store
DELETED
|
Binary file
|