@tscircuit/pcb-viewer 1.11.435 → 1.11.436
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 +171 -145
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -11487,6 +11487,162 @@ function drawCopperPourElementsForLayer({
|
|
|
11487
11487
|
drawer.drawElements(copperPourElements, { layers });
|
|
11488
11488
|
}
|
|
11489
11489
|
|
|
11490
|
+
// src/lib/get-trace-overlay-text.ts
|
|
11491
|
+
var getNonEmptyName = (name) => name?.trim() || null;
|
|
11492
|
+
function createTraceOverlayElementIndex(elements) {
|
|
11493
|
+
const sourceNetById = /* @__PURE__ */ new Map();
|
|
11494
|
+
const sourceTraceById = /* @__PURE__ */ new Map();
|
|
11495
|
+
for (const element of elements) {
|
|
11496
|
+
if (element.type === "source_net") {
|
|
11497
|
+
sourceNetById.set(element.source_net_id, element);
|
|
11498
|
+
} else if (element.type === "source_trace") {
|
|
11499
|
+
sourceTraceById.set(element.source_trace_id, element);
|
|
11500
|
+
}
|
|
11501
|
+
}
|
|
11502
|
+
return { sourceNetById, sourceTraceById };
|
|
11503
|
+
}
|
|
11504
|
+
function getAssociatedTraceName({
|
|
11505
|
+
primitiveElement,
|
|
11506
|
+
traceOverlayElementIndex
|
|
11507
|
+
}) {
|
|
11508
|
+
const sourceElementId = primitiveElement.source_trace_id;
|
|
11509
|
+
if (!sourceElementId) return null;
|
|
11510
|
+
const sourceTrace = traceOverlayElementIndex.sourceTraceById.get(sourceElementId);
|
|
11511
|
+
const sourceTraceName = getNonEmptyName(sourceTrace?.name);
|
|
11512
|
+
if (sourceTraceName) return sourceTraceName;
|
|
11513
|
+
const sourceNet = traceOverlayElementIndex.sourceNetById.get(sourceElementId);
|
|
11514
|
+
const sourceNetName = getNonEmptyName(sourceNet?.name);
|
|
11515
|
+
if (sourceNetName) return sourceNetName;
|
|
11516
|
+
for (const sourceNetId of sourceTrace?.connected_source_net_ids ?? []) {
|
|
11517
|
+
const connectedSourceNetName = getNonEmptyName(
|
|
11518
|
+
traceOverlayElementIndex.sourceNetById.get(sourceNetId)?.name
|
|
11519
|
+
);
|
|
11520
|
+
if (connectedSourceNetName) return connectedSourceNetName;
|
|
11521
|
+
}
|
|
11522
|
+
return null;
|
|
11523
|
+
}
|
|
11524
|
+
function getTraceOverlayInfo({
|
|
11525
|
+
primitiveElement,
|
|
11526
|
+
traceOverlayElementIndex
|
|
11527
|
+
}) {
|
|
11528
|
+
const sourceTraceId = primitiveElement.source_trace_id;
|
|
11529
|
+
const trace = sourceTraceId ? traceOverlayElementIndex.sourceTraceById.get(sourceTraceId) : void 0;
|
|
11530
|
+
const traceLength = primitiveElement.trace_length;
|
|
11531
|
+
const hasTraceLength = typeof traceLength === "number";
|
|
11532
|
+
const maxLength = trace?.max_length;
|
|
11533
|
+
const text = hasTraceLength ? `${traceLength.toFixed(3)}${typeof maxLength === "number" ? ` / ${maxLength}` : ""} mm` : "";
|
|
11534
|
+
const name = getAssociatedTraceName({
|
|
11535
|
+
primitiveElement,
|
|
11536
|
+
traceOverlayElementIndex
|
|
11537
|
+
}) ?? getNonEmptyName(trace?.display_name);
|
|
11538
|
+
if (!text && !name) return null;
|
|
11539
|
+
const isOverLength = Boolean(
|
|
11540
|
+
hasTraceLength && typeof maxLength === "number" && traceLength > maxLength
|
|
11541
|
+
);
|
|
11542
|
+
return {
|
|
11543
|
+
text,
|
|
11544
|
+
name,
|
|
11545
|
+
isOverLength
|
|
11546
|
+
};
|
|
11547
|
+
}
|
|
11548
|
+
|
|
11549
|
+
// src/lib/x-ray-net.ts
|
|
11550
|
+
function getElementNetId(element, connectivityMap) {
|
|
11551
|
+
if (!element) return;
|
|
11552
|
+
const ids = [];
|
|
11553
|
+
for (const key of [
|
|
11554
|
+
`${element.type}_id`,
|
|
11555
|
+
"pcb_port_id",
|
|
11556
|
+
"pcb_trace_id",
|
|
11557
|
+
"source_trace_id",
|
|
11558
|
+
"source_net_id"
|
|
11559
|
+
]) {
|
|
11560
|
+
const value = element[key];
|
|
11561
|
+
if (typeof value === "string") ids.push(value);
|
|
11562
|
+
}
|
|
11563
|
+
for (const id of ids) {
|
|
11564
|
+
const net = connectivityMap.getNetConnectedToId(id);
|
|
11565
|
+
if (net) return net;
|
|
11566
|
+
}
|
|
11567
|
+
if ("source_net_id" in element) return element.source_net_id;
|
|
11568
|
+
}
|
|
11569
|
+
function isXRayCopper(element) {
|
|
11570
|
+
return element && [
|
|
11571
|
+
"pcb_trace",
|
|
11572
|
+
"pcb_smtpad",
|
|
11573
|
+
"pcb_plated_hole",
|
|
11574
|
+
"pcb_via",
|
|
11575
|
+
"pcb_copper_pour"
|
|
11576
|
+
].includes(element.type);
|
|
11577
|
+
}
|
|
11578
|
+
function getXRayDisplayName(element, elements, connectivityMap) {
|
|
11579
|
+
const traceOverlayElementIndex = createTraceOverlayElementIndex(elements);
|
|
11580
|
+
const directName = element.type === "pcb_trace" ? getAssociatedTraceName({
|
|
11581
|
+
primitiveElement: element,
|
|
11582
|
+
traceOverlayElementIndex
|
|
11583
|
+
}) : null;
|
|
11584
|
+
if (directName) return directName;
|
|
11585
|
+
const netId = getElementNetId(element, connectivityMap);
|
|
11586
|
+
const connected = netId ? elements.filter(
|
|
11587
|
+
(candidate) => getElementNetId(candidate, connectivityMap) === netId
|
|
11588
|
+
) : [];
|
|
11589
|
+
for (const type of ["source_net", "source_trace"]) {
|
|
11590
|
+
for (const candidate of connected) {
|
|
11591
|
+
if (candidate.type === type && "name" in candidate && typeof candidate.name === "string" && candidate.name.trim())
|
|
11592
|
+
return candidate.name.trim();
|
|
11593
|
+
}
|
|
11594
|
+
}
|
|
11595
|
+
if (element.type === "pcb_trace") {
|
|
11596
|
+
const label = getTraceOverlayInfo({
|
|
11597
|
+
primitiveElement: element,
|
|
11598
|
+
traceOverlayElementIndex
|
|
11599
|
+
})?.name;
|
|
11600
|
+
if (label) return label;
|
|
11601
|
+
}
|
|
11602
|
+
for (const candidate of connected) {
|
|
11603
|
+
if (candidate.type === "source_trace" && candidate.display_name?.trim())
|
|
11604
|
+
return candidate.display_name.trim();
|
|
11605
|
+
}
|
|
11606
|
+
return "Net";
|
|
11607
|
+
}
|
|
11608
|
+
function getXRayGroups(netId, elements, connectivityMap) {
|
|
11609
|
+
return elements.flatMap((element) => {
|
|
11610
|
+
if (element.type !== "source_bus") return [];
|
|
11611
|
+
const netIds = [
|
|
11612
|
+
...new Set(
|
|
11613
|
+
element.source_trace_ids.flatMap((id) => {
|
|
11614
|
+
const net = connectivityMap.getNetConnectedToId(id);
|
|
11615
|
+
return net ? [net] : [];
|
|
11616
|
+
})
|
|
11617
|
+
)
|
|
11618
|
+
];
|
|
11619
|
+
if (!netIds.includes(netId)) return [];
|
|
11620
|
+
return [
|
|
11621
|
+
{
|
|
11622
|
+
id: element.source_bus_id,
|
|
11623
|
+
name: element.name?.trim() || "Bus",
|
|
11624
|
+
netIds
|
|
11625
|
+
}
|
|
11626
|
+
];
|
|
11627
|
+
});
|
|
11628
|
+
}
|
|
11629
|
+
|
|
11630
|
+
// src/lib/get-highlighted-copper-pour-ids.ts
|
|
11631
|
+
function getHighlightedCopperPourIds(elements, highlightedNetElementIds, connectivityMap) {
|
|
11632
|
+
if (highlightedNetElementIds.length === 0) return [];
|
|
11633
|
+
const netIds = new Set(
|
|
11634
|
+
highlightedNetElementIds.flatMap((id) => {
|
|
11635
|
+
const netId = connectivityMap.getNetConnectedToId(id);
|
|
11636
|
+
return netId ? [netId] : [];
|
|
11637
|
+
})
|
|
11638
|
+
);
|
|
11639
|
+
return elements.flatMap((element) => {
|
|
11640
|
+
if (element.type !== "pcb_copper_pour") return [];
|
|
11641
|
+
const netId = getElementNetId(element, connectivityMap);
|
|
11642
|
+
return netId && netIds.has(netId) ? [element.pcb_copper_pour_id] : [];
|
|
11643
|
+
});
|
|
11644
|
+
}
|
|
11645
|
+
|
|
11490
11646
|
// src/lib/util/get-primitive-bounding-box.ts
|
|
11491
11647
|
var mergeNumber = (a, b, fn) => fn(a, b);
|
|
11492
11648
|
var rotatePoint = (x, y, centerX, centerY, rotationDeg) => {
|
|
@@ -12163,146 +12319,6 @@ var animateTransform = ({
|
|
|
12163
12319
|
return animationFrameId;
|
|
12164
12320
|
};
|
|
12165
12321
|
|
|
12166
|
-
// src/lib/get-trace-overlay-text.ts
|
|
12167
|
-
var getNonEmptyName = (name) => name?.trim() || null;
|
|
12168
|
-
function createTraceOverlayElementIndex(elements) {
|
|
12169
|
-
const sourceNetById = /* @__PURE__ */ new Map();
|
|
12170
|
-
const sourceTraceById = /* @__PURE__ */ new Map();
|
|
12171
|
-
for (const element of elements) {
|
|
12172
|
-
if (element.type === "source_net") {
|
|
12173
|
-
sourceNetById.set(element.source_net_id, element);
|
|
12174
|
-
} else if (element.type === "source_trace") {
|
|
12175
|
-
sourceTraceById.set(element.source_trace_id, element);
|
|
12176
|
-
}
|
|
12177
|
-
}
|
|
12178
|
-
return { sourceNetById, sourceTraceById };
|
|
12179
|
-
}
|
|
12180
|
-
function getAssociatedTraceName({
|
|
12181
|
-
primitiveElement,
|
|
12182
|
-
traceOverlayElementIndex
|
|
12183
|
-
}) {
|
|
12184
|
-
const sourceElementId = primitiveElement.source_trace_id;
|
|
12185
|
-
if (!sourceElementId) return null;
|
|
12186
|
-
const sourceTrace = traceOverlayElementIndex.sourceTraceById.get(sourceElementId);
|
|
12187
|
-
const sourceTraceName = getNonEmptyName(sourceTrace?.name);
|
|
12188
|
-
if (sourceTraceName) return sourceTraceName;
|
|
12189
|
-
const sourceNet = traceOverlayElementIndex.sourceNetById.get(sourceElementId);
|
|
12190
|
-
const sourceNetName = getNonEmptyName(sourceNet?.name);
|
|
12191
|
-
if (sourceNetName) return sourceNetName;
|
|
12192
|
-
for (const sourceNetId of sourceTrace?.connected_source_net_ids ?? []) {
|
|
12193
|
-
const connectedSourceNetName = getNonEmptyName(
|
|
12194
|
-
traceOverlayElementIndex.sourceNetById.get(sourceNetId)?.name
|
|
12195
|
-
);
|
|
12196
|
-
if (connectedSourceNetName) return connectedSourceNetName;
|
|
12197
|
-
}
|
|
12198
|
-
return null;
|
|
12199
|
-
}
|
|
12200
|
-
function getTraceOverlayInfo({
|
|
12201
|
-
primitiveElement,
|
|
12202
|
-
traceOverlayElementIndex
|
|
12203
|
-
}) {
|
|
12204
|
-
const sourceTraceId = primitiveElement.source_trace_id;
|
|
12205
|
-
const trace = sourceTraceId ? traceOverlayElementIndex.sourceTraceById.get(sourceTraceId) : void 0;
|
|
12206
|
-
const traceLength = primitiveElement.trace_length;
|
|
12207
|
-
const hasTraceLength = typeof traceLength === "number";
|
|
12208
|
-
const maxLength = trace?.max_length;
|
|
12209
|
-
const text = hasTraceLength ? `${traceLength.toFixed(3)}${typeof maxLength === "number" ? ` / ${maxLength}` : ""} mm` : "";
|
|
12210
|
-
const name = getAssociatedTraceName({
|
|
12211
|
-
primitiveElement,
|
|
12212
|
-
traceOverlayElementIndex
|
|
12213
|
-
}) ?? getNonEmptyName(trace?.display_name);
|
|
12214
|
-
if (!text && !name) return null;
|
|
12215
|
-
const isOverLength = Boolean(
|
|
12216
|
-
hasTraceLength && typeof maxLength === "number" && traceLength > maxLength
|
|
12217
|
-
);
|
|
12218
|
-
return {
|
|
12219
|
-
text,
|
|
12220
|
-
name,
|
|
12221
|
-
isOverLength
|
|
12222
|
-
};
|
|
12223
|
-
}
|
|
12224
|
-
|
|
12225
|
-
// src/lib/x-ray-net.ts
|
|
12226
|
-
function getElementNetId(element, connectivityMap) {
|
|
12227
|
-
if (!element) return;
|
|
12228
|
-
const ids = [];
|
|
12229
|
-
for (const key of [
|
|
12230
|
-
`${element.type}_id`,
|
|
12231
|
-
"pcb_port_id",
|
|
12232
|
-
"pcb_trace_id",
|
|
12233
|
-
"source_trace_id",
|
|
12234
|
-
"source_net_id"
|
|
12235
|
-
]) {
|
|
12236
|
-
const value = element[key];
|
|
12237
|
-
if (typeof value === "string") ids.push(value);
|
|
12238
|
-
}
|
|
12239
|
-
for (const id of ids) {
|
|
12240
|
-
const net = connectivityMap.getNetConnectedToId(id);
|
|
12241
|
-
if (net) return net;
|
|
12242
|
-
}
|
|
12243
|
-
if ("source_net_id" in element) return element.source_net_id;
|
|
12244
|
-
}
|
|
12245
|
-
function isXRayCopper(element) {
|
|
12246
|
-
return element && [
|
|
12247
|
-
"pcb_trace",
|
|
12248
|
-
"pcb_smtpad",
|
|
12249
|
-
"pcb_plated_hole",
|
|
12250
|
-
"pcb_via",
|
|
12251
|
-
"pcb_copper_pour"
|
|
12252
|
-
].includes(element.type);
|
|
12253
|
-
}
|
|
12254
|
-
function getXRayDisplayName(element, elements, connectivityMap) {
|
|
12255
|
-
const traceOverlayElementIndex = createTraceOverlayElementIndex(elements);
|
|
12256
|
-
const directName = element.type === "pcb_trace" ? getAssociatedTraceName({
|
|
12257
|
-
primitiveElement: element,
|
|
12258
|
-
traceOverlayElementIndex
|
|
12259
|
-
}) : null;
|
|
12260
|
-
if (directName) return directName;
|
|
12261
|
-
const netId = getElementNetId(element, connectivityMap);
|
|
12262
|
-
const connected = netId ? elements.filter(
|
|
12263
|
-
(candidate) => getElementNetId(candidate, connectivityMap) === netId
|
|
12264
|
-
) : [];
|
|
12265
|
-
for (const type of ["source_net", "source_trace"]) {
|
|
12266
|
-
for (const candidate of connected) {
|
|
12267
|
-
if (candidate.type === type && "name" in candidate && typeof candidate.name === "string" && candidate.name.trim())
|
|
12268
|
-
return candidate.name.trim();
|
|
12269
|
-
}
|
|
12270
|
-
}
|
|
12271
|
-
if (element.type === "pcb_trace") {
|
|
12272
|
-
const label = getTraceOverlayInfo({
|
|
12273
|
-
primitiveElement: element,
|
|
12274
|
-
traceOverlayElementIndex
|
|
12275
|
-
})?.name;
|
|
12276
|
-
if (label) return label;
|
|
12277
|
-
}
|
|
12278
|
-
for (const candidate of connected) {
|
|
12279
|
-
if (candidate.type === "source_trace" && candidate.display_name?.trim())
|
|
12280
|
-
return candidate.display_name.trim();
|
|
12281
|
-
}
|
|
12282
|
-
return "Net";
|
|
12283
|
-
}
|
|
12284
|
-
function getXRayGroups(netId, elements, connectivityMap) {
|
|
12285
|
-
return elements.flatMap((element) => {
|
|
12286
|
-
if (element.type !== "source_bus") return [];
|
|
12287
|
-
const netIds = [
|
|
12288
|
-
...new Set(
|
|
12289
|
-
element.source_trace_ids.flatMap((id) => {
|
|
12290
|
-
const net = connectivityMap.getNetConnectedToId(id);
|
|
12291
|
-
return net ? [net] : [];
|
|
12292
|
-
})
|
|
12293
|
-
)
|
|
12294
|
-
];
|
|
12295
|
-
if (!netIds.includes(netId)) return [];
|
|
12296
|
-
return [
|
|
12297
|
-
{
|
|
12298
|
-
id: element.source_bus_id,
|
|
12299
|
-
name: element.name?.trim() || "Bus",
|
|
12300
|
-
netIds
|
|
12301
|
-
}
|
|
12302
|
-
];
|
|
12303
|
-
});
|
|
12304
|
-
}
|
|
12305
|
-
|
|
12306
12322
|
// src/components/CanvasElementsRenderer.tsx
|
|
12307
12323
|
import { useCallback as useCallback11, useEffect as useEffect20, useMemo as useMemo15, useRef as useRef16, useState as useState13 } from "react";
|
|
12308
12324
|
import { applyToPoint as applyToPoint22, inverse as inverse6 } from "transformation-matrix";
|
|
@@ -18955,7 +18971,7 @@ import {
|
|
|
18955
18971
|
// package.json
|
|
18956
18972
|
var package_default = {
|
|
18957
18973
|
name: "@tscircuit/pcb-viewer",
|
|
18958
|
-
version: "1.11.
|
|
18974
|
+
version: "1.11.435",
|
|
18959
18975
|
main: "dist/index.js",
|
|
18960
18976
|
type: "module",
|
|
18961
18977
|
repository: {
|
|
@@ -20915,16 +20931,17 @@ function WebGpuElementsRenderer(props) {
|
|
|
20915
20931
|
const showCourtyards = useGlobalStore((s) => s.is_showing_courtyards);
|
|
20916
20932
|
const highlightedElementIds = useMemo14(
|
|
20917
20933
|
() => [
|
|
20918
|
-
|
|
20919
|
-
|
|
20934
|
+
.../* @__PURE__ */ new Set([
|
|
20935
|
+
...props.highlightedCopperPourIds ?? [],
|
|
20936
|
+
...primitives.flatMap((p) => {
|
|
20920
20937
|
if (!p.is_mouse_over && !p.is_in_highlighted_net) return [];
|
|
20921
20938
|
const element = p._element;
|
|
20922
20939
|
const id = element?.[`${element.type}_id`];
|
|
20923
20940
|
return id ? [id] : [];
|
|
20924
20941
|
})
|
|
20925
|
-
)
|
|
20942
|
+
])
|
|
20926
20943
|
],
|
|
20927
|
-
[primitives]
|
|
20944
|
+
[primitives, props.highlightedCopperPourIds]
|
|
20928
20945
|
);
|
|
20929
20946
|
const xRayElementIds = useMemo14(
|
|
20930
20947
|
() => (props.xRayElements ?? []).map(
|
|
@@ -21282,6 +21299,14 @@ var CanvasElementsRenderer = (props) => {
|
|
|
21282
21299
|
drawingObjectIdsWithMouseOver: /* @__PURE__ */ new Set(),
|
|
21283
21300
|
primitiveIdsInMousedOverNet: []
|
|
21284
21301
|
});
|
|
21302
|
+
const highlightedCopperPourIds = useMemo15(
|
|
21303
|
+
() => xRayNetIds.length > 0 ? [] : getHighlightedCopperPourIds(
|
|
21304
|
+
elementsToRender,
|
|
21305
|
+
hoverState.primitiveIdsInMousedOverNet,
|
|
21306
|
+
connectivityMap
|
|
21307
|
+
),
|
|
21308
|
+
[elementsToRender, hoverState, connectivityMap, xRayNetIds]
|
|
21309
|
+
);
|
|
21285
21310
|
const [hoveredComponentIds, setHoveredComponentIds] = useState13([]);
|
|
21286
21311
|
const currentTransformRef = useRef16(transform ?? null);
|
|
21287
21312
|
const zoomAnimationFrameRef = useRef16(null);
|
|
@@ -21480,6 +21505,7 @@ var CanvasElementsRenderer = (props) => {
|
|
|
21480
21505
|
) : /* @__PURE__ */ jsx26(
|
|
21481
21506
|
WebGpuElementsRenderer,
|
|
21482
21507
|
{
|
|
21508
|
+
highlightedCopperPourIds,
|
|
21483
21509
|
transform,
|
|
21484
21510
|
primitives,
|
|
21485
21511
|
elements,
|