@tscircuit/core 0.0.102 → 0.0.103

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
@@ -2762,6 +2762,20 @@ declare class TraceHint extends PrimitiveComponent<typeof traceHintProps> {
2762
2762
  doInitialPcbTraceHintRender(): void;
2763
2763
  }
2764
2764
 
2765
+ /**
2766
+ * Get the dimensions of a schematic box based on the provided parameters.
2767
+ *
2768
+ * A schematic box is a rectangular box with a set of pins on the sides.
2769
+ *
2770
+ * The user can customize the position of the pins and the spacing between them,
2771
+ * this makes computing the box fairly complicated.
2772
+ *
2773
+ * A note on the internals:
2774
+ * * A "true port" refers to a pin/port before it's remapped by the user to a
2775
+ * different position. True Pin 1 is guaranteed to be in the top-left corner
2776
+ * * We basically iterate over each side and compute how far we are from the
2777
+ * edge for that side by adding margins together
2778
+ */
2765
2779
  interface SchematicBoxDimensions {
2766
2780
  pinCount: number;
2767
2781
  getPortPositionByPinNumber(pinNumber: number): {
package/dist/index.js CHANGED
@@ -3231,7 +3231,7 @@ function isExplicitPinMappingArrangement(arrangement) {
3231
3231
  return arrangement.leftSide !== void 0;
3232
3232
  }
3233
3233
  var getAllDimensionsForSchematicBox = (params) => {
3234
- const portDistanceFromEdge = params.portDistanceFromEdge ?? params.schPinSpacing * 2;
3234
+ const componentMargin = params.schPinSpacing;
3235
3235
  let sidePinCounts = params.schPortArrangement ? getSizeOfSidesFromPortArrangement(params.schPortArrangement) : null;
3236
3236
  const sideLengths = {
3237
3237
  left: 0,
@@ -3242,7 +3242,7 @@ var getAllDimensionsForSchematicBox = (params) => {
3242
3242
  let pinCount = params.pinCount ?? null;
3243
3243
  if (pinCount === null) {
3244
3244
  if (sidePinCounts) {
3245
- pinCount = sidePinCounts.leftSize + sidePinCounts.rightSize + sidePinCounts.topSize;
3245
+ pinCount = sidePinCounts.leftSize + sidePinCounts.rightSize + sidePinCounts.topSize + sidePinCounts.bottomSize;
3246
3246
  } else {
3247
3247
  throw new Error("Could not determine pin count for the schematic box");
3248
3248
  }
@@ -3264,139 +3264,135 @@ var getAllDimensionsForSchematicBox = (params) => {
3264
3264
  bottomSize: 0
3265
3265
  };
3266
3266
  }
3267
+ const schWidth = params.schWidth ?? Math.max(sidePinCounts.topSize, sidePinCounts.bottomSize) * params.schPinSpacing + 2 * componentMargin;
3268
+ const schHeight = params.schHeight ?? Math.max(sidePinCounts.leftSize, sidePinCounts.rightSize) * params.schPinSpacing + 2 * componentMargin;
3269
+ const distributePorts = (sideSize, sideLength, totalMargin) => {
3270
+ if (sideSize <= 1) return 0;
3271
+ return (sideLength - totalMargin) / (sideSize - 1);
3272
+ };
3267
3273
  const orderedTruePorts = [];
3268
- let currentDistanceFromEdge = 0;
3269
3274
  let truePinIndex = 0;
3270
- for (let sideIndex = 0; sideIndex < sidePinCounts.leftSize; sideIndex++) {
3271
- const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement?.leftSide?.pins[sideIndex] : truePinIndex + 1;
3272
- const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
3273
- if (pinStyle?.topMargin) {
3274
- currentDistanceFromEdge += pinStyle.topMargin;
3275
- }
3276
- orderedTruePorts.push({
3277
- trueIndex: truePinIndex,
3278
- pinNumber,
3279
- side: "left",
3280
- distanceFromEdge: currentDistanceFromEdge
3281
- });
3282
- if (pinStyle?.bottomMargin) {
3283
- currentDistanceFromEdge += pinStyle.bottomMargin;
3275
+ const processSide = (side, pins, direction) => {
3276
+ const isVertical = side === "left" || side === "right";
3277
+ const sideLength = isVertical ? schHeight : schWidth;
3278
+ let totalMargin = 0;
3279
+ for (const pin of pins) {
3280
+ const pinStyle = params.schPinStyle?.[`pin${pin}`] ?? params.schPinStyle?.[pin];
3281
+ if (pinStyle) {
3282
+ if (isVertical) {
3283
+ totalMargin += (pinStyle.topMargin ?? 0) + (pinStyle.bottomMargin ?? 0);
3284
+ } else {
3285
+ totalMargin += (pinStyle.leftMargin ?? 0) + (pinStyle.rightMargin ?? 0);
3286
+ }
3287
+ }
3284
3288
  }
3285
- const isLastPinOnSide = sideIndex === sidePinCounts.leftSize - 1;
3286
- if (!isLastPinOnSide) {
3287
- currentDistanceFromEdge += params.schPinSpacing;
3288
- } else {
3289
- sideLengths.left = currentDistanceFromEdge;
3290
- }
3291
- truePinIndex++;
3292
- }
3293
- currentDistanceFromEdge = 0;
3294
- for (let sideIndex = 0; sideIndex < sidePinCounts.bottomSize; sideIndex++) {
3295
- const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement.bottomSide?.pins[sideIndex] : truePinIndex + 1;
3296
- const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
3297
- if (pinStyle?.leftMargin) {
3298
- currentDistanceFromEdge += pinStyle.leftMargin;
3299
- }
3300
- orderedTruePorts.push({
3301
- trueIndex: truePinIndex,
3302
- pinNumber,
3303
- side: "bottom",
3304
- distanceFromEdge: currentDistanceFromEdge
3289
+ const spacing = distributePorts(
3290
+ pins.length,
3291
+ sideLength - 2 * componentMargin,
3292
+ totalMargin
3293
+ );
3294
+ let currentDistanceFromEdge = componentMargin;
3295
+ pins.forEach((pinNumber, index) => {
3296
+ const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
3297
+ if (pinStyle) {
3298
+ if (isVertical) {
3299
+ if (side === "left") {
3300
+ currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.topMargin ?? 0 : pinStyle.bottomMargin ?? 0;
3301
+ } else {
3302
+ currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.bottomMargin ?? 0 : pinStyle.topMargin ?? 0;
3303
+ }
3304
+ } else {
3305
+ if (side === "top") {
3306
+ currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.leftMargin ?? 0 : pinStyle.rightMargin ?? 0;
3307
+ } else {
3308
+ currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.rightMargin ?? 0 : pinStyle.leftMargin ?? 0;
3309
+ }
3310
+ }
3311
+ }
3312
+ orderedTruePorts.push({
3313
+ trueIndex: truePinIndex,
3314
+ pinNumber,
3315
+ side,
3316
+ distanceFromEdge: currentDistanceFromEdge
3317
+ });
3318
+ if (pinStyle) {
3319
+ if (isVertical) {
3320
+ if (side === "left") {
3321
+ currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.bottomMargin ?? 0 : pinStyle.topMargin ?? 0;
3322
+ } else {
3323
+ currentDistanceFromEdge += direction === "top-to-bottom" ? pinStyle.topMargin ?? 0 : pinStyle.bottomMargin ?? 0;
3324
+ }
3325
+ } else {
3326
+ if (side === "top") {
3327
+ currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.rightMargin ?? 0 : pinStyle.leftMargin ?? 0;
3328
+ } else {
3329
+ currentDistanceFromEdge += direction === "left-to-right" ? pinStyle.leftMargin ?? 0 : pinStyle.rightMargin ?? 0;
3330
+ }
3331
+ }
3332
+ }
3333
+ currentDistanceFromEdge += spacing;
3334
+ truePinIndex++;
3305
3335
  });
3306
- if (pinStyle?.rightMargin) {
3307
- currentDistanceFromEdge += pinStyle.rightMargin;
3336
+ sideLengths[side] = sideLength;
3337
+ };
3338
+ if (params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement)) {
3339
+ if (params.schPortArrangement.leftSide) {
3340
+ processSide(
3341
+ "left",
3342
+ params.schPortArrangement.leftSide.pins,
3343
+ params.schPortArrangement.leftSide.direction ?? "top-to-bottom"
3344
+ );
3308
3345
  }
3309
- const isLastPinOnSide = sideIndex === sidePinCounts.bottomSize - 1;
3310
- if (!isLastPinOnSide) {
3311
- currentDistanceFromEdge += params.schPinSpacing;
3312
- } else {
3313
- sideLengths.bottom = currentDistanceFromEdge;
3314
- }
3315
- truePinIndex++;
3316
- }
3317
- currentDistanceFromEdge = 0;
3318
- for (let sideIndex = 0; sideIndex < sidePinCounts.rightSize; sideIndex++) {
3319
- const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement.rightSide?.pins[sideIndex] : truePinIndex + 1;
3320
- const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
3321
- if (pinStyle?.bottomMargin) {
3322
- currentDistanceFromEdge += pinStyle.bottomMargin;
3323
- }
3324
- orderedTruePorts.push({
3325
- trueIndex: truePinIndex,
3326
- pinNumber,
3327
- side: "right",
3328
- distanceFromEdge: currentDistanceFromEdge
3329
- });
3330
- if (pinStyle?.topMargin) {
3331
- currentDistanceFromEdge += pinStyle.topMargin;
3346
+ if (params.schPortArrangement.rightSide) {
3347
+ processSide(
3348
+ "right",
3349
+ params.schPortArrangement.rightSide.pins,
3350
+ params.schPortArrangement.rightSide.direction ?? "bottom-to-top"
3351
+ );
3332
3352
  }
3333
- const isLastPinOnSide = sideIndex === sidePinCounts.rightSize - 1;
3334
- if (!isLastPinOnSide) {
3335
- currentDistanceFromEdge += params.schPinSpacing;
3336
- } else {
3337
- sideLengths.right = currentDistanceFromEdge;
3338
- }
3339
- truePinIndex++;
3340
- }
3341
- currentDistanceFromEdge = 0;
3342
- for (let sideIndex = 0; sideIndex < sidePinCounts.topSize; sideIndex++) {
3343
- const pinNumber = params.schPortArrangement && isExplicitPinMappingArrangement(params.schPortArrangement) ? params.schPortArrangement.topSide?.pins[sideIndex] : truePinIndex + 1;
3344
- const pinStyle = params.schPinStyle?.[`pin${pinNumber}`] ?? params.schPinStyle?.[pinNumber];
3345
- if (pinStyle?.rightMargin) {
3346
- currentDistanceFromEdge += pinStyle.rightMargin;
3347
- }
3348
- orderedTruePorts.push({
3349
- trueIndex: truePinIndex,
3350
- pinNumber,
3351
- side: "top",
3352
- distanceFromEdge: currentDistanceFromEdge
3353
- });
3354
- if (pinStyle?.leftMargin) {
3355
- currentDistanceFromEdge += pinStyle.leftMargin;
3353
+ if (params.schPortArrangement.topSide) {
3354
+ processSide(
3355
+ "top",
3356
+ params.schPortArrangement.topSide.pins,
3357
+ params.schPortArrangement.topSide.direction ?? "left-to-right"
3358
+ );
3356
3359
  }
3357
- const isLastPinOnSide = sideIndex === sidePinCounts.topSize - 1;
3358
- if (!isLastPinOnSide) {
3359
- currentDistanceFromEdge += params.schPinSpacing;
3360
- } else {
3361
- sideLengths.top = currentDistanceFromEdge;
3360
+ if (params.schPortArrangement.bottomSide) {
3361
+ processSide(
3362
+ "bottom",
3363
+ params.schPortArrangement.bottomSide.pins,
3364
+ params.schPortArrangement.bottomSide.direction ?? "left-to-right"
3365
+ );
3362
3366
  }
3363
- truePinIndex++;
3364
- }
3365
- let schWidth = params.schWidth;
3366
- if (!schWidth) {
3367
- schWidth = Math.max(
3368
- sideLengths.top + params.schPinSpacing * 2,
3369
- sideLengths.bottom + params.schPinSpacing * 2
3367
+ } else {
3368
+ const leftSide = Array.from(
3369
+ { length: sidePinCounts.leftSize },
3370
+ (_, i) => i + 1
3370
3371
  );
3371
- }
3372
- let schHeight = params.schHeight;
3373
- if (!schHeight) {
3374
- schHeight = Math.max(
3375
- sideLengths.left + params.schPinSpacing * 2,
3376
- sideLengths.right + params.schPinSpacing * 2
3372
+ const rightSide = Array.from(
3373
+ { length: sidePinCounts.rightSize },
3374
+ (_, i) => i + sidePinCounts.leftSize + 1
3375
+ );
3376
+ const topSide = Array.from(
3377
+ { length: sidePinCounts.topSize },
3378
+ (_, i) => i + sidePinCounts.leftSize + sidePinCounts.rightSize + 1
3379
+ );
3380
+ const bottomSide = Array.from(
3381
+ {
3382
+ length: pinCount - sidePinCounts.leftSize - sidePinCounts.rightSize - sidePinCounts.topSize
3383
+ },
3384
+ (_, i) => i + sidePinCounts.leftSize + sidePinCounts.rightSize + sidePinCounts.topSize + 1
3377
3385
  );
3386
+ processSide("left", leftSide, "top-to-bottom");
3387
+ processSide("right", rightSide, "top-to-bottom");
3388
+ processSide("top", topSide, "left-to-right");
3389
+ processSide("bottom", bottomSide, "left-to-right");
3378
3390
  }
3379
3391
  const trueEdgePositions = {
3380
- // Top left corner
3381
- left: {
3382
- x: -schWidth / 2 - portDistanceFromEdge,
3383
- y: sideLengths.left / 2
3384
- },
3385
- // bottom left corner
3386
- bottom: {
3387
- x: -sideLengths.bottom / 2,
3388
- y: -schHeight / 2 - portDistanceFromEdge
3389
- },
3390
- // bottom right corner
3391
- right: {
3392
- x: schWidth / 2 + portDistanceFromEdge,
3393
- y: -sideLengths.right / 2
3394
- },
3395
- // top right corner
3396
- top: {
3397
- x: sideLengths.top / 2,
3398
- y: schHeight / 2 + portDistanceFromEdge
3399
- }
3392
+ left: { x: -schWidth / 2, y: schHeight / 2 },
3393
+ bottom: { x: -schWidth / 2, y: schHeight / 2 },
3394
+ right: { x: schWidth / 2, y: -schHeight / 2 },
3395
+ top: { x: schWidth / 2, y: -schHeight / 2 }
3400
3396
  };
3401
3397
  const trueEdgeTraversalDirections = {
3402
3398
  left: { x: 0, y: -1 },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/core",
3
3
  "type": "module",
4
- "version": "0.0.102",
4
+ "version": "0.0.103",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",