@tscircuit/core 0.0.1243 → 0.0.1245

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
  }
@@ -11428,7 +11522,6 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
11428
11522
  *
11429
11523
  */
11430
11524
  initPorts(opts = {}) {
11431
- if (this.root?.schematicDisabled) return;
11432
11525
  this._inferredInternallyConnectedPinNames = [];
11433
11526
  const { config } = this;
11434
11527
  const portsToCreate = [];
@@ -12457,7 +12550,6 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
12457
12550
  const cadModel = cadModelProp2 === void 0 ? this._asyncFootprintCadModel : cadModelProp2;
12458
12551
  const footprint = this.getFootprinterString() ?? this._getImpliedFootprintString();
12459
12552
  if (!this.pcb_component_id) return;
12460
- if (!cadModel && !footprint) return;
12461
12553
  if (cadModel === null) return;
12462
12554
  const bounds = this._getPcbCircuitJsonBounds();
12463
12555
  if (typeof cadModel === "string") {
@@ -12486,6 +12578,28 @@ var NormalComponent3 = class extends PrimitiveComponent2 {
12486
12578
  const preLayoutRotation = decomposedTransform.rotation.angle * 180 / Math.PI;
12487
12579
  const totalRotation = pcbComponent?.position_mode === "packed" ? pcbComponent.rotation ?? preLayoutRotation : preLayoutRotation;
12488
12580
  const isBottomLayer = computedLayer === "bottom";
12581
+ if (!cadModel && !footprint) {
12582
+ const cad_component = db.cad_component.insert({
12583
+ position: {
12584
+ x: bounds.center.x,
12585
+ y: bounds.center.y,
12586
+ z: computedLayer === "bottom" ? -boardThickness / 2 : boardThickness / 2
12587
+ },
12588
+ rotation: {
12589
+ x: 0,
12590
+ y: isBottomLayer ? 180 : 0,
12591
+ z: normalizeDegrees2(isBottomLayer ? -totalRotation : totalRotation)
12592
+ },
12593
+ pcb_component_id: this.pcb_component_id,
12594
+ source_component_id: this.source_component_id,
12595
+ model_origin_alignment: "center_of_component_on_board_surface",
12596
+ anchor_alignment: "center_of_component_on_board_surface",
12597
+ show_as_bounding_box: true,
12598
+ show_as_translucent_model: this._parsedProps.showAsTranslucentModel
12599
+ });
12600
+ this.cad_component_id = cad_component.cad_component_id;
12601
+ return;
12602
+ }
12489
12603
  const rotationWithOffset = totalRotation + (rotationOffset.z ?? 0);
12490
12604
  const cadRotationZ = normalizeDegrees2(rotationWithOffset);
12491
12605
  const cad_model = db.cad_component.insert({
@@ -12797,7 +12911,7 @@ import {
12797
12911
  } from "@tscircuit/checks";
12798
12912
  import { getBoundsFromPoints as getBoundsFromPoints5 } from "@tscircuit/math-utils";
12799
12913
  import { boardProps } from "@tscircuit/props";
12800
- import { compose as compose7, translate as translate7 } from "transformation-matrix";
12914
+ import { compose as compose6, translate as translate6 } from "transformation-matrix";
12801
12915
 
12802
12916
  // lib/utils/autorouting/getAncestorSubcircuitIds.ts
12803
12917
  var getDescendantSubcircuitIds = (db, root_subcircuit_id) => {
@@ -12976,7 +13090,7 @@ var Capacitor = class extends NormalComponent3 {
12976
13090
 
12977
13091
  // lib/utils/extractPcbPrimitivesFromCircuitJson.ts
12978
13092
  import { transformPCBElements } from "@tscircuit/circuit-json-util";
12979
- import { compose as compose5, inverse, rotate as rotate2, translate as translate4 } from "transformation-matrix";
13093
+ import { compose as compose4, inverse, rotate as rotate2, translate as translate3 } from "transformation-matrix";
12980
13094
  var extractPcbPrimitivesFromCircuitJson = ({
12981
13095
  pcbComponent,
12982
13096
  db,
@@ -12985,8 +13099,8 @@ var extractPcbPrimitivesFromCircuitJson = ({
12985
13099
  const componentCenter = pcbComponent.center || { x: 0, y: 0 };
12986
13100
  const componentRotation = pcbComponent.rotation || 0;
12987
13101
  const absoluteToComponentRelativeTransform = inverse(
12988
- compose5(
12989
- translate4(componentCenter.x, componentCenter.y),
13102
+ compose4(
13103
+ translate3(componentCenter.x, componentCenter.y),
12990
13104
  rotate2(componentRotation * Math.PI / 180)
12991
13105
  )
12992
13106
  );
@@ -13960,7 +14074,7 @@ var applyEditEventsToManualEditsFile = ({
13960
14074
 
13961
14075
  // lib/utils/edit-events/apply-edit-events-to-circuit-json.ts
13962
14076
  import { transformPCBElement } from "@tscircuit/circuit-json-util";
13963
- import { translate as translate5 } from "transformation-matrix";
14077
+ import { translate as translate4 } from "transformation-matrix";
13964
14078
 
13965
14079
  // lib/utils/edit-events/apply-trace-hint-edit-event.ts
13966
14080
  import { su as su3 } from "@tscircuit/circuit-json-util";
@@ -14005,7 +14119,7 @@ var applyEditEvents = ({
14005
14119
  );
14006
14120
  const needsMovement = !component || component.center.x !== editEvent.new_center.x || component.center.y !== editEvent.new_center.y;
14007
14121
  if (needsMovement && editEvent.original_center) {
14008
- const mat = translate5(
14122
+ const mat = translate4(
14009
14123
  editEvent.new_center.x - editEvent.original_center.x,
14010
14124
  editEvent.new_center.y - editEvent.original_center.y
14011
14125
  );
@@ -15716,7 +15830,7 @@ var applyComponentConstraintClusters = (group, packInput) => {
15716
15830
  };
15717
15831
 
15718
15832
  // lib/components/primitive-components/Group/Group_doInitialPcbLayoutPack/applyPackOutput.ts
15719
- import { translate as translate6, rotate as rotate3, compose as compose6 } from "transformation-matrix";
15833
+ import { translate as translate5, rotate as rotate3, compose as compose5 } from "transformation-matrix";
15720
15834
  import {
15721
15835
  transformPCBElements as transformPCBElements2
15722
15836
  } from "@tscircuit/circuit-json-util";
@@ -15771,11 +15885,11 @@ var applyPackOutput = (group, packOutput, clusterMap) => {
15771
15885
  const member = db.pcb_component.get(memberId);
15772
15886
  if (!member) continue;
15773
15887
  const originalCenter2 = member.center;
15774
- const transformMatrix2 = compose6(
15888
+ const transformMatrix2 = compose5(
15775
15889
  group._computePcbGlobalTransformBeforeLayout(),
15776
- translate6(center.x + rotatedRel.x, center.y + rotatedRel.y),
15890
+ translate5(center.x + rotatedRel.x, center.y + rotatedRel.y),
15777
15891
  rotate3(angleRad),
15778
- translate6(-originalCenter2.x, -originalCenter2.y)
15892
+ translate5(-originalCenter2.x, -originalCenter2.y)
15779
15893
  );
15780
15894
  const related = db.toArray().filter(
15781
15895
  (elm) => "pcb_component_id" in elm && elm.pcb_component_id === memberId
@@ -15805,11 +15919,11 @@ var applyPackOutput = (group, packOutput, clusterMap) => {
15805
15919
  }
15806
15920
  const originalCenter2 = pcbComponent.center;
15807
15921
  const rotationDegrees2 = ccwRotationDegrees ?? ccwRotationOffset ?? 0;
15808
- const transformMatrix2 = compose6(
15922
+ const transformMatrix2 = compose5(
15809
15923
  group._computePcbGlobalTransformBeforeLayout(),
15810
- translate6(center.x, center.y),
15924
+ translate5(center.x, center.y),
15811
15925
  rotate3(rotationDegrees2 * Math.PI / 180),
15812
- translate6(-originalCenter2.x, -originalCenter2.y)
15926
+ translate5(-originalCenter2.x, -originalCenter2.y)
15813
15927
  );
15814
15928
  const related = db.toArray().filter(
15815
15929
  (elm) => "pcb_component_id" in elm && elm.pcb_component_id === componentId
@@ -15827,11 +15941,11 @@ var applyPackOutput = (group, packOutput, clusterMap) => {
15827
15941
  if (!pcbGroup) continue;
15828
15942
  const originalCenter = pcbGroup.center;
15829
15943
  const rotationDegrees = ccwRotationDegrees ?? ccwRotationOffset ?? 0;
15830
- const transformMatrix = compose6(
15944
+ const transformMatrix = compose5(
15831
15945
  group._computePcbGlobalTransformBeforeLayout(),
15832
- translate6(center.x, center.y),
15946
+ translate5(center.x, center.y),
15833
15947
  rotate3(rotationDegrees * Math.PI / 180),
15834
- translate6(-originalCenter.x, -originalCenter.y)
15948
+ translate5(-originalCenter.x, -originalCenter.y)
15835
15949
  );
15836
15950
  const relatedElements = db.toArray().filter((elm) => {
15837
15951
  if ("source_group_id" in elm && elm.source_group_id) {
@@ -20778,8 +20892,11 @@ function pcbTraceRouteToPcbPath(route) {
20778
20892
  const firstPoint = route[0];
20779
20893
  const lastPoint = route[route.length - 1];
20780
20894
  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;
20895
+ const position = getRoutePointPosition(point6);
20896
+ const firstPosition = getRoutePointPosition(firstPoint);
20897
+ const lastPosition = getRoutePointPosition(lastPoint);
20898
+ const isSameAsFirst = position.x === firstPosition.x && position.y === firstPosition.y;
20899
+ const isSameAsLast = position.x === lastPosition.x && position.y === lastPosition.y;
20783
20900
  return !isSameAsFirst && !isSameAsLast;
20784
20901
  }).map((point6) => {
20785
20902
  if (point6.route_type === "via") {
@@ -20791,7 +20908,8 @@ function pcbTraceRouteToPcbPath(route) {
20791
20908
  toLayer: point6.to_layer
20792
20909
  };
20793
20910
  }
20794
- return { x: point6.x, y: point6.y };
20911
+ const position = getRoutePointPosition(point6);
20912
+ return { x: position.x, y: position.y };
20795
20913
  });
20796
20914
  }
20797
20915
 
@@ -21098,7 +21216,7 @@ import { identity as identity5 } from "transformation-matrix";
21098
21216
  var package_default = {
21099
21217
  name: "@tscircuit/core",
21100
21218
  type: "module",
21101
- version: "0.0.1242",
21219
+ version: "0.0.1244",
21102
21220
  types: "dist/index.d.ts",
21103
21221
  main: "dist/index.js",
21104
21222
  module: "dist/index.js",
@@ -21158,7 +21276,7 @@ var package_default = {
21158
21276
  "bun-match-svg": "0.0.12",
21159
21277
  "calculate-elbow": "^0.0.12",
21160
21278
  "chokidar-cli": "^3.0.0",
21161
- "circuit-json": "^0.0.423",
21279
+ "circuit-json": "^0.0.425",
21162
21280
  "circuit-json-to-bpc": "^0.0.13",
21163
21281
  "circuit-json-to-connectivity-map": "^0.0.23",
21164
21282
  "circuit-json-to-gltf": "^0.0.96",
@@ -21750,9 +21868,9 @@ var Board = class extends Group6 {
21750
21868
  _computePcbGlobalTransformBeforeLayout() {
21751
21869
  if (this._panelPositionOffset) {
21752
21870
  const parentTransform = this.parent?._computePcbGlobalTransformBeforeLayout?.() ?? { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };
21753
- return compose7(
21871
+ return compose6(
21754
21872
  parentTransform,
21755
- translate7(this._panelPositionOffset.x, this._panelPositionOffset.y)
21873
+ translate6(this._panelPositionOffset.x, this._panelPositionOffset.y)
21756
21874
  );
21757
21875
  }
21758
21876
  return super._computePcbGlobalTransformBeforeLayout();
@@ -22270,7 +22388,7 @@ import { distance as distance13 } from "circuit-json";
22270
22388
  // lib/components/normal-components/Subpanel.ts
22271
22389
  import { subpanelProps } from "@tscircuit/props";
22272
22390
  import { distance as distance12 } from "circuit-json";
22273
- import { compose as compose8, identity as identity6, translate as translate8 } from "transformation-matrix";
22391
+ import { compose as compose7, identity as identity6, translate as translate7 } from "transformation-matrix";
22274
22392
 
22275
22393
  // lib/utils/panels/generate-panel-tabs-and-mouse-bites.ts
22276
22394
  import * as Flatten from "@flatten-js/core";
@@ -22731,9 +22849,9 @@ var Subpanel = class _Subpanel extends Group6 {
22731
22849
  _computePcbGlobalTransformBeforeLayout() {
22732
22850
  if (this._panelPositionOffset) {
22733
22851
  const parentTransform = this.parent?._computePcbGlobalTransformBeforeLayout?.() ?? identity6();
22734
- return compose8(
22852
+ return compose7(
22735
22853
  parentTransform,
22736
- translate8(this._panelPositionOffset.x, this._panelPositionOffset.y)
22854
+ translate7(this._panelPositionOffset.x, this._panelPositionOffset.y)
22737
22855
  );
22738
22856
  }
22739
22857
  return super._computePcbGlobalTransformBeforeLayout();
@@ -24222,7 +24340,7 @@ import { netLabelProps } from "@tscircuit/props";
24222
24340
  import {
24223
24341
  applyToPoint as applyToPoint20,
24224
24342
  identity as identity7,
24225
- translate as translate9
24343
+ translate as translate8
24226
24344
  } from "transformation-matrix";
24227
24345
  import { calculateElbow as calculateElbow2 } from "calculate-elbow";
24228
24346
  var NetLabel = class extends PrimitiveComponent2 {
@@ -24275,7 +24393,7 @@ var NetLabel = class extends PrimitiveComponent2 {
24275
24393
  this.parent?.computeSchematicGlobalTransform?.() ?? identity7(),
24276
24394
  { x: 0, y: 0 }
24277
24395
  );
24278
- return translate9(portPos.x - parentCenter.x, portPos.y - parentCenter.y);
24396
+ return translate8(portPos.x - parentCenter.x, portPos.y - parentCenter.y);
24279
24397
  }
24280
24398
  }
24281
24399
  return super.computeSchematicPropsTransform();
@@ -26954,7 +27072,7 @@ var SchematicCell = class extends PrimitiveComponent2 {
26954
27072
 
26955
27073
  // lib/components/primitive-components/Symbol/Symbol.ts
26956
27074
  import { symbolProps } from "@tscircuit/props";
26957
- import { compose as compose9, translate as translate10, scale as scale2 } from "transformation-matrix";
27075
+ import { compose as compose8, translate as translate9, scale } from "transformation-matrix";
26958
27076
  var SymbolComponent = class extends PrimitiveComponent2 {
26959
27077
  isPrimitiveContainer = true;
26960
27078
  schematic_symbol_id;
@@ -27064,10 +27182,10 @@ var SymbolComponent = class extends PrimitiveComponent2 {
27064
27182
  const scaleX = targetWidth !== void 0 && currentWidth > 0 ? targetWidth / currentWidth : 1;
27065
27183
  const scaleY = targetHeight !== void 0 && currentHeight > 0 ? targetHeight / currentHeight : 1;
27066
27184
  const globalPos = this._getGlobalSchematicPositionBeforeLayout();
27067
- this.userCoordinateToResizedSymbolTransformMat = compose9(
27068
- translate10(globalPos.x, globalPos.y),
27069
- scale2(scaleX, scaleY),
27070
- translate10(-currentCenterX, -currentCenterY)
27185
+ this.userCoordinateToResizedSymbolTransformMat = compose8(
27186
+ translate9(globalPos.x, globalPos.y),
27187
+ scale(scaleX, scaleY),
27188
+ translate9(-currentCenterX, -currentCenterY)
27071
27189
  );
27072
27190
  }
27073
27191
  };
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.1245",
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",