@tscircuit/3d-viewer 0.0.520 → 0.0.522
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 +514 -1194
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -243,9 +243,9 @@ var require_trigonometry = __commonJS({
|
|
|
243
243
|
"use strict";
|
|
244
244
|
var { NEPS } = require_constants();
|
|
245
245
|
var rezero = (n) => Math.abs(n) < NEPS ? 0 : n;
|
|
246
|
-
var
|
|
247
|
-
var
|
|
248
|
-
module.exports = { sin
|
|
246
|
+
var sin = (radians) => rezero(Math.sin(radians));
|
|
247
|
+
var cos = (radians) => rezero(Math.cos(radians));
|
|
248
|
+
module.exports = { sin, cos };
|
|
249
249
|
}
|
|
250
250
|
});
|
|
251
251
|
|
|
@@ -281,7 +281,7 @@ var require_fromRotation = __commonJS({
|
|
|
281
281
|
"node_modules/@jscad/modeling/src/maths/mat4/fromRotation.js"(exports, module) {
|
|
282
282
|
"use strict";
|
|
283
283
|
var { EPS } = require_constants();
|
|
284
|
-
var { sin
|
|
284
|
+
var { sin, cos } = require_trigonometry();
|
|
285
285
|
var identity = require_identity();
|
|
286
286
|
var fromRotation = (out, rad, axis) => {
|
|
287
287
|
let [x, y, z18] = axis;
|
|
@@ -293,8 +293,8 @@ var require_fromRotation = __commonJS({
|
|
|
293
293
|
x *= len;
|
|
294
294
|
y *= len;
|
|
295
295
|
z18 *= len;
|
|
296
|
-
const s =
|
|
297
|
-
const c =
|
|
296
|
+
const s = sin(rad);
|
|
297
|
+
const c = cos(rad);
|
|
298
298
|
const t = 1 - c;
|
|
299
299
|
out[0] = x * x * t + c;
|
|
300
300
|
out[1] = y * x * t + z18 * s;
|
|
@@ -349,14 +349,14 @@ var require_fromScaling = __commonJS({
|
|
|
349
349
|
var require_fromTaitBryanRotation = __commonJS({
|
|
350
350
|
"node_modules/@jscad/modeling/src/maths/mat4/fromTaitBryanRotation.js"(exports, module) {
|
|
351
351
|
"use strict";
|
|
352
|
-
var { sin
|
|
352
|
+
var { sin, cos } = require_trigonometry();
|
|
353
353
|
var fromTaitBryanRotation = (out, yaw, pitch, roll) => {
|
|
354
|
-
const sy =
|
|
355
|
-
const cy =
|
|
356
|
-
const sp =
|
|
357
|
-
const cp =
|
|
358
|
-
const sr =
|
|
359
|
-
const cr =
|
|
354
|
+
const sy = sin(yaw);
|
|
355
|
+
const cy = cos(yaw);
|
|
356
|
+
const sp = sin(pitch);
|
|
357
|
+
const cp = cos(pitch);
|
|
358
|
+
const sr = sin(roll);
|
|
359
|
+
const cr = cos(roll);
|
|
360
360
|
out[0] = cp * cy;
|
|
361
361
|
out[1] = cp * sy;
|
|
362
362
|
out[2] = -sp;
|
|
@@ -825,13 +825,13 @@ var require_rotateZ = __commonJS({
|
|
|
825
825
|
var require_scale = __commonJS({
|
|
826
826
|
"node_modules/@jscad/modeling/src/maths/vec3/scale.js"(exports, module) {
|
|
827
827
|
"use strict";
|
|
828
|
-
var
|
|
828
|
+
var scale2 = (out, vector, amount) => {
|
|
829
829
|
out[0] = vector[0] * amount;
|
|
830
830
|
out[1] = vector[1] * amount;
|
|
831
831
|
out[2] = vector[2] * amount;
|
|
832
832
|
return out;
|
|
833
833
|
};
|
|
834
|
-
module.exports =
|
|
834
|
+
module.exports = scale2;
|
|
835
835
|
}
|
|
836
836
|
});
|
|
837
837
|
|
|
@@ -904,7 +904,7 @@ var require_toString = __commonJS({
|
|
|
904
904
|
var require_transform = __commonJS({
|
|
905
905
|
"node_modules/@jscad/modeling/src/maths/vec3/transform.js"(exports, module) {
|
|
906
906
|
"use strict";
|
|
907
|
-
var
|
|
907
|
+
var transform = (out, vector, matrix) => {
|
|
908
908
|
const x = vector[0];
|
|
909
909
|
const y = vector[1];
|
|
910
910
|
const z18 = vector[2];
|
|
@@ -915,7 +915,7 @@ var require_transform = __commonJS({
|
|
|
915
915
|
out[2] = (matrix[2] * x + matrix[6] * y + matrix[10] * z18 + matrix[14]) / w;
|
|
916
916
|
return out;
|
|
917
917
|
};
|
|
918
|
-
module.exports =
|
|
918
|
+
module.exports = transform;
|
|
919
919
|
}
|
|
920
920
|
});
|
|
921
921
|
|
|
@@ -999,10 +999,10 @@ var require_fromVectorRotation = __commonJS({
|
|
|
999
999
|
var require_fromXRotation = __commonJS({
|
|
1000
1000
|
"node_modules/@jscad/modeling/src/maths/mat4/fromXRotation.js"(exports, module) {
|
|
1001
1001
|
"use strict";
|
|
1002
|
-
var { sin
|
|
1002
|
+
var { sin, cos } = require_trigonometry();
|
|
1003
1003
|
var fromXRotation = (out, radians) => {
|
|
1004
|
-
const s =
|
|
1005
|
-
const c =
|
|
1004
|
+
const s = sin(radians);
|
|
1005
|
+
const c = cos(radians);
|
|
1006
1006
|
out[0] = 1;
|
|
1007
1007
|
out[1] = 0;
|
|
1008
1008
|
out[2] = 0;
|
|
@@ -1029,10 +1029,10 @@ var require_fromXRotation = __commonJS({
|
|
|
1029
1029
|
var require_fromYRotation = __commonJS({
|
|
1030
1030
|
"node_modules/@jscad/modeling/src/maths/mat4/fromYRotation.js"(exports, module) {
|
|
1031
1031
|
"use strict";
|
|
1032
|
-
var { sin
|
|
1032
|
+
var { sin, cos } = require_trigonometry();
|
|
1033
1033
|
var fromYRotation = (out, radians) => {
|
|
1034
|
-
const s =
|
|
1035
|
-
const c =
|
|
1034
|
+
const s = sin(radians);
|
|
1035
|
+
const c = cos(radians);
|
|
1036
1036
|
out[0] = c;
|
|
1037
1037
|
out[1] = 0;
|
|
1038
1038
|
out[2] = -s;
|
|
@@ -1059,10 +1059,10 @@ var require_fromYRotation = __commonJS({
|
|
|
1059
1059
|
var require_fromZRotation = __commonJS({
|
|
1060
1060
|
"node_modules/@jscad/modeling/src/maths/mat4/fromZRotation.js"(exports, module) {
|
|
1061
1061
|
"use strict";
|
|
1062
|
-
var { sin
|
|
1062
|
+
var { sin, cos } = require_trigonometry();
|
|
1063
1063
|
var fromZRotation = (out, radians) => {
|
|
1064
|
-
const s =
|
|
1065
|
-
const c =
|
|
1064
|
+
const s = sin(radians);
|
|
1065
|
+
const c = cos(radians);
|
|
1066
1066
|
out[0] = c;
|
|
1067
1067
|
out[1] = s;
|
|
1068
1068
|
out[2] = 0;
|
|
@@ -1214,9 +1214,9 @@ var require_rotate = __commonJS({
|
|
|
1214
1214
|
"node_modules/@jscad/modeling/src/maths/mat4/rotate.js"(exports, module) {
|
|
1215
1215
|
"use strict";
|
|
1216
1216
|
var { EPS } = require_constants();
|
|
1217
|
-
var { sin
|
|
1217
|
+
var { sin, cos } = require_trigonometry();
|
|
1218
1218
|
var copy = require_copy();
|
|
1219
|
-
var
|
|
1219
|
+
var rotate2 = (out, matrix, radians, axis) => {
|
|
1220
1220
|
let [x, y, z18] = axis;
|
|
1221
1221
|
const lengthSquared = x * x + y * y + z18 * z18;
|
|
1222
1222
|
if (Math.abs(lengthSquared) < EPS) {
|
|
@@ -1226,8 +1226,8 @@ var require_rotate = __commonJS({
|
|
|
1226
1226
|
x *= len;
|
|
1227
1227
|
y *= len;
|
|
1228
1228
|
z18 *= len;
|
|
1229
|
-
const s =
|
|
1230
|
-
const c =
|
|
1229
|
+
const s = sin(radians);
|
|
1230
|
+
const c = cos(radians);
|
|
1231
1231
|
const t = 1 - c;
|
|
1232
1232
|
const a00 = matrix[0];
|
|
1233
1233
|
const a01 = matrix[1];
|
|
@@ -1270,7 +1270,7 @@ var require_rotate = __commonJS({
|
|
|
1270
1270
|
}
|
|
1271
1271
|
return out;
|
|
1272
1272
|
};
|
|
1273
|
-
module.exports =
|
|
1273
|
+
module.exports = rotate2;
|
|
1274
1274
|
}
|
|
1275
1275
|
});
|
|
1276
1276
|
|
|
@@ -1278,10 +1278,10 @@ var require_rotate = __commonJS({
|
|
|
1278
1278
|
var require_rotateX2 = __commonJS({
|
|
1279
1279
|
"node_modules/@jscad/modeling/src/maths/mat4/rotateX.js"(exports, module) {
|
|
1280
1280
|
"use strict";
|
|
1281
|
-
var { sin
|
|
1281
|
+
var { sin, cos } = require_trigonometry();
|
|
1282
1282
|
var rotateX = (out, matrix, radians) => {
|
|
1283
|
-
const s =
|
|
1284
|
-
const c =
|
|
1283
|
+
const s = sin(radians);
|
|
1284
|
+
const c = cos(radians);
|
|
1285
1285
|
const a10 = matrix[4];
|
|
1286
1286
|
const a11 = matrix[5];
|
|
1287
1287
|
const a12 = matrix[6];
|
|
@@ -1318,10 +1318,10 @@ var require_rotateX2 = __commonJS({
|
|
|
1318
1318
|
var require_rotateY2 = __commonJS({
|
|
1319
1319
|
"node_modules/@jscad/modeling/src/maths/mat4/rotateY.js"(exports, module) {
|
|
1320
1320
|
"use strict";
|
|
1321
|
-
var { sin
|
|
1321
|
+
var { sin, cos } = require_trigonometry();
|
|
1322
1322
|
var rotateY = (out, matrix, radians) => {
|
|
1323
|
-
const s =
|
|
1324
|
-
const c =
|
|
1323
|
+
const s = sin(radians);
|
|
1324
|
+
const c = cos(radians);
|
|
1325
1325
|
const a00 = matrix[0];
|
|
1326
1326
|
const a01 = matrix[1];
|
|
1327
1327
|
const a02 = matrix[2];
|
|
@@ -1358,10 +1358,10 @@ var require_rotateY2 = __commonJS({
|
|
|
1358
1358
|
var require_rotateZ2 = __commonJS({
|
|
1359
1359
|
"node_modules/@jscad/modeling/src/maths/mat4/rotateZ.js"(exports, module) {
|
|
1360
1360
|
"use strict";
|
|
1361
|
-
var { sin
|
|
1361
|
+
var { sin, cos } = require_trigonometry();
|
|
1362
1362
|
var rotateZ3 = (out, matrix, radians) => {
|
|
1363
|
-
const s =
|
|
1364
|
-
const c =
|
|
1363
|
+
const s = sin(radians);
|
|
1364
|
+
const c = cos(radians);
|
|
1365
1365
|
const a00 = matrix[0];
|
|
1366
1366
|
const a01 = matrix[1];
|
|
1367
1367
|
const a02 = matrix[2];
|
|
@@ -1398,7 +1398,7 @@ var require_rotateZ2 = __commonJS({
|
|
|
1398
1398
|
var require_scale2 = __commonJS({
|
|
1399
1399
|
"node_modules/@jscad/modeling/src/maths/mat4/scale.js"(exports, module) {
|
|
1400
1400
|
"use strict";
|
|
1401
|
-
var
|
|
1401
|
+
var scale2 = (out, matrix, dimensions) => {
|
|
1402
1402
|
const x = dimensions[0];
|
|
1403
1403
|
const y = dimensions[1];
|
|
1404
1404
|
const z18 = dimensions[2];
|
|
@@ -1420,7 +1420,7 @@ var require_scale2 = __commonJS({
|
|
|
1420
1420
|
out[15] = matrix[15];
|
|
1421
1421
|
return out;
|
|
1422
1422
|
};
|
|
1423
|
-
module.exports =
|
|
1423
|
+
module.exports = scale2;
|
|
1424
1424
|
}
|
|
1425
1425
|
});
|
|
1426
1426
|
|
|
@@ -1464,7 +1464,7 @@ var require_toString2 = __commonJS({
|
|
|
1464
1464
|
var require_translate = __commonJS({
|
|
1465
1465
|
"node_modules/@jscad/modeling/src/maths/mat4/translate.js"(exports, module) {
|
|
1466
1466
|
"use strict";
|
|
1467
|
-
var
|
|
1467
|
+
var translate6 = (out, matrix, offsets) => {
|
|
1468
1468
|
const x = offsets[0];
|
|
1469
1469
|
const y = offsets[1];
|
|
1470
1470
|
const z18 = offsets[2];
|
|
@@ -1517,7 +1517,7 @@ var require_translate = __commonJS({
|
|
|
1517
1517
|
}
|
|
1518
1518
|
return out;
|
|
1519
1519
|
};
|
|
1520
|
-
module.exports =
|
|
1520
|
+
module.exports = translate6;
|
|
1521
1521
|
}
|
|
1522
1522
|
});
|
|
1523
1523
|
|
|
@@ -1729,10 +1729,10 @@ var require_equals3 = __commonJS({
|
|
|
1729
1729
|
var require_fromAngleRadians = __commonJS({
|
|
1730
1730
|
"node_modules/@jscad/modeling/src/maths/vec2/fromAngleRadians.js"(exports, module) {
|
|
1731
1731
|
"use strict";
|
|
1732
|
-
var { sin
|
|
1732
|
+
var { sin, cos } = require_trigonometry();
|
|
1733
1733
|
var fromAngleRadians = (out, radians) => {
|
|
1734
|
-
out[0] =
|
|
1735
|
-
out[1] =
|
|
1734
|
+
out[0] = cos(radians);
|
|
1735
|
+
out[1] = sin(radians);
|
|
1736
1736
|
return out;
|
|
1737
1737
|
};
|
|
1738
1738
|
module.exports = fromAngleRadians;
|
|
@@ -1857,7 +1857,7 @@ var require_negate2 = __commonJS({
|
|
|
1857
1857
|
var require_rotate2 = __commonJS({
|
|
1858
1858
|
"node_modules/@jscad/modeling/src/maths/vec2/rotate.js"(exports, module) {
|
|
1859
1859
|
"use strict";
|
|
1860
|
-
var
|
|
1860
|
+
var rotate2 = (out, vector, origin, radians) => {
|
|
1861
1861
|
const x = vector[0] - origin[0];
|
|
1862
1862
|
const y = vector[1] - origin[1];
|
|
1863
1863
|
const c = Math.cos(radians);
|
|
@@ -1866,7 +1866,7 @@ var require_rotate2 = __commonJS({
|
|
|
1866
1866
|
out[1] = x * s + y * c + origin[1];
|
|
1867
1867
|
return out;
|
|
1868
1868
|
};
|
|
1869
|
-
module.exports =
|
|
1869
|
+
module.exports = rotate2;
|
|
1870
1870
|
}
|
|
1871
1871
|
});
|
|
1872
1872
|
|
|
@@ -1876,8 +1876,8 @@ var require_normal = __commonJS({
|
|
|
1876
1876
|
"use strict";
|
|
1877
1877
|
var { TAU } = require_constants();
|
|
1878
1878
|
var create = require_create4();
|
|
1879
|
-
var
|
|
1880
|
-
var normal = (out, vector) =>
|
|
1879
|
+
var rotate2 = require_rotate2();
|
|
1880
|
+
var normal = (out, vector) => rotate2(out, vector, create(), TAU / 4);
|
|
1881
1881
|
module.exports = normal;
|
|
1882
1882
|
}
|
|
1883
1883
|
});
|
|
@@ -1905,12 +1905,12 @@ var require_normalize2 = __commonJS({
|
|
|
1905
1905
|
var require_scale3 = __commonJS({
|
|
1906
1906
|
"node_modules/@jscad/modeling/src/maths/vec2/scale.js"(exports, module) {
|
|
1907
1907
|
"use strict";
|
|
1908
|
-
var
|
|
1908
|
+
var scale2 = (out, vector, amount) => {
|
|
1909
1909
|
out[0] = vector[0] * amount;
|
|
1910
1910
|
out[1] = vector[1] * amount;
|
|
1911
1911
|
return out;
|
|
1912
1912
|
};
|
|
1913
|
-
module.exports =
|
|
1913
|
+
module.exports = scale2;
|
|
1914
1914
|
}
|
|
1915
1915
|
});
|
|
1916
1916
|
|
|
@@ -1979,14 +1979,14 @@ var require_toString3 = __commonJS({
|
|
|
1979
1979
|
var require_transform2 = __commonJS({
|
|
1980
1980
|
"node_modules/@jscad/modeling/src/maths/vec2/transform.js"(exports, module) {
|
|
1981
1981
|
"use strict";
|
|
1982
|
-
var
|
|
1982
|
+
var transform = (out, vector, matrix) => {
|
|
1983
1983
|
const x = vector[0];
|
|
1984
1984
|
const y = vector[1];
|
|
1985
1985
|
out[0] = matrix[0] * x + matrix[4] * y + matrix[12];
|
|
1986
1986
|
out[1] = matrix[1] * x + matrix[5] * y + matrix[13];
|
|
1987
1987
|
return out;
|
|
1988
1988
|
};
|
|
1989
|
-
module.exports =
|
|
1989
|
+
module.exports = transform;
|
|
1990
1990
|
}
|
|
1991
1991
|
});
|
|
1992
1992
|
|
|
@@ -2332,7 +2332,7 @@ var require_transform3 = __commonJS({
|
|
|
2332
2332
|
"use strict";
|
|
2333
2333
|
var mat4 = require_mat4();
|
|
2334
2334
|
var reverse = require_reverse();
|
|
2335
|
-
var
|
|
2335
|
+
var transform = (matrix, geometry) => {
|
|
2336
2336
|
const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms);
|
|
2337
2337
|
const transformed = Object.assign({}, geometry, { transforms });
|
|
2338
2338
|
if (matrix[0] * matrix[5] - matrix[4] * matrix[1] < 0) {
|
|
@@ -2340,7 +2340,7 @@ var require_transform3 = __commonJS({
|
|
|
2340
2340
|
}
|
|
2341
2341
|
return transformed;
|
|
2342
2342
|
};
|
|
2343
|
-
module.exports =
|
|
2343
|
+
module.exports = transform;
|
|
2344
2344
|
}
|
|
2345
2345
|
});
|
|
2346
2346
|
|
|
@@ -2666,7 +2666,7 @@ var require_Face = __commonJS({
|
|
|
2666
2666
|
var dot = require_dot();
|
|
2667
2667
|
var length51 = require_length();
|
|
2668
2668
|
var normalize = require_normalize();
|
|
2669
|
-
var
|
|
2669
|
+
var scale2 = require_scale();
|
|
2670
2670
|
var subtract5 = require_subtract();
|
|
2671
2671
|
var HalfEdge = require_HalfEdge();
|
|
2672
2672
|
var VISIBLE = 0;
|
|
@@ -2714,7 +2714,7 @@ var require_Face = __commonJS({
|
|
|
2714
2714
|
this.nVertices += 1;
|
|
2715
2715
|
}
|
|
2716
2716
|
this.area = length51(this.normal);
|
|
2717
|
-
this.normal =
|
|
2717
|
+
this.normal = scale2(this.normal, this.normal, 1 / this.area);
|
|
2718
2718
|
}
|
|
2719
2719
|
computeNormalMinArea(minArea) {
|
|
2720
2720
|
this.computeNormal();
|
|
@@ -2734,9 +2734,9 @@ var require_Face = __commonJS({
|
|
|
2734
2734
|
const p2 = maxEdge.head().point;
|
|
2735
2735
|
const maxVector = subtract5([], p2, p1);
|
|
2736
2736
|
const maxLength = Math.sqrt(maxSquaredLength);
|
|
2737
|
-
|
|
2737
|
+
scale2(maxVector, maxVector, 1 / maxLength);
|
|
2738
2738
|
const maxProjection = dot(this.normal, maxVector);
|
|
2739
|
-
|
|
2739
|
+
scale2(maxVector, maxVector, -maxProjection);
|
|
2740
2740
|
add(this.normal, this.normal, maxVector);
|
|
2741
2741
|
normalize(this.normal, this.normal);
|
|
2742
2742
|
}
|
|
@@ -2748,7 +2748,7 @@ var require_Face = __commonJS({
|
|
|
2748
2748
|
add(this.centroid, this.centroid, edge.head().point);
|
|
2749
2749
|
edge = edge.next;
|
|
2750
2750
|
} while (edge !== this.edge);
|
|
2751
|
-
|
|
2751
|
+
scale2(this.centroid, this.centroid, 1 / this.nVertices);
|
|
2752
2752
|
}
|
|
2753
2753
|
computeNormalAndCentroid(minArea) {
|
|
2754
2754
|
if (typeof minArea !== "undefined") {
|
|
@@ -3779,7 +3779,7 @@ var require_transform4 = __commonJS({
|
|
|
3779
3779
|
var vec3 = require_vec3();
|
|
3780
3780
|
var fromPoints = require_fromPoints3();
|
|
3781
3781
|
var flip4 = require_flip();
|
|
3782
|
-
var
|
|
3782
|
+
var transform = (out, plane, matrix) => {
|
|
3783
3783
|
const ismirror = mat4.isMirroring(matrix);
|
|
3784
3784
|
const r = vec3.orthogonal(vec3.create(), plane);
|
|
3785
3785
|
const u = vec3.cross(r, plane, r);
|
|
@@ -3797,7 +3797,7 @@ var require_transform4 = __commonJS({
|
|
|
3797
3797
|
}
|
|
3798
3798
|
return out;
|
|
3799
3799
|
};
|
|
3800
|
-
module.exports =
|
|
3800
|
+
module.exports = transform;
|
|
3801
3801
|
}
|
|
3802
3802
|
});
|
|
3803
3803
|
|
|
@@ -4049,7 +4049,7 @@ var require_fromScalar3 = __commonJS({
|
|
|
4049
4049
|
var require_transform5 = __commonJS({
|
|
4050
4050
|
"node_modules/@jscad/modeling/src/maths/vec4/transform.js"(exports, module) {
|
|
4051
4051
|
"use strict";
|
|
4052
|
-
var
|
|
4052
|
+
var transform = (out, vector, matrix) => {
|
|
4053
4053
|
const [x, y, z18, w] = vector;
|
|
4054
4054
|
out[0] = matrix[0] * x + matrix[4] * y + matrix[8] * z18 + matrix[12] * w;
|
|
4055
4055
|
out[1] = matrix[1] * x + matrix[5] * y + matrix[9] * z18 + matrix[13] * w;
|
|
@@ -4057,7 +4057,7 @@ var require_transform5 = __commonJS({
|
|
|
4057
4057
|
out[3] = matrix[3] * x + matrix[7] * y + matrix[11] * z18 + matrix[15] * w;
|
|
4058
4058
|
return out;
|
|
4059
4059
|
};
|
|
4060
|
-
module.exports =
|
|
4060
|
+
module.exports = transform;
|
|
4061
4061
|
}
|
|
4062
4062
|
});
|
|
4063
4063
|
|
|
@@ -4178,14 +4178,14 @@ var require_transform6 = __commonJS({
|
|
|
4178
4178
|
var mat4 = require_mat4();
|
|
4179
4179
|
var vec3 = require_vec3();
|
|
4180
4180
|
var create = require_create6();
|
|
4181
|
-
var
|
|
4181
|
+
var transform = (matrix, polygon3) => {
|
|
4182
4182
|
const vertices = polygon3.vertices.map((vertex) => vec3.transform(vec3.create(), vertex, matrix));
|
|
4183
4183
|
if (mat4.isMirroring(matrix)) {
|
|
4184
4184
|
vertices.reverse();
|
|
4185
4185
|
}
|
|
4186
4186
|
return create(vertices);
|
|
4187
4187
|
};
|
|
4188
|
-
module.exports =
|
|
4188
|
+
module.exports = transform;
|
|
4189
4189
|
}
|
|
4190
4190
|
});
|
|
4191
4191
|
|
|
@@ -4492,11 +4492,11 @@ var require_transform7 = __commonJS({
|
|
|
4492
4492
|
"node_modules/@jscad/modeling/src/geometries/geom3/transform.js"(exports, module) {
|
|
4493
4493
|
"use strict";
|
|
4494
4494
|
var mat4 = require_mat4();
|
|
4495
|
-
var
|
|
4495
|
+
var transform = (matrix, geometry) => {
|
|
4496
4496
|
const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms);
|
|
4497
4497
|
return Object.assign({}, geometry, { transforms });
|
|
4498
4498
|
};
|
|
4499
|
-
module.exports =
|
|
4499
|
+
module.exports = transform;
|
|
4500
4500
|
}
|
|
4501
4501
|
});
|
|
4502
4502
|
|
|
@@ -5085,11 +5085,11 @@ var require_transform8 = __commonJS({
|
|
|
5085
5085
|
"node_modules/@jscad/modeling/src/geometries/path2/transform.js"(exports, module) {
|
|
5086
5086
|
"use strict";
|
|
5087
5087
|
var mat4 = require_mat4();
|
|
5088
|
-
var
|
|
5088
|
+
var transform = (matrix, geometry) => {
|
|
5089
5089
|
const transforms = mat4.multiply(mat4.create(), matrix, geometry.transforms);
|
|
5090
5090
|
return Object.assign({}, geometry, { transforms });
|
|
5091
5091
|
};
|
|
5092
|
-
module.exports =
|
|
5092
|
+
module.exports = transform;
|
|
5093
5093
|
}
|
|
5094
5094
|
});
|
|
5095
5095
|
|
|
@@ -6289,14 +6289,14 @@ var require_transform9 = __commonJS({
|
|
|
6289
6289
|
var fromPoints = require_fromPoints6();
|
|
6290
6290
|
var origin = require_origin();
|
|
6291
6291
|
var direction = require_direction();
|
|
6292
|
-
var
|
|
6292
|
+
var transform = (out, line, matrix) => {
|
|
6293
6293
|
const org = origin(line);
|
|
6294
6294
|
const dir = direction(line);
|
|
6295
6295
|
vec2.transform(org, org, matrix);
|
|
6296
6296
|
vec2.transform(dir, dir, matrix);
|
|
6297
6297
|
return fromPoints(out, org, dir);
|
|
6298
6298
|
};
|
|
6299
|
-
module.exports =
|
|
6299
|
+
module.exports = transform;
|
|
6300
6300
|
}
|
|
6301
6301
|
});
|
|
6302
6302
|
|
|
@@ -6570,7 +6570,7 @@ var require_transform10 = __commonJS({
|
|
|
6570
6570
|
"use strict";
|
|
6571
6571
|
var vec3 = require_vec3();
|
|
6572
6572
|
var fromPointAndDirection = require_fromPointAndDirection();
|
|
6573
|
-
var
|
|
6573
|
+
var transform = (out, line, matrix) => {
|
|
6574
6574
|
const point = line[0];
|
|
6575
6575
|
const direction = line[1];
|
|
6576
6576
|
const pointPlusDirection = vec3.add(vec3.create(), point, direction);
|
|
@@ -6579,7 +6579,7 @@ var require_transform10 = __commonJS({
|
|
|
6579
6579
|
const newdirection = vec3.subtract(newPointPlusDirection, newPointPlusDirection, newpoint);
|
|
6580
6580
|
return fromPointAndDirection(out, newpoint, newdirection);
|
|
6581
6581
|
};
|
|
6582
|
-
module.exports =
|
|
6582
|
+
module.exports = transform;
|
|
6583
6583
|
}
|
|
6584
6584
|
});
|
|
6585
6585
|
|
|
@@ -7252,7 +7252,7 @@ var require_ellipse = __commonJS({
|
|
|
7252
7252
|
var { EPS, TAU } = require_constants();
|
|
7253
7253
|
var vec2 = require_vec2();
|
|
7254
7254
|
var geom2 = require_geom2();
|
|
7255
|
-
var { sin
|
|
7255
|
+
var { sin, cos } = require_trigonometry();
|
|
7256
7256
|
var { isGTE, isNumberArray } = require_commonChecks();
|
|
7257
7257
|
var ellipse3 = (options) => {
|
|
7258
7258
|
const defaults = {
|
|
@@ -7289,7 +7289,7 @@ var require_ellipse = __commonJS({
|
|
|
7289
7289
|
segments = rotation < TAU ? segments + 1 : segments;
|
|
7290
7290
|
for (let i = 0; i < segments; i++) {
|
|
7291
7291
|
const angle = step * i + startAngle;
|
|
7292
|
-
const point = vec2.fromValues(radius[0] *
|
|
7292
|
+
const point = vec2.fromValues(radius[0] * cos(angle), radius[1] * sin(angle));
|
|
7293
7293
|
vec2.add(point, centerv, point);
|
|
7294
7294
|
points.push(point);
|
|
7295
7295
|
}
|
|
@@ -7396,7 +7396,7 @@ var require_cylinderElliptic = __commonJS({
|
|
|
7396
7396
|
var vec3 = require_vec3();
|
|
7397
7397
|
var geom3 = require_geom3();
|
|
7398
7398
|
var poly3 = require_poly3();
|
|
7399
|
-
var { sin
|
|
7399
|
+
var { sin, cos } = require_trigonometry();
|
|
7400
7400
|
var { isGT, isGTE, isNumberArray } = require_commonChecks();
|
|
7401
7401
|
var cylinderElliptic = (options) => {
|
|
7402
7402
|
const defaults = {
|
|
@@ -7442,8 +7442,8 @@ var require_cylinderElliptic = __commonJS({
|
|
|
7442
7442
|
const v3 = vec3.create();
|
|
7443
7443
|
const point = (stack, slice, radius) => {
|
|
7444
7444
|
const angle = slice * rotation + startAngle;
|
|
7445
|
-
vec3.scale(v1, axisX, radius[0] *
|
|
7446
|
-
vec3.scale(v2, axisY, radius[1] *
|
|
7445
|
+
vec3.scale(v1, axisX, radius[0] * cos(angle));
|
|
7446
|
+
vec3.scale(v2, axisY, radius[1] * sin(angle));
|
|
7447
7447
|
vec3.add(v1, v1, v2);
|
|
7448
7448
|
vec3.scale(v3, ray, stack);
|
|
7449
7449
|
vec3.add(v3, v3, start);
|
|
@@ -7528,7 +7528,7 @@ var require_ellipsoid = __commonJS({
|
|
|
7528
7528
|
var vec3 = require_vec3();
|
|
7529
7529
|
var geom3 = require_geom3();
|
|
7530
7530
|
var poly3 = require_poly3();
|
|
7531
|
-
var { sin
|
|
7531
|
+
var { sin, cos } = require_trigonometry();
|
|
7532
7532
|
var { isGTE, isNumberArray } = require_commonChecks();
|
|
7533
7533
|
var ellipsoid = (options) => {
|
|
7534
7534
|
const defaults = {
|
|
@@ -7553,13 +7553,13 @@ var require_ellipsoid = __commonJS({
|
|
|
7553
7553
|
const p2 = vec3.create();
|
|
7554
7554
|
for (let slice1 = 0; slice1 <= segments; slice1++) {
|
|
7555
7555
|
const angle = TAU * slice1 / segments;
|
|
7556
|
-
const cylinderpoint = vec3.add(vec3.create(), vec3.scale(p1, xvector,
|
|
7556
|
+
const cylinderpoint = vec3.add(vec3.create(), vec3.scale(p1, xvector, cos(angle)), vec3.scale(p2, yvector, sin(angle)));
|
|
7557
7557
|
if (slice1 > 0) {
|
|
7558
7558
|
let prevcospitch, prevsinpitch;
|
|
7559
7559
|
for (let slice2 = 0; slice2 <= qsegments; slice2++) {
|
|
7560
7560
|
const pitch = TAU / 4 * slice2 / qsegments;
|
|
7561
|
-
const cospitch =
|
|
7562
|
-
const sinpitch =
|
|
7561
|
+
const cospitch = cos(pitch);
|
|
7562
|
+
const sinpitch = sin(pitch);
|
|
7563
7563
|
if (slice2 > 0) {
|
|
7564
7564
|
let points = [];
|
|
7565
7565
|
let point;
|
|
@@ -7883,13 +7883,13 @@ var require_roundedCuboid = __commonJS({
|
|
|
7883
7883
|
var vec3 = require_vec3();
|
|
7884
7884
|
var geom3 = require_geom3();
|
|
7885
7885
|
var poly3 = require_poly3();
|
|
7886
|
-
var { sin
|
|
7886
|
+
var { sin, cos } = require_trigonometry();
|
|
7887
7887
|
var { isGTE, isNumberArray } = require_commonChecks();
|
|
7888
7888
|
var cuboid5 = require_cuboid();
|
|
7889
7889
|
var createCorners = (center, size4, radius, segments, slice, positive) => {
|
|
7890
7890
|
const pitch = TAU / 4 * slice / segments;
|
|
7891
|
-
const cospitch =
|
|
7892
|
-
const sinpitch =
|
|
7891
|
+
const cospitch = cos(pitch);
|
|
7892
|
+
const sinpitch = sin(pitch);
|
|
7893
7893
|
const layersegments = segments - slice;
|
|
7894
7894
|
let layerradius = radius * cospitch;
|
|
7895
7895
|
let layeroffset = size4[2] - (radius - radius * sinpitch);
|
|
@@ -8035,7 +8035,7 @@ var require_roundedCylinder = __commonJS({
|
|
|
8035
8035
|
var vec3 = require_vec3();
|
|
8036
8036
|
var geom3 = require_geom3();
|
|
8037
8037
|
var poly3 = require_poly3();
|
|
8038
|
-
var { sin
|
|
8038
|
+
var { sin, cos } = require_trigonometry();
|
|
8039
8039
|
var { isGTE, isNumberArray } = require_commonChecks();
|
|
8040
8040
|
var cylinder5 = require_cylinder();
|
|
8041
8041
|
var roundedCylinder = (options) => {
|
|
@@ -8082,7 +8082,7 @@ var require_roundedCylinder = __commonJS({
|
|
|
8082
8082
|
let prevcylinderpoint;
|
|
8083
8083
|
for (let slice1 = 0; slice1 <= segments; slice1++) {
|
|
8084
8084
|
const angle = TAU * slice1 / segments;
|
|
8085
|
-
const cylinderpoint = vec3.add(vec3.create(), vec3.scale(v1, xvector,
|
|
8085
|
+
const cylinderpoint = vec3.add(vec3.create(), vec3.scale(v1, xvector, cos(angle)), vec3.scale(v2, yvector, sin(angle)));
|
|
8086
8086
|
if (slice1 > 0) {
|
|
8087
8087
|
let points = [];
|
|
8088
8088
|
points.push(vec3.add(vec3.create(), start, cylinderpoint));
|
|
@@ -8093,8 +8093,8 @@ var require_roundedCylinder = __commonJS({
|
|
|
8093
8093
|
let prevcospitch, prevsinpitch;
|
|
8094
8094
|
for (let slice2 = 0; slice2 <= qsegments; slice2++) {
|
|
8095
8095
|
const pitch = TAU / 4 * slice2 / qsegments;
|
|
8096
|
-
const cospitch =
|
|
8097
|
-
const sinpitch =
|
|
8096
|
+
const cospitch = cos(pitch);
|
|
8097
|
+
const sinpitch = sin(pitch);
|
|
8098
8098
|
if (slice2 > 0) {
|
|
8099
8099
|
points = [];
|
|
8100
8100
|
let point;
|
|
@@ -8802,10 +8802,10 @@ var require_eliminateHoles = __commonJS({
|
|
|
8802
8802
|
p = m;
|
|
8803
8803
|
do {
|
|
8804
8804
|
if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
|
|
8805
|
-
const
|
|
8806
|
-
if (locallyInside(p, hole) && (
|
|
8805
|
+
const tan = Math.abs(hy - p.y) / (hx - p.x);
|
|
8806
|
+
if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
|
|
8807
8807
|
m = p;
|
|
8808
|
-
tanMin =
|
|
8808
|
+
tanMin = tan;
|
|
8809
8809
|
}
|
|
8810
8810
|
}
|
|
8811
8811
|
p = p.next;
|
|
@@ -9145,11 +9145,11 @@ var require_transform11 = __commonJS({
|
|
|
9145
9145
|
"use strict";
|
|
9146
9146
|
var vec3 = require_vec3();
|
|
9147
9147
|
var create = require_create13();
|
|
9148
|
-
var
|
|
9148
|
+
var transform = (matrix, slice) => {
|
|
9149
9149
|
const edges = slice.edges.map((edge) => [vec3.transform(vec3.create(), edge[0], matrix), vec3.transform(vec3.create(), edge[1], matrix)]);
|
|
9150
9150
|
return create(edges);
|
|
9151
9151
|
};
|
|
9152
|
-
module.exports =
|
|
9152
|
+
module.exports = transform;
|
|
9153
9153
|
}
|
|
9154
9154
|
});
|
|
9155
9155
|
|
|
@@ -9473,7 +9473,7 @@ var require_rotate3 = __commonJS({
|
|
|
9473
9473
|
var geom2 = require_geom2();
|
|
9474
9474
|
var geom3 = require_geom3();
|
|
9475
9475
|
var path2 = require_path2();
|
|
9476
|
-
var
|
|
9476
|
+
var rotate2 = (angles, ...objects) => {
|
|
9477
9477
|
if (!Array.isArray(angles)) throw new Error("angles must be an array");
|
|
9478
9478
|
objects = flatten(objects);
|
|
9479
9479
|
if (objects.length === 0) throw new Error("wrong number of arguments");
|
|
@@ -9491,11 +9491,11 @@ var require_rotate3 = __commonJS({
|
|
|
9491
9491
|
});
|
|
9492
9492
|
return results.length === 1 ? results[0] : results;
|
|
9493
9493
|
};
|
|
9494
|
-
var rotateX = (angle, ...objects) =>
|
|
9495
|
-
var rotateY = (angle, ...objects) =>
|
|
9496
|
-
var rotateZ3 = (angle, ...objects) =>
|
|
9494
|
+
var rotateX = (angle, ...objects) => rotate2([angle, 0, 0], objects);
|
|
9495
|
+
var rotateY = (angle, ...objects) => rotate2([0, angle, 0], objects);
|
|
9496
|
+
var rotateZ3 = (angle, ...objects) => rotate2([0, 0, angle], objects);
|
|
9497
9497
|
module.exports = {
|
|
9498
|
-
rotate:
|
|
9498
|
+
rotate: rotate2,
|
|
9499
9499
|
rotateX,
|
|
9500
9500
|
rotateY,
|
|
9501
9501
|
rotateZ: rotateZ3
|
|
@@ -9512,7 +9512,7 @@ var require_translate2 = __commonJS({
|
|
|
9512
9512
|
var geom2 = require_geom2();
|
|
9513
9513
|
var geom3 = require_geom3();
|
|
9514
9514
|
var path2 = require_path2();
|
|
9515
|
-
var
|
|
9515
|
+
var translate6 = (offset4, ...objects) => {
|
|
9516
9516
|
if (!Array.isArray(offset4)) throw new Error("offset must be an array");
|
|
9517
9517
|
objects = flatten(objects);
|
|
9518
9518
|
if (objects.length === 0) throw new Error("wrong number of arguments");
|
|
@@ -9527,11 +9527,11 @@ var require_translate2 = __commonJS({
|
|
|
9527
9527
|
});
|
|
9528
9528
|
return results.length === 1 ? results[0] : results;
|
|
9529
9529
|
};
|
|
9530
|
-
var translateX = (offset4, ...objects) =>
|
|
9531
|
-
var translateY = (offset4, ...objects) =>
|
|
9532
|
-
var translateZ = (offset4, ...objects) =>
|
|
9530
|
+
var translateX = (offset4, ...objects) => translate6([offset4, 0, 0], objects);
|
|
9531
|
+
var translateY = (offset4, ...objects) => translate6([0, offset4, 0], objects);
|
|
9532
|
+
var translateZ = (offset4, ...objects) => translate6([0, 0, offset4], objects);
|
|
9533
9533
|
module.exports = {
|
|
9534
|
-
translate:
|
|
9534
|
+
translate: translate6,
|
|
9535
9535
|
translateX,
|
|
9536
9536
|
translateY,
|
|
9537
9537
|
translateZ
|
|
@@ -9545,8 +9545,8 @@ var require_torus = __commonJS({
|
|
|
9545
9545
|
"use strict";
|
|
9546
9546
|
var { TAU } = require_constants();
|
|
9547
9547
|
var extrudeRotate = require_extrudeRotate();
|
|
9548
|
-
var { rotate:
|
|
9549
|
-
var { translate:
|
|
9548
|
+
var { rotate: rotate2 } = require_rotate3();
|
|
9549
|
+
var { translate: translate6 } = require_translate2();
|
|
9550
9550
|
var circle = require_circle();
|
|
9551
9551
|
var { isGT, isGTE } = require_commonChecks();
|
|
9552
9552
|
var torus = (options) => {
|
|
@@ -9569,9 +9569,9 @@ var require_torus = __commonJS({
|
|
|
9569
9569
|
if (innerRadius >= outerRadius) throw new Error("inner circle is too large to rotate about the outer circle");
|
|
9570
9570
|
let innerCircle = circle({ radius: innerRadius, segments: innerSegments });
|
|
9571
9571
|
if (innerRotation !== 0) {
|
|
9572
|
-
innerCircle =
|
|
9572
|
+
innerCircle = rotate2([0, 0, innerRotation], innerCircle);
|
|
9573
9573
|
}
|
|
9574
|
-
innerCircle =
|
|
9574
|
+
innerCircle = translate6([outerRadius, 0], innerCircle);
|
|
9575
9575
|
const extrudeOptions = {
|
|
9576
9576
|
startAngle,
|
|
9577
9577
|
angle: outerRotation,
|
|
@@ -9928,7 +9928,7 @@ var require_vectorText = __commonJS({
|
|
|
9928
9928
|
}
|
|
9929
9929
|
return line;
|
|
9930
9930
|
};
|
|
9931
|
-
var
|
|
9931
|
+
var vectorText = (options, text) => {
|
|
9932
9932
|
const {
|
|
9933
9933
|
xOffset,
|
|
9934
9934
|
yOffset,
|
|
@@ -9985,7 +9985,7 @@ var require_vectorText = __commonJS({
|
|
|
9985
9985
|
}
|
|
9986
9986
|
return output;
|
|
9987
9987
|
};
|
|
9988
|
-
module.exports =
|
|
9988
|
+
module.exports = vectorText;
|
|
9989
9989
|
}
|
|
9990
9990
|
});
|
|
9991
9991
|
|
|
@@ -13296,7 +13296,7 @@ var require_align = __commonJS({
|
|
|
13296
13296
|
var flatten = require_flatten();
|
|
13297
13297
|
var padArrayToLength = require_padArrayToLength();
|
|
13298
13298
|
var measureAggregateBoundingBox = require_measureAggregateBoundingBox();
|
|
13299
|
-
var { translate:
|
|
13299
|
+
var { translate: translate6 } = require_translate2();
|
|
13300
13300
|
var validateOptions = (options) => {
|
|
13301
13301
|
if (!Array.isArray(options.modes) || options.modes.length > 3) throw new Error("align(): modes must be an array of length <= 3");
|
|
13302
13302
|
options.modes = padArrayToLength(options.modes, "none", 3);
|
|
@@ -13333,7 +13333,7 @@ var require_align = __commonJS({
|
|
|
13333
13333
|
translation[i] = relativeTo[i] - bounds[0][i];
|
|
13334
13334
|
}
|
|
13335
13335
|
}
|
|
13336
|
-
return
|
|
13336
|
+
return translate6(translation, geometry);
|
|
13337
13337
|
};
|
|
13338
13338
|
var align = (options, ...geometries) => {
|
|
13339
13339
|
const defaults = {
|
|
@@ -13370,7 +13370,7 @@ var require_center = __commonJS({
|
|
|
13370
13370
|
var geom3 = require_geom3();
|
|
13371
13371
|
var path2 = require_path2();
|
|
13372
13372
|
var measureBoundingBox = require_measureBoundingBox2();
|
|
13373
|
-
var { translate:
|
|
13373
|
+
var { translate: translate6 } = require_translate2();
|
|
13374
13374
|
var centerGeometry = (options, object) => {
|
|
13375
13375
|
const defaults = {
|
|
13376
13376
|
axes: [true, true, true],
|
|
@@ -13382,7 +13382,7 @@ var require_center = __commonJS({
|
|
|
13382
13382
|
if (axes[0]) offset4[0] = relativeTo[0] - (bounds[0][0] + (bounds[1][0] - bounds[0][0]) / 2);
|
|
13383
13383
|
if (axes[1]) offset4[1] = relativeTo[1] - (bounds[0][1] + (bounds[1][1] - bounds[0][1]) / 2);
|
|
13384
13384
|
if (axes[2]) offset4[2] = relativeTo[2] - (bounds[0][2] + (bounds[1][2] - bounds[0][2]) / 2);
|
|
13385
|
-
return
|
|
13385
|
+
return translate6(offset4, object);
|
|
13386
13386
|
};
|
|
13387
13387
|
var center = (options, ...objects) => {
|
|
13388
13388
|
const defaults = {
|
|
@@ -13424,7 +13424,7 @@ var require_scale4 = __commonJS({
|
|
|
13424
13424
|
var geom2 = require_geom2();
|
|
13425
13425
|
var geom3 = require_geom3();
|
|
13426
13426
|
var path2 = require_path2();
|
|
13427
|
-
var
|
|
13427
|
+
var scale2 = (factors, ...objects) => {
|
|
13428
13428
|
if (!Array.isArray(factors)) throw new Error("factors must be an array");
|
|
13429
13429
|
objects = flatten(objects);
|
|
13430
13430
|
if (objects.length === 0) throw new Error("wrong number of arguments");
|
|
@@ -13440,11 +13440,11 @@ var require_scale4 = __commonJS({
|
|
|
13440
13440
|
});
|
|
13441
13441
|
return results.length === 1 ? results[0] : results;
|
|
13442
13442
|
};
|
|
13443
|
-
var scaleX = (factor, ...objects) =>
|
|
13444
|
-
var scaleY = (factor, ...objects) =>
|
|
13445
|
-
var scaleZ = (factor, ...objects) =>
|
|
13443
|
+
var scaleX = (factor, ...objects) => scale2([factor, 1, 1], objects);
|
|
13444
|
+
var scaleY = (factor, ...objects) => scale2([1, factor, 1], objects);
|
|
13445
|
+
var scaleZ = (factor, ...objects) => scale2([1, 1, factor], objects);
|
|
13446
13446
|
module.exports = {
|
|
13447
|
-
scale:
|
|
13447
|
+
scale: scale2,
|
|
13448
13448
|
scaleX,
|
|
13449
13449
|
scaleY,
|
|
13450
13450
|
scaleZ
|
|
@@ -13460,7 +13460,7 @@ var require_transform12 = __commonJS({
|
|
|
13460
13460
|
var geom2 = require_geom2();
|
|
13461
13461
|
var geom3 = require_geom3();
|
|
13462
13462
|
var path2 = require_path2();
|
|
13463
|
-
var
|
|
13463
|
+
var transform = (matrix, ...objects) => {
|
|
13464
13464
|
objects = flatten(objects);
|
|
13465
13465
|
if (objects.length === 0) throw new Error("wrong number of arguments");
|
|
13466
13466
|
const results = objects.map((object) => {
|
|
@@ -13471,7 +13471,7 @@ var require_transform12 = __commonJS({
|
|
|
13471
13471
|
});
|
|
13472
13472
|
return results.length === 1 ? results[0] : results;
|
|
13473
13473
|
};
|
|
13474
|
-
module.exports =
|
|
13474
|
+
module.exports = transform;
|
|
13475
13475
|
}
|
|
13476
13476
|
});
|
|
13477
13477
|
|
|
@@ -14248,7 +14248,7 @@ import { useState as useState36, useCallback as useCallback21, useRef as useRef2
|
|
|
14248
14248
|
import * as THREE36 from "three";
|
|
14249
14249
|
|
|
14250
14250
|
// src/CadViewerJscad.tsx
|
|
14251
|
-
import { su as
|
|
14251
|
+
import { su as su11 } from "@tscircuit/circuit-json-util";
|
|
14252
14252
|
import { forwardRef as forwardRef3, useMemo as useMemo20 } from "react";
|
|
14253
14253
|
|
|
14254
14254
|
// src/AnyCadComponent.tsx
|
|
@@ -22331,7 +22331,7 @@ var m2host = (raw_params) => {
|
|
|
22331
22331
|
}
|
|
22332
22332
|
const centerX = (minX + maxX) / 2;
|
|
22333
22333
|
const centerY = (minY + maxY) / 2;
|
|
22334
|
-
const
|
|
22334
|
+
const translate6 = (el) => {
|
|
22335
22335
|
if (typeof el.x === "number") el.x -= centerX;
|
|
22336
22336
|
if (typeof el.y === "number") el.y -= centerY;
|
|
22337
22337
|
if (el.center) {
|
|
@@ -22345,9 +22345,9 @@ var m2host = (raw_params) => {
|
|
|
22345
22345
|
}));
|
|
22346
22346
|
}
|
|
22347
22347
|
};
|
|
22348
|
-
for (const pad2 of pads)
|
|
22349
|
-
|
|
22350
|
-
|
|
22348
|
+
for (const pad2 of pads) translate6(pad2);
|
|
22349
|
+
translate6(cutout);
|
|
22350
|
+
translate6(pin1Marker);
|
|
22351
22351
|
return {
|
|
22352
22352
|
circuitJson: [
|
|
22353
22353
|
...pads,
|
|
@@ -22789,9 +22789,9 @@ function getExpandedStroke(strokeInput, width10) {
|
|
|
22789
22789
|
addPoint(current, normalPrev, -1);
|
|
22790
22790
|
addPoint(current, normalNext, -1);
|
|
22791
22791
|
} else {
|
|
22792
|
-
const
|
|
22793
|
-
addPoint(current, { x: miterX *
|
|
22794
|
-
addPoint(current, { x: miterX *
|
|
22792
|
+
const scale2 = 1 / miterLength;
|
|
22793
|
+
addPoint(current, { x: miterX * scale2, y: miterY * scale2 }, 1);
|
|
22794
|
+
addPoint(current, { x: miterX * scale2, y: miterY * scale2 }, -1);
|
|
22795
22795
|
}
|
|
22796
22796
|
}
|
|
22797
22797
|
const lastNormal = getNormal(
|
|
@@ -27509,7 +27509,7 @@ var FootprinterModel = ({
|
|
|
27509
27509
|
onHover,
|
|
27510
27510
|
onUnhover,
|
|
27511
27511
|
isHovered,
|
|
27512
|
-
scale:
|
|
27512
|
+
scale: scale2,
|
|
27513
27513
|
isTranslucent = false
|
|
27514
27514
|
}) => {
|
|
27515
27515
|
const { rootObject } = useThree();
|
|
@@ -27549,7 +27549,7 @@ var FootprinterModel = ({
|
|
|
27549
27549
|
if (!group) return;
|
|
27550
27550
|
if (positionOffset) group.position.fromArray(positionOffset);
|
|
27551
27551
|
if (rotationOffset) group.rotation.fromArray(rotationOffset);
|
|
27552
|
-
if (
|
|
27552
|
+
if (scale2 !== void 0) group.scale.setScalar(scale2);
|
|
27553
27553
|
}, [
|
|
27554
27554
|
group,
|
|
27555
27555
|
positionOffset?.[0],
|
|
@@ -27558,7 +27558,7 @@ var FootprinterModel = ({
|
|
|
27558
27558
|
rotationOffset?.[0],
|
|
27559
27559
|
rotationOffset?.[1],
|
|
27560
27560
|
rotationOffset?.[2],
|
|
27561
|
-
|
|
27561
|
+
scale2
|
|
27562
27562
|
]);
|
|
27563
27563
|
useEffect5(() => {
|
|
27564
27564
|
if (!group) return;
|
|
@@ -27627,7 +27627,7 @@ function GltfModel({
|
|
|
27627
27627
|
onHover,
|
|
27628
27628
|
onUnhover,
|
|
27629
27629
|
isHovered,
|
|
27630
|
-
scale:
|
|
27630
|
+
scale: scale2,
|
|
27631
27631
|
isTranslucent = false
|
|
27632
27632
|
}) {
|
|
27633
27633
|
const { renderer, rootObject } = useThree();
|
|
@@ -27675,7 +27675,7 @@ function GltfModel({
|
|
|
27675
27675
|
if (!model) return;
|
|
27676
27676
|
if (position) model.position.fromArray(position);
|
|
27677
27677
|
if (rotation) model.rotation.fromArray(rotation);
|
|
27678
|
-
if (
|
|
27678
|
+
if (scale2 !== void 0) model.scale.setScalar(scale2);
|
|
27679
27679
|
}, [
|
|
27680
27680
|
model,
|
|
27681
27681
|
position?.[0],
|
|
@@ -27684,7 +27684,7 @@ function GltfModel({
|
|
|
27684
27684
|
rotation?.[0],
|
|
27685
27685
|
rotation?.[1],
|
|
27686
27686
|
rotation?.[2],
|
|
27687
|
-
|
|
27687
|
+
scale2
|
|
27688
27688
|
]);
|
|
27689
27689
|
useEffect6(() => {
|
|
27690
27690
|
if (!rootObject || !model) return;
|
|
@@ -27769,7 +27769,7 @@ var JscadModel = ({
|
|
|
27769
27769
|
onHover,
|
|
27770
27770
|
onUnhover,
|
|
27771
27771
|
isHovered,
|
|
27772
|
-
scale:
|
|
27772
|
+
scale: scale2,
|
|
27773
27773
|
isTranslucent = false
|
|
27774
27774
|
}) => {
|
|
27775
27775
|
const { rootObject } = useThree();
|
|
@@ -27803,7 +27803,7 @@ var JscadModel = ({
|
|
|
27803
27803
|
if (!mesh) return;
|
|
27804
27804
|
if (positionOffset) mesh.position.fromArray(positionOffset);
|
|
27805
27805
|
if (rotationOffset) mesh.rotation.fromArray(rotationOffset);
|
|
27806
|
-
if (
|
|
27806
|
+
if (scale2 !== void 0) mesh.scale.setScalar(scale2);
|
|
27807
27807
|
}, [
|
|
27808
27808
|
mesh,
|
|
27809
27809
|
positionOffset?.[0],
|
|
@@ -27812,7 +27812,7 @@ var JscadModel = ({
|
|
|
27812
27812
|
rotationOffset?.[0],
|
|
27813
27813
|
rotationOffset?.[1],
|
|
27814
27814
|
rotationOffset?.[2],
|
|
27815
|
-
|
|
27815
|
+
scale2
|
|
27816
27816
|
]);
|
|
27817
27817
|
useMemo6(() => {
|
|
27818
27818
|
if (!material) return;
|
|
@@ -27952,7 +27952,7 @@ function MixedStlModel({
|
|
|
27952
27952
|
onHover,
|
|
27953
27953
|
onUnhover,
|
|
27954
27954
|
isHovered,
|
|
27955
|
-
scale:
|
|
27955
|
+
scale: scale2,
|
|
27956
27956
|
isTranslucent = false
|
|
27957
27957
|
}) {
|
|
27958
27958
|
const obj = useGlobalObjLoader(url);
|
|
@@ -28008,8 +28008,8 @@ function MixedStlModel({
|
|
|
28008
28008
|
model.rotation.copy(rotation);
|
|
28009
28009
|
}
|
|
28010
28010
|
}
|
|
28011
|
-
if (
|
|
28012
|
-
model.scale.setScalar(
|
|
28011
|
+
if (scale2 !== void 0) {
|
|
28012
|
+
model.scale.setScalar(scale2);
|
|
28013
28013
|
}
|
|
28014
28014
|
}, [
|
|
28015
28015
|
model,
|
|
@@ -28019,7 +28019,7 @@ function MixedStlModel({
|
|
|
28019
28019
|
Array.isArray(rotation) ? rotation[0] : rotation?.x,
|
|
28020
28020
|
Array.isArray(rotation) ? rotation[1] : rotation?.y,
|
|
28021
28021
|
Array.isArray(rotation) ? rotation[2] : rotation?.z,
|
|
28022
|
-
|
|
28022
|
+
scale2
|
|
28023
28023
|
]);
|
|
28024
28024
|
if (obj instanceof Error) {
|
|
28025
28025
|
throw obj;
|
|
@@ -28181,7 +28181,7 @@ var StepModel = ({
|
|
|
28181
28181
|
stepUrl,
|
|
28182
28182
|
position,
|
|
28183
28183
|
rotation,
|
|
28184
|
-
scale:
|
|
28184
|
+
scale: scale2,
|
|
28185
28185
|
onHover,
|
|
28186
28186
|
onUnhover,
|
|
28187
28187
|
isHovered,
|
|
@@ -28273,7 +28273,7 @@ var StepModel = ({
|
|
|
28273
28273
|
gltfUrl: stepGltfUrl,
|
|
28274
28274
|
position,
|
|
28275
28275
|
rotation,
|
|
28276
|
-
scale:
|
|
28276
|
+
scale: scale2,
|
|
28277
28277
|
onHover,
|
|
28278
28278
|
onUnhover,
|
|
28279
28279
|
isHovered,
|
|
@@ -28483,7 +28483,7 @@ import * as THREE16 from "three";
|
|
|
28483
28483
|
// package.json
|
|
28484
28484
|
var package_default = {
|
|
28485
28485
|
name: "@tscircuit/3d-viewer",
|
|
28486
|
-
version: "0.0.
|
|
28486
|
+
version: "0.0.521",
|
|
28487
28487
|
main: "./dist/index.js",
|
|
28488
28488
|
module: "./dist/index.js",
|
|
28489
28489
|
type: "module",
|
|
@@ -28513,7 +28513,7 @@ var package_default = {
|
|
|
28513
28513
|
"@jscad/regl-renderer": "^2.6.12",
|
|
28514
28514
|
"@jscad/stl-serializer": "^2.1.20",
|
|
28515
28515
|
"circuit-json": "^0.0.372",
|
|
28516
|
-
"circuit-to-canvas": "^0.0.
|
|
28516
|
+
"circuit-to-canvas": "^0.0.81",
|
|
28517
28517
|
"react-hot-toast": "^2.6.0",
|
|
28518
28518
|
three: "^0.165.0",
|
|
28519
28519
|
"three-stdlib": "^2.36.0",
|
|
@@ -31169,7 +31169,7 @@ var Text = ({
|
|
|
31169
31169
|
parent,
|
|
31170
31170
|
position,
|
|
31171
31171
|
rotation,
|
|
31172
|
-
scale:
|
|
31172
|
+
scale: scale2,
|
|
31173
31173
|
color,
|
|
31174
31174
|
fontSize,
|
|
31175
31175
|
anchorX,
|
|
@@ -31182,7 +31182,7 @@ var Text = ({
|
|
|
31182
31182
|
textMesh.text = children;
|
|
31183
31183
|
if (position) textMesh.position.fromArray(position);
|
|
31184
31184
|
if (rotation) textMesh.rotation.fromArray(rotation);
|
|
31185
|
-
if (
|
|
31185
|
+
if (scale2) textMesh.scale.fromArray(scale2);
|
|
31186
31186
|
textMesh.color = color || "white";
|
|
31187
31187
|
textMesh.fontSize = fontSize || 1;
|
|
31188
31188
|
textMesh.anchorX = anchorX || "center";
|
|
@@ -31195,7 +31195,7 @@ var Text = ({
|
|
|
31195
31195
|
children,
|
|
31196
31196
|
position,
|
|
31197
31197
|
rotation,
|
|
31198
|
-
|
|
31198
|
+
scale2,
|
|
31199
31199
|
color,
|
|
31200
31200
|
fontSize,
|
|
31201
31201
|
anchorX,
|
|
@@ -31448,226 +31448,12 @@ var ThreeErrorBoundary = class extends React11.Component {
|
|
|
31448
31448
|
};
|
|
31449
31449
|
|
|
31450
31450
|
// src/three-components/JscadBoardTextures.tsx
|
|
31451
|
-
import { su as
|
|
31451
|
+
import { su as su8 } from "@tscircuit/circuit-json-util";
|
|
31452
31452
|
import { useEffect as useEffect23, useMemo as useMemo19 } from "react";
|
|
31453
31453
|
|
|
31454
31454
|
// src/textures/create-combined-board-textures.ts
|
|
31455
31455
|
import * as THREE26 from "three";
|
|
31456
31456
|
|
|
31457
|
-
// src/utils/copper-text-texture.ts
|
|
31458
|
-
var import_text = __toESM(require_text(), 1);
|
|
31459
|
-
import * as THREE19 from "three";
|
|
31460
|
-
|
|
31461
|
-
// node_modules/transformation-matrix/src/applyToPoint.js
|
|
31462
|
-
function applyToPoint(matrix, point) {
|
|
31463
|
-
return Array.isArray(point) ? [
|
|
31464
|
-
matrix.a * point[0] + matrix.c * point[1] + matrix.e,
|
|
31465
|
-
matrix.b * point[0] + matrix.d * point[1] + matrix.f
|
|
31466
|
-
] : {
|
|
31467
|
-
x: matrix.a * point.x + matrix.c * point.y + matrix.e,
|
|
31468
|
-
y: matrix.b * point.x + matrix.d * point.y + matrix.f
|
|
31469
|
-
};
|
|
31470
|
-
}
|
|
31471
|
-
|
|
31472
|
-
// node_modules/transformation-matrix/src/utils.js
|
|
31473
|
-
function isUndefined(val) {
|
|
31474
|
-
return typeof val === "undefined";
|
|
31475
|
-
}
|
|
31476
|
-
|
|
31477
|
-
// node_modules/transformation-matrix/src/translate.js
|
|
31478
|
-
function translate6(tx, ty = 0) {
|
|
31479
|
-
return {
|
|
31480
|
-
a: 1,
|
|
31481
|
-
c: 0,
|
|
31482
|
-
e: tx,
|
|
31483
|
-
b: 0,
|
|
31484
|
-
d: 1,
|
|
31485
|
-
f: ty
|
|
31486
|
-
};
|
|
31487
|
-
}
|
|
31488
|
-
|
|
31489
|
-
// node_modules/transformation-matrix/src/transform.js
|
|
31490
|
-
function transform(...matrices) {
|
|
31491
|
-
matrices = Array.isArray(matrices[0]) ? matrices[0] : matrices;
|
|
31492
|
-
const multiply = (m1, m2) => {
|
|
31493
|
-
return {
|
|
31494
|
-
a: m1.a * m2.a + m1.c * m2.b,
|
|
31495
|
-
c: m1.a * m2.c + m1.c * m2.d,
|
|
31496
|
-
e: m1.a * m2.e + m1.c * m2.f + m1.e,
|
|
31497
|
-
b: m1.b * m2.a + m1.d * m2.b,
|
|
31498
|
-
d: m1.b * m2.c + m1.d * m2.d,
|
|
31499
|
-
f: m1.b * m2.e + m1.d * m2.f + m1.f
|
|
31500
|
-
};
|
|
31501
|
-
};
|
|
31502
|
-
switch (matrices.length) {
|
|
31503
|
-
case 0:
|
|
31504
|
-
throw new Error("no matrices provided");
|
|
31505
|
-
case 1:
|
|
31506
|
-
return matrices[0];
|
|
31507
|
-
case 2:
|
|
31508
|
-
return multiply(matrices[0], matrices[1]);
|
|
31509
|
-
default: {
|
|
31510
|
-
const [m1, m2, ...rest] = matrices;
|
|
31511
|
-
const m = multiply(m1, m2);
|
|
31512
|
-
return transform(m, ...rest);
|
|
31513
|
-
}
|
|
31514
|
-
}
|
|
31515
|
-
}
|
|
31516
|
-
function compose(...matrices) {
|
|
31517
|
-
return transform(...matrices);
|
|
31518
|
-
}
|
|
31519
|
-
|
|
31520
|
-
// node_modules/transformation-matrix/src/rotate.js
|
|
31521
|
-
var { cos, sin, PI } = Math;
|
|
31522
|
-
function rotate2(angle, cx, cy) {
|
|
31523
|
-
const cosAngle = cos(angle);
|
|
31524
|
-
const sinAngle = sin(angle);
|
|
31525
|
-
const rotationMatrix = {
|
|
31526
|
-
a: cosAngle,
|
|
31527
|
-
c: -sinAngle,
|
|
31528
|
-
e: 0,
|
|
31529
|
-
b: sinAngle,
|
|
31530
|
-
d: cosAngle,
|
|
31531
|
-
f: 0
|
|
31532
|
-
};
|
|
31533
|
-
if (isUndefined(cx) || isUndefined(cy)) {
|
|
31534
|
-
return rotationMatrix;
|
|
31535
|
-
}
|
|
31536
|
-
return transform([
|
|
31537
|
-
translate6(cx, cy),
|
|
31538
|
-
rotationMatrix,
|
|
31539
|
-
translate6(-cx, -cy)
|
|
31540
|
-
]);
|
|
31541
|
-
}
|
|
31542
|
-
|
|
31543
|
-
// node_modules/transformation-matrix/src/skew.js
|
|
31544
|
-
var { tan } = Math;
|
|
31545
|
-
|
|
31546
|
-
// node_modules/transformation-matrix/src/fromTransformAttribute.autogenerated.js
|
|
31547
|
-
function peg$subclass(child, parent) {
|
|
31548
|
-
function C() {
|
|
31549
|
-
this.constructor = child;
|
|
31550
|
-
}
|
|
31551
|
-
C.prototype = parent.prototype;
|
|
31552
|
-
child.prototype = new C();
|
|
31553
|
-
}
|
|
31554
|
-
function peg$SyntaxError(message, expected, found, location) {
|
|
31555
|
-
var self = Error.call(this, message);
|
|
31556
|
-
if (Object.setPrototypeOf) {
|
|
31557
|
-
Object.setPrototypeOf(self, peg$SyntaxError.prototype);
|
|
31558
|
-
}
|
|
31559
|
-
self.expected = expected;
|
|
31560
|
-
self.found = found;
|
|
31561
|
-
self.location = location;
|
|
31562
|
-
self.name = "SyntaxError";
|
|
31563
|
-
return self;
|
|
31564
|
-
}
|
|
31565
|
-
peg$subclass(peg$SyntaxError, Error);
|
|
31566
|
-
function peg$padEnd(str, targetLength, padString) {
|
|
31567
|
-
padString = padString || " ";
|
|
31568
|
-
if (str.length > targetLength) {
|
|
31569
|
-
return str;
|
|
31570
|
-
}
|
|
31571
|
-
targetLength -= str.length;
|
|
31572
|
-
padString += padString.repeat(targetLength);
|
|
31573
|
-
return str + padString.slice(0, targetLength);
|
|
31574
|
-
}
|
|
31575
|
-
peg$SyntaxError.prototype.format = function(sources) {
|
|
31576
|
-
var str = "Error: " + this.message;
|
|
31577
|
-
if (this.location) {
|
|
31578
|
-
var src = null;
|
|
31579
|
-
var k;
|
|
31580
|
-
for (k = 0; k < sources.length; k++) {
|
|
31581
|
-
if (sources[k].source === this.location.source) {
|
|
31582
|
-
src = sources[k].text.split(/\r\n|\n|\r/g);
|
|
31583
|
-
break;
|
|
31584
|
-
}
|
|
31585
|
-
}
|
|
31586
|
-
var s = this.location.start;
|
|
31587
|
-
var offset_s = this.location.source && typeof this.location.source.offset === "function" ? this.location.source.offset(s) : s;
|
|
31588
|
-
var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column;
|
|
31589
|
-
if (src) {
|
|
31590
|
-
var e = this.location.end;
|
|
31591
|
-
var filler = peg$padEnd("", offset_s.line.toString().length, " ");
|
|
31592
|
-
var line = src[s.line - 1];
|
|
31593
|
-
var last = s.line === e.line ? e.column : line.length + 1;
|
|
31594
|
-
var hatLen = last - s.column || 1;
|
|
31595
|
-
str += "\n --> " + loc + "\n" + filler + " |\n" + offset_s.line + " | " + line + "\n" + filler + " | " + peg$padEnd("", s.column - 1, " ") + peg$padEnd("", hatLen, "^");
|
|
31596
|
-
} else {
|
|
31597
|
-
str += "\n at " + loc;
|
|
31598
|
-
}
|
|
31599
|
-
}
|
|
31600
|
-
return str;
|
|
31601
|
-
};
|
|
31602
|
-
peg$SyntaxError.buildMessage = function(expected, found) {
|
|
31603
|
-
var DESCRIBE_EXPECTATION_FNS = {
|
|
31604
|
-
literal: function(expectation) {
|
|
31605
|
-
return '"' + literalEscape(expectation.text) + '"';
|
|
31606
|
-
},
|
|
31607
|
-
class: function(expectation) {
|
|
31608
|
-
var escapedParts = expectation.parts.map(function(part) {
|
|
31609
|
-
return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part);
|
|
31610
|
-
});
|
|
31611
|
-
return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]";
|
|
31612
|
-
},
|
|
31613
|
-
any: function() {
|
|
31614
|
-
return "any character";
|
|
31615
|
-
},
|
|
31616
|
-
end: function() {
|
|
31617
|
-
return "end of input";
|
|
31618
|
-
},
|
|
31619
|
-
other: function(expectation) {
|
|
31620
|
-
return expectation.description;
|
|
31621
|
-
}
|
|
31622
|
-
};
|
|
31623
|
-
function hex(ch) {
|
|
31624
|
-
return ch.charCodeAt(0).toString(16).toUpperCase();
|
|
31625
|
-
}
|
|
31626
|
-
function literalEscape(s) {
|
|
31627
|
-
return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function(ch) {
|
|
31628
|
-
return "\\x0" + hex(ch);
|
|
31629
|
-
}).replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) {
|
|
31630
|
-
return "\\x" + hex(ch);
|
|
31631
|
-
});
|
|
31632
|
-
}
|
|
31633
|
-
function classEscape(s) {
|
|
31634
|
-
return s.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function(ch) {
|
|
31635
|
-
return "\\x0" + hex(ch);
|
|
31636
|
-
}).replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) {
|
|
31637
|
-
return "\\x" + hex(ch);
|
|
31638
|
-
});
|
|
31639
|
-
}
|
|
31640
|
-
function describeExpectation(expectation) {
|
|
31641
|
-
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
|
|
31642
|
-
}
|
|
31643
|
-
function describeExpected(expected2) {
|
|
31644
|
-
var descriptions = expected2.map(describeExpectation);
|
|
31645
|
-
var i, j;
|
|
31646
|
-
descriptions.sort();
|
|
31647
|
-
if (descriptions.length > 0) {
|
|
31648
|
-
for (i = 1, j = 1; i < descriptions.length; i++) {
|
|
31649
|
-
if (descriptions[i - 1] !== descriptions[i]) {
|
|
31650
|
-
descriptions[j] = descriptions[i];
|
|
31651
|
-
j++;
|
|
31652
|
-
}
|
|
31653
|
-
}
|
|
31654
|
-
descriptions.length = j;
|
|
31655
|
-
}
|
|
31656
|
-
switch (descriptions.length) {
|
|
31657
|
-
case 1:
|
|
31658
|
-
return descriptions[0];
|
|
31659
|
-
case 2:
|
|
31660
|
-
return descriptions[0] + " or " + descriptions[1];
|
|
31661
|
-
default:
|
|
31662
|
-
return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1];
|
|
31663
|
-
}
|
|
31664
|
-
}
|
|
31665
|
-
function describeFound(found2) {
|
|
31666
|
-
return found2 ? '"' + literalEscape(found2) + '"' : "end of input";
|
|
31667
|
-
}
|
|
31668
|
-
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
|
|
31669
|
-
};
|
|
31670
|
-
|
|
31671
31457
|
// node_modules/@tscircuit/math-utils/dist/chunk-5N7UJNVK.js
|
|
31672
31458
|
var getBoundsFromPoints = (points) => {
|
|
31673
31459
|
if (points.length === 0) {
|
|
@@ -31718,257 +31504,9 @@ function calculateOutlineBounds(boardData) {
|
|
|
31718
31504
|
};
|
|
31719
31505
|
}
|
|
31720
31506
|
|
|
31721
|
-
// src/utils/copper-text-texture.ts
|
|
31722
|
-
function parseDimension2(value, defaultValue) {
|
|
31723
|
-
if (value === void 0) return defaultValue;
|
|
31724
|
-
if (typeof value === "number") return value;
|
|
31725
|
-
const num = parseFloat(value.replace(/mm$/, ""));
|
|
31726
|
-
return isNaN(num) ? defaultValue : num;
|
|
31727
|
-
}
|
|
31728
|
-
function shouldMirrorText(text) {
|
|
31729
|
-
if (text.layer === "bottom") {
|
|
31730
|
-
return text.is_mirrored !== false;
|
|
31731
|
-
}
|
|
31732
|
-
return text.is_mirrored === true;
|
|
31733
|
-
}
|
|
31734
|
-
function getTextMetrics(outlines) {
|
|
31735
|
-
const points = outlines.flat();
|
|
31736
|
-
if (points.length === 0) {
|
|
31737
|
-
return {
|
|
31738
|
-
minX: 0,
|
|
31739
|
-
maxX: 0,
|
|
31740
|
-
minY: 0,
|
|
31741
|
-
maxY: 0,
|
|
31742
|
-
width: 0,
|
|
31743
|
-
height: 0,
|
|
31744
|
-
centerX: 0,
|
|
31745
|
-
centerY: 0
|
|
31746
|
-
};
|
|
31747
|
-
}
|
|
31748
|
-
const minX = Math.min(...points.map((p) => p[0]));
|
|
31749
|
-
const maxX = Math.max(...points.map((p) => p[0]));
|
|
31750
|
-
const minY = Math.min(...points.map((p) => p[1]));
|
|
31751
|
-
const maxY = Math.max(...points.map((p) => p[1]));
|
|
31752
|
-
return {
|
|
31753
|
-
minX,
|
|
31754
|
-
maxX,
|
|
31755
|
-
minY,
|
|
31756
|
-
maxY,
|
|
31757
|
-
width: maxX - minX,
|
|
31758
|
-
height: maxY - minY,
|
|
31759
|
-
centerX: (minX + maxX) / 2,
|
|
31760
|
-
centerY: (minY + maxY) / 2
|
|
31761
|
-
};
|
|
31762
|
-
}
|
|
31763
|
-
function processTextOutlines(rawOutlines) {
|
|
31764
|
-
const processed = [];
|
|
31765
|
-
rawOutlines.forEach((outline) => {
|
|
31766
|
-
if (outline.length === 29) {
|
|
31767
|
-
processed.push(outline.slice(0, 15));
|
|
31768
|
-
processed.push(outline.slice(14, 29));
|
|
31769
|
-
} else if (outline.length === 17) {
|
|
31770
|
-
processed.push(outline.slice(0, 10));
|
|
31771
|
-
processed.push(outline.slice(9, 17));
|
|
31772
|
-
} else {
|
|
31773
|
-
processed.push(outline);
|
|
31774
|
-
}
|
|
31775
|
-
});
|
|
31776
|
-
return processed;
|
|
31777
|
-
}
|
|
31778
|
-
function getAlignmentOffset(metrics, alignment) {
|
|
31779
|
-
let xOff = -metrics.centerX;
|
|
31780
|
-
let yOff = -metrics.centerY;
|
|
31781
|
-
if (alignment.includes("left")) {
|
|
31782
|
-
xOff = -metrics.minX;
|
|
31783
|
-
} else if (alignment.includes("right")) {
|
|
31784
|
-
xOff = -metrics.maxX;
|
|
31785
|
-
}
|
|
31786
|
-
if (alignment.includes("top")) {
|
|
31787
|
-
yOff = -metrics.maxY;
|
|
31788
|
-
} else if (alignment.includes("bottom")) {
|
|
31789
|
-
yOff = -metrics.minY;
|
|
31790
|
-
}
|
|
31791
|
-
return { x: xOff, y: yOff };
|
|
31792
|
-
}
|
|
31793
|
-
function buildTransformMatrix(text, metrics) {
|
|
31794
|
-
const transformMatrices = [];
|
|
31795
|
-
let rotationDeg = text.ccw_rotation ?? 0;
|
|
31796
|
-
const shouldMirror = shouldMirrorText(text);
|
|
31797
|
-
if (shouldMirror) {
|
|
31798
|
-
transformMatrices.push(
|
|
31799
|
-
translate6(metrics.centerX, metrics.centerY),
|
|
31800
|
-
{ a: -1, b: 0, c: 0, d: 1, e: 0, f: 0 },
|
|
31801
|
-
// horizontal flip
|
|
31802
|
-
translate6(-metrics.centerX, -metrics.centerY)
|
|
31803
|
-
);
|
|
31804
|
-
rotationDeg = -rotationDeg;
|
|
31805
|
-
}
|
|
31806
|
-
if (rotationDeg) {
|
|
31807
|
-
const rad = rotationDeg * Math.PI / 180;
|
|
31808
|
-
transformMatrices.push(
|
|
31809
|
-
translate6(metrics.centerX, metrics.centerY),
|
|
31810
|
-
rotate2(rad),
|
|
31811
|
-
translate6(-metrics.centerX, -metrics.centerY)
|
|
31812
|
-
);
|
|
31813
|
-
}
|
|
31814
|
-
const matrix = transformMatrices.length > 0 ? compose(...transformMatrices) : void 0;
|
|
31815
|
-
return { matrix, rotationDeg };
|
|
31816
|
-
}
|
|
31817
|
-
function drawTextStrokes(ctx, outlines, transform2, offset4, anchorPos, canvasXFromPcb, canvasYFromPcb) {
|
|
31818
|
-
outlines.forEach((segment) => {
|
|
31819
|
-
ctx.beginPath();
|
|
31820
|
-
segment.forEach((p, index2) => {
|
|
31821
|
-
let transformedP = { x: p[0], y: p[1] };
|
|
31822
|
-
if (transform2) {
|
|
31823
|
-
transformedP = applyToPoint(transform2, transformedP);
|
|
31824
|
-
}
|
|
31825
|
-
const pcbX = transformedP.x + offset4.x + anchorPos.x;
|
|
31826
|
-
const pcbY = transformedP.y + offset4.y + anchorPos.y;
|
|
31827
|
-
const canvasX = canvasXFromPcb(pcbX);
|
|
31828
|
-
const canvasY = canvasYFromPcb(pcbY);
|
|
31829
|
-
if (index2 === 0) ctx.moveTo(canvasX, canvasY);
|
|
31830
|
-
else ctx.lineTo(canvasX, canvasY);
|
|
31831
|
-
});
|
|
31832
|
-
ctx.stroke();
|
|
31833
|
-
});
|
|
31834
|
-
}
|
|
31835
|
-
function drawRotatedRect(ctx, centerX, centerY, width10, height10, rotationRad) {
|
|
31836
|
-
ctx.save();
|
|
31837
|
-
ctx.translate(centerX, centerY);
|
|
31838
|
-
ctx.rotate(-rotationRad);
|
|
31839
|
-
ctx.fillRect(-width10 / 2, -height10 / 2, width10, height10);
|
|
31840
|
-
ctx.restore();
|
|
31841
|
-
}
|
|
31842
|
-
function drawKnockoutText(ctx, text, outlines, metrics, transform2, rotationDeg, canvasXFromPcb, canvasYFromPcb, traceTextureResolution, copperColor) {
|
|
31843
|
-
const fontSize = typeof text.font_size === "number" ? text.font_size : 0.2;
|
|
31844
|
-
const padding = {
|
|
31845
|
-
left: parseDimension2(text.knockout_padding?.left, fontSize * 0.5),
|
|
31846
|
-
right: parseDimension2(text.knockout_padding?.right, fontSize * 0.5),
|
|
31847
|
-
top: parseDimension2(text.knockout_padding?.top, fontSize * 0.3),
|
|
31848
|
-
bottom: parseDimension2(text.knockout_padding?.bottom, fontSize * 0.3)
|
|
31849
|
-
};
|
|
31850
|
-
const rectWidth = metrics.width + padding.left + padding.right;
|
|
31851
|
-
const rectHeight = metrics.height + padding.top + padding.bottom;
|
|
31852
|
-
const rectCenterCanvasX = canvasXFromPcb(text.anchor_position.x);
|
|
31853
|
-
const rectCenterCanvasY = canvasYFromPcb(text.anchor_position.y);
|
|
31854
|
-
const rectWidthPx = rectWidth * traceTextureResolution;
|
|
31855
|
-
const rectHeightPx = rectHeight * traceTextureResolution;
|
|
31856
|
-
ctx.fillStyle = copperColor;
|
|
31857
|
-
const rotationRad = rotationDeg * Math.PI / 180;
|
|
31858
|
-
drawRotatedRect(
|
|
31859
|
-
ctx,
|
|
31860
|
-
rectCenterCanvasX,
|
|
31861
|
-
rectCenterCanvasY,
|
|
31862
|
-
rectWidthPx,
|
|
31863
|
-
rectHeightPx,
|
|
31864
|
-
rotationRad
|
|
31865
|
-
);
|
|
31866
|
-
const textOffset = {
|
|
31867
|
-
x: -metrics.centerX,
|
|
31868
|
-
y: -metrics.centerY
|
|
31869
|
-
};
|
|
31870
|
-
ctx.globalCompositeOperation = "destination-out";
|
|
31871
|
-
drawTextStrokes(
|
|
31872
|
-
ctx,
|
|
31873
|
-
outlines,
|
|
31874
|
-
transform2,
|
|
31875
|
-
textOffset,
|
|
31876
|
-
text.anchor_position,
|
|
31877
|
-
canvasXFromPcb,
|
|
31878
|
-
canvasYFromPcb
|
|
31879
|
-
);
|
|
31880
|
-
ctx.globalCompositeOperation = "source-over";
|
|
31881
|
-
}
|
|
31882
|
-
function createCopperTextTextureForLayer({
|
|
31883
|
-
layer,
|
|
31884
|
-
circuitJson,
|
|
31885
|
-
boardData,
|
|
31886
|
-
copperColor = "rgb(230, 153, 51)",
|
|
31887
|
-
// Same as colors.copper [0.9, 0.6, 0.2]
|
|
31888
|
-
traceTextureResolution
|
|
31889
|
-
}) {
|
|
31890
|
-
const copperTexts = circuitJson.filter(
|
|
31891
|
-
(e) => e.type === "pcb_copper_text"
|
|
31892
|
-
);
|
|
31893
|
-
const textsOnLayer = copperTexts.filter((t) => t.layer === layer);
|
|
31894
|
-
if (textsOnLayer.length === 0) {
|
|
31895
|
-
return null;
|
|
31896
|
-
}
|
|
31897
|
-
const boardOutlineBounds = calculateOutlineBounds(boardData);
|
|
31898
|
-
const canvas = document.createElement("canvas");
|
|
31899
|
-
const canvasWidth = Math.floor(
|
|
31900
|
-
boardOutlineBounds.width * traceTextureResolution
|
|
31901
|
-
);
|
|
31902
|
-
const canvasHeight = Math.floor(
|
|
31903
|
-
boardOutlineBounds.height * traceTextureResolution
|
|
31904
|
-
);
|
|
31905
|
-
canvas.width = canvasWidth;
|
|
31906
|
-
canvas.height = canvasHeight;
|
|
31907
|
-
const ctx = canvas.getContext("2d");
|
|
31908
|
-
if (!ctx) return null;
|
|
31909
|
-
if (layer === "bottom") {
|
|
31910
|
-
ctx.translate(0, canvasHeight);
|
|
31911
|
-
ctx.scale(1, -1);
|
|
31912
|
-
}
|
|
31913
|
-
ctx.strokeStyle = copperColor;
|
|
31914
|
-
ctx.fillStyle = copperColor;
|
|
31915
|
-
const canvasXFromPcb = (pcbX) => (pcbX - boardOutlineBounds.minX) * traceTextureResolution;
|
|
31916
|
-
const canvasYFromPcb = (pcbY) => (boardOutlineBounds.maxY - pcbY) * traceTextureResolution;
|
|
31917
|
-
textsOnLayer.forEach((textS) => {
|
|
31918
|
-
const fontSize = typeof textS.font_size === "number" ? textS.font_size : 0.2;
|
|
31919
|
-
const textStrokeWidth = Math.max(0.02, fontSize * 0.08) * traceTextureResolution;
|
|
31920
|
-
ctx.lineWidth = textStrokeWidth;
|
|
31921
|
-
ctx.lineCap = "round";
|
|
31922
|
-
ctx.lineJoin = "round";
|
|
31923
|
-
const rawTextOutlines = (0, import_text.vectorText)({
|
|
31924
|
-
height: fontSize * 0.45,
|
|
31925
|
-
input: textS.text
|
|
31926
|
-
});
|
|
31927
|
-
const processedOutlines = processTextOutlines(rawTextOutlines);
|
|
31928
|
-
const metrics = getTextMetrics(processedOutlines);
|
|
31929
|
-
const { matrix: transform2, rotationDeg } = buildTransformMatrix(
|
|
31930
|
-
textS,
|
|
31931
|
-
metrics
|
|
31932
|
-
);
|
|
31933
|
-
if (textS.is_knockout) {
|
|
31934
|
-
drawKnockoutText(
|
|
31935
|
-
ctx,
|
|
31936
|
-
textS,
|
|
31937
|
-
processedOutlines,
|
|
31938
|
-
metrics,
|
|
31939
|
-
transform2,
|
|
31940
|
-
rotationDeg,
|
|
31941
|
-
canvasXFromPcb,
|
|
31942
|
-
canvasYFromPcb,
|
|
31943
|
-
traceTextureResolution,
|
|
31944
|
-
copperColor
|
|
31945
|
-
);
|
|
31946
|
-
} else {
|
|
31947
|
-
const alignment = textS.anchor_alignment || "center";
|
|
31948
|
-
const offset4 = getAlignmentOffset(metrics, alignment);
|
|
31949
|
-
drawTextStrokes(
|
|
31950
|
-
ctx,
|
|
31951
|
-
processedOutlines,
|
|
31952
|
-
transform2,
|
|
31953
|
-
offset4,
|
|
31954
|
-
textS.anchor_position,
|
|
31955
|
-
canvasXFromPcb,
|
|
31956
|
-
canvasYFromPcb
|
|
31957
|
-
);
|
|
31958
|
-
}
|
|
31959
|
-
});
|
|
31960
|
-
const texture = new THREE19.CanvasTexture(canvas);
|
|
31961
|
-
texture.generateMipmaps = true;
|
|
31962
|
-
texture.minFilter = THREE19.LinearMipmapLinearFilter;
|
|
31963
|
-
texture.magFilter = THREE19.LinearFilter;
|
|
31964
|
-
texture.anisotropy = 16;
|
|
31965
|
-
texture.needsUpdate = true;
|
|
31966
|
-
return texture;
|
|
31967
|
-
}
|
|
31968
|
-
|
|
31969
31507
|
// src/utils/pad-texture.ts
|
|
31970
31508
|
import { su as su5 } from "@tscircuit/circuit-json-util";
|
|
31971
|
-
import * as
|
|
31509
|
+
import * as THREE19 from "three";
|
|
31972
31510
|
function createPadTextureForLayer({
|
|
31973
31511
|
layer,
|
|
31974
31512
|
circuitJson,
|
|
@@ -32091,17 +31629,17 @@ function createPadTextureForLayer({
|
|
|
32091
31629
|
ctx.restore();
|
|
32092
31630
|
}
|
|
32093
31631
|
});
|
|
32094
|
-
const texture = new
|
|
31632
|
+
const texture = new THREE19.CanvasTexture(canvas);
|
|
32095
31633
|
texture.generateMipmaps = true;
|
|
32096
|
-
texture.minFilter =
|
|
32097
|
-
texture.magFilter =
|
|
31634
|
+
texture.minFilter = THREE19.LinearMipmapLinearFilter;
|
|
31635
|
+
texture.magFilter = THREE19.LinearFilter;
|
|
32098
31636
|
texture.anisotropy = 16;
|
|
32099
31637
|
texture.needsUpdate = true;
|
|
32100
31638
|
return texture;
|
|
32101
31639
|
}
|
|
32102
31640
|
|
|
32103
31641
|
// src/utils/panel-outline-texture.ts
|
|
32104
|
-
import * as
|
|
31642
|
+
import * as THREE20 from "three";
|
|
32105
31643
|
import { su as su6 } from "@tscircuit/circuit-json-util";
|
|
32106
31644
|
function createPanelOutlineTextureForLayer({
|
|
32107
31645
|
layer,
|
|
@@ -32157,476 +31695,18 @@ function createPanelOutlineTextureForLayer({
|
|
|
32157
31695
|
);
|
|
32158
31696
|
}
|
|
32159
31697
|
});
|
|
32160
|
-
const texture = new
|
|
32161
|
-
texture.generateMipmaps = true;
|
|
32162
|
-
texture.minFilter = THREE21.LinearMipmapLinearFilter;
|
|
32163
|
-
texture.magFilter = THREE21.LinearFilter;
|
|
32164
|
-
texture.anisotropy = 16;
|
|
32165
|
-
texture.needsUpdate = true;
|
|
32166
|
-
return texture;
|
|
32167
|
-
}
|
|
32168
|
-
|
|
32169
|
-
// src/utils/silkscreen-texture.ts
|
|
32170
|
-
var import_text2 = __toESM(require_text(), 1);
|
|
32171
|
-
import * as THREE22 from "three";
|
|
32172
|
-
import { su as su7 } from "@tscircuit/circuit-json-util";
|
|
32173
|
-
|
|
32174
|
-
// src/utils/units.ts
|
|
32175
|
-
var MM_PER_INCH = 25.4;
|
|
32176
|
-
var MM_PER_MIL = MM_PER_INCH / 1e3;
|
|
32177
|
-
var dimensionRegex = /^\s*(-?\d*(?:\.\d+)?)(?:\s*(mm|mil|inch|in|"))?\s*$/i;
|
|
32178
|
-
function normalizeUnit(unit) {
|
|
32179
|
-
if (!unit) return void 0;
|
|
32180
|
-
const normalized = unit.trim().toLowerCase();
|
|
32181
|
-
if (normalized === '"') return "in";
|
|
32182
|
-
if (normalized === "inch") return "in";
|
|
32183
|
-
return normalized;
|
|
32184
|
-
}
|
|
32185
|
-
function parseDimensionToMm(value) {
|
|
32186
|
-
if (value === null || value === void 0) return void 0;
|
|
32187
|
-
if (typeof value === "number") {
|
|
32188
|
-
return Number.isFinite(value) ? value : void 0;
|
|
32189
|
-
}
|
|
32190
|
-
if (typeof value !== "string") return void 0;
|
|
32191
|
-
const trimmed = value.trim();
|
|
32192
|
-
if (trimmed.length === 0) return void 0;
|
|
32193
|
-
const match = trimmed.match(dimensionRegex);
|
|
32194
|
-
if (!match) {
|
|
32195
|
-
const numeric = Number.parseFloat(trimmed);
|
|
32196
|
-
return Number.isFinite(numeric) ? numeric : void 0;
|
|
32197
|
-
}
|
|
32198
|
-
const [, magnitudeRaw, unitRaw] = match;
|
|
32199
|
-
const magnitude = Number.parseFloat(magnitudeRaw || "0");
|
|
32200
|
-
if (!Number.isFinite(magnitude)) return void 0;
|
|
32201
|
-
const unit = normalizeUnit(unitRaw);
|
|
32202
|
-
switch (unit) {
|
|
32203
|
-
case "mil":
|
|
32204
|
-
return magnitude * MM_PER_MIL;
|
|
32205
|
-
case "in":
|
|
32206
|
-
return magnitude * MM_PER_INCH;
|
|
32207
|
-
case "mm":
|
|
32208
|
-
case void 0:
|
|
32209
|
-
return magnitude;
|
|
32210
|
-
default:
|
|
32211
|
-
return magnitude;
|
|
32212
|
-
}
|
|
32213
|
-
}
|
|
32214
|
-
function coerceDimensionToMm(value, fallback) {
|
|
32215
|
-
const parsed = parseDimensionToMm(value);
|
|
32216
|
-
return parsed === void 0 ? fallback : parsed;
|
|
32217
|
-
}
|
|
32218
|
-
|
|
32219
|
-
// src/utils/silkscreen-texture.ts
|
|
32220
|
-
function parseFabricationNoteColor(colorString) {
|
|
32221
|
-
let hex = colorString;
|
|
32222
|
-
if (hex.startsWith("#")) {
|
|
32223
|
-
hex = hex.slice(1);
|
|
32224
|
-
}
|
|
32225
|
-
if (hex.length === 6) {
|
|
32226
|
-
const r = parseInt(hex.slice(0, 2), 16);
|
|
32227
|
-
const g = parseInt(hex.slice(2, 4), 16);
|
|
32228
|
-
const b = parseInt(hex.slice(4, 6), 16);
|
|
32229
|
-
return `rgb(${r}, ${g}, ${b})`;
|
|
32230
|
-
}
|
|
32231
|
-
if (colorString.startsWith("rgb")) {
|
|
32232
|
-
return colorString;
|
|
32233
|
-
}
|
|
32234
|
-
return "rgb(255, 243, 204)";
|
|
32235
|
-
}
|
|
32236
|
-
function createSilkscreenTextureForLayer({
|
|
32237
|
-
layer,
|
|
32238
|
-
circuitJson,
|
|
32239
|
-
boardData,
|
|
32240
|
-
silkscreenColor = "rgb(255,255,255)",
|
|
32241
|
-
traceTextureResolution
|
|
32242
|
-
}) {
|
|
32243
|
-
const pcbSilkscreenTexts = su7(circuitJson).pcb_silkscreen_text.list();
|
|
32244
|
-
const pcbSilkscreenPaths = su7(circuitJson).pcb_silkscreen_path.list();
|
|
32245
|
-
const pcbSilkscreenLines = su7(circuitJson).pcb_silkscreen_line.list();
|
|
32246
|
-
const pcbSilkscreenRects = su7(circuitJson).pcb_silkscreen_rect.list();
|
|
32247
|
-
const pcbSilkscreenCircles = su7(circuitJson).pcb_silkscreen_circle.list();
|
|
32248
|
-
const pcbFabricationNoteRects = su7(circuitJson).pcb_fabrication_note_rect.list();
|
|
32249
|
-
const pcbNoteLines = su7(circuitJson).pcb_note_line.list();
|
|
32250
|
-
const textsOnLayer = pcbSilkscreenTexts.filter((t) => t.layer === layer);
|
|
32251
|
-
const pathsOnLayer = pcbSilkscreenPaths.filter((p) => p.layer === layer);
|
|
32252
|
-
const linesOnLayer = pcbSilkscreenLines.filter((l) => l.layer === layer);
|
|
32253
|
-
const rectsOnLayer = pcbSilkscreenRects.filter((r) => r.layer === layer);
|
|
32254
|
-
const circlesOnLayer = pcbSilkscreenCircles.filter((c) => c.layer === layer);
|
|
32255
|
-
const fabricationNoteRectsOnLayer = pcbFabricationNoteRects.filter(
|
|
32256
|
-
(r) => r.layer === layer
|
|
32257
|
-
);
|
|
32258
|
-
const noteLinesOnLayer = pcbNoteLines.filter(
|
|
32259
|
-
(l) => l.layer === layer
|
|
32260
|
-
);
|
|
32261
|
-
if (textsOnLayer.length === 0 && pathsOnLayer.length === 0 && linesOnLayer.length === 0 && rectsOnLayer.length === 0 && circlesOnLayer.length === 0 && fabricationNoteRectsOnLayer.length === 0 && noteLinesOnLayer.length === 0) {
|
|
32262
|
-
return null;
|
|
32263
|
-
}
|
|
32264
|
-
const boardOutlineBounds = calculateOutlineBounds(boardData);
|
|
32265
|
-
const canvas = document.createElement("canvas");
|
|
32266
|
-
const canvasWidth = Math.floor(
|
|
32267
|
-
boardOutlineBounds.width * traceTextureResolution
|
|
32268
|
-
);
|
|
32269
|
-
const canvasHeight = Math.floor(
|
|
32270
|
-
boardOutlineBounds.height * traceTextureResolution
|
|
32271
|
-
);
|
|
32272
|
-
canvas.width = canvasWidth;
|
|
32273
|
-
canvas.height = canvasHeight;
|
|
32274
|
-
const ctx = canvas.getContext("2d");
|
|
32275
|
-
if (!ctx) return null;
|
|
32276
|
-
if (layer === "bottom") {
|
|
32277
|
-
ctx.translate(0, canvasHeight);
|
|
32278
|
-
ctx.scale(1, -1);
|
|
32279
|
-
}
|
|
32280
|
-
ctx.strokeStyle = silkscreenColor;
|
|
32281
|
-
ctx.fillStyle = silkscreenColor;
|
|
32282
|
-
const canvasXFromPcb = (pcbX) => (pcbX - boardOutlineBounds.minX) * traceTextureResolution;
|
|
32283
|
-
const canvasYFromPcb = (pcbY) => (boardOutlineBounds.maxY - pcbY) * traceTextureResolution;
|
|
32284
|
-
linesOnLayer.forEach((lineEl) => {
|
|
32285
|
-
const startXmm = parseDimensionToMm(lineEl.x1) ?? 0;
|
|
32286
|
-
const startYmm = parseDimensionToMm(lineEl.y1) ?? 0;
|
|
32287
|
-
const endXmm = parseDimensionToMm(lineEl.x2) ?? 0;
|
|
32288
|
-
const endYmm = parseDimensionToMm(lineEl.y2) ?? 0;
|
|
32289
|
-
if (startXmm === endXmm && startYmm === endYmm) return;
|
|
32290
|
-
ctx.beginPath();
|
|
32291
|
-
ctx.lineWidth = coerceDimensionToMm(lineEl.stroke_width, 0.1) * traceTextureResolution;
|
|
32292
|
-
ctx.lineCap = "round";
|
|
32293
|
-
ctx.moveTo(canvasXFromPcb(startXmm), canvasYFromPcb(startYmm));
|
|
32294
|
-
ctx.lineTo(canvasXFromPcb(endXmm), canvasYFromPcb(endYmm));
|
|
32295
|
-
ctx.stroke();
|
|
32296
|
-
});
|
|
32297
|
-
noteLinesOnLayer.forEach((lineEl) => {
|
|
32298
|
-
const startXmm = parseDimensionToMm(lineEl.x1) ?? 0;
|
|
32299
|
-
const startYmm = parseDimensionToMm(lineEl.y1) ?? 0;
|
|
32300
|
-
const endXmm = parseDimensionToMm(lineEl.x2) ?? 0;
|
|
32301
|
-
const endYmm = parseDimensionToMm(lineEl.y2) ?? 0;
|
|
32302
|
-
if (startXmm === endXmm && startYmm === endYmm) return;
|
|
32303
|
-
ctx.save();
|
|
32304
|
-
let strokeColor = silkscreenColor;
|
|
32305
|
-
if (lineEl.color) {
|
|
32306
|
-
strokeColor = parseFabricationNoteColor(lineEl.color);
|
|
32307
|
-
} else {
|
|
32308
|
-
strokeColor = "rgb(255, 243, 204)";
|
|
32309
|
-
}
|
|
32310
|
-
ctx.strokeStyle = strokeColor;
|
|
32311
|
-
ctx.beginPath();
|
|
32312
|
-
ctx.lineWidth = coerceDimensionToMm(lineEl.stroke_width, 0.1) * traceTextureResolution;
|
|
32313
|
-
ctx.lineCap = "round";
|
|
32314
|
-
const isDashed = lineEl.is_dashed ?? false;
|
|
32315
|
-
if (isDashed) {
|
|
32316
|
-
const dashLength = Math.max(ctx.lineWidth * 2, 1);
|
|
32317
|
-
ctx.setLineDash([dashLength, dashLength]);
|
|
32318
|
-
}
|
|
32319
|
-
ctx.moveTo(canvasXFromPcb(startXmm), canvasYFromPcb(startYmm));
|
|
32320
|
-
ctx.lineTo(canvasXFromPcb(endXmm), canvasYFromPcb(endYmm));
|
|
32321
|
-
ctx.stroke();
|
|
32322
|
-
if (isDashed) {
|
|
32323
|
-
ctx.setLineDash([]);
|
|
32324
|
-
}
|
|
32325
|
-
ctx.restore();
|
|
32326
|
-
});
|
|
32327
|
-
pathsOnLayer.forEach((path) => {
|
|
32328
|
-
if (path.route.length < 2) return;
|
|
32329
|
-
ctx.beginPath();
|
|
32330
|
-
ctx.lineWidth = coerceDimensionToMm(path.stroke_width, 0.1) * traceTextureResolution;
|
|
32331
|
-
ctx.lineCap = "round";
|
|
32332
|
-
ctx.lineJoin = "round";
|
|
32333
|
-
path.route.forEach((point, index2) => {
|
|
32334
|
-
const canvasX = canvasXFromPcb(parseDimensionToMm(point.x) ?? 0);
|
|
32335
|
-
const canvasY = canvasYFromPcb(parseDimensionToMm(point.y) ?? 0);
|
|
32336
|
-
if (index2 === 0) ctx.moveTo(canvasX, canvasY);
|
|
32337
|
-
else ctx.lineTo(canvasX, canvasY);
|
|
32338
|
-
});
|
|
32339
|
-
ctx.stroke();
|
|
32340
|
-
});
|
|
32341
|
-
circlesOnLayer.forEach((circleEl) => {
|
|
32342
|
-
const radius = coerceDimensionToMm(circleEl.radius, 0);
|
|
32343
|
-
if (radius <= 0) return;
|
|
32344
|
-
const strokeWidth = coerceDimensionToMm(circleEl.stroke_width, 0.12);
|
|
32345
|
-
const hasStroke = strokeWidth > 0;
|
|
32346
|
-
const centerXmm = parseDimensionToMm(circleEl.center?.x) ?? 0;
|
|
32347
|
-
const centerYmm = parseDimensionToMm(circleEl.center?.y) ?? 0;
|
|
32348
|
-
const canvasCenterX = canvasXFromPcb(centerXmm);
|
|
32349
|
-
const canvasCenterY = canvasYFromPcb(centerYmm);
|
|
32350
|
-
const radiusPx = radius * traceTextureResolution;
|
|
32351
|
-
ctx.save();
|
|
32352
|
-
ctx.translate(canvasCenterX, canvasCenterY);
|
|
32353
|
-
if (hasStroke) {
|
|
32354
|
-
const outerRadiusPx = radiusPx + strokeWidth / 2 * traceTextureResolution;
|
|
32355
|
-
const innerRadiusPx = Math.max(
|
|
32356
|
-
0,
|
|
32357
|
-
radiusPx - strokeWidth / 2 * traceTextureResolution
|
|
32358
|
-
);
|
|
32359
|
-
if (innerRadiusPx > 0) {
|
|
32360
|
-
ctx.beginPath();
|
|
32361
|
-
ctx.arc(0, 0, outerRadiusPx, 0, 2 * Math.PI);
|
|
32362
|
-
ctx.arc(0, 0, innerRadiusPx, 0, 2 * Math.PI, true);
|
|
32363
|
-
ctx.fill("evenodd");
|
|
32364
|
-
} else {
|
|
32365
|
-
ctx.beginPath();
|
|
32366
|
-
ctx.arc(0, 0, outerRadiusPx, 0, 2 * Math.PI);
|
|
32367
|
-
ctx.fill();
|
|
32368
|
-
}
|
|
32369
|
-
} else {
|
|
32370
|
-
ctx.beginPath();
|
|
32371
|
-
ctx.arc(0, 0, radiusPx, 0, 2 * Math.PI);
|
|
32372
|
-
ctx.fill();
|
|
32373
|
-
}
|
|
32374
|
-
ctx.restore();
|
|
32375
|
-
});
|
|
32376
|
-
rectsOnLayer.forEach((rect) => {
|
|
32377
|
-
const width10 = coerceDimensionToMm(rect.width, 0);
|
|
32378
|
-
const height10 = coerceDimensionToMm(rect.height, 0);
|
|
32379
|
-
if (width10 <= 0 || height10 <= 0) return;
|
|
32380
|
-
const centerXmm = parseDimensionToMm(rect.center?.x) ?? 0;
|
|
32381
|
-
const centerYmm = parseDimensionToMm(rect.center?.y) ?? 0;
|
|
32382
|
-
const canvasCenterX = canvasXFromPcb(centerXmm);
|
|
32383
|
-
const canvasCenterY = canvasYFromPcb(centerYmm);
|
|
32384
|
-
const rawRadius = extractRectBorderRadius(rect);
|
|
32385
|
-
const borderRadiusInput = typeof rawRadius === "string" ? parseDimensionToMm(rawRadius) : rawRadius;
|
|
32386
|
-
const borderRadiusMm = clampRectBorderRadius(
|
|
32387
|
-
width10,
|
|
32388
|
-
height10,
|
|
32389
|
-
borderRadiusInput
|
|
32390
|
-
);
|
|
32391
|
-
ctx.save();
|
|
32392
|
-
ctx.translate(canvasCenterX, canvasCenterY);
|
|
32393
|
-
const halfWidthPx = width10 / 2 * traceTextureResolution;
|
|
32394
|
-
const halfHeightPx = height10 / 2 * traceTextureResolution;
|
|
32395
|
-
const borderRadiusPx = Math.min(
|
|
32396
|
-
borderRadiusMm * traceTextureResolution,
|
|
32397
|
-
halfWidthPx,
|
|
32398
|
-
halfHeightPx
|
|
32399
|
-
);
|
|
32400
|
-
const hasStroke = rect.stroke_width ?? false;
|
|
32401
|
-
const isFilled = rect.is_filled ?? true;
|
|
32402
|
-
const isDashed = rect.is_stroke_dashed ?? false;
|
|
32403
|
-
const strokeWidthPx = hasStroke ? coerceDimensionToMm(rect.stroke_width, 0.1) * traceTextureResolution : 0;
|
|
32404
|
-
const drawRoundedRectPath = (x, y, rectWidth, rectHeight, radius) => {
|
|
32405
|
-
ctx.beginPath();
|
|
32406
|
-
if (radius <= 0) {
|
|
32407
|
-
ctx.rect(x, y, rectWidth, rectHeight);
|
|
32408
|
-
} else {
|
|
32409
|
-
const r = radius;
|
|
32410
|
-
const right = x + rectWidth;
|
|
32411
|
-
const bottom = y + rectHeight;
|
|
32412
|
-
ctx.moveTo(x + r, y);
|
|
32413
|
-
ctx.lineTo(right - r, y);
|
|
32414
|
-
ctx.quadraticCurveTo(right, y, right, y + r);
|
|
32415
|
-
ctx.lineTo(right, bottom - r);
|
|
32416
|
-
ctx.quadraticCurveTo(right, bottom, right - r, bottom);
|
|
32417
|
-
ctx.lineTo(x + r, bottom);
|
|
32418
|
-
ctx.quadraticCurveTo(x, bottom, x, bottom - r);
|
|
32419
|
-
ctx.lineTo(x, y + r);
|
|
32420
|
-
ctx.quadraticCurveTo(x, y, x + r, y);
|
|
32421
|
-
ctx.closePath();
|
|
32422
|
-
}
|
|
32423
|
-
};
|
|
32424
|
-
drawRoundedRectPath(
|
|
32425
|
-
-halfWidthPx,
|
|
32426
|
-
-halfHeightPx,
|
|
32427
|
-
halfWidthPx * 2,
|
|
32428
|
-
halfHeightPx * 2,
|
|
32429
|
-
borderRadiusPx
|
|
32430
|
-
);
|
|
32431
|
-
if (isFilled) {
|
|
32432
|
-
ctx.fill();
|
|
32433
|
-
}
|
|
32434
|
-
if (hasStroke && strokeWidthPx > 0) {
|
|
32435
|
-
ctx.lineWidth = strokeWidthPx;
|
|
32436
|
-
if (isDashed) {
|
|
32437
|
-
const dashLength = Math.max(strokeWidthPx * 2, 1);
|
|
32438
|
-
ctx.setLineDash([dashLength, dashLength]);
|
|
32439
|
-
}
|
|
32440
|
-
ctx.stroke();
|
|
32441
|
-
if (isDashed) {
|
|
32442
|
-
ctx.setLineDash([]);
|
|
32443
|
-
}
|
|
32444
|
-
}
|
|
32445
|
-
ctx.restore();
|
|
32446
|
-
});
|
|
32447
|
-
fabricationNoteRectsOnLayer.forEach((rect) => {
|
|
32448
|
-
const width10 = coerceDimensionToMm(rect.width, 0);
|
|
32449
|
-
const height10 = coerceDimensionToMm(rect.height, 0);
|
|
32450
|
-
if (width10 <= 0 || height10 <= 0) return;
|
|
32451
|
-
const centerXmm = parseDimensionToMm(rect.center?.x) ?? 0;
|
|
32452
|
-
const centerYmm = parseDimensionToMm(rect.center?.y) ?? 0;
|
|
32453
|
-
const canvasCenterX = canvasXFromPcb(centerXmm);
|
|
32454
|
-
const canvasCenterY = canvasYFromPcb(centerYmm);
|
|
32455
|
-
const rawRadius = extractRectBorderRadius(rect);
|
|
32456
|
-
const borderRadiusInput = typeof rawRadius === "string" ? parseDimensionToMm(rawRadius) : rawRadius;
|
|
32457
|
-
const borderRadiusMm = clampRectBorderRadius(
|
|
32458
|
-
width10,
|
|
32459
|
-
height10,
|
|
32460
|
-
borderRadiusInput
|
|
32461
|
-
);
|
|
32462
|
-
ctx.save();
|
|
32463
|
-
ctx.translate(canvasCenterX, canvasCenterY);
|
|
32464
|
-
const halfWidthPx = width10 / 2 * traceTextureResolution;
|
|
32465
|
-
const halfHeightPx = height10 / 2 * traceTextureResolution;
|
|
32466
|
-
const borderRadiusPx = Math.min(
|
|
32467
|
-
borderRadiusMm * traceTextureResolution,
|
|
32468
|
-
halfWidthPx,
|
|
32469
|
-
halfHeightPx
|
|
32470
|
-
);
|
|
32471
|
-
const hasStroke = rect.has_stroke ?? false;
|
|
32472
|
-
const isFilled = rect.is_filled ?? true;
|
|
32473
|
-
const isDashed = rect.is_stroke_dashed ?? false;
|
|
32474
|
-
const strokeWidthPx = hasStroke ? coerceDimensionToMm(rect.stroke_width, 0.1) * traceTextureResolution : 0;
|
|
32475
|
-
let fillColor = silkscreenColor;
|
|
32476
|
-
let strokeColor = silkscreenColor;
|
|
32477
|
-
if (rect.color) {
|
|
32478
|
-
const parsedColor = parseFabricationNoteColor(rect.color);
|
|
32479
|
-
fillColor = parsedColor;
|
|
32480
|
-
strokeColor = parsedColor;
|
|
32481
|
-
} else {
|
|
32482
|
-
fillColor = "rgb(255, 243, 204)";
|
|
32483
|
-
strokeColor = "rgb(255, 243, 204)";
|
|
32484
|
-
}
|
|
32485
|
-
const drawRoundedRectPath = (x, y, rectWidth, rectHeight, radius) => {
|
|
32486
|
-
ctx.beginPath();
|
|
32487
|
-
if (radius <= 0) {
|
|
32488
|
-
ctx.rect(x, y, rectWidth, rectHeight);
|
|
32489
|
-
} else {
|
|
32490
|
-
const r = radius;
|
|
32491
|
-
const right = x + rectWidth;
|
|
32492
|
-
const bottom = y + rectHeight;
|
|
32493
|
-
ctx.moveTo(x + r, y);
|
|
32494
|
-
ctx.lineTo(right - r, y);
|
|
32495
|
-
ctx.quadraticCurveTo(right, y, right, y + r);
|
|
32496
|
-
ctx.lineTo(right, bottom - r);
|
|
32497
|
-
ctx.quadraticCurveTo(right, bottom, right - r, bottom);
|
|
32498
|
-
ctx.lineTo(x + r, bottom);
|
|
32499
|
-
ctx.quadraticCurveTo(x, bottom, x, bottom - r);
|
|
32500
|
-
ctx.lineTo(x, y + r);
|
|
32501
|
-
ctx.quadraticCurveTo(x, y, x + r, y);
|
|
32502
|
-
ctx.closePath();
|
|
32503
|
-
}
|
|
32504
|
-
};
|
|
32505
|
-
drawRoundedRectPath(
|
|
32506
|
-
-halfWidthPx,
|
|
32507
|
-
-halfHeightPx,
|
|
32508
|
-
halfWidthPx * 2,
|
|
32509
|
-
halfHeightPx * 2,
|
|
32510
|
-
borderRadiusPx
|
|
32511
|
-
);
|
|
32512
|
-
if (isFilled) {
|
|
32513
|
-
ctx.fillStyle = fillColor;
|
|
32514
|
-
ctx.fill();
|
|
32515
|
-
}
|
|
32516
|
-
if (hasStroke && strokeWidthPx > 0) {
|
|
32517
|
-
ctx.strokeStyle = strokeColor;
|
|
32518
|
-
ctx.lineWidth = strokeWidthPx;
|
|
32519
|
-
if (isDashed) {
|
|
32520
|
-
const dashLength = Math.max(strokeWidthPx * 2, 1);
|
|
32521
|
-
ctx.setLineDash([dashLength, dashLength]);
|
|
32522
|
-
}
|
|
32523
|
-
ctx.stroke();
|
|
32524
|
-
if (isDashed) {
|
|
32525
|
-
ctx.setLineDash([]);
|
|
32526
|
-
}
|
|
32527
|
-
}
|
|
32528
|
-
ctx.restore();
|
|
32529
|
-
});
|
|
32530
|
-
textsOnLayer.forEach((textS) => {
|
|
32531
|
-
const fontSize = textS.font_size || 0.25;
|
|
32532
|
-
const textStrokeWidth = Math.min(Math.max(0.01, fontSize * 0.1), fontSize * 0.05) * traceTextureResolution;
|
|
32533
|
-
ctx.lineWidth = textStrokeWidth;
|
|
32534
|
-
ctx.lineCap = "butt";
|
|
32535
|
-
ctx.lineJoin = "miter";
|
|
32536
|
-
const rawTextOutlines = (0, import_text2.vectorText)({
|
|
32537
|
-
height: fontSize * 0.45,
|
|
32538
|
-
input: textS.text
|
|
32539
|
-
});
|
|
32540
|
-
const processedTextOutlines = [];
|
|
32541
|
-
rawTextOutlines.forEach((outline) => {
|
|
32542
|
-
if (outline.length === 29) {
|
|
32543
|
-
processedTextOutlines.push(
|
|
32544
|
-
outline.slice(0, 15)
|
|
32545
|
-
);
|
|
32546
|
-
processedTextOutlines.push(
|
|
32547
|
-
outline.slice(14, 29)
|
|
32548
|
-
);
|
|
32549
|
-
} else if (outline.length === 17) {
|
|
32550
|
-
processedTextOutlines.push(
|
|
32551
|
-
outline.slice(0, 10)
|
|
32552
|
-
);
|
|
32553
|
-
processedTextOutlines.push(
|
|
32554
|
-
outline.slice(9, 17)
|
|
32555
|
-
);
|
|
32556
|
-
} else {
|
|
32557
|
-
processedTextOutlines.push(outline);
|
|
32558
|
-
}
|
|
32559
|
-
});
|
|
32560
|
-
const points = processedTextOutlines.flat();
|
|
32561
|
-
const textBounds = {
|
|
32562
|
-
minX: points.length > 0 ? Math.min(...points.map((p) => p[0])) : 0,
|
|
32563
|
-
maxX: points.length > 0 ? Math.max(...points.map((p) => p[0])) : 0,
|
|
32564
|
-
minY: points.length > 0 ? Math.min(...points.map((p) => p[1])) : 0,
|
|
32565
|
-
maxY: points.length > 0 ? Math.max(...points.map((p) => p[1])) : 0
|
|
32566
|
-
};
|
|
32567
|
-
const textCenterX = (textBounds.minX + textBounds.maxX) / 2;
|
|
32568
|
-
const textCenterY = (textBounds.minY + textBounds.maxY) / 2;
|
|
32569
|
-
let xOff = -textCenterX;
|
|
32570
|
-
let yOff = -textCenterY;
|
|
32571
|
-
const alignment = textS.anchor_alignment || "center";
|
|
32572
|
-
if (alignment.includes("left")) {
|
|
32573
|
-
xOff = -textBounds.minX;
|
|
32574
|
-
} else if (alignment.includes("right")) {
|
|
32575
|
-
xOff = -textBounds.maxX;
|
|
32576
|
-
}
|
|
32577
|
-
if (alignment.includes("top")) {
|
|
32578
|
-
yOff = -textBounds.maxY;
|
|
32579
|
-
} else if (alignment.includes("bottom")) {
|
|
32580
|
-
yOff = -textBounds.minY;
|
|
32581
|
-
}
|
|
32582
|
-
const transformMatrices = [];
|
|
32583
|
-
let rotationDeg = textS.ccw_rotation ?? 0;
|
|
32584
|
-
if (textS.layer === "bottom") {
|
|
32585
|
-
transformMatrices.push(
|
|
32586
|
-
translate6(textCenterX, textCenterY),
|
|
32587
|
-
{ a: -1, b: 0, c: 0, d: 1, e: 0, f: 0 },
|
|
32588
|
-
translate6(-textCenterX, -textCenterY)
|
|
32589
|
-
);
|
|
32590
|
-
rotationDeg = -rotationDeg;
|
|
32591
|
-
}
|
|
32592
|
-
if (rotationDeg) {
|
|
32593
|
-
const rad = rotationDeg * Math.PI / 180;
|
|
32594
|
-
transformMatrices.push(
|
|
32595
|
-
translate6(textCenterX, textCenterY),
|
|
32596
|
-
rotate2(rad),
|
|
32597
|
-
translate6(-textCenterX, -textCenterY)
|
|
32598
|
-
);
|
|
32599
|
-
}
|
|
32600
|
-
const finalTransformMatrix = transformMatrices.length > 0 ? compose(...transformMatrices) : void 0;
|
|
32601
|
-
processedTextOutlines.forEach((segment) => {
|
|
32602
|
-
ctx.beginPath();
|
|
32603
|
-
segment.forEach((p, index2) => {
|
|
32604
|
-
let transformedP = { x: p[0], y: p[1] };
|
|
32605
|
-
if (finalTransformMatrix) {
|
|
32606
|
-
transformedP = applyToPoint(finalTransformMatrix, transformedP);
|
|
32607
|
-
}
|
|
32608
|
-
const pcbX = transformedP.x + xOff + textS.anchor_position.x;
|
|
32609
|
-
const pcbY = transformedP.y + yOff + textS.anchor_position.y;
|
|
32610
|
-
const canvasX = canvasXFromPcb(pcbX);
|
|
32611
|
-
const canvasY = canvasYFromPcb(pcbY);
|
|
32612
|
-
if (index2 === 0) ctx.moveTo(canvasX, canvasY);
|
|
32613
|
-
else ctx.lineTo(canvasX, canvasY);
|
|
32614
|
-
});
|
|
32615
|
-
ctx.stroke();
|
|
32616
|
-
});
|
|
32617
|
-
});
|
|
32618
|
-
const texture = new THREE22.CanvasTexture(canvas);
|
|
31698
|
+
const texture = new THREE20.CanvasTexture(canvas);
|
|
32619
31699
|
texture.generateMipmaps = true;
|
|
32620
|
-
texture.minFilter =
|
|
32621
|
-
texture.magFilter =
|
|
31700
|
+
texture.minFilter = THREE20.LinearMipmapLinearFilter;
|
|
31701
|
+
texture.magFilter = THREE20.LinearFilter;
|
|
32622
31702
|
texture.anisotropy = 16;
|
|
32623
31703
|
texture.needsUpdate = true;
|
|
32624
31704
|
return texture;
|
|
32625
31705
|
}
|
|
32626
31706
|
|
|
32627
31707
|
// src/utils/trace-texture.ts
|
|
32628
|
-
import * as
|
|
32629
|
-
import { su as
|
|
31708
|
+
import * as THREE21 from "three";
|
|
31709
|
+
import { su as su7 } from "@tscircuit/circuit-json-util";
|
|
32630
31710
|
function isWireRoutePoint(point) {
|
|
32631
31711
|
return point && point.route_type === "wire" && typeof point.layer === "string" && typeof point.width === "number";
|
|
32632
31712
|
}
|
|
@@ -32637,9 +31717,9 @@ function createTraceTextureForLayer({
|
|
|
32637
31717
|
traceColor,
|
|
32638
31718
|
traceTextureResolution
|
|
32639
31719
|
}) {
|
|
32640
|
-
const pcbTraces =
|
|
32641
|
-
const allPcbVias =
|
|
32642
|
-
const allPcbPlatedHoles =
|
|
31720
|
+
const pcbTraces = su7(circuitJson).pcb_trace.list();
|
|
31721
|
+
const allPcbVias = su7(circuitJson).pcb_via.list();
|
|
31722
|
+
const allPcbPlatedHoles = su7(
|
|
32643
31723
|
circuitJson
|
|
32644
31724
|
).pcb_plated_hole.list();
|
|
32645
31725
|
const tracesOnLayer = pcbTraces.filter(
|
|
@@ -32738,18 +31818,139 @@ function createTraceTextureForLayer({
|
|
|
32738
31818
|
}
|
|
32739
31819
|
});
|
|
32740
31820
|
ctx.globalCompositeOperation = "source-over";
|
|
32741
|
-
const texture = new
|
|
31821
|
+
const texture = new THREE21.CanvasTexture(canvas);
|
|
32742
31822
|
texture.generateMipmaps = true;
|
|
32743
|
-
texture.minFilter =
|
|
32744
|
-
texture.magFilter =
|
|
31823
|
+
texture.minFilter = THREE21.LinearMipmapLinearFilter;
|
|
31824
|
+
texture.magFilter = THREE21.LinearFilter;
|
|
32745
31825
|
texture.anisotropy = 16;
|
|
32746
31826
|
texture.needsUpdate = true;
|
|
32747
31827
|
return texture;
|
|
32748
31828
|
}
|
|
32749
31829
|
|
|
32750
|
-
// src/textures/create-copper-
|
|
32751
|
-
import * as
|
|
31830
|
+
// src/textures/create-copper-text-texture-for-layer.ts
|
|
31831
|
+
import * as THREE22 from "three";
|
|
31832
|
+
|
|
31833
|
+
// src/textures/copper-text/copper-text-drawing.ts
|
|
32752
31834
|
import { CircuitToCanvasDrawer } from "circuit-to-canvas";
|
|
31835
|
+
var setDrawerBounds = (drawer, bounds) => {
|
|
31836
|
+
drawer.setCameraBounds({
|
|
31837
|
+
minX: bounds.minX,
|
|
31838
|
+
maxX: bounds.maxX,
|
|
31839
|
+
minY: bounds.minY,
|
|
31840
|
+
maxY: bounds.maxY
|
|
31841
|
+
});
|
|
31842
|
+
};
|
|
31843
|
+
var drawCopperTextLayer = ({
|
|
31844
|
+
ctx,
|
|
31845
|
+
layer,
|
|
31846
|
+
bounds,
|
|
31847
|
+
elements,
|
|
31848
|
+
copperColor
|
|
31849
|
+
}) => {
|
|
31850
|
+
const renderLayer = layer === "top" ? "top_copper" : "bottom_copper";
|
|
31851
|
+
const drawer = new CircuitToCanvasDrawer(ctx);
|
|
31852
|
+
drawer.configure({
|
|
31853
|
+
colorOverrides: {
|
|
31854
|
+
copper: {
|
|
31855
|
+
top: copperColor,
|
|
31856
|
+
bottom: copperColor,
|
|
31857
|
+
inner1: copperColor,
|
|
31858
|
+
inner2: copperColor,
|
|
31859
|
+
inner3: copperColor,
|
|
31860
|
+
inner4: copperColor,
|
|
31861
|
+
inner5: copperColor,
|
|
31862
|
+
inner6: copperColor
|
|
31863
|
+
}
|
|
31864
|
+
}
|
|
31865
|
+
});
|
|
31866
|
+
setDrawerBounds(drawer, bounds);
|
|
31867
|
+
drawer.drawElements(elements, {
|
|
31868
|
+
layers: [renderLayer]
|
|
31869
|
+
});
|
|
31870
|
+
const knockoutTexts = elements.filter(
|
|
31871
|
+
(element) => element.type === "pcb_copper_text" && element.is_knockout === true
|
|
31872
|
+
);
|
|
31873
|
+
if (knockoutTexts.length === 0) return;
|
|
31874
|
+
const maskCanvas = document.createElement("canvas");
|
|
31875
|
+
maskCanvas.width = ctx.canvas.width;
|
|
31876
|
+
maskCanvas.height = ctx.canvas.height;
|
|
31877
|
+
const maskCtx = maskCanvas.getContext("2d");
|
|
31878
|
+
if (!maskCtx) return;
|
|
31879
|
+
const knockoutCutoutDrawer = new CircuitToCanvasDrawer(maskCtx);
|
|
31880
|
+
knockoutCutoutDrawer.configure({
|
|
31881
|
+
colorOverrides: {
|
|
31882
|
+
copper: {
|
|
31883
|
+
top: "rgb(255,255,255)",
|
|
31884
|
+
bottom: "rgb(255,255,255)",
|
|
31885
|
+
inner1: "rgb(255,255,255)",
|
|
31886
|
+
inner2: "rgb(255,255,255)",
|
|
31887
|
+
inner3: "rgb(255,255,255)",
|
|
31888
|
+
inner4: "rgb(255,255,255)",
|
|
31889
|
+
inner5: "rgb(255,255,255)",
|
|
31890
|
+
inner6: "rgb(255,255,255)"
|
|
31891
|
+
}
|
|
31892
|
+
}
|
|
31893
|
+
});
|
|
31894
|
+
setDrawerBounds(knockoutCutoutDrawer, bounds);
|
|
31895
|
+
knockoutCutoutDrawer.drawElements(
|
|
31896
|
+
knockoutTexts.map((text) => ({
|
|
31897
|
+
...text,
|
|
31898
|
+
is_knockout: false
|
|
31899
|
+
})),
|
|
31900
|
+
{
|
|
31901
|
+
layers: [renderLayer]
|
|
31902
|
+
}
|
|
31903
|
+
);
|
|
31904
|
+
ctx.save();
|
|
31905
|
+
ctx.globalCompositeOperation = "destination-out";
|
|
31906
|
+
ctx.drawImage(maskCanvas, 0, 0);
|
|
31907
|
+
ctx.restore();
|
|
31908
|
+
};
|
|
31909
|
+
|
|
31910
|
+
// src/textures/create-copper-text-texture-for-layer.ts
|
|
31911
|
+
function createCopperTextTextureForLayer({
|
|
31912
|
+
layer,
|
|
31913
|
+
circuitJson,
|
|
31914
|
+
boardData,
|
|
31915
|
+
copperColor = "rgb(230, 153, 51)",
|
|
31916
|
+
traceTextureResolution = TRACE_TEXTURE_RESOLUTION
|
|
31917
|
+
}) {
|
|
31918
|
+
const elements = circuitJson.filter(
|
|
31919
|
+
(element) => element.type === "pcb_copper_text" && "layer" in element && element.layer === layer
|
|
31920
|
+
);
|
|
31921
|
+
if (elements.length === 0) return null;
|
|
31922
|
+
const bounds = calculateOutlineBounds(boardData);
|
|
31923
|
+
const canvasWidth = Math.floor(bounds.width * traceTextureResolution);
|
|
31924
|
+
const canvasHeight = Math.floor(bounds.height * traceTextureResolution);
|
|
31925
|
+
if (canvasWidth <= 0 || canvasHeight <= 0) return null;
|
|
31926
|
+
const canvas = document.createElement("canvas");
|
|
31927
|
+
canvas.width = canvasWidth;
|
|
31928
|
+
canvas.height = canvasHeight;
|
|
31929
|
+
const ctx = canvas.getContext("2d");
|
|
31930
|
+
if (!ctx) return null;
|
|
31931
|
+
if (layer === "bottom") {
|
|
31932
|
+
ctx.translate(0, canvasHeight);
|
|
31933
|
+
ctx.scale(1, -1);
|
|
31934
|
+
}
|
|
31935
|
+
drawCopperTextLayer({
|
|
31936
|
+
ctx,
|
|
31937
|
+
layer,
|
|
31938
|
+
bounds,
|
|
31939
|
+
elements,
|
|
31940
|
+
copperColor
|
|
31941
|
+
});
|
|
31942
|
+
const texture = new THREE22.CanvasTexture(canvas);
|
|
31943
|
+
texture.generateMipmaps = true;
|
|
31944
|
+
texture.minFilter = THREE22.LinearMipmapLinearFilter;
|
|
31945
|
+
texture.magFilter = THREE22.LinearFilter;
|
|
31946
|
+
texture.anisotropy = 16;
|
|
31947
|
+
texture.needsUpdate = true;
|
|
31948
|
+
return texture;
|
|
31949
|
+
}
|
|
31950
|
+
|
|
31951
|
+
// src/textures/create-copper-pour-texture-for-layer.ts
|
|
31952
|
+
import * as THREE23 from "three";
|
|
31953
|
+
import { CircuitToCanvasDrawer as CircuitToCanvasDrawer2 } from "circuit-to-canvas";
|
|
32753
31954
|
|
|
32754
31955
|
// src/geoms/brep-converter.ts
|
|
32755
31956
|
var import_primitives7 = __toESM(require_primitives(), 1);
|
|
@@ -32897,7 +32098,7 @@ function createCopperPourTextureForLayer({
|
|
|
32897
32098
|
);
|
|
32898
32099
|
const brepPours = poursOnLayer.filter((pour) => pour.shape === "brep");
|
|
32899
32100
|
if (rectAndPolygonPours.length > 0) {
|
|
32900
|
-
const drawer = new
|
|
32101
|
+
const drawer = new CircuitToCanvasDrawer2(ctx);
|
|
32901
32102
|
drawer.setCameraBounds({
|
|
32902
32103
|
minX: boardOutlineBounds.minX,
|
|
32903
32104
|
maxX: boardOutlineBounds.maxX,
|
|
@@ -32954,6 +32155,167 @@ function createCopperPourTextureForLayer({
|
|
|
32954
32155
|
ctx.fillStyle = copperColor;
|
|
32955
32156
|
drawBrepShape({ ctx, pour, canvasXFromPcb, canvasYFromPcb });
|
|
32956
32157
|
}
|
|
32158
|
+
const texture = new THREE23.CanvasTexture(canvas);
|
|
32159
|
+
texture.generateMipmaps = true;
|
|
32160
|
+
texture.minFilter = THREE23.LinearMipmapLinearFilter;
|
|
32161
|
+
texture.magFilter = THREE23.LinearFilter;
|
|
32162
|
+
texture.anisotropy = 16;
|
|
32163
|
+
texture.needsUpdate = true;
|
|
32164
|
+
return texture;
|
|
32165
|
+
}
|
|
32166
|
+
|
|
32167
|
+
// src/textures/create-silkscreen-texture-for-layer.ts
|
|
32168
|
+
import * as THREE24 from "three";
|
|
32169
|
+
|
|
32170
|
+
// src/textures/soldermask/soldermask-bounds.ts
|
|
32171
|
+
var boundsFromPanel = (panel) => ({
|
|
32172
|
+
minX: panel.center.x - panel.width / 2,
|
|
32173
|
+
maxX: panel.center.x + panel.width / 2,
|
|
32174
|
+
minY: panel.center.y - panel.height / 2,
|
|
32175
|
+
maxY: panel.center.y + panel.height / 2,
|
|
32176
|
+
width: panel.width,
|
|
32177
|
+
height: panel.height,
|
|
32178
|
+
centerX: panel.center.x,
|
|
32179
|
+
centerY: panel.center.y
|
|
32180
|
+
});
|
|
32181
|
+
var mergeBounds = (a, b) => {
|
|
32182
|
+
const minX = Math.min(a.minX, b.minX);
|
|
32183
|
+
const maxX = Math.max(a.maxX, b.maxX);
|
|
32184
|
+
const minY = Math.min(a.minY, b.minY);
|
|
32185
|
+
const maxY = Math.max(a.maxY, b.maxY);
|
|
32186
|
+
return {
|
|
32187
|
+
minX,
|
|
32188
|
+
maxX,
|
|
32189
|
+
minY,
|
|
32190
|
+
maxY,
|
|
32191
|
+
width: maxX - minX,
|
|
32192
|
+
height: maxY - minY,
|
|
32193
|
+
centerX: (minX + maxX) / 2,
|
|
32194
|
+
centerY: (minY + maxY) / 2
|
|
32195
|
+
};
|
|
32196
|
+
};
|
|
32197
|
+
var getSoldermaskRenderBounds = (circuitJson, boardData) => {
|
|
32198
|
+
const panels = circuitJson.filter(
|
|
32199
|
+
(e) => e.type === "pcb_panel"
|
|
32200
|
+
);
|
|
32201
|
+
const boards = circuitJson.filter(
|
|
32202
|
+
(e) => e.type === "pcb_board"
|
|
32203
|
+
);
|
|
32204
|
+
const activePanel = panels.find((panel) => panel.pcb_panel_id === boardData.pcb_board_id) ?? panels[0];
|
|
32205
|
+
if (activePanel && activePanel.width > 0 && activePanel.height > 0) {
|
|
32206
|
+
return boundsFromPanel(activePanel);
|
|
32207
|
+
}
|
|
32208
|
+
const boardsForBounds = boards.length > 1 ? boards : [boardData];
|
|
32209
|
+
return boardsForBounds.map((board) => calculateOutlineBounds(board)).reduce((acc, bounds) => mergeBounds(acc, bounds));
|
|
32210
|
+
};
|
|
32211
|
+
|
|
32212
|
+
// src/textures/silkscreen/silkscreen-drawing.ts
|
|
32213
|
+
import { CircuitToCanvasDrawer as CircuitToCanvasDrawer3 } from "circuit-to-canvas";
|
|
32214
|
+
var FABRICATION_NOTE_COLOR = "rgb(255,243,204)";
|
|
32215
|
+
var TRANSPARENT = "rgba(0,0,0,0)";
|
|
32216
|
+
var setDrawerBounds2 = (drawer, bounds) => {
|
|
32217
|
+
drawer.setCameraBounds({
|
|
32218
|
+
minX: bounds.minX,
|
|
32219
|
+
maxX: bounds.maxX,
|
|
32220
|
+
minY: bounds.minY,
|
|
32221
|
+
maxY: bounds.maxY
|
|
32222
|
+
});
|
|
32223
|
+
};
|
|
32224
|
+
var drawSilkscreenLayer = ({
|
|
32225
|
+
ctx,
|
|
32226
|
+
layer,
|
|
32227
|
+
bounds,
|
|
32228
|
+
elements,
|
|
32229
|
+
silkscreenColor
|
|
32230
|
+
}) => {
|
|
32231
|
+
const renderLayer = layer === "top" ? "top_silkscreen" : "bottom_silkscreen";
|
|
32232
|
+
const drawer = new CircuitToCanvasDrawer3(ctx);
|
|
32233
|
+
drawer.configure({
|
|
32234
|
+
colorOverrides: {
|
|
32235
|
+
copper: {
|
|
32236
|
+
top: TRANSPARENT,
|
|
32237
|
+
bottom: TRANSPARENT,
|
|
32238
|
+
inner1: TRANSPARENT,
|
|
32239
|
+
inner2: TRANSPARENT,
|
|
32240
|
+
inner3: TRANSPARENT,
|
|
32241
|
+
inner4: TRANSPARENT,
|
|
32242
|
+
inner5: TRANSPARENT,
|
|
32243
|
+
inner6: TRANSPARENT
|
|
32244
|
+
},
|
|
32245
|
+
copperPour: {
|
|
32246
|
+
top: TRANSPARENT,
|
|
32247
|
+
bottom: TRANSPARENT
|
|
32248
|
+
},
|
|
32249
|
+
drill: TRANSPARENT,
|
|
32250
|
+
boardOutline: TRANSPARENT,
|
|
32251
|
+
substrate: TRANSPARENT,
|
|
32252
|
+
keepout: TRANSPARENT,
|
|
32253
|
+
courtyard: {
|
|
32254
|
+
top: TRANSPARENT,
|
|
32255
|
+
bottom: TRANSPARENT
|
|
32256
|
+
},
|
|
32257
|
+
soldermask: {
|
|
32258
|
+
top: TRANSPARENT,
|
|
32259
|
+
bottom: TRANSPARENT
|
|
32260
|
+
},
|
|
32261
|
+
soldermaskWithCopperUnderneath: {
|
|
32262
|
+
top: TRANSPARENT,
|
|
32263
|
+
bottom: TRANSPARENT
|
|
32264
|
+
},
|
|
32265
|
+
soldermaskOverCopper: {
|
|
32266
|
+
top: TRANSPARENT,
|
|
32267
|
+
bottom: TRANSPARENT
|
|
32268
|
+
},
|
|
32269
|
+
silkscreen: {
|
|
32270
|
+
top: silkscreenColor,
|
|
32271
|
+
bottom: silkscreenColor
|
|
32272
|
+
},
|
|
32273
|
+
fabricationNote: FABRICATION_NOTE_COLOR
|
|
32274
|
+
}
|
|
32275
|
+
});
|
|
32276
|
+
setDrawerBounds2(drawer, bounds);
|
|
32277
|
+
drawer.drawElements(elements, {
|
|
32278
|
+
layers: [renderLayer]
|
|
32279
|
+
});
|
|
32280
|
+
};
|
|
32281
|
+
|
|
32282
|
+
// src/textures/create-silkscreen-texture-for-layer.ts
|
|
32283
|
+
var isSilkscreenElement = (element, layer) => {
|
|
32284
|
+
if (!("layer" in element) || element.layer !== layer) return false;
|
|
32285
|
+
const elementType = element.type;
|
|
32286
|
+
return elementType.startsWith("pcb_silkscreen_") || elementType === "pcb_fabrication_note_rect" || elementType === "pcb_note_line";
|
|
32287
|
+
};
|
|
32288
|
+
function createSilkscreenTextureForLayer({
|
|
32289
|
+
layer,
|
|
32290
|
+
circuitJson,
|
|
32291
|
+
boardData,
|
|
32292
|
+
traceTextureResolution = TRACE_TEXTURE_RESOLUTION,
|
|
32293
|
+
silkscreenColor = "rgb(255,255,255)"
|
|
32294
|
+
}) {
|
|
32295
|
+
const elements = circuitJson.filter(
|
|
32296
|
+
(element) => isSilkscreenElement(element, layer)
|
|
32297
|
+
);
|
|
32298
|
+
if (elements.length === 0) return null;
|
|
32299
|
+
const bounds = getSoldermaskRenderBounds(circuitJson, boardData);
|
|
32300
|
+
const canvasWidth = Math.floor(bounds.width * traceTextureResolution);
|
|
32301
|
+
const canvasHeight = Math.floor(bounds.height * traceTextureResolution);
|
|
32302
|
+
if (canvasWidth <= 0 || canvasHeight <= 0) return null;
|
|
32303
|
+
const canvas = document.createElement("canvas");
|
|
32304
|
+
canvas.width = canvasWidth;
|
|
32305
|
+
canvas.height = canvasHeight;
|
|
32306
|
+
const ctx = canvas.getContext("2d");
|
|
32307
|
+
if (!ctx) return null;
|
|
32308
|
+
if (layer === "bottom") {
|
|
32309
|
+
ctx.translate(0, canvasHeight);
|
|
32310
|
+
ctx.scale(1, -1);
|
|
32311
|
+
}
|
|
32312
|
+
drawSilkscreenLayer({
|
|
32313
|
+
ctx,
|
|
32314
|
+
layer,
|
|
32315
|
+
bounds,
|
|
32316
|
+
elements,
|
|
32317
|
+
silkscreenColor
|
|
32318
|
+
});
|
|
32957
32319
|
const texture = new THREE24.CanvasTexture(canvas);
|
|
32958
32320
|
texture.generateMipmaps = true;
|
|
32959
32321
|
texture.minFilter = THREE24.LinearMipmapLinearFilter;
|
|
@@ -32967,7 +32329,7 @@ function createCopperPourTextureForLayer({
|
|
|
32967
32329
|
import * as THREE25 from "three";
|
|
32968
32330
|
|
|
32969
32331
|
// src/textures/soldermask/soldermask-drawing.ts
|
|
32970
|
-
import { CircuitToCanvasDrawer as
|
|
32332
|
+
import { CircuitToCanvasDrawer as CircuitToCanvasDrawer4 } from "circuit-to-canvas";
|
|
32971
32333
|
var toRgb = (colorArr) => {
|
|
32972
32334
|
const [r = 0, g = 0, b = 0] = colorArr;
|
|
32973
32335
|
return `rgb(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(
|
|
@@ -32986,7 +32348,7 @@ var getSoldermaskPalette = (material) => {
|
|
|
32986
32348
|
transparent: "rgba(0,0,0,0)"
|
|
32987
32349
|
};
|
|
32988
32350
|
};
|
|
32989
|
-
var
|
|
32351
|
+
var setDrawerBounds3 = (drawer, bounds) => {
|
|
32990
32352
|
drawer.setCameraBounds({
|
|
32991
32353
|
minX: bounds.minX,
|
|
32992
32354
|
maxX: bounds.maxX,
|
|
@@ -33003,7 +32365,7 @@ var drawSoldermaskLayer = ({
|
|
|
33003
32365
|
}) => {
|
|
33004
32366
|
const palette = getSoldermaskPalette(boardMaterial);
|
|
33005
32367
|
const copperRenderLayer = layer === "top" ? "top_copper" : "bottom_copper";
|
|
33006
|
-
const drawer = new
|
|
32368
|
+
const drawer = new CircuitToCanvasDrawer4(ctx);
|
|
33007
32369
|
drawer.configure({
|
|
33008
32370
|
colorOverrides: {
|
|
33009
32371
|
copper: {
|
|
@@ -33034,7 +32396,7 @@ var drawSoldermaskLayer = ({
|
|
|
33034
32396
|
}
|
|
33035
32397
|
}
|
|
33036
32398
|
});
|
|
33037
|
-
|
|
32399
|
+
setDrawerBounds3(drawer, bounds);
|
|
33038
32400
|
drawer.drawElements(elements, {
|
|
33039
32401
|
layers: [copperRenderLayer],
|
|
33040
32402
|
drawSoldermask: true,
|
|
@@ -33047,7 +32409,7 @@ var drawSoldermaskLayer = ({
|
|
|
33047
32409
|
if (uncoveredPours.length > 0) {
|
|
33048
32410
|
ctx.save();
|
|
33049
32411
|
ctx.globalCompositeOperation = "destination-out";
|
|
33050
|
-
const cutoutDrawer = new
|
|
32412
|
+
const cutoutDrawer = new CircuitToCanvasDrawer4(ctx);
|
|
33051
32413
|
cutoutDrawer.configure({
|
|
33052
32414
|
colorOverrides: {
|
|
33053
32415
|
copper: {
|
|
@@ -33062,54 +32424,12 @@ var drawSoldermaskLayer = ({
|
|
|
33062
32424
|
}
|
|
33063
32425
|
}
|
|
33064
32426
|
});
|
|
33065
|
-
|
|
32427
|
+
setDrawerBounds3(cutoutDrawer, bounds);
|
|
33066
32428
|
cutoutDrawer.drawElements(uncoveredPours, { layers: [copperRenderLayer] });
|
|
33067
32429
|
ctx.restore();
|
|
33068
32430
|
}
|
|
33069
32431
|
};
|
|
33070
32432
|
|
|
33071
|
-
// src/textures/soldermask/soldermask-bounds.ts
|
|
33072
|
-
var boundsFromPanel = (panel) => ({
|
|
33073
|
-
minX: panel.center.x - panel.width / 2,
|
|
33074
|
-
maxX: panel.center.x + panel.width / 2,
|
|
33075
|
-
minY: panel.center.y - panel.height / 2,
|
|
33076
|
-
maxY: panel.center.y + panel.height / 2,
|
|
33077
|
-
width: panel.width,
|
|
33078
|
-
height: panel.height,
|
|
33079
|
-
centerX: panel.center.x,
|
|
33080
|
-
centerY: panel.center.y
|
|
33081
|
-
});
|
|
33082
|
-
var mergeBounds = (a, b) => {
|
|
33083
|
-
const minX = Math.min(a.minX, b.minX);
|
|
33084
|
-
const maxX = Math.max(a.maxX, b.maxX);
|
|
33085
|
-
const minY = Math.min(a.minY, b.minY);
|
|
33086
|
-
const maxY = Math.max(a.maxY, b.maxY);
|
|
33087
|
-
return {
|
|
33088
|
-
minX,
|
|
33089
|
-
maxX,
|
|
33090
|
-
minY,
|
|
33091
|
-
maxY,
|
|
33092
|
-
width: maxX - minX,
|
|
33093
|
-
height: maxY - minY,
|
|
33094
|
-
centerX: (minX + maxX) / 2,
|
|
33095
|
-
centerY: (minY + maxY) / 2
|
|
33096
|
-
};
|
|
33097
|
-
};
|
|
33098
|
-
var getSoldermaskRenderBounds = (circuitJson, boardData) => {
|
|
33099
|
-
const panels = circuitJson.filter(
|
|
33100
|
-
(e) => e.type === "pcb_panel"
|
|
33101
|
-
);
|
|
33102
|
-
const boards = circuitJson.filter(
|
|
33103
|
-
(e) => e.type === "pcb_board"
|
|
33104
|
-
);
|
|
33105
|
-
const activePanel = panels.find((panel) => panel.pcb_panel_id === boardData.pcb_board_id) ?? panels[0];
|
|
33106
|
-
if (activePanel && activePanel.width > 0 && activePanel.height > 0) {
|
|
33107
|
-
return boundsFromPanel(activePanel);
|
|
33108
|
-
}
|
|
33109
|
-
const boardsForBounds = boards.length > 1 ? boards : [boardData];
|
|
33110
|
-
return boardsForBounds.map((board) => calculateOutlineBounds(board)).reduce((acc, bounds) => mergeBounds(acc, bounds));
|
|
33111
|
-
};
|
|
33112
|
-
|
|
33113
32433
|
// src/textures/create-soldermask-texture-for-layer.ts
|
|
33114
32434
|
function createSoldermaskTextureForLayer({
|
|
33115
32435
|
layer,
|
|
@@ -33253,9 +32573,9 @@ function createCombinedBoardTextures({
|
|
|
33253
32573
|
textures: [
|
|
33254
32574
|
copperPourTexture,
|
|
33255
32575
|
traceTexture,
|
|
33256
|
-
copperTextTexture,
|
|
33257
32576
|
padTexture,
|
|
33258
32577
|
soldermaskTexture,
|
|
32578
|
+
copperTextTexture,
|
|
33259
32579
|
silkscreenTexture,
|
|
33260
32580
|
panelOutlineTexture
|
|
33261
32581
|
],
|
|
@@ -33385,7 +32705,7 @@ function JscadBoardTextures({
|
|
|
33385
32705
|
const panels = circuitJson.filter(
|
|
33386
32706
|
(e) => e.type === "pcb_panel"
|
|
33387
32707
|
);
|
|
33388
|
-
const boards =
|
|
32708
|
+
const boards = su8(circuitJson).pcb_board.list();
|
|
33389
32709
|
if (panels.length > 0) {
|
|
33390
32710
|
const panel = panels[0];
|
|
33391
32711
|
const firstBoardInPanel = boards.find(
|
|
@@ -33522,16 +32842,16 @@ function JscadBoardTextures({
|
|
|
33522
32842
|
}
|
|
33523
32843
|
|
|
33524
32844
|
// src/utils/preprocess-circuit-json.ts
|
|
33525
|
-
import { su as
|
|
32845
|
+
import { su as su10 } from "@tscircuit/circuit-json-util";
|
|
33526
32846
|
|
|
33527
32847
|
// src/utils/create-faux-board.ts
|
|
33528
|
-
import { su as
|
|
32848
|
+
import { su as su9, getBoundsOfPcbElements } from "@tscircuit/circuit-json-util";
|
|
33529
32849
|
function createFauxBoard(circuitJson) {
|
|
33530
|
-
const cadComponents =
|
|
33531
|
-
const pads =
|
|
33532
|
-
const holes =
|
|
33533
|
-
const platedHoles =
|
|
33534
|
-
const vias =
|
|
32850
|
+
const cadComponents = su9(circuitJson).cad_component.list();
|
|
32851
|
+
const pads = su9(circuitJson).pcb_smtpad.list();
|
|
32852
|
+
const holes = su9(circuitJson).pcb_hole.list();
|
|
32853
|
+
const platedHoles = su9(circuitJson).pcb_plated_hole.list();
|
|
32854
|
+
const vias = su9(circuitJson).pcb_via.list();
|
|
33535
32855
|
if (cadComponents.length === 0 && pads.length === 0 && holes.length === 0 && platedHoles.length === 0 && vias.length === 0) {
|
|
33536
32856
|
return null;
|
|
33537
32857
|
}
|
|
@@ -33580,7 +32900,7 @@ function createFauxBoard(circuitJson) {
|
|
|
33580
32900
|
|
|
33581
32901
|
// src/utils/preprocess-circuit-json.ts
|
|
33582
32902
|
function addFauxBoardIfNeeded(circuitJson) {
|
|
33583
|
-
const boards =
|
|
32903
|
+
const boards = su10(circuitJson).pcb_board.list();
|
|
33584
32904
|
if (boards.length > 0) {
|
|
33585
32905
|
return circuitJson;
|
|
33586
32906
|
}
|
|
@@ -33631,7 +32951,7 @@ var CadViewerJscad = forwardRef3(
|
|
|
33631
32951
|
const initialCameraPosition = useMemo20(() => {
|
|
33632
32952
|
if (!internalCircuitJson) return [5, -5, 5];
|
|
33633
32953
|
try {
|
|
33634
|
-
const board =
|
|
32954
|
+
const board = su11(internalCircuitJson).pcb_board.list()[0];
|
|
33635
32955
|
if (!board) return [5, -5, 5];
|
|
33636
32956
|
const { width: width10, height: height10 } = board;
|
|
33637
32957
|
if (!width10 && !height10) {
|
|
@@ -33657,7 +32977,7 @@ var CadViewerJscad = forwardRef3(
|
|
|
33657
32977
|
const isFauxBoard = useMemo20(() => {
|
|
33658
32978
|
if (!internalCircuitJson) return false;
|
|
33659
32979
|
try {
|
|
33660
|
-
const board =
|
|
32980
|
+
const board = su11(internalCircuitJson).pcb_board.list()[0];
|
|
33661
32981
|
return !!board && board.pcb_board_id === "faux-board";
|
|
33662
32982
|
} catch (e) {
|
|
33663
32983
|
return false;
|
|
@@ -33666,7 +32986,7 @@ var CadViewerJscad = forwardRef3(
|
|
|
33666
32986
|
const boardDimensions = useMemo20(() => {
|
|
33667
32987
|
if (!internalCircuitJson) return void 0;
|
|
33668
32988
|
try {
|
|
33669
|
-
const board =
|
|
32989
|
+
const board = su11(internalCircuitJson).pcb_board.list()[0];
|
|
33670
32990
|
if (!board) return void 0;
|
|
33671
32991
|
return { width: board.width ?? 0, height: board.height ?? 0 };
|
|
33672
32992
|
} catch (e) {
|
|
@@ -33677,7 +32997,7 @@ var CadViewerJscad = forwardRef3(
|
|
|
33677
32997
|
const boardCenter = useMemo20(() => {
|
|
33678
32998
|
if (!internalCircuitJson) return void 0;
|
|
33679
32999
|
try {
|
|
33680
|
-
const board =
|
|
33000
|
+
const board = su11(internalCircuitJson).pcb_board.list()[0];
|
|
33681
33001
|
if (!board || !board.center) return void 0;
|
|
33682
33002
|
return { x: board.center.x, y: board.center.y };
|
|
33683
33003
|
} catch (e) {
|
|
@@ -33687,7 +33007,7 @@ var CadViewerJscad = forwardRef3(
|
|
|
33687
33007
|
}, [internalCircuitJson]);
|
|
33688
33008
|
const pcbThickness = usePcbThickness(internalCircuitJson);
|
|
33689
33009
|
const { stls: boardStls, loading } = useStlsFromGeom(boardGeom);
|
|
33690
|
-
const cad_components =
|
|
33010
|
+
const cad_components = su11(internalCircuitJson).cad_component.list();
|
|
33691
33011
|
return /* @__PURE__ */ jsxs5(
|
|
33692
33012
|
CadViewerContainer,
|
|
33693
33013
|
{
|
|
@@ -33741,12 +33061,12 @@ var CadViewerJscad = forwardRef3(
|
|
|
33741
33061
|
);
|
|
33742
33062
|
|
|
33743
33063
|
// src/CadViewerManifold.tsx
|
|
33744
|
-
import { su as
|
|
33064
|
+
import { su as su17 } from "@tscircuit/circuit-json-util";
|
|
33745
33065
|
import { useEffect as useEffect25, useMemo as useMemo22, useState as useState16 } from "react";
|
|
33746
33066
|
import * as THREE35 from "three";
|
|
33747
33067
|
|
|
33748
33068
|
// src/hooks/useManifoldBoardBuilder.ts
|
|
33749
|
-
import { su as
|
|
33069
|
+
import { su as su16 } from "@tscircuit/circuit-json-util";
|
|
33750
33070
|
import { useEffect as useEffect24, useMemo as useMemo21, useRef as useRef9, useState as useState15 } from "react";
|
|
33751
33071
|
import * as THREE32 from "three";
|
|
33752
33072
|
|
|
@@ -33809,7 +33129,7 @@ function createManifoldBoard(Manifold, CrossSection, boardData, pcbThickness, ma
|
|
|
33809
33129
|
}
|
|
33810
33130
|
|
|
33811
33131
|
// src/utils/manifold/process-cutouts.ts
|
|
33812
|
-
import { su as
|
|
33132
|
+
import { su as su12 } from "@tscircuit/circuit-json-util";
|
|
33813
33133
|
|
|
33814
33134
|
// src/utils/pad-geoms.ts
|
|
33815
33135
|
var RECT_PAD_SEGMENTS2 = 64;
|
|
@@ -33868,7 +33188,7 @@ var arePointsClockwise3 = (points) => {
|
|
|
33868
33188
|
};
|
|
33869
33189
|
function processCutoutsForManifold(Manifold, CrossSection, circuitJson, pcbThickness, manifoldInstancesForCleanup) {
|
|
33870
33190
|
const cutoutOps = [];
|
|
33871
|
-
const pcbCutouts =
|
|
33191
|
+
const pcbCutouts = su12(circuitJson).pcb_cutout.list();
|
|
33872
33192
|
for (const cutout of pcbCutouts) {
|
|
33873
33193
|
let cutoutOp;
|
|
33874
33194
|
const cutoutHeight = pcbThickness * 1.5;
|
|
@@ -33963,7 +33283,7 @@ function processCutoutsForManifold(Manifold, CrossSection, circuitJson, pcbThick
|
|
|
33963
33283
|
}
|
|
33964
33284
|
|
|
33965
33285
|
// src/utils/manifold/process-non-plated-holes.ts
|
|
33966
|
-
import { su as
|
|
33286
|
+
import { su as su13 } from "@tscircuit/circuit-json-util";
|
|
33967
33287
|
|
|
33968
33288
|
// src/utils/hole-geoms.ts
|
|
33969
33289
|
function createCircleHoleDrill({
|
|
@@ -34006,7 +33326,7 @@ function createPlatedHoleDrill({
|
|
|
34006
33326
|
// src/utils/manifold/process-non-plated-holes.ts
|
|
34007
33327
|
function processNonPlatedHolesForManifold(Manifold, CrossSection, circuitJson, pcbThickness, manifoldInstancesForCleanup) {
|
|
34008
33328
|
const nonPlatedHoleBoardDrills = [];
|
|
34009
|
-
const pcbHoles =
|
|
33329
|
+
const pcbHoles = su13(circuitJson).pcb_hole.list();
|
|
34010
33330
|
const createPillOp = (width10, height10, depth) => {
|
|
34011
33331
|
const pillOp = createRoundedRectPrism({
|
|
34012
33332
|
Manifold,
|
|
@@ -34089,7 +33409,7 @@ function processNonPlatedHolesForManifold(Manifold, CrossSection, circuitJson, p
|
|
|
34089
33409
|
}
|
|
34090
33410
|
|
|
34091
33411
|
// src/utils/manifold/process-plated-holes.ts
|
|
34092
|
-
import { su as
|
|
33412
|
+
import { su as su14 } from "@tscircuit/circuit-json-util";
|
|
34093
33413
|
import * as THREE30 from "three";
|
|
34094
33414
|
|
|
34095
33415
|
// src/utils/manifold-mesh-to-three-geometry.ts
|
|
@@ -34141,7 +33461,7 @@ var PLATED_HOLE_SURFACE_CLEARANCE = 5e-4;
|
|
|
34141
33461
|
var PLATED_HOLE_FILL_CLEARANCE = 4e-3;
|
|
34142
33462
|
function processPlatedHolesForManifold(Manifold, CrossSection, circuitJson, pcbThickness, manifoldInstancesForCleanup, boardClipVolume) {
|
|
34143
33463
|
const platedHoleBoardDrills = [];
|
|
34144
|
-
const pcbPlatedHoles =
|
|
33464
|
+
const pcbPlatedHoles = su14(circuitJson).pcb_plated_hole.list();
|
|
34145
33465
|
const platedHoleCopperGeoms = [];
|
|
34146
33466
|
const platedHoleCopperOpsForSubtract = [];
|
|
34147
33467
|
const createPillOp = (width10, height10, depth) => {
|
|
@@ -34875,7 +34195,7 @@ function processPlatedHolesForManifold(Manifold, CrossSection, circuitJson, pcbT
|
|
|
34875
34195
|
}
|
|
34876
34196
|
|
|
34877
34197
|
// src/utils/manifold/process-vias.ts
|
|
34878
|
-
import { su as
|
|
34198
|
+
import { su as su15 } from "@tscircuit/circuit-json-util";
|
|
34879
34199
|
import * as THREE31 from "three";
|
|
34880
34200
|
|
|
34881
34201
|
// src/utils/via-geoms.ts
|
|
@@ -34932,7 +34252,7 @@ function createViaCopper2({
|
|
|
34932
34252
|
var COPPER_COLOR2 = new THREE31.Color(...colors.copper);
|
|
34933
34253
|
function processViasForManifold(Manifold, circuitJson, pcbThickness, manifoldInstancesForCleanup, boardClipVolume) {
|
|
34934
34254
|
const viaBoardDrills = [];
|
|
34935
|
-
const pcbVias =
|
|
34255
|
+
const pcbVias = su15(circuitJson).pcb_via.list();
|
|
34936
34256
|
const viaCopperGeoms = [];
|
|
34937
34257
|
pcbVias.forEach((via, index2) => {
|
|
34938
34258
|
if (typeof via.hole_diameter === "number") {
|
|
@@ -34991,7 +34311,7 @@ var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
|
|
|
34991
34311
|
const panels = circuitJson.filter(
|
|
34992
34312
|
(e) => e.type === "pcb_panel"
|
|
34993
34313
|
);
|
|
34994
|
-
const boards =
|
|
34314
|
+
const boards = su16(circuitJson).pcb_board.list();
|
|
34995
34315
|
if (panels.length > 0) {
|
|
34996
34316
|
const panel = panels[0];
|
|
34997
34317
|
const firstBoardInPanel = boards.find(
|
|
@@ -35012,7 +34332,7 @@ var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
|
|
|
35012
34332
|
return boardsNotInPanel.length > 0 ? boardsNotInPanel[0] : null;
|
|
35013
34333
|
}, [circuitJson]);
|
|
35014
34334
|
const isFauxBoard = useMemo21(() => {
|
|
35015
|
-
const boards =
|
|
34335
|
+
const boards = su16(circuitJson).pcb_board.list();
|
|
35016
34336
|
return boards.length > 0 && boards[0].pcb_board_id === "faux-board";
|
|
35017
34337
|
}, [circuitJson]);
|
|
35018
34338
|
const traceTextureResolution = useMemo21(() => {
|
|
@@ -35476,7 +34796,7 @@ try {
|
|
|
35476
34796
|
[textures, boardData, pcbThickness, isFauxBoard]
|
|
35477
34797
|
);
|
|
35478
34798
|
const cadComponents = useMemo22(
|
|
35479
|
-
() =>
|
|
34799
|
+
() => su17(circuitJson).cad_component.list(),
|
|
35480
34800
|
[circuitJson]
|
|
35481
34801
|
);
|
|
35482
34802
|
const boardDimensions = useMemo22(() => {
|
|
@@ -37931,21 +37251,21 @@ function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetPar
|
|
|
37931
37251
|
}
|
|
37932
37252
|
const clientRect = element.getBoundingClientRect();
|
|
37933
37253
|
const domElement = unwrapElement(element);
|
|
37934
|
-
let
|
|
37254
|
+
let scale2 = createCoords(1);
|
|
37935
37255
|
if (includeScale) {
|
|
37936
37256
|
if (offsetParent) {
|
|
37937
37257
|
if (isElement(offsetParent)) {
|
|
37938
|
-
|
|
37258
|
+
scale2 = getScale(offsetParent);
|
|
37939
37259
|
}
|
|
37940
37260
|
} else {
|
|
37941
|
-
|
|
37261
|
+
scale2 = getScale(element);
|
|
37942
37262
|
}
|
|
37943
37263
|
}
|
|
37944
37264
|
const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
|
|
37945
|
-
let x = (clientRect.left + visualOffsets.x) /
|
|
37946
|
-
let y = (clientRect.top + visualOffsets.y) /
|
|
37947
|
-
let width10 = clientRect.width /
|
|
37948
|
-
let height10 = clientRect.height /
|
|
37265
|
+
let x = (clientRect.left + visualOffsets.x) / scale2.x;
|
|
37266
|
+
let y = (clientRect.top + visualOffsets.y) / scale2.y;
|
|
37267
|
+
let width10 = clientRect.width / scale2.x;
|
|
37268
|
+
let height10 = clientRect.height / scale2.y;
|
|
37949
37269
|
if (domElement) {
|
|
37950
37270
|
const win = getWindow(domElement);
|
|
37951
37271
|
const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
|
|
@@ -38007,7 +37327,7 @@ function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
|
|
|
38007
37327
|
scrollLeft: 0,
|
|
38008
37328
|
scrollTop: 0
|
|
38009
37329
|
};
|
|
38010
|
-
let
|
|
37330
|
+
let scale2 = createCoords(1);
|
|
38011
37331
|
const offsets = createCoords(0);
|
|
38012
37332
|
const isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
38013
37333
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
@@ -38016,17 +37336,17 @@ function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
|
|
|
38016
37336
|
}
|
|
38017
37337
|
if (isHTMLElement(offsetParent)) {
|
|
38018
37338
|
const offsetRect = getBoundingClientRect(offsetParent);
|
|
38019
|
-
|
|
37339
|
+
scale2 = getScale(offsetParent);
|
|
38020
37340
|
offsets.x = offsetRect.x + offsetParent.clientLeft;
|
|
38021
37341
|
offsets.y = offsetRect.y + offsetParent.clientTop;
|
|
38022
37342
|
}
|
|
38023
37343
|
}
|
|
38024
37344
|
const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
|
|
38025
37345
|
return {
|
|
38026
|
-
width: rect.width *
|
|
38027
|
-
height: rect.height *
|
|
38028
|
-
x: rect.x *
|
|
38029
|
-
y: rect.y *
|
|
37346
|
+
width: rect.width * scale2.x,
|
|
37347
|
+
height: rect.height * scale2.y,
|
|
37348
|
+
x: rect.x * scale2.x - scroll.scrollLeft * scale2.x + offsets.x + htmlOffset.x,
|
|
37349
|
+
y: rect.y * scale2.y - scroll.scrollTop * scale2.y + offsets.y + htmlOffset.y
|
|
38030
37350
|
};
|
|
38031
37351
|
}
|
|
38032
37352
|
function getClientRects(element) {
|
|
@@ -38093,11 +37413,11 @@ function getInnerBoundingClientRect(element, strategy) {
|
|
|
38093
37413
|
const clientRect = getBoundingClientRect(element, true, strategy === "fixed");
|
|
38094
37414
|
const top = clientRect.top + element.clientTop;
|
|
38095
37415
|
const left = clientRect.left + element.clientLeft;
|
|
38096
|
-
const
|
|
38097
|
-
const width10 = element.clientWidth *
|
|
38098
|
-
const height10 = element.clientHeight *
|
|
38099
|
-
const x = left *
|
|
38100
|
-
const y = top *
|
|
37416
|
+
const scale2 = isHTMLElement(element) ? getScale(element) : createCoords(1);
|
|
37417
|
+
const width10 = element.clientWidth * scale2.x;
|
|
37418
|
+
const height10 = element.clientHeight * scale2.y;
|
|
37419
|
+
const x = left * scale2.x;
|
|
37420
|
+
const y = top * scale2.y;
|
|
38101
37421
|
return {
|
|
38102
37422
|
width: width10,
|
|
38103
37423
|
height: height10,
|
|
@@ -38553,7 +37873,7 @@ function useFloating(options) {
|
|
|
38553
37873
|
reference: externalReference,
|
|
38554
37874
|
floating: externalFloating
|
|
38555
37875
|
} = {},
|
|
38556
|
-
transform
|
|
37876
|
+
transform = true,
|
|
38557
37877
|
whileElementsMounted,
|
|
38558
37878
|
open
|
|
38559
37879
|
} = options;
|
|
@@ -38668,7 +37988,7 @@ function useFloating(options) {
|
|
|
38668
37988
|
}
|
|
38669
37989
|
const x = roundByDPR(elements.floating, data.x);
|
|
38670
37990
|
const y = roundByDPR(elements.floating, data.y);
|
|
38671
|
-
if (
|
|
37991
|
+
if (transform) {
|
|
38672
37992
|
return {
|
|
38673
37993
|
...initialStyles,
|
|
38674
37994
|
transform: "translate(" + x + "px, " + y + "px)",
|
|
@@ -38682,7 +38002,7 @@ function useFloating(options) {
|
|
|
38682
38002
|
left: x,
|
|
38683
38003
|
top: y
|
|
38684
38004
|
};
|
|
38685
|
-
}, [strategy,
|
|
38005
|
+
}, [strategy, transform, elements.floating, data.x, data.y]);
|
|
38686
38006
|
return React28.useMemo(() => ({
|
|
38687
38007
|
...data,
|
|
38688
38008
|
update,
|
|
@@ -42490,7 +41810,7 @@ var CadViewer = (props) => {
|
|
|
42490
41810
|
|
|
42491
41811
|
// src/convert-circuit-json-to-3d-svg.ts
|
|
42492
41812
|
var import_debug = __toESM(require_browser(), 1);
|
|
42493
|
-
import { su as
|
|
41813
|
+
import { su as su18 } from "@tscircuit/circuit-json-util";
|
|
42494
41814
|
import * as THREE40 from "three";
|
|
42495
41815
|
import { SVGRenderer } from "three/examples/jsm/renderers/SVGRenderer.js";
|
|
42496
41816
|
|
|
@@ -42719,11 +42039,11 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
|
|
|
42719
42039
|
const pointLight = new THREE40.PointLight(16777215, Math.PI / 4);
|
|
42720
42040
|
pointLight.position.set(-10, -10, 10);
|
|
42721
42041
|
scene.add(pointLight);
|
|
42722
|
-
const components =
|
|
42042
|
+
const components = su18(circuitJson).cad_component.list();
|
|
42723
42043
|
for (const component of components) {
|
|
42724
42044
|
await renderComponent(component, scene);
|
|
42725
42045
|
}
|
|
42726
|
-
const boardData =
|
|
42046
|
+
const boardData = su18(circuitJson).pcb_board.list()[0];
|
|
42727
42047
|
const boardGeom = createBoardGeomFromCircuitJson(circuitJson);
|
|
42728
42048
|
if (boardGeom) {
|
|
42729
42049
|
const solderMaskColor = colors.fr4SolderMaskGreen;
|
|
@@ -42764,8 +42084,8 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
|
|
|
42764
42084
|
scene.position.sub(center);
|
|
42765
42085
|
const maxDim = Math.max(size4.x, size4.y, size4.z);
|
|
42766
42086
|
if (maxDim > 0) {
|
|
42767
|
-
const
|
|
42768
|
-
scene.scale.multiplyScalar(
|
|
42087
|
+
const scale2 = (1 - padding / 100) / maxDim;
|
|
42088
|
+
scene.scale.multiplyScalar(scale2 * 100);
|
|
42769
42089
|
}
|
|
42770
42090
|
camera.updateProjectionMatrix();
|
|
42771
42091
|
renderer.render(scene, camera);
|