@tscircuit/pcb-viewer 1.11.374 → 1.11.375
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 +170 -123
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
package/dist/index.js
CHANGED
|
@@ -6343,16 +6343,31 @@ var getBoundsOfPcbElements = (elements) => {
|
|
|
6343
6343
|
centerX = elm.center.x;
|
|
6344
6344
|
centerY = elm.center.y;
|
|
6345
6345
|
}
|
|
6346
|
+
const rotation = typeof elm.rotation === "number" ? elm.rotation : 0;
|
|
6346
6347
|
if (centerX !== void 0 && centerY !== void 0) {
|
|
6347
6348
|
minX = Math.min(minX, centerX);
|
|
6348
6349
|
minY = Math.min(minY, centerY);
|
|
6349
6350
|
maxX = Math.max(maxX, centerX);
|
|
6350
6351
|
maxY = Math.max(maxY, centerY);
|
|
6351
6352
|
if (width !== void 0 && height !== void 0) {
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
6355
|
-
|
|
6353
|
+
if (rotation) {
|
|
6354
|
+
const rotatedBounds = getRotatedRectBounds(
|
|
6355
|
+
centerX,
|
|
6356
|
+
centerY,
|
|
6357
|
+
width,
|
|
6358
|
+
height,
|
|
6359
|
+
rotation
|
|
6360
|
+
);
|
|
6361
|
+
minX = Math.min(minX, rotatedBounds.minX);
|
|
6362
|
+
minY = Math.min(minY, rotatedBounds.minY);
|
|
6363
|
+
maxX = Math.max(maxX, rotatedBounds.maxX);
|
|
6364
|
+
maxY = Math.max(maxY, rotatedBounds.maxY);
|
|
6365
|
+
} else {
|
|
6366
|
+
minX = Math.min(minX, centerX - width / 2);
|
|
6367
|
+
minY = Math.min(minY, centerY - height / 2);
|
|
6368
|
+
maxX = Math.max(maxX, centerX + width / 2);
|
|
6369
|
+
maxY = Math.max(maxY, centerY + height / 2);
|
|
6370
|
+
}
|
|
6356
6371
|
}
|
|
6357
6372
|
if ("radius" in elm) {
|
|
6358
6373
|
minX = Math.min(minX, centerX - elm.radius);
|
|
@@ -6534,6 +6549,16 @@ var getDebugLayoutObject = (lo) => {
|
|
|
6534
6549
|
if ("outer_diameter" in lo) {
|
|
6535
6550
|
width = lo.outer_diameter;
|
|
6536
6551
|
height = lo.outer_diameter;
|
|
6552
|
+
} else if ("rect_pad_width" in lo && "rect_pad_height" in lo) {
|
|
6553
|
+
width = lo.rect_pad_width;
|
|
6554
|
+
height = lo.rect_pad_height;
|
|
6555
|
+
if ("hole_diameter" in lo) {
|
|
6556
|
+
width = Math.max(width, lo.hole_diameter);
|
|
6557
|
+
height = Math.max(height, lo.hole_diameter);
|
|
6558
|
+
}
|
|
6559
|
+
} else if ("hole_diameter" in lo) {
|
|
6560
|
+
width = lo.hole_diameter;
|
|
6561
|
+
height = lo.hole_diameter;
|
|
6537
6562
|
}
|
|
6538
6563
|
}
|
|
6539
6564
|
if (width === void 0 || height === void 0) {
|
|
@@ -8142,11 +8167,27 @@ var convertElementToPrimitives = (element, allElements) => {
|
|
|
8142
8167
|
case "pcb_trace": {
|
|
8143
8168
|
const primitives = [];
|
|
8144
8169
|
if (element.route_thickness_mode === "interpolated") {
|
|
8145
|
-
const strokeInput = element.route.
|
|
8146
|
-
|
|
8147
|
-
|
|
8148
|
-
|
|
8149
|
-
|
|
8170
|
+
const strokeInput = element.route.flatMap((routePoint) => {
|
|
8171
|
+
if (routePoint.route_type === "through_pad") {
|
|
8172
|
+
return [
|
|
8173
|
+
{
|
|
8174
|
+
...routePoint.start,
|
|
8175
|
+
trace_width: routePoint.width
|
|
8176
|
+
},
|
|
8177
|
+
{
|
|
8178
|
+
...routePoint.end,
|
|
8179
|
+
trace_width: routePoint.width
|
|
8180
|
+
}
|
|
8181
|
+
];
|
|
8182
|
+
}
|
|
8183
|
+
return [
|
|
8184
|
+
{
|
|
8185
|
+
x: routePoint.x,
|
|
8186
|
+
y: routePoint.y,
|
|
8187
|
+
trace_width: routePoint.route_type === "wire" ? routePoint.width : 0.5
|
|
8188
|
+
}
|
|
8189
|
+
];
|
|
8190
|
+
});
|
|
8150
8191
|
const expandedStroke = getExpandedStroke(strokeInput, 0.5);
|
|
8151
8192
|
const layer = element.route[0].layer;
|
|
8152
8193
|
primitives.push({
|
|
@@ -8840,8 +8881,10 @@ var zIndexMap = {
|
|
|
8840
8881
|
ratsNestOverlay: 30,
|
|
8841
8882
|
toolbarOverlay: 70,
|
|
8842
8883
|
warnings: 30,
|
|
8843
|
-
|
|
8844
|
-
//
|
|
8884
|
+
// Canvas layers are assigned z-indexes below this value. A 10-layer board
|
|
8885
|
+
// needs 26 canvas planes once masks, silkscreen, notes, and other overlays
|
|
8886
|
+
// are included, so keep enough room for the complete stack.
|
|
8887
|
+
topLayer: 30,
|
|
8845
8888
|
clickToInteractOverlay: 100
|
|
8846
8889
|
};
|
|
8847
8890
|
|
|
@@ -8885,12 +8928,6 @@ var LAYER_NAME_TO_COLOR = {
|
|
|
8885
8928
|
};
|
|
8886
8929
|
var DEFAULT_DRAW_ORDER = [
|
|
8887
8930
|
"board",
|
|
8888
|
-
"inner6",
|
|
8889
|
-
"inner5",
|
|
8890
|
-
"inner4",
|
|
8891
|
-
"inner3",
|
|
8892
|
-
"inner2",
|
|
8893
|
-
"inner1",
|
|
8894
8931
|
"bottom",
|
|
8895
8932
|
"soldermask_bottom",
|
|
8896
8933
|
"bottom_silkscreen",
|
|
@@ -9192,6 +9229,14 @@ var Drawer = class {
|
|
|
9192
9229
|
*/
|
|
9193
9230
|
orderAndFadeLayers() {
|
|
9194
9231
|
const { canvasLayerMap, foregroundLayer } = this;
|
|
9232
|
+
const innerLayers = Object.keys(canvasLayerMap).filter((layer) => /^inner\d+$/.test(layer)).sort(
|
|
9233
|
+
(a, b) => Number(b.slice("inner".length)) - Number(a.slice("inner".length))
|
|
9234
|
+
);
|
|
9235
|
+
const defaultDrawOrder = [
|
|
9236
|
+
"board",
|
|
9237
|
+
...innerLayers,
|
|
9238
|
+
...DEFAULT_DRAW_ORDER.filter((layer) => layer !== "board")
|
|
9239
|
+
];
|
|
9195
9240
|
const associatedSoldermask = foregroundLayer === "top" ? "soldermask_top" : foregroundLayer === "bottom" ? "soldermask_bottom" : void 0;
|
|
9196
9241
|
const associatedSilkscreen = foregroundLayer === "top" ? "top_silkscreen" : foregroundLayer === "bottom" ? "bottom_silkscreen" : void 0;
|
|
9197
9242
|
const associatedNotes = foregroundLayer === "top" ? "top_notes" : foregroundLayer === "bottom" ? "bottom_notes" : void 0;
|
|
@@ -9219,7 +9264,7 @@ var Drawer = class {
|
|
|
9219
9264
|
...associatedCourtyard ? [associatedCourtyard] : []
|
|
9220
9265
|
];
|
|
9221
9266
|
const order = [
|
|
9222
|
-
...
|
|
9267
|
+
...defaultDrawOrder.filter((l) => !layersToShiftToTop.includes(l)),
|
|
9223
9268
|
...foregroundLayer === "drill" ? [] : [foregroundLayer],
|
|
9224
9269
|
...associatedSoldermask ? [associatedSoldermask] : [],
|
|
9225
9270
|
"edge_cuts",
|
|
@@ -9553,6 +9598,55 @@ import {
|
|
|
9553
9598
|
DEFAULT_PCB_COLOR_MAP as DEFAULT_PCB_COLOR_MAP3
|
|
9554
9599
|
} from "circuit-to-canvas";
|
|
9555
9600
|
import color from "color";
|
|
9601
|
+
|
|
9602
|
+
// src/lib/copper-layers.ts
|
|
9603
|
+
var getCopperLayerRefs = (numLayers = 2) => {
|
|
9604
|
+
const layerCount = Math.max(2, Math.min(10, Math.floor(numLayers)));
|
|
9605
|
+
return [
|
|
9606
|
+
"top",
|
|
9607
|
+
...Array.from(
|
|
9608
|
+
{ length: layerCount - 2 },
|
|
9609
|
+
(_, index) => `inner${index + 1}`
|
|
9610
|
+
),
|
|
9611
|
+
"bottom"
|
|
9612
|
+
];
|
|
9613
|
+
};
|
|
9614
|
+
var getCopperLayerRefsFromElements = (elements) => {
|
|
9615
|
+
const board = elements.find((element) => element.type === "pcb_board");
|
|
9616
|
+
return getCopperLayerRefs(board?.num_layers ?? 2);
|
|
9617
|
+
};
|
|
9618
|
+
var getCopperRenderLayer = (layer) => `${layer}_copper`;
|
|
9619
|
+
var normalizeCopperRenderLayers = (layers) => layers.map(
|
|
9620
|
+
(layer) => layer.endsWith("_copper") ? layer.slice(0, -"_copper".length) : layer
|
|
9621
|
+
);
|
|
9622
|
+
var getOrderedCanvasLayers = (elements) => {
|
|
9623
|
+
const innerLayers = getCopperLayerRefsFromElements(elements).filter(
|
|
9624
|
+
(layer) => layer.startsWith("inner")
|
|
9625
|
+
);
|
|
9626
|
+
return [
|
|
9627
|
+
"board",
|
|
9628
|
+
"bottom",
|
|
9629
|
+
"soldermask_bottom",
|
|
9630
|
+
"bottom_silkscreen",
|
|
9631
|
+
"top",
|
|
9632
|
+
"soldermask_top",
|
|
9633
|
+
"soldermask_with_copper_bottom",
|
|
9634
|
+
"soldermask_with_copper_top",
|
|
9635
|
+
"top_fabrication",
|
|
9636
|
+
"bottom_fabrication",
|
|
9637
|
+
...innerLayers,
|
|
9638
|
+
"drill",
|
|
9639
|
+
"edge_cuts",
|
|
9640
|
+
"bottom_notes",
|
|
9641
|
+
"top_notes",
|
|
9642
|
+
"top_silkscreen",
|
|
9643
|
+
"top_courtyard",
|
|
9644
|
+
"bottom_courtyard",
|
|
9645
|
+
"other"
|
|
9646
|
+
];
|
|
9647
|
+
};
|
|
9648
|
+
|
|
9649
|
+
// src/lib/draw-pcb-smtpad.ts
|
|
9556
9650
|
var HOVER_COLOR_MAP = {
|
|
9557
9651
|
...DEFAULT_PCB_COLOR_MAP3,
|
|
9558
9652
|
copper: {
|
|
@@ -9564,7 +9658,9 @@ var HOVER_COLOR_MAP = {
|
|
|
9564
9658
|
inner3: color(colors_default.board.copper.in3).lighten(0.5).toString(),
|
|
9565
9659
|
inner4: color(colors_default.board.copper.in4).lighten(0.5).toString(),
|
|
9566
9660
|
inner5: color(colors_default.board.copper.in5).lighten(0.5).toString(),
|
|
9567
|
-
inner6: color(colors_default.board.copper.in6).lighten(0.5).toString()
|
|
9661
|
+
inner6: color(colors_default.board.copper.in6).lighten(0.5).toString(),
|
|
9662
|
+
inner7: color(colors_default.board.copper.in7).lighten(0.5).toString(),
|
|
9663
|
+
inner8: color(colors_default.board.copper.in8).lighten(0.5).toString()
|
|
9568
9664
|
}
|
|
9569
9665
|
};
|
|
9570
9666
|
function isPcbSmtPad(element) {
|
|
@@ -9578,20 +9674,8 @@ function drawPcbSmtPadElementsForLayer({
|
|
|
9578
9674
|
primitives,
|
|
9579
9675
|
drawSoldermask
|
|
9580
9676
|
}) {
|
|
9581
|
-
const
|
|
9582
|
-
|
|
9583
|
-
return layers.some((layer) => {
|
|
9584
|
-
if (layer === "top_copper" && elementLayer === "top") return true;
|
|
9585
|
-
if (layer === "bottom_copper" && elementLayer === "bottom") return true;
|
|
9586
|
-
if (layer === "inner1_copper" && elementLayer === "inner1") return true;
|
|
9587
|
-
if (layer === "inner2_copper" && elementLayer === "inner2") return true;
|
|
9588
|
-
if (layer === "inner3_copper" && elementLayer === "inner3") return true;
|
|
9589
|
-
if (layer === "inner4_copper" && elementLayer === "inner4") return true;
|
|
9590
|
-
if (layer === "inner5_copper" && elementLayer === "inner5") return true;
|
|
9591
|
-
if (layer === "inner6_copper" && elementLayer === "inner6") return true;
|
|
9592
|
-
return false;
|
|
9593
|
-
});
|
|
9594
|
-
});
|
|
9677
|
+
const targetLayers = new Set(normalizeCopperRenderLayers(layers));
|
|
9678
|
+
const smtPadElements = elements.filter(isPcbSmtPad).filter((element) => targetLayers.has(element.layer));
|
|
9595
9679
|
if (smtPadElements.length === 0) return;
|
|
9596
9680
|
const highlightedElementIds = /* @__PURE__ */ new Set();
|
|
9597
9681
|
if (primitives) {
|
|
@@ -9640,15 +9724,14 @@ var HOVER_COLOR_MAP2 = {
|
|
|
9640
9724
|
inner3: color2(colors_default.board.copper.in3).lighten(0.5).toString(),
|
|
9641
9725
|
inner4: color2(colors_default.board.copper.in4).lighten(0.5).toString(),
|
|
9642
9726
|
inner5: color2(colors_default.board.copper.in5).lighten(0.5).toString(),
|
|
9643
|
-
inner6: color2(colors_default.board.copper.in6).lighten(0.5).toString()
|
|
9727
|
+
inner6: color2(colors_default.board.copper.in6).lighten(0.5).toString(),
|
|
9728
|
+
inner7: color2(colors_default.board.copper.in7).lighten(0.5).toString(),
|
|
9729
|
+
inner8: color2(colors_default.board.copper.in8).lighten(0.5).toString()
|
|
9644
9730
|
}
|
|
9645
9731
|
};
|
|
9646
9732
|
function isPcbTrace(element) {
|
|
9647
9733
|
return element.type === "pcb_trace";
|
|
9648
9734
|
}
|
|
9649
|
-
var normalizeCopperLayers = (layers) => layers.map(
|
|
9650
|
-
(layer) => layer.endsWith("_copper") ? layer.replace("_copper", "") : layer
|
|
9651
|
-
);
|
|
9652
9735
|
var filterTraceByLayers = (trace, targetLayers) => {
|
|
9653
9736
|
const filteredRoute = trace.route.filter((segment) => {
|
|
9654
9737
|
if (segment.route_type === "wire" && "layer" in segment && targetLayers.has(segment.layer)) {
|
|
@@ -9675,7 +9758,7 @@ function drawPcbTraceElementsForLayer({
|
|
|
9675
9758
|
realToCanvasMat,
|
|
9676
9759
|
primitives
|
|
9677
9760
|
}) {
|
|
9678
|
-
const targetLayers = new Set(
|
|
9761
|
+
const targetLayers = new Set(normalizeCopperRenderLayers(layers));
|
|
9679
9762
|
const traceElements = elements.filter(isPcbTrace).map((trace) => filterTraceByLayers(trace, targetLayers)).filter((trace) => trace !== null);
|
|
9680
9763
|
if (traceElements.length === 0) return;
|
|
9681
9764
|
const highlightedElementIds = /* @__PURE__ */ new Set();
|
|
@@ -9719,7 +9802,15 @@ var HOVER_COLOR_MAP3 = {
|
|
|
9719
9802
|
copper: {
|
|
9720
9803
|
...DEFAULT_PCB_COLOR_MAP5.copper,
|
|
9721
9804
|
top: color3(colors_default.board.pad_front).lighten(0.5).toString(),
|
|
9722
|
-
bottom: color3(colors_default.board.pad_back).lighten(0.5).toString()
|
|
9805
|
+
bottom: color3(colors_default.board.pad_back).lighten(0.5).toString(),
|
|
9806
|
+
inner1: color3(colors_default.board.copper.in1).lighten(0.5).toString(),
|
|
9807
|
+
inner2: color3(colors_default.board.copper.in2).lighten(0.5).toString(),
|
|
9808
|
+
inner3: color3(colors_default.board.copper.in3).lighten(0.5).toString(),
|
|
9809
|
+
inner4: color3(colors_default.board.copper.in4).lighten(0.5).toString(),
|
|
9810
|
+
inner5: color3(colors_default.board.copper.in5).lighten(0.5).toString(),
|
|
9811
|
+
inner6: color3(colors_default.board.copper.in6).lighten(0.5).toString(),
|
|
9812
|
+
inner7: color3(colors_default.board.copper.in7).lighten(0.5).toString(),
|
|
9813
|
+
inner8: color3(colors_default.board.copper.in8).lighten(0.5).toString()
|
|
9723
9814
|
}
|
|
9724
9815
|
};
|
|
9725
9816
|
function isPlatedHole(element) {
|
|
@@ -10175,7 +10266,9 @@ var HOVER_SOLDERMASK_COLOR_MAP = {
|
|
|
10175
10266
|
inner3: color5(colors_default.board.copper.in3).lighten(0.5).toString(),
|
|
10176
10267
|
inner4: color5(colors_default.board.copper.in4).lighten(0.5).toString(),
|
|
10177
10268
|
inner5: color5(colors_default.board.copper.in5).lighten(0.5).toString(),
|
|
10178
|
-
inner6: color5(colors_default.board.copper.in6).lighten(0.5).toString()
|
|
10269
|
+
inner6: color5(colors_default.board.copper.in6).lighten(0.5).toString(),
|
|
10270
|
+
inner7: color5(colors_default.board.copper.in7).lighten(0.5).toString(),
|
|
10271
|
+
inner8: color5(colors_default.board.copper.in8).lighten(0.5).toString()
|
|
10179
10272
|
},
|
|
10180
10273
|
soldermask: {
|
|
10181
10274
|
...DEFAULT_PCB_COLOR_MAP6.soldermask,
|
|
@@ -10297,7 +10390,15 @@ var HOVER_COLOR_MAP4 = {
|
|
|
10297
10390
|
copper: {
|
|
10298
10391
|
...DEFAULT_PCB_COLOR_MAP8.copper,
|
|
10299
10392
|
top: color6(colors_default.board.pad_front).lighten(0.5).toString(),
|
|
10300
|
-
bottom: color6(colors_default.board.pad_back).lighten(0.5).toString()
|
|
10393
|
+
bottom: color6(colors_default.board.pad_back).lighten(0.5).toString(),
|
|
10394
|
+
inner1: color6(colors_default.board.copper.in1).lighten(0.5).toString(),
|
|
10395
|
+
inner2: color6(colors_default.board.copper.in2).lighten(0.5).toString(),
|
|
10396
|
+
inner3: color6(colors_default.board.copper.in3).lighten(0.5).toString(),
|
|
10397
|
+
inner4: color6(colors_default.board.copper.in4).lighten(0.5).toString(),
|
|
10398
|
+
inner5: color6(colors_default.board.copper.in5).lighten(0.5).toString(),
|
|
10399
|
+
inner6: color6(colors_default.board.copper.in6).lighten(0.5).toString(),
|
|
10400
|
+
inner7: color6(colors_default.board.copper.in7).lighten(0.5).toString(),
|
|
10401
|
+
inner8: color6(colors_default.board.copper.in8).lighten(0.5).toString()
|
|
10301
10402
|
}
|
|
10302
10403
|
};
|
|
10303
10404
|
function isPcbVia(element) {
|
|
@@ -10379,32 +10480,6 @@ function drawCourtyardElementsForLayer({
|
|
|
10379
10480
|
import { useEffect as useEffect5, useRef as useRef3 } from "react";
|
|
10380
10481
|
import { SuperGrid, toMMSI } from "react-supergrid";
|
|
10381
10482
|
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
10382
|
-
var orderedLayers = [
|
|
10383
|
-
"board",
|
|
10384
|
-
"bottom",
|
|
10385
|
-
"soldermask_bottom",
|
|
10386
|
-
"bottom_silkscreen",
|
|
10387
|
-
"top",
|
|
10388
|
-
"soldermask_top",
|
|
10389
|
-
"soldermask_with_copper_bottom",
|
|
10390
|
-
"soldermask_with_copper_top",
|
|
10391
|
-
"top_fabrication",
|
|
10392
|
-
"bottom_fabrication",
|
|
10393
|
-
"inner1",
|
|
10394
|
-
"inner2",
|
|
10395
|
-
"inner3",
|
|
10396
|
-
"inner4",
|
|
10397
|
-
"inner5",
|
|
10398
|
-
"inner6",
|
|
10399
|
-
"drill",
|
|
10400
|
-
"edge_cuts",
|
|
10401
|
-
"bottom_notes",
|
|
10402
|
-
"top_notes",
|
|
10403
|
-
"top_silkscreen",
|
|
10404
|
-
"top_courtyard",
|
|
10405
|
-
"bottom_courtyard",
|
|
10406
|
-
"other"
|
|
10407
|
-
];
|
|
10408
10483
|
var CanvasPrimitiveRenderer = ({
|
|
10409
10484
|
primitives,
|
|
10410
10485
|
elements,
|
|
@@ -10442,22 +10517,11 @@ var CanvasPrimitiveRenderer = ({
|
|
|
10442
10517
|
if (transform) {
|
|
10443
10518
|
const topCanvas = canvasRefs.current.top;
|
|
10444
10519
|
const bottomCanvas = canvasRefs.current.bottom;
|
|
10445
|
-
const
|
|
10446
|
-
|
|
10447
|
-
|
|
10448
|
-
|
|
10449
|
-
|
|
10450
|
-
const inner6Canvas = canvasRefs.current.inner6;
|
|
10451
|
-
const copperLayers = [
|
|
10452
|
-
{ canvas: topCanvas, copperLayer: "top_copper" },
|
|
10453
|
-
{ canvas: bottomCanvas, copperLayer: "bottom_copper" },
|
|
10454
|
-
{ canvas: inner1Canvas, copperLayer: "inner1_copper" },
|
|
10455
|
-
{ canvas: inner2Canvas, copperLayer: "inner2_copper" },
|
|
10456
|
-
{ canvas: inner3Canvas, copperLayer: "inner3_copper" },
|
|
10457
|
-
{ canvas: inner4Canvas, copperLayer: "inner4_copper" },
|
|
10458
|
-
{ canvas: inner5Canvas, copperLayer: "inner5_copper" },
|
|
10459
|
-
{ canvas: inner6Canvas, copperLayer: "inner6_copper" }
|
|
10460
|
-
];
|
|
10520
|
+
const copperLayers = getCopperLayerRefsFromElements(elements).map((layer) => ({
|
|
10521
|
+
canvas: canvasRefs.current[layer],
|
|
10522
|
+
layer,
|
|
10523
|
+
copperLayer: getCopperRenderLayer(layer)
|
|
10524
|
+
}));
|
|
10461
10525
|
for (const { canvas, copperLayer } of copperLayers) {
|
|
10462
10526
|
if (!canvas) continue;
|
|
10463
10527
|
drawPcbTraceElementsForLayer({
|
|
@@ -10477,24 +10541,15 @@ var CanvasPrimitiveRenderer = ({
|
|
|
10477
10541
|
realToCanvasMat: transform
|
|
10478
10542
|
});
|
|
10479
10543
|
}
|
|
10480
|
-
|
|
10481
|
-
|
|
10482
|
-
canvas: topCanvas,
|
|
10483
|
-
elements,
|
|
10484
|
-
layers: ["top_copper"],
|
|
10485
|
-
realToCanvasMat: transform,
|
|
10486
|
-
primitives,
|
|
10487
|
-
drawSoldermask: isShowingSolderMask
|
|
10488
|
-
});
|
|
10489
|
-
}
|
|
10490
|
-
if (bottomCanvas) {
|
|
10544
|
+
for (const { canvas, copperLayer, layer } of copperLayers) {
|
|
10545
|
+
if (!canvas) continue;
|
|
10491
10546
|
drawPlatedHolePads({
|
|
10492
|
-
canvas
|
|
10547
|
+
canvas,
|
|
10493
10548
|
elements,
|
|
10494
|
-
layers: [
|
|
10549
|
+
layers: [copperLayer],
|
|
10495
10550
|
realToCanvasMat: transform,
|
|
10496
10551
|
primitives,
|
|
10497
|
-
drawSoldermask: isShowingSolderMask
|
|
10552
|
+
drawSoldermask: isShowingSolderMask && (layer === "top" || layer === "bottom")
|
|
10498
10553
|
});
|
|
10499
10554
|
}
|
|
10500
10555
|
for (const { canvas, copperLayer } of copperLayers) {
|
|
@@ -10517,24 +10572,15 @@ var CanvasPrimitiveRenderer = ({
|
|
|
10517
10572
|
drawSoldermask: isShowingSolderMask
|
|
10518
10573
|
});
|
|
10519
10574
|
}
|
|
10520
|
-
|
|
10521
|
-
|
|
10522
|
-
canvas: topCanvas,
|
|
10523
|
-
elements,
|
|
10524
|
-
layers: ["top_copper"],
|
|
10525
|
-
realToCanvasMat: transform,
|
|
10526
|
-
primitives,
|
|
10527
|
-
drawSoldermask: isShowingSolderMask
|
|
10528
|
-
});
|
|
10529
|
-
}
|
|
10530
|
-
if (bottomCanvas) {
|
|
10575
|
+
for (const { canvas, copperLayer, layer } of copperLayers) {
|
|
10576
|
+
if (!canvas) continue;
|
|
10531
10577
|
drawPcbViaElementsForLayer({
|
|
10532
|
-
canvas
|
|
10578
|
+
canvas,
|
|
10533
10579
|
elements,
|
|
10534
|
-
layers: [
|
|
10580
|
+
layers: [copperLayer],
|
|
10535
10581
|
realToCanvasMat: transform,
|
|
10536
10582
|
primitives,
|
|
10537
|
-
drawSoldermask: isShowingSolderMask
|
|
10583
|
+
drawSoldermask: isShowingSolderMask && (layer === "top" || layer === "bottom")
|
|
10538
10584
|
});
|
|
10539
10585
|
}
|
|
10540
10586
|
if (isShowingSolderMask) {
|
|
@@ -10727,7 +10773,7 @@ var CanvasPrimitiveRenderer = ({
|
|
|
10727
10773
|
stringifyCoord: (x, y, z) => `${toMMSI(x, z)}, ${toMMSI(y, z)}`
|
|
10728
10774
|
}
|
|
10729
10775
|
),
|
|
10730
|
-
|
|
10776
|
+
getOrderedCanvasLayers(elements).filter((layer) => {
|
|
10731
10777
|
if (!isShowingSolderMask && layer.includes("soldermask")) return false;
|
|
10732
10778
|
if (!isShowingSilkscreen && layer.includes("silkscreen")) return false;
|
|
10733
10779
|
return true;
|
|
@@ -14904,7 +14950,7 @@ import { css as css3 } from "@emotion/css";
|
|
|
14904
14950
|
// package.json
|
|
14905
14951
|
var package_default = {
|
|
14906
14952
|
name: "@tscircuit/pcb-viewer",
|
|
14907
|
-
version: "1.11.
|
|
14953
|
+
version: "1.11.374",
|
|
14908
14954
|
main: "dist/index.js",
|
|
14909
14955
|
type: "module",
|
|
14910
14956
|
repository: "tscircuit/pcb-viewer",
|
|
@@ -14928,12 +14974,13 @@ var package_default = {
|
|
|
14928
14974
|
"@semantic-release/npm": "^9.0.1",
|
|
14929
14975
|
"@semantic-release/release-notes-generator": "^10.0.3",
|
|
14930
14976
|
"@swc/core": "^1.4.12",
|
|
14931
|
-
"@tscircuit/circuit-json-util": "^0.0.
|
|
14977
|
+
"@tscircuit/circuit-json-util": "^0.0.99",
|
|
14932
14978
|
"@tscircuit/eagle-xml-converter": "^1.0.0",
|
|
14933
14979
|
"@types/bun": "latest",
|
|
14934
14980
|
"@types/color": "^3.0.6",
|
|
14935
14981
|
"@types/node": "18.7.23",
|
|
14936
14982
|
"@types/react": "19",
|
|
14983
|
+
"format-si-unit": "^0.0.7",
|
|
14937
14984
|
next: "^14.1.4",
|
|
14938
14985
|
"pixi.js": "^8.6.6",
|
|
14939
14986
|
react: "19.1.0",
|
|
@@ -14957,8 +15004,8 @@ var package_default = {
|
|
|
14957
15004
|
"@tscircuit/alphabet": "^0.0.23",
|
|
14958
15005
|
"@tscircuit/math-utils": "^0.0.36",
|
|
14959
15006
|
"@vitejs/plugin-react": "^5.0.2",
|
|
14960
|
-
"circuit-json": "^0.0.
|
|
14961
|
-
"circuit-to-canvas": "^0.0.
|
|
15007
|
+
"circuit-json": "^0.0.450",
|
|
15008
|
+
"circuit-to-canvas": "^0.0.112",
|
|
14962
15009
|
color: "^4.2.3",
|
|
14963
15010
|
"react-supergrid": "^1.0.10",
|
|
14964
15011
|
"react-toastify": "^10.0.5",
|
|
@@ -15732,13 +15779,7 @@ var ToolbarOverlay = ({ children, elements }) => {
|
|
|
15732
15779
|
window.removeEventListener("disarm-bounds-tool", disarmBounds);
|
|
15733
15780
|
};
|
|
15734
15781
|
}, []);
|
|
15735
|
-
const
|
|
15736
|
-
const numLayers = pcbBoard?.num_layers || 2;
|
|
15737
|
-
const availableLayers = numLayers <= 2 ? ["top", "bottom"] : [
|
|
15738
|
-
"top",
|
|
15739
|
-
...Array.from({ length: numLayers - 2 }, (_, i) => `inner${i + 1}`),
|
|
15740
|
-
"bottom"
|
|
15741
|
-
];
|
|
15782
|
+
const availableLayers = getCopperLayerRefsFromElements(elements ?? []);
|
|
15742
15783
|
const processedLayers = availableLayers;
|
|
15743
15784
|
const hasRunInitialMouseCheck = useRef14(false);
|
|
15744
15785
|
const hotkeyBoundaryRef = useRef14(null);
|
|
@@ -15758,6 +15799,10 @@ var ToolbarOverlay = ({ children, elements }) => {
|
|
|
15758
15799
|
"7": availableLayers[6] ? () => selectLayer(availableLayers[6]) : () => {
|
|
15759
15800
|
},
|
|
15760
15801
|
"8": availableLayers[7] ? () => selectLayer(availableLayers[7]) : () => {
|
|
15802
|
+
},
|
|
15803
|
+
"9": availableLayers[8] ? () => selectLayer(availableLayers[8]) : () => {
|
|
15804
|
+
},
|
|
15805
|
+
"0": availableLayers[9] ? () => selectLayer(availableLayers[9]) : () => {
|
|
15761
15806
|
}
|
|
15762
15807
|
};
|
|
15763
15808
|
useHotKey("1", hotKeyCallbacks["1"], hotkeyBoundaryRef);
|
|
@@ -15768,6 +15813,8 @@ var ToolbarOverlay = ({ children, elements }) => {
|
|
|
15768
15813
|
useHotKey("6", hotKeyCallbacks["6"], hotkeyBoundaryRef);
|
|
15769
15814
|
useHotKey("7", hotKeyCallbacks["7"], hotkeyBoundaryRef);
|
|
15770
15815
|
useHotKey("8", hotKeyCallbacks["8"], hotkeyBoundaryRef);
|
|
15816
|
+
useHotKey("9", hotKeyCallbacks["9"], hotkeyBoundaryRef);
|
|
15817
|
+
useHotKey("0", hotKeyCallbacks["0"], hotkeyBoundaryRef);
|
|
15771
15818
|
useLayoutEffect2(() => {
|
|
15772
15819
|
if (hasRunInitialMouseCheck.current) return;
|
|
15773
15820
|
hasRunInitialMouseCheck.current = true;
|