@tscircuit/core 0.0.1241 → 0.0.1243

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.
Files changed (2) hide show
  1. package/dist/index.js +164 -12
  2. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -2778,6 +2778,24 @@ var getObstaclesFromCircuitJson = (soup, connMap) => {
2778
2778
  ...element.shape === "rotated_pill" ? { ccwRotationDegrees: element.ccw_rotation } : {},
2779
2779
  connectedTo: withNetId([element.pcb_smtpad_id])
2780
2780
  });
2781
+ } else if (element.shape === "polygon") {
2782
+ const xs = element.points.map((point6) => point6.x);
2783
+ const ys = element.points.map((point6) => point6.y);
2784
+ const minX = Math.min(...xs);
2785
+ const maxX = Math.max(...xs);
2786
+ const minY = Math.min(...ys);
2787
+ const maxY = Math.max(...ys);
2788
+ obstacles.push({
2789
+ type: "rect",
2790
+ layers: [element.layer],
2791
+ center: {
2792
+ x: (minX + maxX) / 2,
2793
+ y: (minY + maxY) / 2
2794
+ },
2795
+ width: maxX - minX,
2796
+ height: maxY - minY,
2797
+ connectedTo: withNetId([element.pcb_smtpad_id])
2798
+ });
2781
2799
  }
