@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 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.433",
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
- ...new Set(
20919
- primitives.flatMap((p) => {
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,