@tscircuit/pcb-viewer 1.11.402 → 1.11.403
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 +96 -54
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4258,6 +4258,52 @@ var animateTransform = ({
|
|
|
4258
4258
|
import { useCallback as useCallback11, useEffect as useEffect19, useMemo as useMemo10, useRef as useRef16, useState as useState13 } from "react";
|
|
4259
4259
|
import { applyToPoint as applyToPoint19, inverse as inverse6 } from "transformation-matrix";
|
|
4260
4260
|
|
|
4261
|
+
// src/lib/get-trace-overlay-text.ts
|
|
4262
|
+
var getNonEmptyName = (name) => name?.trim() || null;
|
|
4263
|
+
function getAssociatedTraceName({
|
|
4264
|
+
primitiveElement,
|
|
4265
|
+
elements
|
|
4266
|
+
}) {
|
|
4267
|
+
const sourceElementId = primitiveElement.source_trace_id;
|
|
4268
|
+
if (!sourceElementId) return null;
|
|
4269
|
+
const circuitJson = su(elements);
|
|
4270
|
+
const sourceTrace = circuitJson.source_trace.get(sourceElementId);
|
|
4271
|
+
const sourceTraceName = getNonEmptyName(sourceTrace?.name);
|
|
4272
|
+
if (sourceTraceName) return sourceTraceName;
|
|
4273
|
+
const sourceNet = circuitJson.source_net.get(sourceElementId);
|
|
4274
|
+
const sourceNetName = getNonEmptyName(sourceNet?.name);
|
|
4275
|
+
if (sourceNetName) return sourceNetName;
|
|
4276
|
+
for (const sourceNetId of sourceTrace?.connected_source_net_ids ?? []) {
|
|
4277
|
+
const connectedSourceNetName = getNonEmptyName(
|
|
4278
|
+
circuitJson.source_net.get(sourceNetId)?.name
|
|
4279
|
+
);
|
|
4280
|
+
if (connectedSourceNetName) return connectedSourceNetName;
|
|
4281
|
+
}
|
|
4282
|
+
return null;
|
|
4283
|
+
}
|
|
4284
|
+
function getTraceOverlayInfo({
|
|
4285
|
+
primitiveElement,
|
|
4286
|
+
elements
|
|
4287
|
+
}) {
|
|
4288
|
+
const trace = su(elements).source_trace.get(
|
|
4289
|
+
primitiveElement?.source_trace_id
|
|
4290
|
+
);
|
|
4291
|
+
const traceLength = primitiveElement.trace_length;
|
|
4292
|
+
const hasTraceLength = typeof traceLength === "number";
|
|
4293
|
+
const maxLength = trace?.max_length;
|
|
4294
|
+
const text = hasTraceLength ? `${traceLength.toFixed(3)}${typeof maxLength === "number" ? ` / ${maxLength}` : ""} mm` : "";
|
|
4295
|
+
const name = getAssociatedTraceName({ primitiveElement, elements }) ?? getNonEmptyName(trace?.display_name);
|
|
4296
|
+
if (!text && !name) return null;
|
|
4297
|
+
const isOverLength = Boolean(
|
|
4298
|
+
hasTraceLength && typeof maxLength === "number" && traceLength > maxLength
|
|
4299
|
+
);
|
|
4300
|
+
return {
|
|
4301
|
+
text,
|
|
4302
|
+
name,
|
|
4303
|
+
isOverLength
|
|
4304
|
+
};
|
|
4305
|
+
}
|
|
4306
|
+
|
|
4261
4307
|
// src/lib/x-ray-net.ts
|
|
4262
4308
|
function getElementNetId(element, connectivityMap) {
|
|
4263
4309
|
if (!element) return;
|
|
@@ -4282,6 +4328,32 @@ function isXRayCopper(element) {
|
|
|
4282
4328
|
element.type
|
|
4283
4329
|
);
|
|
4284
4330
|
}
|
|
4331
|
+
function getXRayDisplayName(element, elements, connectivityMap) {
|
|
4332
|
+
const directName = element.type === "pcb_trace" ? getAssociatedTraceName({ primitiveElement: element, elements }) : null;
|
|
4333
|
+
if (directName) return directName;
|
|
4334
|
+
const netId = getElementNetId(element, connectivityMap);
|
|
4335
|
+
const connected = netId ? elements.filter(
|
|
4336
|
+
(candidate) => getElementNetId(candidate, connectivityMap) === netId
|
|
4337
|
+
) : [];
|
|
4338
|
+
for (const type of ["source_net", "source_trace"]) {
|
|
4339
|
+
for (const candidate of connected) {
|
|
4340
|
+
if (candidate.type === type && "name" in candidate && typeof candidate.name === "string" && candidate.name.trim())
|
|
4341
|
+
return candidate.name.trim();
|
|
4342
|
+
}
|
|
4343
|
+
}
|
|
4344
|
+
if (element.type === "pcb_trace") {
|
|
4345
|
+
const label = getTraceOverlayInfo({
|
|
4346
|
+
primitiveElement: element,
|
|
4347
|
+
elements
|
|
4348
|
+
})?.name;
|
|
4349
|
+
if (label) return label;
|
|
4350
|
+
}
|
|
4351
|
+
for (const candidate of connected) {
|
|
4352
|
+
if (candidate.type === "source_trace" && candidate.display_name?.trim())
|
|
4353
|
+
return candidate.display_name.trim();
|
|
4354
|
+
}
|
|
4355
|
+
return "Net";
|
|
4356
|
+
}
|
|
4285
4357
|
|
|
4286
4358
|
// src/lib/webgpu/create-worker.ts
|
|
4287
4359
|
var createWebGpuWorker = async () => {
|
|
@@ -10073,52 +10145,6 @@ var PanelAnchorOffsetOverlay = ({
|
|
|
10073
10145
|
);
|
|
10074
10146
|
};
|
|
10075
10147
|
|
|
10076
|
-
// src/lib/get-trace-overlay-text.ts
|
|
10077
|
-
var getNonEmptyName = (name) => name?.trim() || null;
|
|
10078
|
-
function getAssociatedTraceName({
|
|
10079
|
-
primitiveElement,
|
|
10080
|
-
elements
|
|
10081
|
-
}) {
|
|
10082
|
-
const sourceElementId = primitiveElement.source_trace_id;
|
|
10083
|
-
if (!sourceElementId) return null;
|
|
10084
|
-
const circuitJson = su(elements);
|
|
10085
|
-
const sourceTrace = circuitJson.source_trace.get(sourceElementId);
|
|
10086
|
-
const sourceTraceName = getNonEmptyName(sourceTrace?.name);
|
|
10087
|
-
if (sourceTraceName) return sourceTraceName;
|
|
10088
|
-
const sourceNet = circuitJson.source_net.get(sourceElementId);
|
|
10089
|
-
const sourceNetName = getNonEmptyName(sourceNet?.name);
|
|
10090
|
-
if (sourceNetName) return sourceNetName;
|
|
10091
|
-
for (const sourceNetId of sourceTrace?.connected_source_net_ids ?? []) {
|
|
10092
|
-
const connectedSourceNetName = getNonEmptyName(
|
|
10093
|
-
circuitJson.source_net.get(sourceNetId)?.name
|
|
10094
|
-
);
|
|
10095
|
-
if (connectedSourceNetName) return connectedSourceNetName;
|
|
10096
|
-
}
|
|
10097
|
-
return null;
|
|
10098
|
-
}
|
|
10099
|
-
function getTraceOverlayInfo({
|
|
10100
|
-
primitiveElement,
|
|
10101
|
-
elements
|
|
10102
|
-
}) {
|
|
10103
|
-
const trace = su(elements).source_trace.get(
|
|
10104
|
-
primitiveElement?.source_trace_id
|
|
10105
|
-
);
|
|
10106
|
-
const traceLength = primitiveElement.trace_length;
|
|
10107
|
-
const hasTraceLength = typeof traceLength === "number";
|
|
10108
|
-
const maxLength = trace?.max_length;
|
|
10109
|
-
const text = hasTraceLength ? `${traceLength.toFixed(3)}${typeof maxLength === "number" ? ` / ${maxLength}` : ""} mm` : "";
|
|
10110
|
-
const name = getAssociatedTraceName({ primitiveElement, elements }) ?? getNonEmptyName(trace?.display_name);
|
|
10111
|
-
if (!text && !name) return null;
|
|
10112
|
-
const isOverLength = Boolean(
|
|
10113
|
-
hasTraceLength && typeof maxLength === "number" && traceLength > maxLength
|
|
10114
|
-
);
|
|
10115
|
-
return {
|
|
10116
|
-
text,
|
|
10117
|
-
name,
|
|
10118
|
-
isOverLength
|
|
10119
|
-
};
|
|
10120
|
-
}
|
|
10121
|
-
|
|
10122
10148
|
// src/lib/filter-traces-if-multiple.ts
|
|
10123
10149
|
function filterTracesIfMultiple(filterTraces) {
|
|
10124
10150
|
const { primitives, is_showing_multiple_traces_length, elements } = filterTraces;
|
|
@@ -11047,7 +11073,7 @@ import { css as css3 } from "@emotion/css";
|
|
|
11047
11073
|
// package.json
|
|
11048
11074
|
var package_default = {
|
|
11049
11075
|
name: "@tscircuit/pcb-viewer",
|
|
11050
|
-
version: "1.11.
|
|
11076
|
+
version: "1.11.402",
|
|
11051
11077
|
main: "dist/index.js",
|
|
11052
11078
|
type: "module",
|
|
11053
11079
|
repository: {
|
|
@@ -11244,6 +11270,7 @@ var VisibilityContextMenu = ({
|
|
|
11244
11270
|
position,
|
|
11245
11271
|
onClose,
|
|
11246
11272
|
onXRayNet,
|
|
11273
|
+
xRayDisplayName = "Net",
|
|
11247
11274
|
onExitXRayNet
|
|
11248
11275
|
}) => {
|
|
11249
11276
|
const engine = useRenderingEngine();
|
|
@@ -11348,17 +11375,21 @@ var VisibilityContextMenu = ({
|
|
|
11348
11375
|
...stacked ? { overflowY: "auto" } : {}
|
|
11349
11376
|
},
|
|
11350
11377
|
children: [
|
|
11351
|
-
onXRayNet && /* @__PURE__ */
|
|
11378
|
+
onXRayNet && /* @__PURE__ */ jsxs15(
|
|
11352
11379
|
"button",
|
|
11353
11380
|
{
|
|
11354
11381
|
type: "button",
|
|
11355
11382
|
role: "menuitem",
|
|
11356
11383
|
className: itemStyle,
|
|
11384
|
+
style: { whiteSpace: "normal", overflowWrap: "anywhere" },
|
|
11357
11385
|
onClick: () => {
|
|
11358
11386
|
onXRayNet();
|
|
11359
11387
|
onClose();
|
|
11360
11388
|
},
|
|
11361
|
-
children:
|
|
11389
|
+
children: [
|
|
11390
|
+
"X-Ray ",
|
|
11391
|
+
xRayDisplayName
|
|
11392
|
+
]
|
|
11362
11393
|
}
|
|
11363
11394
|
),
|
|
11364
11395
|
onExitXRayNet && /* @__PURE__ */ jsx20(
|
|
@@ -12198,6 +12229,7 @@ var ToolbarOverlay = ({
|
|
|
12198
12229
|
}));
|
|
12199
12230
|
const [contextMenuPosition, setContextMenuPosition] = useState12(null);
|
|
12200
12231
|
const [contextNetId, setContextNetId] = useState12();
|
|
12232
|
+
const [contextNetDisplayName, setContextNetDisplayName] = useState12("Net");
|
|
12201
12233
|
const pointerStart = useRef14(null);
|
|
12202
12234
|
const inEditMode = useGlobalStore((s) => s.in_edit_mode);
|
|
12203
12235
|
const netAtEvent = (event) => {
|
|
@@ -12357,13 +12389,15 @@ var ToolbarOverlay = ({
|
|
|
12357
12389
|
const start = pointerStart.current;
|
|
12358
12390
|
if (!start || Math.hypot(event.clientX - start.x, event.clientY - start.y) > 4)
|
|
12359
12391
|
return;
|
|
12360
|
-
const
|
|
12361
|
-
if (!
|
|
12392
|
+
const hit = netAtEvent(event);
|
|
12393
|
+
if (!hit) return;
|
|
12394
|
+
const net = hit.netId;
|
|
12362
12395
|
if (xRayNetIds.includes(net)) {
|
|
12363
12396
|
onXRayNetsChange?.(xRayNetIds.filter((id) => id !== net));
|
|
12364
12397
|
closeContextMenu();
|
|
12365
12398
|
} else {
|
|
12366
12399
|
setContextNetId(net);
|
|
12400
|
+
setContextNetDisplayName(hit.displayName);
|
|
12367
12401
|
onContextMenuOpenChange?.(true);
|
|
12368
12402
|
setContextMenuPosition({ x: event.clientX, y: event.clientY });
|
|
12369
12403
|
}
|
|
@@ -12375,7 +12409,9 @@ var ToolbarOverlay = ({
|
|
|
12375
12409
|
onContextMenu: (event) => {
|
|
12376
12410
|
event.preventDefault();
|
|
12377
12411
|
event.stopPropagation();
|
|
12378
|
-
|
|
12412
|
+
const hit = netAtEvent(event);
|
|
12413
|
+
setContextNetId(hit?.netId);
|
|
12414
|
+
setContextNetDisplayName(hit?.displayName ?? "Net");
|
|
12379
12415
|
onContextMenuOpenChange?.(true);
|
|
12380
12416
|
setContextMenuPosition({ x: event.clientX, y: event.clientY });
|
|
12381
12417
|
},
|
|
@@ -12390,6 +12426,7 @@ var ToolbarOverlay = ({
|
|
|
12390
12426
|
{
|
|
12391
12427
|
position: contextMenuPosition,
|
|
12392
12428
|
onClose: closeContextMenu,
|
|
12429
|
+
xRayDisplayName: contextNetDisplayName,
|
|
12393
12430
|
onXRayNet: contextNetId && !xRayNetIds.includes(contextNetId) ? () => onXRayNetsChange?.([...xRayNetIds, contextNetId]) : void 0,
|
|
12394
12431
|
onExitXRayNet: xRayNetIds.length > 0 ? () => onXRayNetsChange?.([]) : void 0
|
|
12395
12432
|
}
|
|
@@ -12878,6 +12915,10 @@ var CanvasElementsRenderer = (props) => {
|
|
|
12878
12915
|
);
|
|
12879
12916
|
const getNetAtPoint = (point) => {
|
|
12880
12917
|
if (!transform) return void 0;
|
|
12918
|
+
const describeNet = (netId, element) => ({
|
|
12919
|
+
netId,
|
|
12920
|
+
displayName: getXRayDisplayName(element, elements, connectivityMap)
|
|
12921
|
+
});
|
|
12881
12922
|
const hits = getPrimitivesUnderPoint(
|
|
12882
12923
|
primitivesWithoutInteractionMetadata,
|
|
12883
12924
|
applyToPoint19(inverse6(transform), point),
|
|
@@ -12893,11 +12934,12 @@ var CanvasElementsRenderer = (props) => {
|
|
|
12893
12934
|
);
|
|
12894
12935
|
for (const primitive of copper) {
|
|
12895
12936
|
const net = getElementNetId(primitive._element, connectivityMap);
|
|
12896
|
-
if (net && xRayNetIds.includes(net))
|
|
12937
|
+
if (net && xRayNetIds.includes(net))
|
|
12938
|
+
return describeNet(net, primitive._element);
|
|
12897
12939
|
}
|
|
12898
12940
|
for (const primitive of copper) {
|
|
12899
12941
|
const net = getElementNetId(primitive._element, connectivityMap);
|
|
12900
|
-
if (net) return net;
|
|
12942
|
+
if (net) return describeNet(net, primitive._element);
|
|
12901
12943
|
}
|
|
12902
12944
|
};
|
|
12903
12945
|
const [hoverState, setHoverState] = useState13({
|