2782
2800
  } else if (element.type === "pcb_keepout") {
2783
2801
  if (element.shape === "circle") {
@@ -4541,6 +4559,13 @@ var findInflatedPcbViaForPoint = (vias, point6) => {
4541
4559
  (via) => Math.abs(via.x - point6.x) < 1e-4 && Math.abs(via.y - point6.y) < 1e-4 && (!via.from_layer || via.from_layer === point6.from_layer) && (!via.to_layer || via.to_layer === point6.to_layer)
4542
4560
  );
4543
4561
  };
4562
+ var getViaDiameterFromRoutePoint = (point6) => {
4563
+ const viaPoint = point6;
4564
+ return {
4565
+ holeDiameter: viaPoint.hole_diameter ?? viaPoint.via_hole_diameter,
4566
+ outerDiameter: viaPoint.outer_diameter ?? viaPoint.via_diameter
4567
+ };
4568
+ };
4544
4569
  function Trace_doInitialPcbManualTraceRender(trace) {
4545
4570
  if (trace.root?.pcbDisabled) return;
4546
4571
  const { db } = trace.root;
@@ -4634,6 +4659,7 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4634
4659
  trace._inflatedPcbVias,
4635
4660
  originalPoint
4636
4661
  );
4662
+ const routePointViaDiameter = getViaDiameterFromRoutePoint(point6);
4637
4663
  const fromLayer = maybeFlipLayer(
4638
4664
  inflatedPcbVia?.from_layer ?? point6.from_layer
4639
4665
  );
@@ -4648,8 +4674,8 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4648
4674
  pcb_trace_id: pcb_trace2.pcb_trace_id,
4649
4675
  x: point6.x,
4650
4676
  y: point6.y,
4651
- hole_diameter: inflatedPcbVia?.hole_diameter ?? holeDiameter2,
4652
- outer_diameter: inflatedPcbVia?.outer_diameter ?? padDiameter2,
4677
+ hole_diameter: inflatedPcbVia?.hole_diameter ?? routePointViaDiameter.holeDiameter ?? holeDiameter2,
4678
+ outer_diameter: inflatedPcbVia?.outer_diameter ?? routePointViaDiameter.outerDiameter ?? padDiameter2,
4653
4679
  layers,
4654
4680
  from_layer: fromLayer,
4655
4681
  to_layer: toLayer,
@@ -18524,10 +18550,14 @@ function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps) {
18524
18550
  function Group_getRoutingPhasePlans(group) {
18525
18551
  const traces = group.selectAll("trace");
18526
18552
  const nets = group.selectAll("net");
18527
- if (traces.length === 0 && nets.length === 0) return [];
18528
18553
  const plansByPhaseIndex = /* @__PURE__ */ new Map();
18529
18554
  const autoroutersByPhaseIndex = getAutoroutersByPhaseIndex(group);
18530
18555
  const phasePropsByPhaseIndex = getAutoroutingPhasePropsByPhaseIndex(group);
18556
+ const hasDirectRoutingTargets = traces.length > 0 || nets.length > 0;
18557
+ const hasReroutePhase = Array.from(phasePropsByPhaseIndex.values()).some(
18558
+ (phaseProps) => phaseProps.reroute
18559
+ );
18560
+ if (!hasDirectRoutingTargets && !hasReroutePhase) return [];
18531
18561
  for (const net of nets) {
18532
18562
  const routingPhaseIndex = getNetRoutingPhaseIndex(net);
18533
18563
  getOrCreateRoutingPhasePlan(plansByPhaseIndex, routingPhaseIndex).nets.push(
@@ -18557,7 +18587,7 @@ function Group_getRoutingPhasePlans(group) {
18557
18587
  plan.drcTolerances = phaseProps ? getDrcTolerancesFromAutoroutingPhaseProps(phaseProps) : void 0;
18558
18588
  }
18559
18589
  const defaultPhaseProps = phasePropsByPhaseIndex.get(null);
18560
- if (phasePropsByPhaseIndex.size === 1 && defaultPhaseProps?.reroute && plans.length === 1 && plans[0]?.routingPhaseIndex === null) {
18590
+ if (hasDirectRoutingTargets && phasePropsByPhaseIndex.size === 1 && defaultPhaseProps?.reroute && plans.length === 1 && plans[0]?.routingPhaseIndex === null) {
18561
18591
  const reroutePlan = plans[0];
18562
18592
  return [
18563
18593
  {
@@ -18986,6 +19016,110 @@ function insertAutoplacedJumpers(params) {
18986
19016
  }
18987
19017
  }
18988
19018
 
19019
+ // lib/components/primitive-components/Group/region-replacement/convert-pcb-trace-to-simplified-pcb-trace.ts
19020
+ function convertPcbTraceToSimplifiedPcbTrace(trace) {
19021
+ return {
19022
+ ...trace,
19023
+ type: "pcb_trace",
19024
+ pcb_trace_id: trace.pcb_trace_id,
19025
+ connection_name: trace.connection_name ?? trace.source_trace_id ?? trace.pcb_trace_id,
19026
+ route: trace.route.map((point6) => ({ ...point6 }))
19027
+ };
19028
+ }
19029
+
19030
+ // lib/components/primitive-components/Group/region-replacement/get-relevant-subcircuit-ids-for-reroute.ts
19031
+ function getRelevantSubcircuitIdsForReroute(group) {
19032
+ const relevantSubcircuitIds = /* @__PURE__ */ new Set();
19033
+ if (!group.subcircuit_id) return relevantSubcircuitIds;
19034
+ relevantSubcircuitIds.add(group.subcircuit_id);
19035
+ const db = group.root?.db;
19036
+ if (!db) return relevantSubcircuitIds;
19037
+ for (const subcircuitId of getDescendantSubcircuitIds(
19038
+ db,
19039
+ group.subcircuit_id
19040
+ )) {
19041
+ relevantSubcircuitIds.add(subcircuitId);
19042
+ }
19043
+ return relevantSubcircuitIds;
19044
+ }
19045
+
19046
+ // lib/components/primitive-components/Group/region-replacement/get-existing-pcb-traces-for-reroute.ts
19047
+ function getExistingPcbTracesForReroute(group) {
19048
+ const db = group.root?.db;
19049
+ if (!db) return [];
19050
+ const relevantSubcircuitIds = getRelevantSubcircuitIdsForReroute(group);
19051
+ return db.pcb_trace.list().filter((trace) => {
19052
+ if (!trace.route || trace.route.length < 2) return false;
19053
+ if (!group.subcircuit_id) return true;
19054
+ return Boolean(
19055
+ trace.subcircuit_id && relevantSubcircuitIds.has(trace.subcircuit_id)
19056
+ );
19057
+ });
19058
+ }
19059
+
19060
+ // lib/components/primitive-components/Group/region-replacement/delete-existing-pcb-traces-replaced-by.ts
19061
+ function addPossibleReplacementSourceTraceId(sourceTraceIds, value) {
19062
+ if (typeof value !== "string" || value.length === 0) return;
19063
+ sourceTraceIds.add(value);
19064
+ const rerouteSuffixIndex = value.indexOf("_reroute_");
19065
+ if (rerouteSuffixIndex > 0) {
19066
+ sourceTraceIds.add(value.slice(0, rerouteSuffixIndex));
19067
+ }
19068
+ }
19069
+ function deleteExistingPcbTracesReplacedBy({
19070
+ group,
19071
+ outputPcbTraces
19072
+ }) {
19073
+ const db = group.root?.db;
19074
+ if (!db) return;
19075
+ const replacementPcbTraceIds = /* @__PURE__ */ new Set();
19076
+ const replacementSourceTraceIds = /* @__PURE__ */ new Set();
19077
+ for (const trace of outputPcbTraces) {
19078
+ if (trace.type !== "pcb_trace") continue;
19079
+ const replacementTrace = trace;
19080
+ replacementPcbTraceIds.add(replacementTrace.pcb_trace_id);
19081
+ addPossibleReplacementSourceTraceId(
19082
+ replacementSourceTraceIds,
19083
+ replacementTrace.source_trace_id
19084
+ );
19085
+ addPossibleReplacementSourceTraceId(
19086
+ replacementSourceTraceIds,
19087
+ replacementTrace.connection_name
19088
+ );
19089
+ addPossibleReplacementSourceTraceId(
19090
+ replacementSourceTraceIds,
19091
+ replacementTrace.rootConnectionName
19092
+ );
19093
+ }
19094
+ if (replacementPcbTraceIds.size === 0 && replacementSourceTraceIds.size === 0) {
19095
+ return;
19096
+ }
19097
+ const tracesToDelete = getExistingPcbTracesForReroute(group).filter(
19098
+ (trace) => replacementPcbTraceIds.has(trace.pcb_trace_id) || Boolean(
19099
+ trace.source_trace_id && replacementSourceTraceIds.has(trace.source_trace_id)
19100
+ )
19101
+ );
19102
+ if (tracesToDelete.length === 0) return;
19103
+ const deletedPcbTraceIds = new Set(
19104
+ tracesToDelete.map((trace) => trace.pcb_trace_id)
19105
+ );
19106
+ for (const via of db.pcb_via.list()) {
19107
+ if (via.pcb_trace_id && deletedPcbTraceIds.has(via.pcb_trace_id)) {
19108
+ db.pcb_via.delete(via.pcb_via_id);
19109
+ }
19110
+ }
19111
+ for (const trace of tracesToDelete) {
19112
+ db.pcb_trace.delete(trace.pcb_trace_id);
19113
+ }
19114
+ }
19115
+
19116
+ // lib/components/primitive-components/Group/region-replacement/get-existing-simplified-pcb-traces-for-reroute.ts
19117
+ function getExistingSimplifiedPcbTracesForReroute(group) {
19118
+ return getExistingPcbTracesForReroute(group).map(
19119
+ convertPcbTraceToSimplifiedPcbTrace
19120
+ );
19121
+ }
19122
+
18989
19123
  // lib/components/primitive-components/Group/split-pcb-traces-on-jumper-segments.ts
18990
19124
  function splitPcbTracesOnJumperSegments(route) {
18991
19125
  const jumperRoutes = route.filter(
@@ -19431,11 +19565,23 @@ var Group6 = class extends NormalComponent3 {
19431
19565
  const debug11 = Debug13("tscircuit:core:_hasTracesToRoute");
19432
19566
  const routingPhasePlans = this._getRoutingPhasePlans();
19433
19567
  let traceCount = 0;
19568
+ let hasReroutePhaseWithRegion = false;
19434
19569
  for (const routingPhasePlan of routingPhasePlans) {
19435
19570
  traceCount += routingPhasePlan.traces.length;
19571
+ hasReroutePhaseWithRegion ||= Boolean(
19572
+ routingPhasePlan.reroute && routingPhasePlan.region
19573
+ );
19436
19574
  }
19437
19575
  debug11(`[${this.getString()}] has ${traceCount} traces to route`);
19438
- return traceCount > 0;
19576
+ if (traceCount > 0) return true;
19577
+ if (hasReroutePhaseWithRegion) {
19578
+ const existingTraceCount = getExistingPcbTracesForReroute(this).length;
19579
+ debug11(
19580
+ `[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`
19581
+ );
19582
+ return existingTraceCount > 0;
19583
+ }
19584
+ return false;
19439
19585
  }
19440
19586
  async _runEffectMakeHttpAutoroutingRequest() {
19441
19587
  const { db } = this.root;
@@ -19580,6 +19726,7 @@ var Group6 = class extends NormalComponent3 {
19580
19726
  const hasPhasedAutorouting = Group_hasPhasedAutorouting(routingPhasePlans);
19581
19727
  const outputTraces = [];
19582
19728
  const outputJumpers = [];
19729
+ const existingRerouteSeedTraces = getExistingSimplifiedPcbTracesForReroute(this);
19583
19730
  for (const routingPhasePlan of routingPhasePlans) {
19584
19731
  const phaseAutorouterConfig = routingPhasePlan.autorouter ? getPresetAutoroutingConfig(
19585
19732
  routingPhasePlan.autorouter,
@@ -19591,7 +19738,7 @@ var Group6 = class extends NormalComponent3 {
19591
19738
  );
19592
19739
  const rerouteOriginalSrj = isReroutePhase ? {
19593
19740
  ...baseSimpleRouteJson,
19594
- traces: outputTraces
19741
+ traces: [...existingRerouteSeedTraces, ...outputTraces]
19595
19742
  } : null;
19596
19743
  if (isReroutePhase && rerouteOriginalSrj) {
19597
19744
  simpleRouteJson = getRerouteSimpleRouteJson(
@@ -19615,7 +19762,7 @@ var Group6 = class extends NormalComponent3 {
19615
19762
  simpleRouteJson,
19616
19763
  routingPhasePlan.drcTolerances
19617
19764
  );
19618
- if (hasPhasedAutorouting && simpleRouteJson.connections.length === 0) {
19765
+ if ((hasPhasedAutorouting || isReroutePhase) && simpleRouteJson.connections.length === 0) {
19619
19766
  continue;
19620
19767
  }
19621
19768
  const phaseIsAutoJumperPreset = routingPhasePlan.autorouter !== void 0 ? this._isAutoJumperAutorouter(phaseAutorouterConfig) : isAutoJumperPreset;
@@ -19846,13 +19993,17 @@ var Group6 = class extends NormalComponent3 {
19846
19993
  subcircuit_id: this.subcircuit_id
19847
19994
  });
19848
19995
  }
19996
+ deleteExistingPcbTracesReplacedBy({
19997
+ group: this,
19998
+ outputPcbTraces: output_pcb_traces
19999
+ });
19849
20000
  for (const pcb_trace of output_pcb_traces) {
19850
20001
  if (pcb_trace.type !== "pcb_trace") continue;
19851
- pcb_trace.subcircuit_id = this.subcircuit_id;
19852
- if (pcb_trace.connection_name) {
19853
- const sourceTraceId = pcb_trace.connection_name;
20002
+ const sourceTraceId = pcb_trace.source_trace_id ?? pcb_trace.connection_name;
20003
+ if (sourceTraceId) {
19854
20004
  pcb_trace.source_trace_id = sourceTraceId;
19855
20005
  }
20006
+ pcb_trace.subcircuit_id ??= (sourceTraceId ? db.source_trace.get(sourceTraceId)?.subcircuit_id : void 0) ?? this.subcircuit_id;
19856
20007
  let segments = splitPcbTracesOnJumperSegments(pcb_trace.route);
19857
20008
  if (segments === null) {
19858
20009
  segments = [pcb_trace.route];
@@ -20947,7 +21098,7 @@ import { identity as identity5 } from "transformation-matrix";
20947
21098
  var package_default = {
20948
21099
  name: "@tscircuit/core",
20949
21100
  type: "module",
20950
- version: "0.0.1240",
21101
+ version: "0.0.1242",
20951
21102
  types: "dist/index.d.ts",
20952
21103
  main: "dist/index.js",
20953
21104
  module: "dist/index.js",
@@ -21021,7 +21172,7 @@ var package_default = {
21021
21172
  flatbush: "^4.5.0",
21022
21173
  "graphics-debug": "^0.0.89",
21023
21174
  howfat: "^0.3.8",
21024
- "kicad-to-circuit-json": "^0.0.59",
21175
+ "kicad-to-circuit-json": "^0.0.60",
21025
21176
  kicadts: "^0.0.35",
21026
21177
  "live-server": "^1.2.2",
21027
21178
  "looks-same": "^9.0.1",
@@ -21032,6 +21183,7 @@ var package_default = {
21032
21183
  "react-dom": "^19.1.0",
21033
21184
  "schematic-symbols": "^0.0.208",
21034
21185
  spicey: "^0.0.14",
21186
+ "stack-svgs": "^0.0.1",
21035
21187
  "ts-expect": "^1.3.0",
21036
21188
  tsup: "^8.2.4"
21037
21189
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1241",
4
+ "version": "0.0.1243",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -75,7 +75,7 @@
75
75
  "flatbush": "^4.5.0",
76
76
  "graphics-debug": "^0.0.89",
77
77
  "howfat": "^0.3.8",
78
- "kicad-to-circuit-json": "^0.0.59",
78
+ "kicad-to-circuit-json": "^0.0.60",
79
79
  "kicadts": "^0.0.35",
80
80
  "live-server": "^1.2.2",
81
81
  "looks-same": "^9.0.1",
@@ -86,6 +86,7 @@
86
86
  "react-dom": "^19.1.0",
87
87
  "schematic-symbols": "^0.0.208",
88
88
  "spicey": "^0.0.14",
89
+ "stack-svgs": "^0.0.1",
89
90
  "ts-expect": "^1.3.0",
90
91
  "tsup": "^8.2.4"
91
92
  },