@tscircuit/core 0.0.1243 → 0.0.1244

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.d.ts CHANGED
@@ -83031,6 +83031,83 @@ declare const pcbTraceProps: z.ZodObject<{
83031
83031
  outer_diameter?: string | number | undefined;
83032
83032
  copper_pour_id?: string | undefined;
83033
83033
  is_inside_copper_pour?: boolean | undefined;
83034
+ }>, z.ZodObject<{
83035
+ route_type: z.ZodLiteral<"through_pad">;
83036
+ start: z.ZodObject<{
83037
+ x: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83038
+ y: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83039
+ }, "strip", z.ZodTypeAny, {
83040
+ x: number;
83041
+ y: number;
83042
+ }, {
83043
+ x: string | number;
83044
+ y: string | number;
83045
+ }>;
83046
+ end: z.ZodObject<{
83047
+ x: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83048
+ y: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83049
+ }, "strip", z.ZodTypeAny, {
83050
+ x: number;
83051
+ y: number;
83052
+ }, {
83053
+ x: string | number;
83054
+ y: string | number;
83055
+ }>;
83056
+ width: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83057
+ start_layer: z.ZodEffects<z.ZodUnion<[z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>, z.ZodObject<{
83058
+ name: z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>;
83059
+ }, "strip", z.ZodTypeAny, {
83060
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83061
+ }, {
83062
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83063
+ }>]>, "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6", "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83064
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83065
+ }>;
83066
+ end_layer: z.ZodEffects<z.ZodUnion<[z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>, z.ZodObject<{
83067
+ name: z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>;
83068
+ }, "strip", z.ZodTypeAny, {
83069
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83070
+ }, {
83071
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83072
+ }>]>, "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6", "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83073
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83074
+ }>;
83075
+ pcb_smtpad_id: z.ZodOptional<z.ZodString>;
83076
+ pcb_plated_hole_id: z.ZodOptional<z.ZodString>;
83077
+ }, "strip", z.ZodTypeAny, {
83078
+ width: number;
83079
+ route_type: "through_pad";
83080
+ start: {
83081
+ x: number;
83082
+ y: number;
83083
+ };
83084
+ end: {
83085
+ x: number;
83086
+ y: number;
83087
+ };
83088
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83089
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83090
+ pcb_plated_hole_id?: string | undefined;
83091
+ pcb_smtpad_id?: string | undefined;
83092
+ }, {
83093
+ width: string | number;
83094
+ route_type: "through_pad";
83095
+ start: {
83096
+ x: string | number;
83097
+ y: string | number;
83098
+ };
83099
+ end: {
83100
+ x: string | number;
83101
+ y: string | number;
83102
+ };
83103
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83104
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83105
+ };
83106
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83107
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83108
+ };
83109
+ pcb_plated_hole_id?: string | undefined;
83110
+ pcb_smtpad_id?: string | undefined;
83034
83111
  }>]>, "many">;
83035
83112
  source_trace_id: z.ZodOptional<z.ZodString>;
83036
83113
  }, "strip", z.ZodTypeAny, {
@@ -83054,6 +83131,21 @@ declare const pcbTraceProps: z.ZodObject<{
83054
83131
  outer_diameter?: number | undefined;
83055
83132
  copper_pour_id?: string | undefined;
83056
83133
  is_inside_copper_pour?: boolean | undefined;
83134
+ } | {
83135
+ width: number;
83136
+ route_type: "through_pad";
83137
+ start: {
83138
+ x: number;
83139
+ y: number;
83140
+ };
83141
+ end: {
83142
+ x: number;
83143
+ y: number;
83144
+ };
83145
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83146
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83147
+ pcb_plated_hole_id?: string | undefined;
83148
+ pcb_smtpad_id?: string | undefined;
83057
83149
  })[];
83058
83150
  source_trace_id?: string | undefined;
83059
83151
  }, {
@@ -83083,6 +83175,25 @@ declare const pcbTraceProps: z.ZodObject<{
83083
83175
  outer_diameter?: string | number | undefined;
83084
83176
  copper_pour_id?: string | undefined;
83085
83177
  is_inside_copper_pour?: boolean | undefined;
83178
+ } | {
83179
+ width: string | number;
83180
+ route_type: "through_pad";
83181
+ start: {
83182
+ x: string | number;
83183
+ y: string | number;
83184
+ };
83185
+ end: {
83186
+ x: string | number;
83187
+ y: string | number;
83188
+ };
83189
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83190
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83191
+ };
83192
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83193
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83194
+ };
83195
+ pcb_plated_hole_id?: string | undefined;
83196
+ pcb_smtpad_id?: string | undefined;
83086
83197
  })[];
83087
83198
  source_trace_id?: string | undefined;
83088
83199
  }>;
