@tscircuit/core 0.0.1242 → 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 +146 -12
  2. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -4559,6 +4559,13 @@ var findInflatedPcbViaForPoint = (vias, point6) => {
4559
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)
4560
4560
  );
4561
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
+ };
4562
4569
  function Trace_doInitialPcbManualTraceRender(trace) {
4563
4570
  if (trace.root?.pcbDisabled) return;
4564
4571
  const { db } = trace.root;
@@ -4652,6 +4659,7 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4652
4659
  trace._inflatedPcbVias,
4653
4660
  originalPoint
4654
4661
  );
4662
+ const routePointViaDiameter = getViaDiameterFromRoutePoint(point6);
4655
4663
  const fromLayer = maybeFlipLayer(
4656
4664
  inflatedPcbVia?.from_layer ?? point6.from_layer
4657
4665
  );
@@ -4666,8 +4674,8 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4666
4674
  pcb_trace_id: pcb_trace2.pcb_trace_id,
4667
4675
  x: point6.x,
4668
4676
  y: point6.y,
4669
- hole_diameter: inflatedPcbVia?.hole_diameter ?? holeDiameter2,
4670
- outer_diameter: inflatedPcbVia?.outer_diameter ?? padDiameter2,
4677
+ hole_diameter: inflatedPcbVia?.hole_diameter ?? routePointViaDiameter.holeDiameter ?? holeDiameter2,
4678
+ outer_diameter: inflatedPcbVia?.outer_diameter ?? routePointViaDiameter.outerDiameter ?? padDiameter2,
4671
4679
  layers,
4672
4680
  from_layer: fromLayer,
4673
4681
  to_layer: toLayer,
