circuit-json-to-gltf 0.0.33 → 0.0.35
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/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
__commonJS,
|
|
3
3
|
__toESM
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QGM4M3NI.js";
|
|
5
5
|
|
|
6
6
|
// node_modules/@jscad/modeling/src/utils/flatten.js
|
|
7
7
|
var require_flatten = __commonJS({
|
|
@@ -784,7 +784,7 @@ var require_rotateY = __commonJS({
|
|
|
784
784
|
var require_rotateZ = __commonJS({
|
|
785
785
|
"node_modules/@jscad/modeling/src/maths/vec3/rotateZ.js"(exports, module) {
|
|
786
786
|
"use strict";
|
|
787
|
-
var
|
|
787
|
+
var rotateZ3 = (out, vector, origin, radians) => {
|
|
788
788
|
const p = [];
|
|
789
789
|
const r = [];
|
|
790
790
|
p[0] = vector[0] - origin[0];
|
|
@@ -796,7 +796,7 @@ var require_rotateZ = __commonJS({
|
|
|
796
796
|
out[2] = vector[2];
|
|
797
797
|
return out;
|
|
798
798
|
};
|
|
799
|
-
module.exports =
|
|
799
|
+
module.exports = rotateZ3;
|
|
800
800
|
}
|
|
801
801
|
});
|
|
802
802
|
|
|
@@ -1338,7 +1338,7 @@ var require_rotateZ2 = __commonJS({
|
|
|
1338
1338
|
"node_modules/@jscad/modeling/src/maths/mat4/rotateZ.js"(exports, module) {
|
|
1339
1339
|
"use strict";
|
|
1340
1340
|
var { sin, cos } = require_trigonometry();
|
|
1341
|
-
var
|
|
1341
|
+
var rotateZ3 = (out, matrix, radians) => {
|
|
1342
1342
|
const s = sin(radians);
|
|
1343
1343
|
const c = cos(radians);
|
|
1344
1344
|
const a00 = matrix[0];
|
|
@@ -1369,7 +1369,7 @@ var require_rotateZ2 = __commonJS({
|
|
|
1369
1369
|
out[7] = a13 * c - a03 * s;
|
|
1370
1370
|
return out;
|
|
1371
1371
|
};
|
|
1372
|
-
module.exports =
|
|
1372
|
+
module.exports = rotateZ3;
|
|
1373
1373
|
}
|
|
1374
1374
|
});
|
|
1375
1375
|
|
|
@@ -1443,7 +1443,7 @@ var require_toString2 = __commonJS({
|
|
|
1443
1443
|
var require_translate = __commonJS({
|
|
1444
1444
|
"node_modules/@jscad/modeling/src/maths/mat4/translate.js"(exports, module) {
|
|
1445
1445
|
"use strict";
|
|
1446
|
-
var
|
|
1446
|
+
var translate3 = (out, matrix, offsets) => {
|
|
1447
1447
|
const x = offsets[0];
|
|
1448
1448
|
const y = offsets[1];
|
|
1449
1449
|
const z = offsets[2];
|
|
@@ -1496,7 +1496,7 @@ var require_translate = __commonJS({
|
|
|
1496
1496
|
}
|
|
1497
1497
|
return out;
|
|
1498
1498
|
};
|
|
1499
|
-
module.exports =
|
|
1499
|
+
module.exports = translate3;
|
|
1500
1500
|
}
|
|
1501
1501
|
});
|
|
1502
1502
|
|
|
@@ -3833,11 +3833,11 @@ var require_invert2 = __commonJS({
|
|
|
3833
3833
|
"use strict";
|
|
3834
3834
|
var plane = require_plane();
|
|
3835
3835
|
var create = require_create6();
|
|
3836
|
-
var invert = (
|
|
3837
|
-
const vertices =
|
|
3836
|
+
var invert = (polygon3) => {
|
|
3837
|
+
const vertices = polygon3.vertices.slice().reverse();
|
|
3838
3838
|
const inverted = create(vertices);
|
|
3839
|
-
if (
|
|
3840
|
-
inverted.plane = plane.flip(plane.create(),
|
|
3839
|
+
if (polygon3.plane) {
|
|
3840
|
+
inverted.plane = plane.flip(plane.create(), polygon3.plane);
|
|
3841
3841
|
}
|
|
3842
3842
|
return inverted;
|
|
3843
3843
|
};
|
|
@@ -3869,7 +3869,7 @@ var require_isConvex = __commonJS({
|
|
|
3869
3869
|
"use strict";
|
|
3870
3870
|
var plane = require_plane();
|
|
3871
3871
|
var vec3 = require_vec3();
|
|
3872
|
-
var isConvex = (
|
|
3872
|
+
var isConvex = (polygon3) => areVerticesConvex(polygon3.vertices);
|
|
3873
3873
|
var areVerticesConvex = (vertices) => {
|
|
3874
3874
|
const numvertices = vertices.length;
|
|
3875
3875
|
if (numvertices > 2) {
|
|
@@ -3905,11 +3905,11 @@ var require_plane2 = __commonJS({
|
|
|
3905
3905
|
"node_modules/@jscad/modeling/src/geometries/poly3/plane.js"(exports, module) {
|
|
3906
3906
|
"use strict";
|
|
3907
3907
|
var mplane = require_plane();
|
|
3908
|
-
var plane = (
|
|
3909
|
-
if (!
|
|
3910
|
-
|
|
3908
|
+
var plane = (polygon3) => {
|
|
3909
|
+
if (!polygon3.plane) {
|
|
3910
|
+
polygon3.plane = mplane.fromPoints(mplane.create(), ...polygon3.vertices);
|
|
3911
3911
|
}
|
|
3912
|
-
return
|
|
3912
|
+
return polygon3.plane;
|
|
3913
3913
|
};
|
|
3914
3914
|
module.exports = plane;
|
|
3915
3915
|
}
|
|
@@ -3920,13 +3920,13 @@ var require_measureArea = __commonJS({
|
|
|
3920
3920
|
"node_modules/@jscad/modeling/src/geometries/poly3/measureArea.js"(exports, module) {
|
|
3921
3921
|
"use strict";
|
|
3922
3922
|
var plane = require_plane2();
|
|
3923
|
-
var measureArea = (
|
|
3924
|
-
const n =
|
|
3923
|
+
var measureArea = (polygon3) => {
|
|
3924
|
+
const n = polygon3.vertices.length;
|
|
3925
3925
|
if (n < 3) {
|
|
3926
3926
|
return 0;
|
|
3927
3927
|
}
|
|
3928
|
-
const vertices =
|
|
3929
|
-
const normal = plane(
|
|
3928
|
+
const vertices = polygon3.vertices;
|
|
3929
|
+
const normal = plane(polygon3);
|
|
3930
3930
|
const ax = Math.abs(normal[0]);
|
|
3931
3931
|
const ay = Math.abs(normal[1]);
|
|
3932
3932
|
const az = Math.abs(normal[2]);
|
|
@@ -3985,8 +3985,8 @@ var require_measureBoundingBox = __commonJS({
|
|
|
3985
3985
|
"node_modules/@jscad/modeling/src/geometries/poly3/measureBoundingBox.js"(exports, module) {
|
|
3986
3986
|
"use strict";
|
|
3987
3987
|
var vec3 = require_vec3();
|
|
3988
|
-
var measureBoundingBox2 = (
|
|
3989
|
-
const vertices =
|
|
3988
|
+
var measureBoundingBox2 = (polygon3) => {
|
|
3989
|
+
const vertices = polygon3.vertices;
|
|
3990
3990
|
const numvertices = vertices.length;
|
|
3991
3991
|
const min = numvertices === 0 ? vec3.create() : vec3.clone(vertices[0]);
|
|
3992
3992
|
const max = vec3.clone(min);
|
|
@@ -4064,10 +4064,10 @@ var require_measureBoundingSphere = __commonJS({
|
|
|
4064
4064
|
"use strict";
|
|
4065
4065
|
var vec4 = require_vec4();
|
|
4066
4066
|
var cache = /* @__PURE__ */ new WeakMap();
|
|
4067
|
-
var measureBoundingSphere = (
|
|
4068
|
-
const boundingSphere = cache.get(
|
|
4067
|
+
var measureBoundingSphere = (polygon3) => {
|
|
4068
|
+
const boundingSphere = cache.get(polygon3);
|
|
4069
4069
|
if (boundingSphere) return boundingSphere;
|
|
4070
|
-
const vertices =
|
|
4070
|
+
const vertices = polygon3.vertices;
|
|
4071
4071
|
const out = vec4.create();
|
|
4072
4072
|
if (vertices.length === 0) {
|
|
4073
4073
|
out[0] = 0;
|
|
@@ -4097,7 +4097,7 @@ var require_measureBoundingSphere = __commonJS({
|
|
|
4097
4097
|
const y = out[1] - maxy[1];
|
|
4098
4098
|
const z = out[2] - maxz[2];
|
|
4099
4099
|
out[3] = Math.sqrt(x * x + y * y + z * z);
|
|
4100
|
-
cache.set(
|
|
4100
|
+
cache.set(polygon3, out);
|
|
4101
4101
|
return out;
|
|
4102
4102
|
};
|
|
4103
4103
|
module.exports = measureBoundingSphere;
|
|
@@ -4109,9 +4109,9 @@ var require_measureSignedVolume = __commonJS({
|
|
|
4109
4109
|
"node_modules/@jscad/modeling/src/geometries/poly3/measureSignedVolume.js"(exports, module) {
|
|
4110
4110
|
"use strict";
|
|
4111
4111
|
var vec3 = require_vec3();
|
|
4112
|
-
var measureSignedVolume = (
|
|
4112
|
+
var measureSignedVolume = (polygon3) => {
|
|
4113
4113
|
let signedVolume = 0;
|
|
4114
|
-
const vertices =
|
|
4114
|
+
const vertices = polygon3.vertices;
|
|
4115
4115
|
const cross = vec3.create();
|
|
4116
4116
|
for (let i = 0; i < vertices.length - 2; i++) {
|
|
4117
4117
|
vec3.cross(cross, vertices[i + 1], vertices[i + 2]);
|
|
@@ -4128,7 +4128,7 @@ var require_measureSignedVolume = __commonJS({
|
|
|
4128
4128
|
var require_toPoints2 = __commonJS({
|
|
4129
4129
|
"node_modules/@jscad/modeling/src/geometries/poly3/toPoints.js"(exports, module) {
|
|
4130
4130
|
"use strict";
|
|
4131
|
-
var toPoints = (
|
|
4131
|
+
var toPoints = (polygon3) => polygon3.vertices;
|
|
4132
4132
|
module.exports = toPoints;
|
|
4133
4133
|
}
|
|
4134
4134
|
});
|
|
@@ -4138,9 +4138,9 @@ var require_toString6 = __commonJS({
|
|
|
4138
4138
|
"node_modules/@jscad/modeling/src/geometries/poly3/toString.js"(exports, module) {
|
|
4139
4139
|
"use strict";
|
|
4140
4140
|
var vec3 = require_vec3();
|
|
4141
|
-
var toString = (
|
|
4141
|
+
var toString = (polygon3) => {
|
|
4142
4142
|
let result = "poly3: vertices: [";
|
|
4143
|
-
|
|
4143
|
+
polygon3.vertices.forEach((vertex) => {
|
|
4144
4144
|
result += `${vec3.toString(vertex)}, `;
|
|
4145
4145
|
});
|
|
4146
4146
|
result += "]";
|
|
@@ -4157,8 +4157,8 @@ var require_transform6 = __commonJS({
|
|
|
4157
4157
|
var mat4 = require_mat4();
|
|
4158
4158
|
var vec3 = require_vec3();
|
|
4159
4159
|
var create = require_create6();
|
|
4160
|
-
var transform = (matrix,
|
|
4161
|
-
const vertices =
|
|
4160
|
+
var transform = (matrix, polygon3) => {
|
|
4161
|
+
const vertices = polygon3.vertices.map((vertex) => vec3.transform(vec3.create(), vertex, matrix));
|
|
4162
4162
|
if (mat4.isMirroring(matrix)) {
|
|
4163
4163
|
vertices.reverse();
|
|
4164
4164
|
}
|
|
@@ -4274,8 +4274,8 @@ var require_fromPoints4 = __commonJS({
|
|
|
4274
4274
|
throw new Error("the given points must be an array");
|
|
4275
4275
|
}
|
|
4276
4276
|
const polygons = listofpoints.map((points, index) => {
|
|
4277
|
-
const
|
|
4278
|
-
return
|
|
4277
|
+
const polygon3 = poly3.create(points);
|
|
4278
|
+
return polygon3;
|
|
4279
4279
|
});
|
|
4280
4280
|
const result = create(polygons);
|
|
4281
4281
|
return result;
|
|
@@ -4326,7 +4326,7 @@ var require_applyTransforms2 = __commonJS({
|
|
|
4326
4326
|
var poly3 = require_poly3();
|
|
4327
4327
|
var applyTransforms = (geometry) => {
|
|
4328
4328
|
if (mat4.isIdentity(geometry.transforms)) return geometry;
|
|
4329
|
-
geometry.polygons = geometry.polygons.map((
|
|
4329
|
+
geometry.polygons = geometry.polygons.map((polygon3) => poly3.transform(geometry.transforms, polygon3));
|
|
4330
4330
|
geometry.transforms = mat4.create();
|
|
4331
4331
|
return geometry;
|
|
4332
4332
|
};
|
|
@@ -4353,7 +4353,7 @@ var require_invert3 = __commonJS({
|
|
|
4353
4353
|
var toPolygons2 = require_toPolygons();
|
|
4354
4354
|
var invert = (geometry) => {
|
|
4355
4355
|
const polygons = toPolygons2(geometry);
|
|
4356
|
-
const newpolygons = polygons.map((
|
|
4356
|
+
const newpolygons = polygons.map((polygon3) => poly3.invert(polygon3));
|
|
4357
4357
|
return create(newpolygons);
|
|
4358
4358
|
};
|
|
4359
4359
|
module.exports = invert;
|
|
@@ -4386,7 +4386,7 @@ var require_toPoints3 = __commonJS({
|
|
|
4386
4386
|
var toPolygons2 = require_toPolygons();
|
|
4387
4387
|
var toPoints = (geometry) => {
|
|
4388
4388
|
const polygons = toPolygons2(geometry);
|
|
4389
|
-
const listofpoints = polygons.map((
|
|
4389
|
+
const listofpoints = polygons.map((polygon3) => poly3.toPoints(polygon3));
|
|
4390
4390
|
return listofpoints;
|
|
4391
4391
|
};
|
|
4392
4392
|
module.exports = toPoints;
|
|
@@ -4402,8 +4402,8 @@ var require_toString7 = __commonJS({
|
|
|
4402
4402
|
var toString = (geometry) => {
|
|
4403
4403
|
const polygons = toPolygons2(geometry);
|
|
4404
4404
|
let result = "geom3 (" + polygons.length + " polygons):\n";
|
|
4405
|
-
polygons.forEach((
|
|
4406
|
-
result += " " + poly3.toString(
|
|
4405
|
+
polygons.forEach((polygon3) => {
|
|
4406
|
+
result += " " + poly3.toString(polygon3) + "\n";
|
|
4407
4407
|
});
|
|
4408
4408
|
return result;
|
|
4409
4409
|
};
|
|
@@ -4420,7 +4420,7 @@ var require_toCompactBinary2 = __commonJS({
|
|
|
4420
4420
|
const polygons = geometry.polygons;
|
|
4421
4421
|
const transforms = geometry.transforms;
|
|
4422
4422
|
const numberOfPolygons = polygons.length;
|
|
4423
|
-
const numberOfVertices = polygons.reduce((count,
|
|
4423
|
+
const numberOfVertices = polygons.reduce((count, polygon3) => count + polygon3.vertices.length, 0);
|
|
4424
4424
|
let color = [-1, -1, -1, -1];
|
|
4425
4425
|
if (geometry.color) color = geometry.color;
|
|
4426
4426
|
const compacted = new Float32Array(1 + 16 + 4 + 1 + numberOfPolygons + numberOfVertices * 3);
|
|
@@ -4448,8 +4448,8 @@ var require_toCompactBinary2 = __commonJS({
|
|
|
4448
4448
|
compacted[21] = numberOfVertices;
|
|
4449
4449
|
let ci = 22;
|
|
4450
4450
|
let vi = ci + numberOfPolygons;
|
|
4451
|
-
polygons.forEach((
|
|
4452
|
-
const points = poly3.toPoints(
|
|
4451
|
+
polygons.forEach((polygon3) => {
|
|
4452
|
+
const points = poly3.toPoints(polygon3);
|
|
4453
4453
|
compacted[ci] = points.length;
|
|
4454
4454
|
ci++;
|
|
4455
4455
|
for (let i = 0; i < points.length; i++) {
|
|
@@ -5877,7 +5877,7 @@ var require_measureArea2 = __commonJS({
|
|
|
5877
5877
|
"node_modules/@jscad/modeling/src/geometries/poly2/measureArea.js"(exports, module) {
|
|
5878
5878
|
"use strict";
|
|
5879
5879
|
var area = require_area();
|
|
5880
|
-
var measureArea = (
|
|
5880
|
+
var measureArea = (polygon3) => area(polygon3.vertices);
|
|
5881
5881
|
module.exports = measureArea;
|
|
5882
5882
|
}
|
|
5883
5883
|
});
|
|
@@ -5901,8 +5901,8 @@ var require_flip2 = __commonJS({
|
|
|
5901
5901
|
"node_modules/@jscad/modeling/src/geometries/poly2/flip.js"(exports, module) {
|
|
5902
5902
|
"use strict";
|
|
5903
5903
|
var create = require_create10();
|
|
5904
|
-
var flip = (
|
|
5905
|
-
const vertices =
|
|
5904
|
+
var flip = (polygon3) => {
|
|
5905
|
+
const vertices = polygon3.vertices.slice().reverse();
|
|
5906
5906
|
return create(vertices);
|
|
5907
5907
|
};
|
|
5908
5908
|
module.exports = flip;
|
|
@@ -5915,22 +5915,22 @@ var require_arePointsInside = __commonJS({
|
|
|
5915
5915
|
"use strict";
|
|
5916
5916
|
var measureArea = require_measureArea2();
|
|
5917
5917
|
var flip = require_flip2();
|
|
5918
|
-
var arePointsInside = (points,
|
|
5918
|
+
var arePointsInside = (points, polygon3) => {
|
|
5919
5919
|
if (points.length === 0) return 0;
|
|
5920
|
-
const vertices =
|
|
5920
|
+
const vertices = polygon3.vertices;
|
|
5921
5921
|
if (vertices.length < 3) return 0;
|
|
5922
|
-
if (measureArea(
|
|
5923
|
-
|
|
5922
|
+
if (measureArea(polygon3) < 0) {
|
|
5923
|
+
polygon3 = flip(polygon3);
|
|
5924
5924
|
}
|
|
5925
5925
|
const sum = points.reduce((acc, point) => acc + isPointInside(point, vertices), 0);
|
|
5926
5926
|
return sum === points.length ? 1 : 0;
|
|
5927
5927
|
};
|
|
5928
|
-
var isPointInside = (point,
|
|
5929
|
-
const numverts =
|
|
5928
|
+
var isPointInside = (point, polygon3) => {
|
|
5929
|
+
const numverts = polygon3.length;
|
|
5930
5930
|
const tx = point[0];
|
|
5931
5931
|
const ty = point[1];
|
|
5932
|
-
let vtx0 =
|
|
5933
|
-
let vtx1 =
|
|
5932
|
+
let vtx0 = polygon3[numverts - 1];
|
|
5933
|
+
let vtx1 = polygon3[0];
|
|
5934
5934
|
let yflag0 = vtx0[1] > ty;
|
|
5935
5935
|
let insideFlag = 0;
|
|
5936
5936
|
let i = 0;
|
|
@@ -5949,7 +5949,7 @@ var require_arePointsInside = __commonJS({
|
|
|
5949
5949
|
}
|
|
5950
5950
|
yflag0 = yflag1;
|
|
5951
5951
|
vtx0 = vtx1;
|
|
5952
|
-
vtx1 =
|
|
5952
|
+
vtx1 = polygon3[++i];
|
|
5953
5953
|
}
|
|
5954
5954
|
return insideFlag;
|
|
5955
5955
|
};
|
|
@@ -6628,7 +6628,7 @@ var require_measureArea3 = __commonJS({
|
|
|
6628
6628
|
let area = cache.get(geometry);
|
|
6629
6629
|
if (area) return area;
|
|
6630
6630
|
const polygons = geom32.toPolygons(geometry);
|
|
6631
|
-
area = polygons.reduce((area2,
|
|
6631
|
+
area = polygons.reduce((area2, polygon3) => area2 + poly3.measureArea(polygon3), 0);
|
|
6632
6632
|
cache.set(geometry, area);
|
|
6633
6633
|
return area;
|
|
6634
6634
|
};
|
|
@@ -6731,8 +6731,8 @@ var require_measureBoundingBox2 = __commonJS({
|
|
|
6731
6731
|
vec3.copy(minpoint, points[0]);
|
|
6732
6732
|
}
|
|
6733
6733
|
let maxpoint = vec3.clone(minpoint);
|
|
6734
|
-
polygons.forEach((
|
|
6735
|
-
poly3.toPoints(
|
|
6734
|
+
polygons.forEach((polygon3) => {
|
|
6735
|
+
poly3.toPoints(polygon3).forEach((point) => {
|
|
6736
6736
|
vec3.min(minpoint, minpoint, point);
|
|
6737
6737
|
vec3.max(maxpoint, maxpoint, point);
|
|
6738
6738
|
});
|
|
@@ -6839,7 +6839,7 @@ var require_measureVolume = __commonJS({
|
|
|
6839
6839
|
let volume = cache.get(geometry);
|
|
6840
6840
|
if (volume) return volume;
|
|
6841
6841
|
const polygons = geom32.toPolygons(geometry);
|
|
6842
|
-
volume = polygons.reduce((volume2,
|
|
6842
|
+
volume = polygons.reduce((volume2, polygon3) => volume2 + poly3.measureSignedVolume(polygon3), 0);
|
|
6843
6843
|
cache.set(geometry, volume);
|
|
6844
6844
|
return volume;
|
|
6845
6845
|
};
|
|
@@ -6944,15 +6944,15 @@ var require_measureBoundingSphere2 = __commonJS({
|
|
|
6944
6944
|
const polygons = geom32.toPolygons(geometry);
|
|
6945
6945
|
if (polygons.length > 0) {
|
|
6946
6946
|
let numPoints = 0;
|
|
6947
|
-
polygons.forEach((
|
|
6948
|
-
poly3.toPoints(
|
|
6947
|
+
polygons.forEach((polygon3) => {
|
|
6948
|
+
poly3.toPoints(polygon3).forEach((point) => {
|
|
6949
6949
|
vec3.add(centroid, centroid, point);
|
|
6950
6950
|
numPoints++;
|
|
6951
6951
|
});
|
|
6952
6952
|
});
|
|
6953
6953
|
vec3.scale(centroid, centroid, 1 / numPoints);
|
|
6954
|
-
polygons.forEach((
|
|
6955
|
-
poly3.toPoints(
|
|
6954
|
+
polygons.forEach((polygon3) => {
|
|
6955
|
+
poly3.toPoints(polygon3).forEach((point) => {
|
|
6956
6956
|
radius = Math.max(radius, vec3.squaredDistance(centroid, point));
|
|
6957
6957
|
});
|
|
6958
6958
|
});
|
|
@@ -7040,8 +7040,8 @@ var require_measureCenterOfMass = __commonJS({
|
|
|
7040
7040
|
if (polygons.length === 0) return centerOfMass;
|
|
7041
7041
|
let totalVolume = 0;
|
|
7042
7042
|
const vector = vec3.create();
|
|
7043
|
-
polygons.forEach((
|
|
7044
|
-
const vertices =
|
|
7043
|
+
polygons.forEach((polygon3) => {
|
|
7044
|
+
const vertices = polygon3.vertices;
|
|
7045
7045
|
for (let i = 0; i < vertices.length - 2; i++) {
|
|
7046
7046
|
vec3.cross(vector, vertices[i + 1], vertices[i + 2]);
|
|
7047
7047
|
const volume = vec3.dot(vertices[0], vector) / 6;
|
|
@@ -7622,9 +7622,9 @@ var require_polyhedron = __commonJS({
|
|
|
7622
7622
|
faces.forEach((face) => face.reverse());
|
|
7623
7623
|
}
|
|
7624
7624
|
const polygons = faces.map((face, findex) => {
|
|
7625
|
-
const
|
|
7626
|
-
if (colors && colors[findex])
|
|
7627
|
-
return
|
|
7625
|
+
const polygon3 = poly3.create(face.map((pindex) => points[pindex]));
|
|
7626
|
+
if (colors && colors[findex]) polygon3.color = colors[findex];
|
|
7627
|
+
return polygon3;
|
|
7628
7628
|
});
|
|
7629
7629
|
return geom32.create(polygons);
|
|
7630
7630
|
};
|
|
@@ -7777,7 +7777,7 @@ var require_polygon = __commonJS({
|
|
|
7777
7777
|
"node_modules/@jscad/modeling/src/primitives/polygon.js"(exports, module) {
|
|
7778
7778
|
"use strict";
|
|
7779
7779
|
var geom2 = require_geom2();
|
|
7780
|
-
var
|
|
7780
|
+
var polygon3 = (options) => {
|
|
7781
7781
|
const defaults = {
|
|
7782
7782
|
points: [],
|
|
7783
7783
|
paths: [],
|
|
@@ -7818,7 +7818,7 @@ var require_polygon = __commonJS({
|
|
|
7818
7818
|
}
|
|
7819
7819
|
return geometry;
|
|
7820
7820
|
};
|
|
7821
|
-
module.exports =
|
|
7821
|
+
module.exports = polygon3;
|
|
7822
7822
|
}
|
|
7823
7823
|
});
|
|
7824
7824
|
|
|
@@ -7829,7 +7829,7 @@ var require_rectangle = __commonJS({
|
|
|
7829
7829
|
var vec2 = require_vec2();
|
|
7830
7830
|
var geom2 = require_geom2();
|
|
7831
7831
|
var { isNumberArray } = require_commonChecks();
|
|
7832
|
-
var
|
|
7832
|
+
var rectangle3 = (options) => {
|
|
7833
7833
|
const defaults = {
|
|
7834
7834
|
center: [0, 0],
|
|
7835
7835
|
size: [2, 2]
|
|
@@ -7849,7 +7849,7 @@ var require_rectangle = __commonJS({
|
|
|
7849
7849
|
];
|
|
7850
7850
|
return geom2.fromPoints(points);
|
|
7851
7851
|
};
|
|
7852
|
-
module.exports =
|
|
7852
|
+
module.exports = rectangle3;
|
|
7853
7853
|
}
|
|
7854
7854
|
});
|
|
7855
7855
|
|
|
@@ -8127,7 +8127,7 @@ var require_roundedRectangle = __commonJS({
|
|
|
8127
8127
|
var vec2 = require_vec2();
|
|
8128
8128
|
var geom2 = require_geom2();
|
|
8129
8129
|
var { isGTE, isNumberArray } = require_commonChecks();
|
|
8130
|
-
var
|
|
8130
|
+
var rectangle3 = require_rectangle();
|
|
8131
8131
|
var roundedRectangle2 = (options) => {
|
|
8132
8132
|
const defaults = {
|
|
8133
8133
|
center: [0, 0],
|
|
@@ -8142,7 +8142,7 @@ var require_roundedRectangle = __commonJS({
|
|
|
8142
8142
|
if (!isGTE(roundRadius, 0)) throw new Error("roundRadius must be positive");
|
|
8143
8143
|
if (!isGTE(segments, 4)) throw new Error("segments must be four or more");
|
|
8144
8144
|
if (size[0] === 0 || size[1] === 0) return geom2.create();
|
|
8145
|
-
if (roundRadius === 0) return
|
|
8145
|
+
if (roundRadius === 0) return rectangle3({ center, size });
|
|
8146
8146
|
size = size.map((v) => v / 2);
|
|
8147
8147
|
if (roundRadius > size[0] - EPS || roundRadius > size[1] - EPS) throw new Error("roundRadius must be smaller than the radius of all dimensions");
|
|
8148
8148
|
const cornersegments = Math.floor(segments / 4);
|
|
@@ -8198,7 +8198,7 @@ var require_sphere = __commonJS({
|
|
|
8198
8198
|
var require_square = __commonJS({
|
|
8199
8199
|
"node_modules/@jscad/modeling/src/primitives/square.js"(exports, module) {
|
|
8200
8200
|
"use strict";
|
|
8201
|
-
var
|
|
8201
|
+
var rectangle3 = require_rectangle();
|
|
8202
8202
|
var { isGTE } = require_commonChecks();
|
|
8203
8203
|
var square = (options) => {
|
|
8204
8204
|
const defaults = {
|
|
@@ -8208,7 +8208,7 @@ var require_square = __commonJS({
|
|
|
8208
8208
|
let { center, size } = Object.assign({}, defaults, options);
|
|
8209
8209
|
if (!isGTE(size, 0)) throw new Error("size must be positive");
|
|
8210
8210
|
size = [size, size];
|
|
8211
|
-
return
|
|
8211
|
+
return rectangle3({ center, size });
|
|
8212
8212
|
};
|
|
8213
8213
|
module.exports = square;
|
|
8214
8214
|
}
|
|
@@ -9458,12 +9458,12 @@ var require_rotate3 = __commonJS({
|
|
|
9458
9458
|
};
|
|
9459
9459
|
var rotateX2 = (angle, ...objects) => rotate([angle, 0, 0], objects);
|
|
9460
9460
|
var rotateY = (angle, ...objects) => rotate([0, angle, 0], objects);
|
|
9461
|
-
var
|
|
9461
|
+
var rotateZ3 = (angle, ...objects) => rotate([0, 0, angle], objects);
|
|
9462
9462
|
module.exports = {
|
|
9463
9463
|
rotate,
|
|
9464
9464
|
rotateX: rotateX2,
|
|
9465
9465
|
rotateY,
|
|
9466
|
-
rotateZ:
|
|
9466
|
+
rotateZ: rotateZ3
|
|
9467
9467
|
};
|
|
9468
9468
|
}
|
|
9469
9469
|
});
|
|
@@ -9477,7 +9477,7 @@ var require_translate2 = __commonJS({
|
|
|
9477
9477
|
var geom2 = require_geom2();
|
|
9478
9478
|
var geom32 = require_geom3();
|
|
9479
9479
|
var path2 = require_path2();
|
|
9480
|
-
var
|
|
9480
|
+
var translate3 = (offset, ...objects) => {
|
|
9481
9481
|
if (!Array.isArray(offset)) throw new Error("offset must be an array");
|
|
9482
9482
|
objects = flatten(objects);
|
|
9483
9483
|
if (objects.length === 0) throw new Error("wrong number of arguments");
|
|
@@ -9492,11 +9492,11 @@ var require_translate2 = __commonJS({
|
|
|
9492
9492
|
});
|
|
9493
9493
|
return results.length === 1 ? results[0] : results;
|
|
9494
9494
|
};
|
|
9495
|
-
var translateX = (offset, ...objects) =>
|
|
9496
|
-
var translateY = (offset, ...objects) =>
|
|
9497
|
-
var translateZ = (offset, ...objects) =>
|
|
9495
|
+
var translateX = (offset, ...objects) => translate3([offset, 0, 0], objects);
|
|
9496
|
+
var translateY = (offset, ...objects) => translate3([0, offset, 0], objects);
|
|
9497
|
+
var translateZ = (offset, ...objects) => translate3([0, 0, offset], objects);
|
|
9498
9498
|
module.exports = {
|
|
9499
|
-
translate:
|
|
9499
|
+
translate: translate3,
|
|
9500
9500
|
translateX,
|
|
9501
9501
|
translateY,
|
|
9502
9502
|
translateZ
|
|
@@ -9511,7 +9511,7 @@ var require_torus = __commonJS({
|
|
|
9511
9511
|
var { TAU } = require_constants();
|
|
9512
9512
|
var extrudeRotate = require_extrudeRotate();
|
|
9513
9513
|
var { rotate } = require_rotate3();
|
|
9514
|
-
var { translate:
|
|
9514
|
+
var { translate: translate3 } = require_translate2();
|
|
9515
9515
|
var circle = require_circle();
|
|
9516
9516
|
var { isGT, isGTE } = require_commonChecks();
|
|
9517
9517
|
var torus = (options) => {
|
|
@@ -9536,7 +9536,7 @@ var require_torus = __commonJS({
|
|
|
9536
9536
|
if (innerRotation !== 0) {
|
|
9537
9537
|
innerCircle = rotate([0, 0, innerRotation], innerCircle);
|
|
9538
9538
|
}
|
|
9539
|
-
innerCircle =
|
|
9539
|
+
innerCircle = translate3([outerRadius, 0], innerCircle);
|
|
9540
9540
|
const extrudeOptions = {
|
|
9541
9541
|
startAngle,
|
|
9542
9542
|
angle: outerRotation,
|
|
@@ -10074,12 +10074,12 @@ var require_fromFakePolygons = __commonJS({
|
|
|
10074
10074
|
"use strict";
|
|
10075
10075
|
var vec2 = require_vec2();
|
|
10076
10076
|
var geom2 = require_geom2();
|
|
10077
|
-
var fromFakePolygon = (epsilon,
|
|
10078
|
-
if (
|
|
10077
|
+
var fromFakePolygon = (epsilon, polygon3) => {
|
|
10078
|
+
if (polygon3.vertices.length < 4) {
|
|
10079
10079
|
return null;
|
|
10080
10080
|
}
|
|
10081
10081
|
const vert1Indices = [];
|
|
10082
|
-
const points3D =
|
|
10082
|
+
const points3D = polygon3.vertices.filter((vertex, i) => {
|
|
10083
10083
|
if (vertex[2] > 0) {
|
|
10084
10084
|
vert1Indices.push(i);
|
|
10085
10085
|
return true;
|
|
@@ -10106,7 +10106,7 @@ var require_fromFakePolygons = __commonJS({
|
|
|
10106
10106
|
return points2D;
|
|
10107
10107
|
};
|
|
10108
10108
|
var fromFakePolygons = (epsilon, polygons) => {
|
|
10109
|
-
const sides = polygons.map((
|
|
10109
|
+
const sides = polygons.map((polygon3) => fromFakePolygon(epsilon, polygon3)).filter((polygon3) => polygon3 !== null);
|
|
10110
10110
|
return geom2.create(sides);
|
|
10111
10111
|
};
|
|
10112
10112
|
module.exports = fromFakePolygons;
|
|
@@ -10463,8 +10463,8 @@ var require_reTesselateCoplanarPolygons = __commonJS({
|
|
|
10463
10463
|
prevpolygon.outpolygon.leftpoints.reverse();
|
|
10464
10464
|
const points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints);
|
|
10465
10465
|
const vertices3d = points2d.map((point2d) => orthobasis.to3D(point2d));
|
|
10466
|
-
const
|
|
10467
|
-
if (
|
|
10466
|
+
const polygon3 = poly3.fromPointsAndPlane(vertices3d, plane);
|
|
10467
|
+
if (polygon3.vertices.length) destpolygons.push(polygon3);
|
|
10468
10468
|
}
|
|
10469
10469
|
}
|
|
10470
10470
|
}
|
|
@@ -10508,7 +10508,7 @@ var require_retessellate = __commonJS({
|
|
|
10508
10508
|
if (geometry.isRetesselated) {
|
|
10509
10509
|
return geometry;
|
|
10510
10510
|
}
|
|
10511
|
-
const polygons = geom32.toPolygons(geometry).map((
|
|
10511
|
+
const polygons = geom32.toPolygons(geometry).map((polygon3, index) => ({ vertices: polygon3.vertices, plane: poly3.plane(polygon3), index }));
|
|
10512
10512
|
const classified = classifyPolygons(polygons);
|
|
10513
10513
|
const destPolygons = [];
|
|
10514
10514
|
classified.forEach((group) => {
|
|
@@ -10554,8 +10554,8 @@ var require_retessellate = __commonJS({
|
|
|
10554
10554
|
clusters.forEach((cluster) => {
|
|
10555
10555
|
if (cluster[0]) result[cluster[0].index] = cluster;
|
|
10556
10556
|
});
|
|
10557
|
-
nonCoplanar.forEach((
|
|
10558
|
-
result[
|
|
10557
|
+
nonCoplanar.forEach((polygon3) => {
|
|
10558
|
+
result[polygon3.index] = polygon3;
|
|
10559
10559
|
});
|
|
10560
10560
|
return result;
|
|
10561
10561
|
};
|
|
@@ -10747,15 +10747,15 @@ var require_splitPolygonByPlane = __commonJS({
|
|
|
10747
10747
|
var vec3 = require_vec3();
|
|
10748
10748
|
var poly3 = require_poly3();
|
|
10749
10749
|
var splitLineSegmentByPlane = require_splitLineSegmentByPlane();
|
|
10750
|
-
var splitPolygonByPlane = (splane,
|
|
10750
|
+
var splitPolygonByPlane = (splane, polygon3) => {
|
|
10751
10751
|
const result = {
|
|
10752
10752
|
type: null,
|
|
10753
10753
|
front: null,
|
|
10754
10754
|
back: null
|
|
10755
10755
|
};
|
|
10756
|
-
const vertices =
|
|
10756
|
+
const vertices = polygon3.vertices;
|
|
10757
10757
|
const numvertices = vertices.length;
|
|
10758
|
-
const pplane = poly3.plane(
|
|
10758
|
+
const pplane = poly3.plane(polygon3);
|
|
10759
10759
|
if (plane.equals(pplane, splane)) {
|
|
10760
10760
|
result.type = 0;
|
|
10761
10761
|
} else {
|
|
@@ -10855,10 +10855,10 @@ var require_PolygonTreeNode = __commonJS({
|
|
|
10855
10855
|
var splitPolygonByPlane = require_splitPolygonByPlane();
|
|
10856
10856
|
var PolygonTreeNode = class _PolygonTreeNode {
|
|
10857
10857
|
// constructor creates the root node
|
|
10858
|
-
constructor(parent,
|
|
10858
|
+
constructor(parent, polygon3) {
|
|
10859
10859
|
this.parent = parent;
|
|
10860
10860
|
this.children = [];
|
|
10861
|
-
this.polygon =
|
|
10861
|
+
this.polygon = polygon3;
|
|
10862
10862
|
this.removed = false;
|
|
10863
10863
|
}
|
|
10864
10864
|
// fill the tree with polygons. Should be called on the root node only; child nodes must
|
|
@@ -10868,8 +10868,8 @@ var require_PolygonTreeNode = __commonJS({
|
|
|
10868
10868
|
throw new Error("Assertion failed");
|
|
10869
10869
|
}
|
|
10870
10870
|
const _this = this;
|
|
10871
|
-
polygons.forEach((
|
|
10872
|
-
_this.addChild(
|
|
10871
|
+
polygons.forEach((polygon3) => {
|
|
10872
|
+
_this.addChild(polygon3);
|
|
10873
10873
|
});
|
|
10874
10874
|
}
|
|
10875
10875
|
// remove a node
|
|
@@ -10946,9 +10946,9 @@ var require_PolygonTreeNode = __commonJS({
|
|
|
10946
10946
|
}
|
|
10947
10947
|
// only to be called for nodes with no children
|
|
10948
10948
|
_splitByPlane(splane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {
|
|
10949
|
-
const
|
|
10950
|
-
if (
|
|
10951
|
-
const bound = poly3.measureBoundingSphere(
|
|
10949
|
+
const polygon3 = this.polygon;
|
|
10950
|
+
if (polygon3) {
|
|
10951
|
+
const bound = poly3.measureBoundingSphere(polygon3);
|
|
10952
10952
|
const sphereradius = bound[3] + EPS;
|
|
10953
10953
|
const spherecenter = bound;
|
|
10954
10954
|
const d = vec3.dot(splane, spherecenter) - splane[3];
|
|
@@ -10957,7 +10957,7 @@ var require_PolygonTreeNode = __commonJS({
|
|
|
10957
10957
|
} else if (d < -sphereradius) {
|
|
10958
10958
|
backnodes.push(this);
|
|
10959
10959
|
} else {
|
|
10960
|
-
const splitresult = splitPolygonByPlane(splane,
|
|
10960
|
+
const splitresult = splitPolygonByPlane(splane, polygon3);
|
|
10961
10961
|
switch (splitresult.type) {
|
|
10962
10962
|
case 0:
|
|
10963
10963
|
coplanarfrontnodes.push(this);
|
|
@@ -10990,8 +10990,8 @@ var require_PolygonTreeNode = __commonJS({
|
|
|
10990
10990
|
// this should be called whenever the polygon is split
|
|
10991
10991
|
// a child should be created for every fragment of the split polygon
|
|
10992
10992
|
// returns the newly created child
|
|
10993
|
-
addChild(
|
|
10994
|
-
const newchild = new _PolygonTreeNode(this,
|
|
10993
|
+
addChild(polygon3) {
|
|
10994
|
+
const newchild = new _PolygonTreeNode(this, polygon3);
|
|
10995
10995
|
this.children.push(newchild);
|
|
10996
10996
|
return newchild;
|
|
10997
10997
|
}
|
|
@@ -11241,14 +11241,14 @@ var require_scissionGeom3 = __commonJS({
|
|
|
11241
11241
|
const pl = polygons.length;
|
|
11242
11242
|
const indexesPerPoint = /* @__PURE__ */ new Map();
|
|
11243
11243
|
const temp = vec3.create();
|
|
11244
|
-
polygons.forEach((
|
|
11245
|
-
|
|
11244
|
+
polygons.forEach((polygon3, index) => {
|
|
11245
|
+
polygon3.vertices.forEach((point) => {
|
|
11246
11246
|
insertMapping(indexesPerPoint, vec3.snap(temp, point, eps), index);
|
|
11247
11247
|
});
|
|
11248
11248
|
});
|
|
11249
|
-
const indexesPerPolygon = polygons.map((
|
|
11249
|
+
const indexesPerPolygon = polygons.map((polygon3) => {
|
|
11250
11250
|
let indexes = [];
|
|
11251
|
-
|
|
11251
|
+
polygon3.vertices.forEach((point) => {
|
|
11252
11252
|
indexes = indexes.concat(findMapping(indexesPerPoint, vec3.snap(temp, point, eps)));
|
|
11253
11253
|
});
|
|
11254
11254
|
return { e: 1, d: sortNb(indexes) };
|
|
@@ -11694,19 +11694,19 @@ var require_extrudePolygon = __commonJS({
|
|
|
11694
11694
|
polygon1 = poly3.invert(polygon1);
|
|
11695
11695
|
}
|
|
11696
11696
|
const newpolygons = [polygon1];
|
|
11697
|
-
const
|
|
11697
|
+
const polygon22 = poly3.transform(mat4.fromTranslation(mat4.create(), offsetvector), polygon1);
|
|
11698
11698
|
const numvertices = polygon1.vertices.length;
|
|
11699
11699
|
for (let i = 0; i < numvertices; i++) {
|
|
11700
11700
|
const nexti = i < numvertices - 1 ? i + 1 : 0;
|
|
11701
11701
|
const sideFacePolygon = poly3.create([
|
|
11702
11702
|
polygon1.vertices[i],
|
|
11703
|
-
|
|
11704
|
-
|
|
11703
|
+
polygon22.vertices[i],
|
|
11704
|
+
polygon22.vertices[nexti],
|
|
11705
11705
|
polygon1.vertices[nexti]
|
|
11706
11706
|
]);
|
|
11707
11707
|
newpolygons.push(sideFacePolygon);
|
|
11708
11708
|
}
|
|
11709
|
-
newpolygons.push(poly3.invert(
|
|
11709
|
+
newpolygons.push(poly3.invert(polygon22));
|
|
11710
11710
|
return geom32.create(newpolygons);
|
|
11711
11711
|
};
|
|
11712
11712
|
module.exports = extrudePolygon;
|
|
@@ -11767,17 +11767,17 @@ var require_expandShell = __commonJS({
|
|
|
11767
11767
|
const v1 = vec3.create();
|
|
11768
11768
|
const v2 = vec3.create();
|
|
11769
11769
|
const polygons = geom32.toPolygons(geometry);
|
|
11770
|
-
polygons.forEach((
|
|
11771
|
-
const extrudevector = vec3.scale(vec3.create(), poly3.plane(
|
|
11772
|
-
const translatedpolygon = poly3.transform(mat4.fromTranslation(mat4.create(), vec3.scale(vec3.create(), extrudevector, -0.5)),
|
|
11770
|
+
polygons.forEach((polygon3, index) => {
|
|
11771
|
+
const extrudevector = vec3.scale(vec3.create(), poly3.plane(polygon3), 2 * delta);
|
|
11772
|
+
const translatedpolygon = poly3.transform(mat4.fromTranslation(mat4.create(), vec3.scale(vec3.create(), extrudevector, -0.5)), polygon3);
|
|
11773
11773
|
const extrudedface = extrudePolygon(extrudevector, translatedpolygon);
|
|
11774
11774
|
result = unionGeom3Sub(result, extrudedface);
|
|
11775
|
-
const vertices =
|
|
11775
|
+
const vertices = polygon3.vertices;
|
|
11776
11776
|
for (let i = 0; i < vertices.length; i++) {
|
|
11777
|
-
mapPlaneToVertex(vertices2planes, vertices[i], poly3.plane(
|
|
11777
|
+
mapPlaneToVertex(vertices2planes, vertices[i], poly3.plane(polygon3));
|
|
11778
11778
|
const j = (i + 1) % vertices.length;
|
|
11779
11779
|
const edge = [vertices[i], vertices[j]];
|
|
11780
|
-
mapPlaneToEdge(edges2planes, edge, poly3.plane(
|
|
11780
|
+
mapPlaneToEdge(edges2planes, edge, poly3.plane(polygon3));
|
|
11781
11781
|
}
|
|
11782
11782
|
});
|
|
11783
11783
|
edges2planes.forEach((item) => {
|
|
@@ -11831,8 +11831,8 @@ var require_expandShell = __commonJS({
|
|
|
11831
11831
|
startfacevertices.push(p1);
|
|
11832
11832
|
endfacevertices.push(p2);
|
|
11833
11833
|
const points = [prevp2, p2, p1, prevp1];
|
|
11834
|
-
const
|
|
11835
|
-
polygons2.push(
|
|
11834
|
+
const polygon3 = poly3.create(points);
|
|
11835
|
+
polygons2.push(polygon3);
|
|
11836
11836
|
}
|
|
11837
11837
|
prevp1 = p1;
|
|
11838
11838
|
prevp2 = p2;
|
|
@@ -12034,7 +12034,7 @@ var require_offsetGeom2 = __commonJS({
|
|
|
12034
12034
|
}
|
|
12035
12035
|
const outlines = geom2.toOutlines(geometry);
|
|
12036
12036
|
const newoutlines = outlines.map((outline) => {
|
|
12037
|
-
const level = outlines.reduce((acc,
|
|
12037
|
+
const level = outlines.reduce((acc, polygon3) => acc + poly2.arePointsInside(outline, poly2.create(polygon3)), 0);
|
|
12038
12038
|
const outside = level % 2 === 0;
|
|
12039
12039
|
options = {
|
|
12040
12040
|
delta: outside ? delta : -delta,
|
|
@@ -12182,7 +12182,7 @@ var require_extrudeLinear = __commonJS({
|
|
|
12182
12182
|
var path2 = require_path2();
|
|
12183
12183
|
var extrudeLinearGeom2 = require_extrudeLinearGeom2();
|
|
12184
12184
|
var extrudeLinearPath2 = require_extrudeLinearPath2();
|
|
12185
|
-
var
|
|
12185
|
+
var extrudeLinear3 = (options, ...objects) => {
|
|
12186
12186
|
const defaults = {
|
|
12187
12187
|
height: 1,
|
|
12188
12188
|
twistAngle: 0,
|
|
@@ -12200,7 +12200,7 @@ var require_extrudeLinear = __commonJS({
|
|
|
12200
12200
|
});
|
|
12201
12201
|
return results.length === 1 ? results[0] : results;
|
|
12202
12202
|
};
|
|
12203
|
-
module.exports =
|
|
12203
|
+
module.exports = extrudeLinear3;
|
|
12204
12204
|
}
|
|
12205
12205
|
});
|
|
12206
12206
|
|
|
@@ -12648,24 +12648,24 @@ var require_snapPolygons = __commonJS({
|
|
|
12648
12648
|
"use strict";
|
|
12649
12649
|
var vec3 = require_vec3();
|
|
12650
12650
|
var poly3 = require_poly3();
|
|
12651
|
-
var isValidPoly3 = (epsilon,
|
|
12652
|
-
const area = Math.abs(poly3.measureArea(
|
|
12651
|
+
var isValidPoly3 = (epsilon, polygon3) => {
|
|
12652
|
+
const area = Math.abs(poly3.measureArea(polygon3));
|
|
12653
12653
|
return Number.isFinite(area) && area > epsilon;
|
|
12654
12654
|
};
|
|
12655
12655
|
var snapPolygons = (epsilon, polygons) => {
|
|
12656
|
-
let newpolygons = polygons.map((
|
|
12657
|
-
const snapvertices =
|
|
12656
|
+
let newpolygons = polygons.map((polygon3) => {
|
|
12657
|
+
const snapvertices = polygon3.vertices.map((vertice) => vec3.snap(vec3.create(), vertice, epsilon));
|
|
12658
12658
|
const newvertices = [];
|
|
12659
12659
|
for (let i = 0; i < snapvertices.length; i++) {
|
|
12660
12660
|
const j = (i + 1) % snapvertices.length;
|
|
12661
12661
|
if (!vec3.equals(snapvertices[i], snapvertices[j])) newvertices.push(snapvertices[i]);
|
|
12662
12662
|
}
|
|
12663
12663
|
const newpolygon = poly3.create(newvertices);
|
|
12664
|
-
if (
|
|
12664
|
+
if (polygon3.color) newpolygon.color = polygon3.color;
|
|
12665
12665
|
return newpolygon;
|
|
12666
12666
|
});
|
|
12667
12667
|
const epsilonArea = epsilon * epsilon * Math.sqrt(3) / 4;
|
|
12668
|
-
newpolygons = newpolygons.filter((
|
|
12668
|
+
newpolygons = newpolygons.filter((polygon3) => isValidPoly3(epsilonArea, polygon3));
|
|
12669
12669
|
return newpolygons;
|
|
12670
12670
|
};
|
|
12671
12671
|
module.exports = snapPolygons;
|
|
@@ -12679,8 +12679,8 @@ var require_mergePolygons = __commonJS({
|
|
|
12679
12679
|
var aboutEqualNormals = require_aboutEqualNormals();
|
|
12680
12680
|
var vec3 = require_vec3();
|
|
12681
12681
|
var poly3 = require_poly3();
|
|
12682
|
-
var createEdges = (
|
|
12683
|
-
const points = poly3.toPoints(
|
|
12682
|
+
var createEdges = (polygon3) => {
|
|
12683
|
+
const points = poly3.toPoints(polygon3);
|
|
12684
12684
|
const edges = [];
|
|
12685
12685
|
for (let i = 0; i < points.length; i++) {
|
|
12686
12686
|
const j = (i + 1) % points.length;
|
|
@@ -12729,7 +12729,7 @@ var require_mergePolygons = __commonJS({
|
|
|
12729
12729
|
return vec3.dot(d0, normal);
|
|
12730
12730
|
};
|
|
12731
12731
|
var createPolygonAnd = (edge) => {
|
|
12732
|
-
let
|
|
12732
|
+
let polygon3;
|
|
12733
12733
|
const points = [];
|
|
12734
12734
|
while (edge.next) {
|
|
12735
12735
|
const next = edge.next;
|
|
@@ -12740,8 +12740,8 @@ var require_mergePolygons = __commonJS({
|
|
|
12740
12740
|
edge.prev = null;
|
|
12741
12741
|
edge = next;
|
|
12742
12742
|
}
|
|
12743
|
-
if (points.length > 0)
|
|
12744
|
-
return
|
|
12743
|
+
if (points.length > 0) polygon3 = poly3.create(points);
|
|
12744
|
+
return polygon3;
|
|
12745
12745
|
};
|
|
12746
12746
|
var mergeCoplanarPolygons = (sourcepolygons) => {
|
|
12747
12747
|
if (sourcepolygons.length < 2) return sourcepolygons;
|
|
@@ -12749,8 +12749,8 @@ var require_mergePolygons = __commonJS({
|
|
|
12749
12749
|
const polygons = sourcepolygons.slice();
|
|
12750
12750
|
const edgeList = /* @__PURE__ */ new Map();
|
|
12751
12751
|
while (polygons.length > 0) {
|
|
12752
|
-
const
|
|
12753
|
-
const edges = createEdges(
|
|
12752
|
+
const polygon3 = polygons.shift();
|
|
12753
|
+
const edges = createEdges(polygon3);
|
|
12754
12754
|
for (let i = 0; i < edges.length; i++) {
|
|
12755
12755
|
const current = edges[i];
|
|
12756
12756
|
const opposite = findOppositeEdge(edgeList, current);
|
|
@@ -12806,8 +12806,8 @@ var require_mergePolygons = __commonJS({
|
|
|
12806
12806
|
}
|
|
12807
12807
|
const destpolygons = [];
|
|
12808
12808
|
edgeList.forEach((edge) => {
|
|
12809
|
-
const
|
|
12810
|
-
if (
|
|
12809
|
+
const polygon3 = createPolygonAnd(edge);
|
|
12810
|
+
if (polygon3) destpolygons.push(polygon3);
|
|
12811
12811
|
});
|
|
12812
12812
|
edgeList.clear();
|
|
12813
12813
|
return destpolygons;
|
|
@@ -12820,13 +12820,13 @@ var require_mergePolygons = __commonJS({
|
|
|
12820
12820
|
};
|
|
12821
12821
|
var mergePolygons = (epsilon, polygons) => {
|
|
12822
12822
|
const polygonsPerPlane = [];
|
|
12823
|
-
polygons.forEach((
|
|
12824
|
-
const mapping = polygonsPerPlane.find((element) => coplanar(element[0], poly3.plane(
|
|
12823
|
+
polygons.forEach((polygon3) => {
|
|
12824
|
+
const mapping = polygonsPerPlane.find((element) => coplanar(element[0], poly3.plane(polygon3)));
|
|
12825
12825
|
if (mapping) {
|
|
12826
12826
|
const polygons2 = mapping[1];
|
|
12827
|
-
polygons2.push(
|
|
12827
|
+
polygons2.push(polygon3);
|
|
12828
12828
|
} else {
|
|
12829
|
-
polygonsPerPlane.push([poly3.plane(
|
|
12829
|
+
polygonsPerPlane.push([poly3.plane(polygon3), [polygon3]]);
|
|
12830
12830
|
}
|
|
12831
12831
|
});
|
|
12832
12832
|
let destpolygons = [];
|
|
@@ -12922,15 +12922,15 @@ var require_insertTjunctions = __commonJS({
|
|
|
12922
12922
|
var insertTjunctions = (polygons) => {
|
|
12923
12923
|
const sidemap = /* @__PURE__ */ new Map();
|
|
12924
12924
|
for (let polygonindex = 0; polygonindex < polygons.length; polygonindex++) {
|
|
12925
|
-
const
|
|
12926
|
-
const numvertices =
|
|
12925
|
+
const polygon3 = polygons[polygonindex];
|
|
12926
|
+
const numvertices = polygon3.vertices.length;
|
|
12927
12927
|
if (numvertices >= 3) {
|
|
12928
|
-
let vertex =
|
|
12928
|
+
let vertex = polygon3.vertices[0];
|
|
12929
12929
|
let vertextag = getTag(vertex);
|
|
12930
12930
|
for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {
|
|
12931
12931
|
let nextvertexindex = vertexindex + 1;
|
|
12932
12932
|
if (nextvertexindex === numvertices) nextvertexindex = 0;
|
|
12933
|
-
const nextvertex =
|
|
12933
|
+
const nextvertex = polygon3.vertices[nextvertexindex];
|
|
12934
12934
|
const nextvertextag = getTag(nextvertex);
|
|
12935
12935
|
const sidetag = `${vertextag}/${nextvertextag}`;
|
|
12936
12936
|
const reversesidetag = `${nextvertextag}/${vertextag}`;
|
|
@@ -13038,17 +13038,17 @@ var require_insertTjunctions = __commonJS({
|
|
|
13038
13038
|
const distancesquared = vec3.squaredDistance(closestpoint, endpos);
|
|
13039
13039
|
if (distancesquared < constants.EPS * constants.EPS) {
|
|
13040
13040
|
const polygonindex = matchingside.polygonindex;
|
|
13041
|
-
const
|
|
13041
|
+
const polygon3 = newpolygons[polygonindex];
|
|
13042
13042
|
const insertionvertextag = getTag(matchingside.vertex1);
|
|
13043
13043
|
let insertionvertextagindex = -1;
|
|
13044
|
-
for (let i = 0; i <
|
|
13045
|
-
if (getTag(
|
|
13044
|
+
for (let i = 0; i < polygon3.vertices.length; i++) {
|
|
13045
|
+
if (getTag(polygon3.vertices[i]) === insertionvertextag) {
|
|
13046
13046
|
insertionvertextagindex = i;
|
|
13047
13047
|
break;
|
|
13048
13048
|
}
|
|
13049
13049
|
}
|
|
13050
13050
|
if (assert && insertionvertextagindex < 0) throw new Error("assert failed");
|
|
13051
|
-
const newvertices =
|
|
13051
|
+
const newvertices = polygon3.vertices.slice(0);
|
|
13052
13052
|
newvertices.splice(insertionvertextagindex, 0, endvertex);
|
|
13053
13053
|
const newpolygon = poly3.create(newvertices);
|
|
13054
13054
|
newpolygons[polygonindex] = newpolygon;
|
|
@@ -13088,35 +13088,35 @@ var require_triangulatePolygons = __commonJS({
|
|
|
13088
13088
|
"use strict";
|
|
13089
13089
|
var vec3 = require_vec3();
|
|
13090
13090
|
var poly3 = require_poly3();
|
|
13091
|
-
var triangulatePolygon = (epsilon,
|
|
13092
|
-
const nv =
|
|
13091
|
+
var triangulatePolygon = (epsilon, polygon3, triangles) => {
|
|
13092
|
+
const nv = polygon3.vertices.length;
|
|
13093
13093
|
if (nv > 3) {
|
|
13094
13094
|
if (nv > 4) {
|
|
13095
13095
|
const midpoint = [0, 0, 0];
|
|
13096
|
-
|
|
13096
|
+
polygon3.vertices.forEach((vertice) => vec3.add(midpoint, midpoint, vertice));
|
|
13097
13097
|
vec3.snap(midpoint, vec3.divide(midpoint, midpoint, [nv, nv, nv]), epsilon);
|
|
13098
13098
|
for (let i = 0; i < nv; i++) {
|
|
13099
|
-
const poly = poly3.create([midpoint,
|
|
13100
|
-
if (
|
|
13099
|
+
const poly = poly3.create([midpoint, polygon3.vertices[i], polygon3.vertices[(i + 1) % nv]]);
|
|
13100
|
+
if (polygon3.color) poly.color = polygon3.color;
|
|
13101
13101
|
triangles.push(poly);
|
|
13102
13102
|
}
|
|
13103
13103
|
return;
|
|
13104
13104
|
}
|
|
13105
|
-
const poly0 = poly3.create([
|
|
13106
|
-
const poly1 = poly3.create([
|
|
13107
|
-
if (
|
|
13108
|
-
poly0.color =
|
|
13109
|
-
poly1.color =
|
|
13105
|
+
const poly0 = poly3.create([polygon3.vertices[0], polygon3.vertices[1], polygon3.vertices[2]]);
|
|
13106
|
+
const poly1 = poly3.create([polygon3.vertices[0], polygon3.vertices[2], polygon3.vertices[3]]);
|
|
13107
|
+
if (polygon3.color) {
|
|
13108
|
+
poly0.color = polygon3.color;
|
|
13109
|
+
poly1.color = polygon3.color;
|
|
13110
13110
|
}
|
|
13111
13111
|
triangles.push(poly0, poly1);
|
|
13112
13112
|
return;
|
|
13113
13113
|
}
|
|
13114
|
-
triangles.push(
|
|
13114
|
+
triangles.push(polygon3);
|
|
13115
13115
|
};
|
|
13116
13116
|
var triangulatePolygons = (epsilon, polygons) => {
|
|
13117
13117
|
const triangles = [];
|
|
13118
|
-
polygons.forEach((
|
|
13119
|
-
triangulatePolygon(epsilon,
|
|
13118
|
+
polygons.forEach((polygon3) => {
|
|
13119
|
+
triangulatePolygon(epsilon, polygon3, triangles);
|
|
13120
13120
|
});
|
|
13121
13121
|
return triangles;
|
|
13122
13122
|
};
|
|
@@ -13256,7 +13256,7 @@ var require_align = __commonJS({
|
|
|
13256
13256
|
var flatten = require_flatten();
|
|
13257
13257
|
var padArrayToLength = require_padArrayToLength();
|
|
13258
13258
|
var measureAggregateBoundingBox = require_measureAggregateBoundingBox();
|
|
13259
|
-
var { translate:
|
|
13259
|
+
var { translate: translate3 } = require_translate2();
|
|
13260
13260
|
var validateOptions = (options) => {
|
|
13261
13261
|
if (!Array.isArray(options.modes) || options.modes.length > 3) throw new Error("align(): modes must be an array of length <= 3");
|
|
13262
13262
|
options.modes = padArrayToLength(options.modes, "none", 3);
|
|
@@ -13293,7 +13293,7 @@ var require_align = __commonJS({
|
|
|
13293
13293
|
translation[i] = relativeTo[i] - bounds[0][i];
|
|
13294
13294
|
}
|
|
13295
13295
|
}
|
|
13296
|
-
return
|
|
13296
|
+
return translate3(translation, geometry);
|
|
13297
13297
|
};
|
|
13298
13298
|
var align = (options, ...geometries) => {
|
|
13299
13299
|
const defaults = {
|
|
@@ -13330,7 +13330,7 @@ var require_center = __commonJS({
|
|
|
13330
13330
|
var geom32 = require_geom3();
|
|
13331
13331
|
var path2 = require_path2();
|
|
13332
13332
|
var measureBoundingBox2 = require_measureBoundingBox2();
|
|
13333
|
-
var { translate:
|
|
13333
|
+
var { translate: translate3 } = require_translate2();
|
|
13334
13334
|
var centerGeometry = (options, object) => {
|
|
13335
13335
|
const defaults = {
|
|
13336
13336
|
axes: [true, true, true],
|
|
@@ -13342,7 +13342,7 @@ var require_center = __commonJS({
|
|
|
13342
13342
|
if (axes[0]) offset[0] = relativeTo[0] - (bounds[0][0] + (bounds[1][0] - bounds[0][0]) / 2);
|
|
13343
13343
|
if (axes[1]) offset[1] = relativeTo[1] - (bounds[0][1] + (bounds[1][1] - bounds[0][1]) / 2);
|
|
13344
13344
|
if (axes[2]) offset[2] = relativeTo[2] - (bounds[0][2] + (bounds[1][2] - bounds[0][2]) / 2);
|
|
13345
|
-
return
|
|
13345
|
+
return translate3(offset, object);
|
|
13346
13346
|
};
|
|
13347
13347
|
var center = (options, ...objects) => {
|
|
13348
13348
|
const defaults = {
|
|
@@ -14552,10 +14552,14 @@ async function renderBoardLayer(circuitJson, options) {
|
|
|
14552
14552
|
}
|
|
14553
14553
|
async function convertSvgToPng(svgString, resolution, backgroundColor) {
|
|
14554
14554
|
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
14555
|
-
|
|
14555
|
+
const { svgToPngDataUrl } = await import("./svg-to-png-browser-VH734VGT.js");
|
|
14556
|
+
return await svgToPngDataUrl(svgString, {
|
|
14557
|
+
width: resolution,
|
|
14558
|
+
background: backgroundColor
|
|
14559
|
+
});
|
|
14556
14560
|
} else {
|
|
14557
14561
|
try {
|
|
14558
|
-
const { svgToPngDataUrl } = await import("./svg-to-png-
|
|
14562
|
+
const { svgToPngDataUrl } = await import("./svg-to-png-XFKMCXOE.js");
|
|
14559
14563
|
return await svgToPngDataUrl(svgString, {
|
|
14560
14564
|
width: resolution,
|
|
14561
14565
|
background: backgroundColor
|
|
@@ -14645,18 +14649,20 @@ function scaleMesh(mesh, scale) {
|
|
|
14645
14649
|
}
|
|
14646
14650
|
|
|
14647
14651
|
// lib/utils/pcb-board-geometry.ts
|
|
14648
|
-
var
|
|
14649
|
-
var
|
|
14650
|
-
var
|
|
14652
|
+
var import_extrusions2 = __toESM(require_extrusions(), 1);
|
|
14653
|
+
var import_primitives2 = __toESM(require_primitives(), 1);
|
|
14654
|
+
var import_transforms2 = __toESM(require_transforms(), 1);
|
|
14651
14655
|
var import_booleans = __toESM(require_booleans(), 1);
|
|
14652
14656
|
var geom3 = __toESM(require_geom3(), 1);
|
|
14653
14657
|
var import_measureBoundingBox = __toESM(require_measureBoundingBox2(), 1);
|
|
14658
|
+
|
|
14659
|
+
// lib/utils/pcb-board-cutouts.ts
|
|
14660
|
+
var import_extrusions = __toESM(require_extrusions(), 1);
|
|
14661
|
+
var import_primitives = __toESM(require_primitives(), 1);
|
|
14662
|
+
var import_transforms = __toESM(require_transforms(), 1);
|
|
14654
14663
|
var DEFAULT_SEGMENTS = 64;
|
|
14655
|
-
var
|
|
14656
|
-
var
|
|
14657
|
-
point.x - center.x,
|
|
14658
|
-
point.y - center.y
|
|
14659
|
-
];
|
|
14664
|
+
var toBoardSpaceVec2 = (point, center) => [point.x - center.x, -(point.y - center.y)];
|
|
14665
|
+
var isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
|
|
14660
14666
|
var arePointsClockwise = (points) => {
|
|
14661
14667
|
let area = 0;
|
|
14662
14668
|
for (let i = 0; i < points.length; i++) {
|
|
@@ -14667,6 +14673,119 @@ var arePointsClockwise = (points) => {
|
|
|
14667
14673
|
const signedArea = area / 2;
|
|
14668
14674
|
return signedArea <= 0;
|
|
14669
14675
|
};
|
|
14676
|
+
var createCircularHole = (x, y, radius, thickness) => (0, import_primitives.cylinder)({
|
|
14677
|
+
center: [x, y, 0],
|
|
14678
|
+
height: thickness + 1,
|
|
14679
|
+
radius,
|
|
14680
|
+
segments: DEFAULT_SEGMENTS
|
|
14681
|
+
});
|
|
14682
|
+
var createCutoutGeoms = (boardCenter, thickness, cutouts = []) => {
|
|
14683
|
+
const geoms = [];
|
|
14684
|
+
for (const cutout of cutouts) {
|
|
14685
|
+
if (!cutout) continue;
|
|
14686
|
+
switch (cutout.shape) {
|
|
14687
|
+
case "rect": {
|
|
14688
|
+
const { center } = cutout;
|
|
14689
|
+
if (!center || !isFiniteNumber(center.x) || !isFiniteNumber(center.y)) {
|
|
14690
|
+
continue;
|
|
14691
|
+
}
|
|
14692
|
+
const width = typeof cutout.width === "number" && Number.isFinite(cutout.width) ? cutout.width : void 0;
|
|
14693
|
+
const height = typeof cutout.height === "number" && Number.isFinite(cutout.height) ? cutout.height : void 0;
|
|
14694
|
+
if (!width || !height) continue;
|
|
14695
|
+
const relX = center.x - boardCenter.x;
|
|
14696
|
+
const relY = -(center.y - boardCenter.y);
|
|
14697
|
+
const rect2d = (0, import_primitives.rectangle)({ size: [width, height] });
|
|
14698
|
+
let geom = (0, import_extrusions.extrudeLinear)({ height: thickness + 1 }, rect2d);
|
|
14699
|
+
geom = (0, import_transforms.translate)([0, 0, -(thickness + 1) / 2], geom);
|
|
14700
|
+
let rotationRad = 0;
|
|
14701
|
+
const { rotation } = cutout;
|
|
14702
|
+
if (typeof rotation === "number" && Number.isFinite(rotation)) {
|
|
14703
|
+
rotationRad = rotation * Math.PI / 180;
|
|
14704
|
+
} else if (rotation && typeof rotation === "object") {
|
|
14705
|
+
const record = rotation;
|
|
14706
|
+
const degreeCandidate = [
|
|
14707
|
+
record.deg,
|
|
14708
|
+
record.degs,
|
|
14709
|
+
record.degree,
|
|
14710
|
+
record.degrees,
|
|
14711
|
+
record.ccw,
|
|
14712
|
+
record.ccw_degrees,
|
|
14713
|
+
record.ccw_degree
|
|
14714
|
+
].find(
|
|
14715
|
+
(value) => typeof value === "number" && Number.isFinite(value)
|
|
14716
|
+
);
|
|
14717
|
+
if (degreeCandidate !== void 0) {
|
|
14718
|
+
rotationRad = degreeCandidate * Math.PI / 180;
|
|
14719
|
+
} else {
|
|
14720
|
+
const radCandidate = [
|
|
14721
|
+
record.rad,
|
|
14722
|
+
record.rads,
|
|
14723
|
+
record.radian,
|
|
14724
|
+
record.radians,
|
|
14725
|
+
record.ccw_radians
|
|
14726
|
+
].find(
|
|
14727
|
+
(value) => typeof value === "number" && Number.isFinite(value)
|
|
14728
|
+
);
|
|
14729
|
+
if (radCandidate !== void 0) {
|
|
14730
|
+
rotationRad = radCandidate;
|
|
14731
|
+
}
|
|
14732
|
+
}
|
|
14733
|
+
}
|
|
14734
|
+
if (rotationRad) {
|
|
14735
|
+
geom = (0, import_transforms.rotateZ)(-rotationRad, geom);
|
|
14736
|
+
}
|
|
14737
|
+
geoms.push((0, import_transforms.translate)([relX, relY, 0], geom));
|
|
14738
|
+
break;
|
|
14739
|
+
}
|
|
14740
|
+
case "circle": {
|
|
14741
|
+
const { center } = cutout;
|
|
14742
|
+
if (!center || !isFiniteNumber(center.x) || !isFiniteNumber(center.y)) {
|
|
14743
|
+
continue;
|
|
14744
|
+
}
|
|
14745
|
+
const radius = (() => {
|
|
14746
|
+
if (typeof cutout.radius === "number" && Number.isFinite(cutout.radius)) {
|
|
14747
|
+
return cutout.radius;
|
|
14748
|
+
}
|
|
14749
|
+
if ("diameter" in cutout && typeof cutout.diameter === "number" && Number.isFinite(cutout.diameter)) {
|
|
14750
|
+
return cutout.diameter / 2;
|
|
14751
|
+
}
|
|
14752
|
+
return void 0;
|
|
14753
|
+
})();
|
|
14754
|
+
if (!radius) continue;
|
|
14755
|
+
const relX = center.x - boardCenter.x;
|
|
14756
|
+
const relY = -(center.y - boardCenter.y);
|
|
14757
|
+
geoms.push(createCircularHole(relX, relY, radius, thickness));
|
|
14758
|
+
break;
|
|
14759
|
+
}
|
|
14760
|
+
case "polygon": {
|
|
14761
|
+
const { points } = cutout;
|
|
14762
|
+
if (!Array.isArray(points) || points.length < 3) continue;
|
|
14763
|
+
let polygonPoints = points.filter(
|
|
14764
|
+
(point) => point !== void 0 && isFiniteNumber(point.x) && isFiniteNumber(point.y)
|
|
14765
|
+
).map((point) => toBoardSpaceVec2(point, boardCenter));
|
|
14766
|
+
if (polygonPoints.length < 3) continue;
|
|
14767
|
+
if (arePointsClockwise(polygonPoints)) {
|
|
14768
|
+
polygonPoints = polygonPoints.slice().reverse();
|
|
14769
|
+
}
|
|
14770
|
+
const polygon2d = (0, import_primitives.polygon)({ points: polygonPoints });
|
|
14771
|
+
let geom = (0, import_extrusions.extrudeLinear)({ height: thickness + 1 }, polygon2d);
|
|
14772
|
+
geom = (0, import_transforms.translate)([0, 0, -(thickness + 1) / 2], geom);
|
|
14773
|
+
geoms.push(geom);
|
|
14774
|
+
break;
|
|
14775
|
+
}
|
|
14776
|
+
default:
|
|
14777
|
+
break;
|
|
14778
|
+
}
|
|
14779
|
+
}
|
|
14780
|
+
return geoms;
|
|
14781
|
+
};
|
|
14782
|
+
|
|
14783
|
+
// lib/utils/pcb-board-geometry.ts
|
|
14784
|
+
var RADIUS_EPSILON = 1e-4;
|
|
14785
|
+
var toVec2 = (point, center) => [
|
|
14786
|
+
point.x - center.x,
|
|
14787
|
+
point.y - center.y
|
|
14788
|
+
];
|
|
14670
14789
|
var getNumberProperty = (obj, key) => {
|
|
14671
14790
|
const value = obj[key];
|
|
14672
14791
|
return typeof value === "number" ? value : void 0;
|
|
@@ -14677,37 +14796,31 @@ var createBoardOutlineGeom = (board, center, thickness) => {
|
|
|
14677
14796
|
if (arePointsClockwise(outlinePoints)) {
|
|
14678
14797
|
outlinePoints = outlinePoints.slice().reverse();
|
|
14679
14798
|
}
|
|
14680
|
-
const shape2d = (0,
|
|
14681
|
-
let geom2 = (0,
|
|
14682
|
-
geom2 = (0,
|
|
14799
|
+
const shape2d = (0, import_primitives2.polygon)({ points: outlinePoints });
|
|
14800
|
+
let geom2 = (0, import_extrusions2.extrudeLinear)({ height: thickness }, shape2d);
|
|
14801
|
+
geom2 = (0, import_transforms2.translate)([0, 0, -thickness / 2], geom2);
|
|
14683
14802
|
return geom2;
|
|
14684
14803
|
}
|
|
14685
|
-
const baseRect = (0,
|
|
14686
|
-
let geom = (0,
|
|
14687
|
-
geom = (0,
|
|
14804
|
+
const baseRect = (0, import_primitives2.rectangle)({ size: [board.width, board.height] });
|
|
14805
|
+
let geom = (0, import_extrusions2.extrudeLinear)({ height: thickness }, baseRect);
|
|
14806
|
+
geom = (0, import_transforms2.translate)([0, 0, -thickness / 2], geom);
|
|
14688
14807
|
return geom;
|
|
14689
14808
|
};
|
|
14690
|
-
var createCircularHole = (x, y, radius, thickness) => (0, import_primitives.cylinder)({
|
|
14691
|
-
center: [x, y, 0],
|
|
14692
|
-
height: thickness + 1,
|
|
14693
|
-
radius,
|
|
14694
|
-
segments: DEFAULT_SEGMENTS
|
|
14695
|
-
});
|
|
14696
14809
|
var createPillHole = (x, y, width, height, thickness, rotate) => {
|
|
14697
14810
|
const minDimension = Math.min(width, height);
|
|
14698
14811
|
const maxAllowedRadius = Math.max(0, minDimension / 2 - RADIUS_EPSILON);
|
|
14699
14812
|
const roundRadius = maxAllowedRadius <= 0 ? 0 : Math.min(height / 2, maxAllowedRadius);
|
|
14700
|
-
const hole2d = (0,
|
|
14813
|
+
const hole2d = (0, import_primitives2.roundedRectangle)({
|
|
14701
14814
|
size: [width, height],
|
|
14702
14815
|
roundRadius,
|
|
14703
14816
|
segments: DEFAULT_SEGMENTS
|
|
14704
14817
|
});
|
|
14705
|
-
let hole3d = (0,
|
|
14706
|
-
hole3d = (0,
|
|
14818
|
+
let hole3d = (0, import_extrusions2.extrudeLinear)({ height: thickness + 1 }, hole2d);
|
|
14819
|
+
hole3d = (0, import_transforms2.translate)([0, 0, -(thickness + 1) / 2], hole3d);
|
|
14707
14820
|
if (rotate) {
|
|
14708
|
-
hole3d = (0,
|
|
14821
|
+
hole3d = (0, import_transforms2.rotateZ)(Math.PI / 2, hole3d);
|
|
14709
14822
|
}
|
|
14710
|
-
return (0,
|
|
14823
|
+
return (0, import_transforms2.translate)([x, y, 0], hole3d);
|
|
14711
14824
|
};
|
|
14712
14825
|
var createHoleGeoms = (boardCenter, thickness, holes = [], platedHoles = []) => {
|
|
14713
14826
|
const holeGeoms = [];
|
|
@@ -14743,17 +14856,17 @@ var createHoleGeoms = (boardCenter, thickness, holes = [], platedHoles = []) =>
|
|
|
14743
14856
|
const minDimension = Math.min(holeWidth, holeHeight);
|
|
14744
14857
|
const maxAllowedRadius = Math.max(0, minDimension / 2 - RADIUS_EPSILON);
|
|
14745
14858
|
const roundRadius = maxAllowedRadius <= 0 ? 0 : Math.min(holeHeight / 2, maxAllowedRadius);
|
|
14746
|
-
const hole2d = (0,
|
|
14859
|
+
const hole2d = (0, import_primitives2.roundedRectangle)({
|
|
14747
14860
|
size: [holeWidth, holeHeight],
|
|
14748
14861
|
roundRadius,
|
|
14749
14862
|
segments: DEFAULT_SEGMENTS
|
|
14750
14863
|
});
|
|
14751
|
-
let hole3d = (0,
|
|
14752
|
-
hole3d = (0,
|
|
14864
|
+
let hole3d = (0, import_extrusions2.extrudeLinear)({ height: thickness + 1 }, hole2d);
|
|
14865
|
+
hole3d = (0, import_transforms2.translate)([0, 0, -(thickness + 1) / 2], hole3d);
|
|
14753
14866
|
if (rotationRad !== 0) {
|
|
14754
|
-
hole3d = (0,
|
|
14867
|
+
hole3d = (0, import_transforms2.rotateZ)(rotationRad, hole3d);
|
|
14755
14868
|
}
|
|
14756
|
-
hole3d = (0,
|
|
14869
|
+
hole3d = (0, import_transforms2.translate)([relX, relY, 0], hole3d);
|
|
14757
14870
|
holeGeoms.push(hole3d);
|
|
14758
14871
|
continue;
|
|
14759
14872
|
}
|
|
@@ -14835,14 +14948,16 @@ var createBoundingBox = (bbox) => {
|
|
|
14835
14948
|
};
|
|
14836
14949
|
};
|
|
14837
14950
|
var createBoardMesh = (board, options) => {
|
|
14838
|
-
const { thickness, holes = [], platedHoles = [] } = options;
|
|
14951
|
+
const { thickness, holes = [], platedHoles = [], cutouts = [] } = options;
|
|
14839
14952
|
const center = board.center ?? { x: 0, y: 0 };
|
|
14840
14953
|
let boardGeom = createBoardOutlineGeom(board, center, thickness);
|
|
14841
14954
|
const holeGeoms = createHoleGeoms(center, thickness, holes, platedHoles);
|
|
14842
|
-
|
|
14843
|
-
|
|
14955
|
+
const cutoutGeoms = createCutoutGeoms(center, thickness, cutouts);
|
|
14956
|
+
const subtractGeoms = [...holeGeoms, ...cutoutGeoms];
|
|
14957
|
+
if (subtractGeoms.length > 0) {
|
|
14958
|
+
boardGeom = (0, import_booleans.subtract)(boardGeom, ...subtractGeoms);
|
|
14844
14959
|
}
|
|
14845
|
-
boardGeom = (0,
|
|
14960
|
+
boardGeom = (0, import_transforms2.rotateX)(-Math.PI / 2, boardGeom);
|
|
14846
14961
|
const polygons = geom3.toPolygons(boardGeom);
|
|
14847
14962
|
const triangles = geom3ToTriangles(boardGeom, polygons);
|
|
14848
14963
|
const bboxValues = (0, import_measureBoundingBox.default)(boardGeom);
|
|
@@ -14881,10 +14996,16 @@ async function convertCircuitJsonTo3D(circuitJson, options = {}) {
|
|
|
14881
14996
|
if (pcbBoard) {
|
|
14882
14997
|
const pcbHoles = db.pcb_hole?.list?.() ?? [];
|
|
14883
14998
|
const pcbPlatedHoles = db.pcb_plated_hole?.list?.() ?? [];
|
|
14999
|
+
const pcbCutouts = db.pcb_cutout?.list?.() ?? [];
|
|
15000
|
+
const boardCutouts = pcbCutouts.filter((cutout) => {
|
|
15001
|
+
const cutoutBoardId = cutout.pcb_board_id;
|
|
15002
|
+
return !cutoutBoardId || cutoutBoardId === pcbBoard.pcb_board_id;
|
|
15003
|
+
});
|
|
14884
15004
|
const boardMesh = createBoardMesh(pcbBoard, {
|
|
14885
15005
|
thickness: effectiveBoardThickness,
|
|
14886
15006
|
holes: pcbHoles,
|
|
14887
|
-
platedHoles: pcbPlatedHoles
|
|
15007
|
+
platedHoles: pcbPlatedHoles,
|
|
15008
|
+
cutouts: boardCutouts
|
|
14888
15009
|
});
|
|
14889
15010
|
const meshWidth = boardMesh.boundingBox.max.x - boardMesh.boundingBox.min.x;
|
|
14890
15011
|
const meshHeight = boardMesh.boundingBox.max.z - boardMesh.boundingBox.min.z;
|
|
@@ -15627,6 +15748,38 @@ function transformMesh(mesh, translation, rotation, scale) {
|
|
|
15627
15748
|
}
|
|
15628
15749
|
return result;
|
|
15629
15750
|
}
|
|
15751
|
+
function convertMeshToGLTFOrientation(mesh) {
|
|
15752
|
+
const result = {
|
|
15753
|
+
positions: [...mesh.positions],
|
|
15754
|
+
normals: [...mesh.normals],
|
|
15755
|
+
texcoords: [...mesh.texcoords],
|
|
15756
|
+
indices: [...mesh.indices]
|
|
15757
|
+
};
|
|
15758
|
+
if (mesh.colors) {
|
|
15759
|
+
result.colors = [...mesh.colors];
|
|
15760
|
+
}
|
|
15761
|
+
for (let i = 0; i < result.positions.length; i += 3) {
|
|
15762
|
+
const x = result.positions[i];
|
|
15763
|
+
if (typeof x === "number") {
|
|
15764
|
+
result.positions[i] = -x;
|
|
15765
|
+
}
|
|
15766
|
+
}
|
|
15767
|
+
for (let i = 0; i < result.normals.length; i += 3) {
|
|
15768
|
+
const nx = result.normals[i];
|
|
15769
|
+
if (typeof nx === "number") {
|
|
15770
|
+
result.normals[i] = -nx;
|
|
15771
|
+
}
|
|
15772
|
+
}
|
|
15773
|
+
for (let i = 0; i < result.indices.length; i += 3) {
|
|
15774
|
+
const i1 = result.indices[i + 1];
|
|
15775
|
+
const i2 = result.indices[i + 2];
|
|
15776
|
+
if (typeof i1 === "number" && typeof i2 === "number") {
|
|
15777
|
+
result.indices[i + 1] = i2;
|
|
15778
|
+
result.indices[i + 2] = i1;
|
|
15779
|
+
}
|
|
15780
|
+
}
|
|
15781
|
+
return result;
|
|
15782
|
+
}
|
|
15630
15783
|
function getBounds(positions) {
|
|
15631
15784
|
if (positions.length === 0) {
|
|
15632
15785
|
return {
|
|
@@ -15714,6 +15867,7 @@ var GLTFBuilder = class {
|
|
|
15714
15867
|
meshData = createBoxMesh(box.size);
|
|
15715
15868
|
}
|
|
15716
15869
|
meshData = transformMesh(meshData, box.center, box.rotation);
|
|
15870
|
+
meshData = convertMeshToGLTFOrientation(meshData);
|
|
15717
15871
|
let materialIndex = defaultMaterialIndex;
|
|
15718
15872
|
if (box.color) {
|
|
15719
15873
|
materialIndex = this.addMaterialFromColor(box.color, !box.mesh);
|
|
@@ -15767,10 +15921,8 @@ var GLTFBuilder = class {
|
|
|
15767
15921
|
}
|
|
15768
15922
|
const primitives = [];
|
|
15769
15923
|
for (const { meshData, materialIndex } of meshDataArray) {
|
|
15770
|
-
const transformedMeshData =
|
|
15771
|
-
meshData,
|
|
15772
|
-
box.center,
|
|
15773
|
-
box.rotation
|
|
15924
|
+
const transformedMeshData = convertMeshToGLTFOrientation(
|
|
15925
|
+
transformMesh(meshData, box.center, box.rotation)
|
|
15774
15926
|
);
|
|
15775
15927
|
const positionAccessorIndex = this.addAccessor(
|
|
15776
15928
|
transformedMeshData.positions,
|
|
@@ -15938,10 +16090,8 @@ var GLTFBuilder = class {
|
|
|
15938
16090
|
vertexIndex += 3;
|
|
15939
16091
|
}
|
|
15940
16092
|
const meshData = { positions, normals, texcoords, indices };
|
|
15941
|
-
const transformedMeshData =
|
|
15942
|
-
meshData,
|
|
15943
|
-
box.center,
|
|
15944
|
-
box.rotation
|
|
16093
|
+
const transformedMeshData = convertMeshToGLTFOrientation(
|
|
16094
|
+
transformMesh(meshData, box.center, box.rotation)
|
|
15945
16095
|
);
|
|
15946
16096
|
const positionAccessorIndex = this.addAccessor(
|
|
15947
16097
|
transformedMeshData.positions,
|
|
@@ -16060,10 +16210,8 @@ var GLTFBuilder = class {
|
|
|
16060
16210
|
const meshIndex = this.meshes.length;
|
|
16061
16211
|
const primitives = [];
|
|
16062
16212
|
for (const [faceName, faceData] of Object.entries(faceMeshes)) {
|
|
16063
|
-
const transformedFaceData =
|
|
16064
|
-
faceData,
|
|
16065
|
-
box.center,
|
|
16066
|
-
box.rotation
|
|
16213
|
+
const transformedFaceData = convertMeshToGLTFOrientation(
|
|
16214
|
+
transformMesh(faceData, box.center, box.rotation)
|
|
16067
16215
|
);
|
|
16068
16216
|
const positionAccessorIndex = this.addAccessor(
|
|
16069
16217
|
transformedFaceData.positions,
|