@@ -83182,6 +83293,83 @@ declare class PcbTrace extends PrimitiveComponent<typeof pcbTraceProps> {
83182
83293
  outer_diameter?: string | number | undefined;
83183
83294
  copper_pour_id?: string | undefined;
83184
83295
  is_inside_copper_pour?: boolean | undefined;
83296
+ }>, z.ZodObject<{
83297
+ route_type: z.ZodLiteral<"through_pad">;
83298
+ start: z.ZodObject<{
83299
+ x: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83300
+ y: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83301
+ }, "strip", z.ZodTypeAny, {
83302
+ x: number;
83303
+ y: number;
83304
+ }, {
83305
+ x: string | number;
83306
+ y: string | number;
83307
+ }>;
83308
+ end: z.ZodObject<{
83309
+ x: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83310
+ y: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83311
+ }, "strip", z.ZodTypeAny, {
83312
+ x: number;
83313
+ y: number;
83314
+ }, {
83315
+ x: string | number;
83316
+ y: string | number;
83317
+ }>;
83318
+ width: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
83319
+ start_layer: z.ZodEffects<z.ZodUnion<[z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>, z.ZodObject<{
83320
+ name: z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>;
83321
+ }, "strip", z.ZodTypeAny, {
83322
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83323
+ }, {
83324
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83325
+ }>]>, "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6", "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83326
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83327
+ }>;
83328
+ end_layer: z.ZodEffects<z.ZodUnion<[z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>, z.ZodObject<{
83329
+ name: z.ZodEnum<["top", "bottom", "inner1", "inner2", "inner3", "inner4", "inner5", "inner6"]>;
83330
+ }, "strip", z.ZodTypeAny, {
83331
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83332
+ }, {
83333
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83334
+ }>]>, "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6", "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83335
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83336
+ }>;
83337
+ pcb_smtpad_id: z.ZodOptional<z.ZodString>;
83338
+ pcb_plated_hole_id: z.ZodOptional<z.ZodString>;
83339
+ }, "strip", z.ZodTypeAny, {
83340
+ width: number;
83341
+ route_type: "through_pad";
83342
+ start: {
83343
+ x: number;
83344
+ y: number;
83345
+ };
83346
+ end: {
83347
+ x: number;
83348
+ y: number;
83349
+ };
83350
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83351
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83352
+ pcb_plated_hole_id?: string | undefined;
83353
+ pcb_smtpad_id?: string | undefined;
83354
+ }, {
83355
+ width: string | number;
83356
+ route_type: "through_pad";
83357
+ start: {
83358
+ x: string | number;
83359
+ y: string | number;
83360
+ };
83361
+ end: {
83362
+ x: string | number;
83363
+ y: string | number;
83364
+ };
83365
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83366
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83367
+ };
83368
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83369
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83370
+ };
83371
+ pcb_plated_hole_id?: string | undefined;
83372
+ pcb_smtpad_id?: string | undefined;
83185
83373
  }>]>, "many">;
83186
83374
  source_trace_id: z.ZodOptional<z.ZodString>;
83187
83375
  }, "strip", z.ZodTypeAny, {
@@ -83205,6 +83393,21 @@ declare class PcbTrace extends PrimitiveComponent<typeof pcbTraceProps> {
83205
83393
  outer_diameter?: number | undefined;
83206
83394
  copper_pour_id?: string | undefined;
83207
83395
  is_inside_copper_pour?: boolean | undefined;
83396
+ } | {
83397
+ width: number;
83398
+ route_type: "through_pad";
83399
+ start: {
83400
+ x: number;
83401
+ y: number;
83402
+ };
83403
+ end: {
83404
+ x: number;
83405
+ y: number;
83406
+ };
83407
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83408
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83409
+ pcb_plated_hole_id?: string | undefined;
83410
+ pcb_smtpad_id?: string | undefined;
83208
83411
  })[];
83209
83412
  source_trace_id?: string | undefined;
83210
83413
  }, {
@@ -83234,6 +83437,25 @@ declare class PcbTrace extends PrimitiveComponent<typeof pcbTraceProps> {
83234
83437
  outer_diameter?: string | number | undefined;
83235
83438
  copper_pour_id?: string | undefined;
83236
83439
  is_inside_copper_pour?: boolean | undefined;
83440
+ } | {
83441
+ width: string | number;
83442
+ route_type: "through_pad";
83443
+ start: {
83444
+ x: string | number;
83445
+ y: string | number;
83446
+ };
83447
+ end: {
83448
+ x: string | number;
83449
+ y: string | number;
83450
+ };
83451
+ start_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83452
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83453
+ };
83454
+ end_layer: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6" | {
83455
+ name: "top" | "bottom" | "inner1" | "inner2" | "inner3" | "inner4" | "inner5" | "inner6";
83456
+ };
83457
+ pcb_plated_hole_id?: string | undefined;
83458
+ pcb_smtpad_id?: string | undefined;
83237
83459
  })[];
83238
83460
  source_trace_id?: string | undefined;
83239
83461
  }>;
package/dist/index.js CHANGED
@@ -233,9 +233,21 @@ function getDominantDirection(edge) {
233
233
  return delta.y > 0 ? "down" : "up";
234
234
  }