@@ -18542,10 +18550,14 @@ function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps) {
18542
18550
  function Group_getRoutingPhasePlans(group) {
18543
18551
  const traces = group.selectAll("trace");
18544
18552
  const nets = group.selectAll("net");
18545
- if (traces.length === 0 && nets.length === 0) return [];
18546
18553
  const plansByPhaseIndex = /* @__PURE__ */ new Map();
18547
18554
  const autoroutersByPhaseIndex = getAutoroutersByPhaseIndex(group);
18548
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 [];
18549
18561
  for (const net of nets) {
18550
18562
  const routingPhaseIndex = getNetRoutingPhaseIndex(net);
18551
18563
  getOrCreateRoutingPhasePlan(plansByPhaseIndex, routingPhaseIndex).nets.push(
@@ -18575,7 +18587,7 @@ function Group_getRoutingPhasePlans(group) {
18575
18587
  plan.drcTolerances = phaseProps ? getDrcTolerancesFromAutoroutingPhaseProps(phaseProps) : void 0;
18576
18588
  }
18577
18589
  const defaultPhaseProps = phasePropsByPhaseIndex.get(null);
18578
- 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) {
18579
18591
  const reroutePlan = plans[0];
18580
18592
  return [
18581
18593
  {
@@ -19004,6 +19016,110 @@ function insertAutoplacedJumpers(params) {
19004
19016
  }
19005
19017
  }
19006
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
+
19007
19123
  // lib/components/primitive-components/Group/split-pcb-traces-on-jumper-segments.ts
19008
19124
  function splitPcbTracesOnJumperSegments(route) {
19009
19125
  const jumperRoutes = route.filter(
@@ -19449,11 +19565,23 @@ var Group6 = class extends NormalComponent3 {
19449
19565
  const debug11 = Debug13("tscircuit:core:_hasTracesToRoute");
19450
19566
  const routingPhasePlans = this._getRoutingPhasePlans();
19451
19567
  let traceCount = 0;
19568
+ let hasReroutePhaseWithRegion = false;
19452
19569
  for (const routingPhasePlan of routingPhasePlans) {
19453
19570
  traceCount += routingPhasePlan.traces.length;
19571
+ hasReroutePhaseWithRegion ||= Boolean(
19572
+ routingPhasePlan.reroute && routingPhasePlan.region
19573
+ );
19454
19574
  }
19455
19575
  debug11(`[${this.getString()}] has ${traceCount} traces to route`);
19456
- 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;
19457
19585
  }
19458
19586
  async _runEffectMakeHttpAutoroutingRequest() {
19459
19587
  const { db } = this.root;
@@ -19598,6 +19726,7 @@ var Group6 = class extends NormalComponent3 {
19598
19726
  const hasPhasedAutorouting = Group_hasPhasedAutorouting(routingPhasePlans);
19599
19727
  const outputTraces = [];
19600
19728
  const outputJumpers = [];
19729
+ const existingRerouteSeedTraces = getExistingSimplifiedPcbTracesForReroute(this);
19601
19730
  for (const routingPhasePlan of routingPhasePlans) {
19602
19731
  const phaseAutorouterConfig = routingPhasePlan.autorouter ? getPresetAutoroutingConfig(
19603
19732
  routingPhasePlan.autorouter,
@@ -19609,7 +19738,7 @@ var Group6 = class extends NormalComponent3 {
19609
19738
  );
19610
19739
  const rerouteOriginalSrj = isReroutePhase ? {
19611
19740
  ...baseSimpleRouteJson,
19612
- traces: outputTraces
19741
+ traces: [...existingRerouteSeedTraces, ...outputTraces]
19613
19742
  } : null;
19614
19743
  if (isReroutePhase && rerouteOriginalSrj) {
19615
19744
  simpleRouteJson = getRerouteSimpleRouteJson(
@@ -19633,7 +19762,7 @@ var Group6 = class extends NormalComponent3 {
19633
19762
  simpleRouteJson,
19634
19763
  routingPhasePlan.drcTolerances
19635
19764
  );
19636
- if (hasPhasedAutorouting && simpleRouteJson.connections.length === 0) {
19765
+ if ((hasPhasedAutorouting || isReroutePhase) && simpleRouteJson.connections.length === 0) {
19637
19766
  continue;
19638
19767
  }
19639
19768
  const phaseIsAutoJumperPreset = routingPhasePlan.autorouter !== void 0 ? this._isAutoJumperAutorouter(phaseAutorouterConfig) : isAutoJumperPreset;
@@ -19864,13 +19993,17 @@ var Group6 = class extends NormalComponent3 {
19864
19993
  subcircuit_id: this.subcircuit_id
19865
19994
  });
19866
19995
  }
19996
+ deleteExistingPcbTracesReplacedBy({
19997
+ group: this,
19998
+ outputPcbTraces: output_pcb_traces
19999
+ });
19867
20000
  for (const pcb_trace of output_pcb_traces) {
19868
20001
  if (pcb_trace.type !== "pcb_trace") continue;
19869
- pcb_trace.subcircuit_id = this.subcircuit_id;
19870
- if (pcb_trace.connection_name) {
19871
- const sourceTraceId = pcb_trace.connection_name;
20002
+ const sourceTraceId = pcb_trace.source_trace_id ?? pcb_trace.connection_name;
20003
+ if (sourceTraceId) {
19872
20004
  pcb_trace.source_trace_id = sourceTraceId;
19873
20005
  }
20006
+ pcb_trace.subcircuit_id ??= (sourceTraceId ? db.source_trace.get(sourceTraceId)?.subcircuit_id : void 0) ?? this.subcircuit_id;
19874
20007
  let segments = splitPcbTracesOnJumperSegments(pcb_trace.route);
19875
20008
  if (segments === null) {
19876
20009
  segments = [pcb_trace.route];
@@ -20965,7 +21098,7 @@ import { identity as identity5 } from "transformation-matrix";
20965
21098
  var package_default = {
20966
21099
  name: "@tscircuit/core",
20967
21100
  type: "module",
20968
- version: "0.0.1241",
21101
+ version: "0.0.1242",
20969
21102
  types: "dist/index.d.ts",
20970
21103
  main: "dist/index.js",
20971
21104
  module: "dist/index.js",
@@ -21039,7 +21172,7 @@ var package_default = {
21039
21172
  flatbush: "^4.5.0",
21040
21173
  "graphics-debug": "^0.0.89",
21041
21174
  howfat: "^0.3.8",
21042
- "kicad-to-circuit-json": "^0.0.59",
21175
+ "kicad-to-circuit-json": "^0.0.60",
21043
21176
  kicadts: "^0.0.35",
21044
21177
  "live-server": "^1.2.2",
21045
21178
  "looks-same": "^9.0.1",
@@ -21050,6 +21183,7 @@ var package_default = {
21050
21183
  "react-dom": "^19.1.0",
21051
21184
  "schematic-symbols": "^0.0.208",
21052
21185
  spicey: "^0.0.14",
21186
+ "stack-svgs": "^0.0.1",
21053
21187
  "ts-expect": "^1.3.0",
21054
21188
  tsup: "^8.2.4"
21055
21189
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1242",
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
  },