235
235
 
236
+ // lib/utils/pcb-trace-route-point-utils.ts
237
+ var getRoutePointPosition = (point6) => {
238
+ if (point6.route_type === "through_pad") return point6.start;
239
+ return { x: point6.x, y: point6.y };
240
+ };
241
+ var getRoutePointPositions = (point6) => {
242
+ if (point6.route_type === "through_pad") return [point6.start, point6.end];
243
+ return [{ x: point6.x, y: point6.y }];
244
+ };
245
+
236
246
  // lib/utils/autorouting/mergeRoutes.ts
237
247
  function pdist(a, b) {
238
- return Math.hypot(a.x - b.x, a.y - b.y);
248
+ const aPosition = getRoutePointPosition(a);
249
+ const bPosition = getRoutePointPosition(b);
250
+ return Math.hypot(aPosition.x - bPosition.x, aPosition.y - bPosition.y);
239
251
  }
240
252
  var mergeRoutes = (routes) => {
241
253
  if (routes.length === 1) return routes[0];
@@ -2578,8 +2590,10 @@ var isRouteOutsideBoard = ({
2578
2590
  const pcbBoard = db.pcb_board.get(pcbBoardId);
2579
2591
  if (!pcbBoard) return false;
2580
2592
  const boardOutlinePolygon = getPcbBoardOutlinePolygon(pcbBoard);
2581
- return !mergedRoute.flat().every(
2582
- (routePoint) => boardOutlinePolygon.contains(point2(routePoint.x, routePoint.y))
2593
+ return !mergedRoute.flatMap(getRoutePointPositions).every(
2594
+ (routePointPosition) => boardOutlinePolygon.contains(
2595
+ point2(routePointPosition.x, routePointPosition.y)
2596
+ )
2583
2597
  );
2584
2598
  };
2585
2599
 
@@ -3015,11 +3029,29 @@ var getObstaclesFromCircuitJson = (soup, connMap) => {
3015
3029
  }
3016
3030
  } else if (element.type === "pcb_trace") {
3017
3031
  const traceObstacles = getObstaclesFromRoute(
3018
- element.route.map((rp) => ({
3019
- x: rp.x,
3020
- y: rp.y,
3021
- layer: "layer" in rp ? rp.layer : rp.from_layer
3022
- })),
3032
+ element.route.flatMap((rp) => {
3033
+ if (rp.route_type === "through_pad") {
3034
+ return [
3035
+ {
3036
+ x: rp.start.x,
3037
+ y: rp.start.y,
3038
+ layer: rp.start_layer
3039
+ },
3040
+ {
3041
+ x: rp.end.x,
3042
+ y: rp.end.y,
3043
+ layer: rp.end_layer
3044
+ }
3045
+ ];
3046
+ }
3047
+ return [
3048
+ {
3049
+ x: rp.x,
3050
+ y: rp.y,
3051
+ layer: rp.route_type === "wire" ? rp.layer : rp.from_layer
3052
+ }
3053
+ ];
3054
+ }),
3023
3055
  element.source_trace_id
3024
3056
  );
3025
3057
  obstacles.push(...traceObstacles);
@@ -3945,8 +3977,10 @@ function getTraceLength(route) {
3945
3977
  if (point6.route_type === "wire") {
3946
3978
  const nextPoint = route[i + 1];
3947
3979
  if (nextPoint) {
3948
- const dx = nextPoint.x - point6.x;
3949
- const dy = nextPoint.y - point6.y;
3980
+ const nextPosition = getRoutePointPosition(nextPoint);
3981
+ const position = getRoutePointPosition(point6);
3982
+ const dx = nextPosition.x - position.x;
3983
+ const dy = nextPosition.y - position.y;
3950
3984
  totalLength += Math.sqrt(dx * dx + dy * dy);
3951
3985
  }
3952
3986
  } else if (point6.route_type === "via") {
@@ -4631,16 +4665,32 @@ function Trace_doInitialPcbManualTraceRender(trace) {
4631
4665
  const { maybeFlipLayer } = trace._getPcbPrimitiveFlippedHelpers();
4632
4666
  const transform2 = trace._computePcbGlobalTransformBeforeLayout();
4633
4667
  const transformedRoute = inflatedPcbTrace.route.map((point6) => {
4634
- const { x, y, ...restOfPoint } = point6;
4635
- const transformedPoint = applyToPoint2(transform2, { x, y });
4636
- if (point6.route_type === "wire" && point6.layer) {
4668
+ if (point6.route_type === "wire") {
4669
+ const { x, y, ...restOfPoint } = point6;
4670
+ const transformedPoint = applyToPoint2(transform2, { x, y });
4637
4671
  return {
4638
- ...transformedPoint,
4639
4672
  ...restOfPoint,
4673
+ ...transformedPoint,
4640
4674
  layer: maybeFlipLayer(point6.layer)
4641
4675
  };
4642
4676
  }
4643
- return { ...transformedPoint, ...restOfPoint };
4677
+ if (point6.route_type === "via") {
4678
+ const { x, y, ...restOfPoint } = point6;
4679
+ const transformedPoint = applyToPoint2(transform2, { x, y });
4680
+ return {
4681
+ ...restOfPoint,
4682
+ ...transformedPoint,
4683
+ from_layer: maybeFlipLayer(point6.from_layer),
4684
+ to_layer: maybeFlipLayer(point6.to_layer)
4685
+ };
4686
+ }
4687
+ return {
4688
+ ...point6,
4689
+ start: applyToPoint2(transform2, point6.start),
4690
+ end: applyToPoint2(transform2, point6.end),
4691
+ start_layer: maybeFlipLayer(point6.start_layer),
4692
+ end_layer: maybeFlipLayer(point6.end_layer)
4693
+ };
4644
4694
  });
4645
4695
  const pcb_trace2 = db.pcb_trace.insert({
4646
4696
  ...inflatedPcbTrace,
@@ -6906,16 +6956,32 @@ var PcbTrace = class extends PrimitiveComponent2 {
6906
6956
  const { maybeFlipLayer } = this._getPcbPrimitiveFlippedHelpers();
6907
6957
  const parentTransform = this._computePcbGlobalTransformBeforeLayout();
6908
6958
  const transformedRoute = props.route.map((point6) => {
6909
- const { x, y, ...restOfPoint } = point6;
6910
- const transformedPoint = applyToPoint11(parentTransform, { x, y });
6911
- if (point6.route_type === "wire" && point6.layer) {
6959
+ if (point6.route_type === "wire") {
6960
+ const { x, y, ...restOfPoint } = point6;
6961
+ const transformedPoint = applyToPoint11(parentTransform, { x, y });
6912
6962
  return {
6913
- ...transformedPoint,
6914
6963
  ...restOfPoint,
6964
+ ...transformedPoint,
6915
6965
  layer: maybeFlipLayer(point6.layer)
6916
6966
  };
6917
6967
  }
6918
- return { ...transformedPoint, ...restOfPoint };
6968
+ if (point6.route_type === "via") {
6969
+ const { x, y, ...restOfPoint } = point6;
6970
+ const transformedPoint = applyToPoint11(parentTransform, { x, y });
6971
+ return {
6972
+ ...restOfPoint,
6973
+ ...transformedPoint,
6974
+ from_layer: maybeFlipLayer(point6.from_layer),
6975
+ to_layer: maybeFlipLayer(point6.to_layer)
6976
+ };
6977
+ }
6978
+ return {
6979
+ ...point6,
6980
+ start: applyToPoint11(parentTransform, point6.start),
6981
+ end: applyToPoint11(parentTransform, point6.end),
6982
+ start_layer: maybeFlipLayer(point6.start_layer),
6983
+ end_layer: maybeFlipLayer(point6.end_layer)
6984
+ };
6919
6985
  });
6920
6986
  const pcb_trace = db.pcb_trace.insert({
6921
6987
  pcb_component_id: container.pcb_component_id,
@@ -6933,15 +6999,43 @@ var PcbTrace = class extends PrimitiveComponent2 {
6933
6999
  }
6934
7000
  let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
6935
7001
  for (const point6 of props.route) {
6936
- minX = Math.min(minX, point6.x);
6937
- maxX = Math.max(maxX, point6.x);
6938
- minY = Math.min(minY, point6.y);
6939
- maxY = Math.max(maxY, point6.y);
7002
+ if (point6.route_type === "through_pad") {
7003
+ minX = Math.min(minX, point6.start.x, point6.end.x);
7004
+ maxX = Math.max(maxX, point6.start.x, point6.end.x);
7005
+ minY = Math.min(minY, point6.start.y, point6.end.y);
7006
+ maxY = Math.max(maxY, point6.start.y, point6.end.y);
7007
+ } else {
7008
+ minX = Math.min(minX, point6.x);
7009
+ maxX = Math.max(maxX, point6.x);
7010
+ minY = Math.min(minY, point6.y);
7011
+ maxY = Math.max(maxY, point6.y);
7012
+ }
6940
7013
  if (point6.route_type === "wire") {
6941
7014
  minX = Math.min(minX, point6.x - point6.width / 2);
6942
7015
  maxX = Math.max(maxX, point6.x + point6.width / 2);
6943
7016
  minY = Math.min(minY, point6.y - point6.width / 2);
6944
7017
  maxY = Math.max(maxY, point6.y + point6.width / 2);
7018
+ } else if (point6.route_type === "through_pad") {
7019
+ minX = Math.min(
7020
+ minX,
7021
+ point6.start.x - point6.width / 2,
7022
+ point6.end.x - point6.width / 2
7023
+ );
7024
+ maxX = Math.max(
7025
+ maxX,
7026
+ point6.start.x + point6.width / 2,
7027
+ point6.end.x + point6.width / 2
7028
+ );
7029
+ minY = Math.min(
7030
+ minY,
7031
+ point6.start.y - point6.width / 2,
7032
+ point6.end.y - point6.width / 2
7033
+ );
7034
+ maxY = Math.max(
7035
+ maxY,
7036
+ point6.start.y + point6.width / 2,
7037
+ point6.end.y + point6.width / 2
7038
+ );
6945
7039
  }
6946
7040
  }
6947
7041
  if (minX === Infinity || maxX === -Infinity || minY === Infinity || maxY === -Infinity) {
@@ -7793,7 +7887,7 @@ var SilkscreenRect = class extends PrimitiveComponent2 {
7793
7887
  import { silkscreenTextProps } from "@tscircuit/props";
7794
7888
  import {
7795
7889
  applyToPoint as applyToPoint14,
7796
- compose as compose3,
7890
+ compose as compose2,
7797
7891
  decomposeTSR as decomposeTSR5,
7798
7892
  flipY as flipY2,
7799
7893
  identity as identity4
@@ -7850,7 +7944,7 @@ var SilkscreenText = class extends PrimitiveComponent2 {
7850
7944
  const fontSize = props.fontSize ?? resolvedPcbSxFontSize ?? this.getInheritedProperty("pcbStyle")?.silkscreenFontSize ?? this._footprinterFontSize ?? 1;
7851
7945
  const hasResolvedPcbSxPosition = resolvedPcbSxPcbX !== void 0 || resolvedPcbSxPcbY !== void 0;
7852
7946
  const position = hasResolvedPcbSxPosition && this._footprinterFontSize !== void 0 ? applyToPoint14(
7853
- compose3(
7947
+ compose2(
7854
7948
  this.parent?._computePcbGlobalTransformBeforeLayout() ?? identity4(),
7855
7949
  isFlipped ? flipY2() : identity4()
7856
7950
  ),
@@ -9003,7 +9097,7 @@ var SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH = 0.12;
9003
9097
 
9004
9098
  // lib/components/primitive-components/Port/Port.ts
9005
9099
  import "schematic-symbols";
9006
- import { applyToPoint as applyToPoint16, compose as compose4, translate as translate3 } from "transformation-matrix";
9100
+ import { applyToPoint as applyToPoint16, compose as compose3, translate as translate2 } from "transformation-matrix";
9007
9101
  import "zod";
9008
9102
 
9009
9103
  // lib/components/primitive-components/Port/getCenterOfPcbPrimitives.ts
@@ -9250,9 +9344,9 @@ var Port = class extends PrimitiveComponent2 {
9250
9344
  );
9251
9345
  }
9252
9346
  }
9253
- const transform = compose4(
9347
+ const transform = compose3(
9254
9348
  parentNormalComponent.computeSchematicGlobalTransform(),
9255
- translate3(-symbol.center.x, -symbol.center.y)
9349
+ translate2(-symbol.center.x, -symbol.center.y)
9256
9350
  );
9257
9351
  return applyToPoint16(transform, schematicSymbolPortDef);
9258
9352
  }
@@ -12457,7 +12551,6 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
12457
12551
  const cadModel = cadModelProp2 === void 0 ? this._asyncFootprintCadModel : cadModelProp2;
12458
12552
  const footprint = this.getFootprinterString() ?? this._getImpliedFootprintString();
12459
12553
  if (!this.pcb_component_id) return;
12460
- if (!cadModel && !footprint) return;
12461
12554
  if (cadModel === null) return;
12462
12555
  const bounds = this._getPcbCircuitJsonBounds();
12463
12556
  if (typeof cadModel === "string") {
@@ -12486,6 +12579,28 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
12486
12579
  const preLayoutRotation = decomposedTransform.rotation.angle * 180 / Math.PI;
12487
12580
  const totalRotation = pcbComponent?.position_mode === "packed" ? pcbComponent.rotation ?? preLayoutRotation : preLayoutRotation;
12488
12581
  const isBottomLayer = computedLayer === "bottom";
12582
+ if (!cadModel && !footprint) {
12583
+ const cad_component = db.cad_component.insert({
12584
+ position: {
12585
+ x: bounds.center.x,
12586
+ y: bounds.center.y,
12587
+ z: computedLayer === "bottom" ? -boardThickness / 2 : boardThickness / 2
12588
+ },
12589
+ rotation: {
12590
+ x: 0,
12591
+ y: isBottomLayer ? 180 : 0,
12592
+ z: normalizeDegrees2(isBottomLayer ? -totalRotation : totalRotation)
12593
+ },
12594
+ pcb_component_id: this.pcb_component_id,
12595
+ source_component_id: this.source_component_id,
12596
+ model_origin_alignment: "center_of_component_on_board_surface",
12597
+ anchor_alignment: "center_of_component_on_board_surface",
12598
+ show_as_bounding_box: true,
12599
+ show_as_translucent_model: this._parsedProps.showAsTranslucentModel
12600
+ });
12601
+ this.cad_component_id = cad_component.cad_component_id;
12602
+ return;
12603
+ }
12489
12604
  const rotationWithOffset = totalRotation + (rotationOffset.z ?? 0);
12490
12605
  const cadRotationZ = normalizeDegrees2(rotationWithOffset);
12491
12606
  const cad_model = db.cad_component.insert({
@@ -12797,7 +12912,7 @@ import {
12797
12912
  } from "@tscircuit/checks";
12798
12913
  import { getBoundsFromPoints as getBoundsFromPoints5 } from "@tscircuit/math-utils";
12799
12914
  import { boardProps } from "@tscircuit/props";
12800
- import { compose as compose7, translate as translate7 } from "transformation-matrix";
12915
+ import { compose as compose6, translate as translate6 } from "transformation-matrix";
12801
12916
 
12802
12917
  // lib/utils/autorouting/getAncestorSubcircuitIds.ts
12803
12918
  var getDescendantSubcircuitIds = (db, root_subcircuit_id) => {
@@ -12976,7 +13091,7 @@ var Capacitor = class extends NormalComponent3 {
12976
13091
 
12977
13092
  // lib/utils/extractPcbPrimitivesFromCircuitJson.ts
12978
13093
  import { transformPCBElements } from "@tscircuit/circuit-json-util";
12979
- import { compose as compose5, inverse, rotate as rotate2, translate as translate4 } from "transformation-matrix";
13094
+ import { compose as compose4, inverse, rotate as rotate2, translate as translate3 } from "transformation-matrix";
12980
13095
  var extractPcbPrimitivesFromCircuitJson = ({
12981
13096
  pcbComponent,
12982
13097
  db,
@@ -12985,8 +13100,8 @@ var extractPcbPrimitivesFromCircuitJson = ({
12985
13100
  const componentCenter = pcbComponent.center || { x: 0, y: 0 };
12986
13101
  const componentRotation = pcbComponent.rotation || 0;
12987
13102
  const absoluteToComponentRelativeTransform = inverse(
12988
- compose5(
12989
- translate4(componentCenter.x, componentCenter.y),
13103
+ compose4(
13104
+ translate3(componentCenter.x, componentCenter.y),
12990
13105
  rotate2(componentRotation * Math.PI / 180)
12991
13106
  )
12992
13107
  );
@@ -13960,7 +14075,7 @@ var applyEditEventsToManualEditsFile = ({
13960
14075
 
13961
14076
  // lib/utils/edit-events/apply-edit-events-to-circuit-json.ts
13962
14077
  import { transformPCBElement } from "@tscircuit/circuit-json-util";
13963
- import { translate as translate5 } from "transformation-matrix";
14078
+ import { translate as translate4 } from "transformation-matrix";
13964
14079
 
13965
14080
  // lib/utils/edit-events/apply-trace-hint-edit-event.ts
13966
14081
  import { su as su3 } from "@tscircuit/circuit-json-util";
@@ -14005,7 +14120,7 @@ var applyEditEvents = ({
14005
14120
  );
14006
14121
  const needsMovement = !component || component.center.x !== editEvent.new_center.x || component.center.y !== editEvent.new_center.y;
14007
14122
  if (needsMovement && editEvent.original_center) {
14008
- const mat = translate5(
14123
+ const mat = translate4(
14009
14124
  editEvent.new_center.x - editEvent.original_center.x,
14010
14125
  editEvent.new_center.y - editEvent.original_center.y
14011
14126
  );
@@ -15716,7 +15831,7 @@ var applyComponentConstraintClusters = (group, packInput) => {
15716
15831
  };
15717
15832
 
15718
15833
  // lib/components/primitive-components/Group/Group_doInitialPcbLayoutPack/applyPackOutput.ts
15719
- import { translate as translate6, rotate as rotate3, compose as compose6 } from "transformation-matrix";
15834
+ import { translate as translate5, rotate as rotate3, compose as compose5 } from "transformation-matrix";
15720
15835
  import {
15721
15836
  transformPCBElements as transformPCBElements2
15722
15837
  } from "@tscircuit/circuit-json-util";
@@ -15771,11 +15886,11 @@ var applyPackOutput = (group, packOutput, clusterMap) => {
15771
15886
  const member = db.pcb_component.get(memberId);
15772
15887
  if (!member) continue;
15773
15888
  const originalCenter2 = member.center;
15774
- const transformMatrix2 = compose6(
15889
+ const transformMatrix2 = compose5(
15775
15890
  group._computePcbGlobalTransformBeforeLayout(),
15776
- translate6(center.x + rotatedRel.x, center.y + rotatedRel.y),
15891
+ translate5(center.x + rotatedRel.x, center.y + rotatedRel.y),
15777
15892
  rotate3(angleRad),
15778
- translate6(-originalCenter2.x, -originalCenter2.y)
15893
+ translate5(-originalCenter2.x, -originalCenter2.y)
15779
15894
  );
15780
15895
  const related = db.toArray().filter(
15781
15896
  (elm) => "pcb_component_id" in elm && elm.pcb_component_id === memberId
@@ -15805,11 +15920,11 @@ var applyPackOutput = (group, packOutput, clusterMap) => {
15805
15920
  }
15806
15921
  const originalCenter2 = pcbComponent.center;
15807
15922
  const rotationDegrees2 = ccwRotationDegrees ?? ccwRotationOffset ?? 0;
15808
- const transformMatrix2 = compose6(
15923
+ const transformMatrix2 = compose5(
15809
15924
  group._computePcbGlobalTransformBeforeLayout(),
15810
- translate6(center.x, center.y),
15925
+ translate5(center.x, center.y),
15811
15926
  rotate3(rotationDegrees2 * Math.PI / 180),
15812
- translate6(-originalCenter2.x, -originalCenter2.y)
15927
+ translate5(-originalCenter2.x, -originalCenter2.y)
15813
15928
  );
15814
15929
  const related = db.toArray().filter(
15815
15930
  (elm) => "pcb_component_id" in elm && elm.pcb_component_id === componentId
@@ -15827,11 +15942,11 @@ var applyPackOutput = (group, packOutput, clusterMap) => {
15827
15942
  if (!pcbGroup) continue;
15828
15943
  const originalCenter = pcbGroup.center;
15829
15944
  const rotationDegrees = ccwRotationDegrees ?? ccwRotationOffset ?? 0;
15830
- const transformMatrix = compose6(
15945
+ const transformMatrix = compose5(
15831
15946
  group._computePcbGlobalTransformBeforeLayout(),
15832
- translate6(center.x, center.y),
15947
+ translate5(center.x, center.y),
15833
15948
  rotate3(rotationDegrees * Math.PI / 180),
15834
- translate6(-originalCenter.x, -originalCenter.y)
15949
+ translate5(-originalCenter.x, -originalCenter.y)
15835
15950
  );
15836
15951
  const relatedElements = db.toArray().filter((elm) => {
15837
15952
  if ("source_group_id" in elm && elm.source_group_id) {
@@ -20778,8 +20893,11 @@ function pcbTraceRouteToPcbPath(route) {
20778
20893
  const firstPoint = route[0];
20779
20894
  const lastPoint = route[route.length - 1];
20780
20895
  return route.slice(1, -1).filter((point6) => {
20781
- const isSameAsFirst = point6.x === firstPoint.x && point6.y === firstPoint.y;
20782
- const isSameAsLast = point6.x === lastPoint.x && point6.y === lastPoint.y;
20896
+ const position = getRoutePointPosition(point6);
20897
+ const firstPosition = getRoutePointPosition(firstPoint);
20898
+ const lastPosition = getRoutePointPosition(lastPoint);
20899
+ const isSameAsFirst = position.x === firstPosition.x && position.y === firstPosition.y;
20900
+ const isSameAsLast = position.x === lastPosition.x && position.y === lastPosition.y;
20783
20901
  return !isSameAsFirst && !isSameAsLast;
20784
20902
  }).map((point6) => {
20785
20903
  if (point6.route_type === "via") {
@@ -20791,7 +20909,8 @@ function pcbTraceRouteToPcbPath(route) {
20791
20909
  toLayer: point6.to_layer
20792
20910
  };
20793
20911
  }
20794
- return { x: point6.x, y: point6.y };
20912
+ const position = getRoutePointPosition(point6);
20913
+ return { x: position.x, y: position.y };
20795
20914
  });
20796
20915
  }
20797
20916
 
@@ -21098,7 +21217,7 @@ import { identity as identity5 } from "transformation-matrix";
21098
21217
  var package_default = {
21099
21218
  name: "@tscircuit/core",
21100
21219
  type: "module",
21101
- version: "0.0.1242",
21220
+ version: "0.0.1243",
21102
21221
  types: "dist/index.d.ts",
21103
21222
  main: "dist/index.js",
21104
21223
  module: "dist/index.js",
@@ -21158,7 +21277,7 @@ var package_default = {
21158
21277
  "bun-match-svg": "0.0.12",
21159
21278
  "calculate-elbow": "^0.0.12",
21160
21279
  "chokidar-cli": "^3.0.0",
21161
- "circuit-json": "^0.0.423",
21280
+ "circuit-json": "^0.0.425",
21162
21281
  "circuit-json-to-bpc": "^0.0.13",
21163
21282
  "circuit-json-to-connectivity-map": "^0.0.23",
21164
21283
  "circuit-json-to-gltf": "^0.0.96",
@@ -21750,9 +21869,9 @@ var Board = class extends Group6 {
21750
21869
  _computePcbGlobalTransformBeforeLayout() {
21751
21870
  if (this._panelPositionOffset) {
21752
21871
  const parentTransform = this.parent?._computePcbGlobalTransformBeforeLayout?.() ?? { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };
21753
- return compose7(
21872
+ return compose6(
21754
21873
  parentTransform,
21755
- translate7(this._panelPositionOffset.x, this._panelPositionOffset.y)
21874
+ translate6(this._panelPositionOffset.x, this._panelPositionOffset.y)
21756
21875
  );
21757
21876
  }
21758
21877
  return super._computePcbGlobalTransformBeforeLayout();
@@ -22270,7 +22389,7 @@ import { distance as distance13 } from "circuit-json";
22270
22389
  // lib/components/normal-components/Subpanel.ts
22271
22390
  import { subpanelProps } from "@tscircuit/props";
22272
22391
  import { distance as distance12 } from "circuit-json";
22273
- import { compose as compose8, identity as identity6, translate as translate8 } from "transformation-matrix";
22392
+ import { compose as compose7, identity as identity6, translate as translate7 } from "transformation-matrix";
22274
22393
 
22275
22394
  // lib/utils/panels/generate-panel-tabs-and-mouse-bites.ts
22276
22395
  import * as Flatten from "@flatten-js/core";
@@ -22731,9 +22850,9 @@ var Subpanel = class _Subpanel extends Group6 {
22731
22850
  _computePcbGlobalTransformBeforeLayout() {
22732
22851
  if (this._panelPositionOffset) {
22733
22852
  const parentTransform = this.parent?._computePcbGlobalTransformBeforeLayout?.() ?? identity6();
22734
- return compose8(
22853
+ return compose7(
22735
22854
  parentTransform,
22736
- translate8(this._panelPositionOffset.x, this._panelPositionOffset.y)
22855
+ translate7(this._panelPositionOffset.x, this._panelPositionOffset.y)
22737
22856
  );
22738
22857
  }
22739
22858
  return super._computePcbGlobalTransformBeforeLayout();
@@ -24222,7 +24341,7 @@ import { netLabelProps } from "@tscircuit/props";
24222
24341
  import {
24223
24342
  applyToPoint as applyToPoint20,
24224
24343
  identity as identity7,
24225
- translate as translate9
24344
+ translate as translate8
24226
24345
  } from "transformation-matrix";
24227
24346
  import { calculateElbow as calculateElbow2 } from "calculate-elbow";
24228
24347
  var NetLabel = class extends PrimitiveComponent2 {
@@ -24275,7 +24394,7 @@ var NetLabel = class extends PrimitiveComponent2 {
24275
24394
  this.parent?.computeSchematicGlobalTransform?.() ?? identity7(),
24276
24395
  { x: 0, y: 0 }
24277
24396
  );
24278
- return translate9(portPos.x - parentCenter.x, portPos.y - parentCenter.y);
24397
+ return translate8(portPos.x - parentCenter.x, portPos.y - parentCenter.y);
24279
24398
  }
24280
24399
  }
24281
24400
  return super.computeSchematicPropsTransform();
@@ -26954,7 +27073,7 @@ var SchematicCell = class extends PrimitiveComponent2 {
26954
27073
 
26955
27074
  // lib/components/primitive-components/Symbol/Symbol.ts
26956
27075
  import { symbolProps } from "@tscircuit/props";
26957
- import { compose as compose9, translate as translate10, scale as scale2 } from "transformation-matrix";
27076
+ import { compose as compose8, translate as translate9, scale } from "transformation-matrix";
26958
27077
  var SymbolComponent = class extends PrimitiveComponent2 {
26959
27078
  isPrimitiveContainer = true;
26960
27079
  schematic_symbol_id;
@@ -27064,10 +27183,10 @@ var SymbolComponent = class extends PrimitiveComponent2 {
27064
27183
  const scaleX = targetWidth !== void 0 && currentWidth > 0 ? targetWidth / currentWidth : 1;
27065
27184
  const scaleY = targetHeight !== void 0 && currentHeight > 0 ? targetHeight / currentHeight : 1;
27066
27185
  const globalPos = this._getGlobalSchematicPositionBeforeLayout();
27067
- this.userCoordinateToResizedSymbolTransformMat = compose9(
27068
- translate10(globalPos.x, globalPos.y),
27069
- scale2(scaleX, scaleY),
27070
- translate10(-currentCenterX, -currentCenterY)
27186
+ this.userCoordinateToResizedSymbolTransformMat = compose8(
27187
+ translate9(globalPos.x, globalPos.y),
27188
+ scale(scaleX, scaleY),
27189
+ translate9(-currentCenterX, -currentCenterY)
27071
27190
  );
27072
27191
  }
27073
27192
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.1243",
4
+ "version": "0.0.1244",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -61,7 +61,7 @@
61
61
  "bun-match-svg": "0.0.12",
62
62
  "calculate-elbow": "^0.0.12",
63
63
  "chokidar-cli": "^3.0.0",
64
- "circuit-json": "^0.0.423",
64
+ "circuit-json": "^0.0.425",
65
65
  "circuit-json-to-bpc": "^0.0.13",
66
66
  "circuit-json-to-connectivity-map": "^0.0.23",
67
67
  "circuit-json-to-gltf": "^0.0.96",