easyeda 0.0.263 → 0.0.265

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.
@@ -4892,8 +4892,20 @@ interface Options {
4892
4892
  cadPositionXMm?: number;
4893
4893
  cadPositionYMm?: number;
4894
4894
  cadPositionZMm?: number;
4895
+ cadModelBounds?: {
4896
+ min: {
4897
+ x: number;
4898
+ y: number;
4899
+ z: number;
4900
+ };
4901
+ max: {
4902
+ x: number;
4903
+ y: number;
4904
+ z: number;
4905
+ };
4906
+ };
4895
4907
  showDesignator?: boolean;
4896
4908
  }
4897
- declare const convertEasyEdaJsonToCircuitJson: (easyEdaJson: BetterEasyEdaJson, { useModelCdn, shouldRecenter, cadPositionXMm, cadPositionYMm, cadPositionZMm, showDesignator, }?: Options) => AnyCircuitElement[];
4909
+ declare const convertEasyEdaJsonToCircuitJson: (easyEdaJson: BetterEasyEdaJson, { useModelCdn, shouldRecenter, cadPositionXMm, cadPositionYMm, cadPositionZMm, cadModelBounds, showDesignator, }?: Options) => AnyCircuitElement[];
4898
4910
 
4899
4911
  export { BBoxSchema, type BetterEasyEdaJson, DataStrSchema, EasyEdaJsonSchema, HeadSchema, LayerItemSchema, LcscSchema, ModelBoundsSchema, ObjectItemSchema, OwnerSchema, PackageDetailDataStrSchema, PackageDetailSchema, type RawEasyEdaJson, SzlcscSchema, convertBetterEasyToTsx, convertEasyEdaJsonToCircuitJson, convertRawEasyToTsx, fetchEasyEDAComponent, generateFootprintTsx, getModelCdnUrl, getModelObjCdnUrl, getModelStepCdnUrl, maybeNumber };
@@ -8916,11 +8916,11 @@ function generateArcFromSweep(startX, startY, endX, endY, radius, largeArcFlag,
8916
8916
  const midY = (startY + endY) / 2;
8917
8917
  const dx = endX - startX;
8918
8918
  const dy = endY - startY;
8919
- const distance2 = Math.sqrt(dx * dx + dy * dy);
8920
- if (distance2 === 0 || radius < distance2 / 2) {
8919
+ const distance3 = Math.sqrt(dx * dx + dy * dy);
8920
+ if (distance3 === 0 || radius < distance3 / 2) {
8921
8921
  return [start, end];
8922
8922
  }
8923
- const h = Math.sqrt(radius * radius - distance2 * distance2 / 4);
8923
+ const h = Math.sqrt(radius * radius - distance3 * distance3 / 4);
8924
8924
  const angle = Math.atan2(dy, dx);
8925
8925
  const centerX = midX + h * Math.sin(angle) * (sweepFlag ? -1 : 1);
8926
8926
  const centerY = midY - h * Math.cos(angle) * (sweepFlag ? -1 : 1);
@@ -8956,6 +8956,142 @@ function generateArcFromSweep(startX, startY, endX, endY, radius, largeArcFlag,
8956
8956
  // lib/utils/easyeda-unit-to-mm.ts
8957
8957
  var mil10ToMm = (value) => value * 10 * 0.0254;
8958
8958
 
8959
+ // node_modules/@tscircuit/math-utils/dist/chunk-3WCUPG5S.js
8960
+ var getBoundsCenter = (bounds) => ({
8961
+ x: (bounds.minX + bounds.maxX) / 2,
8962
+ y: (bounds.minY + bounds.maxY) / 2
8963
+ });
8964
+
8965
+ // node_modules/@tscircuit/math-utils/dist/chunk-5N7UJNVK.js
8966
+ var getBoundsFromPoints = (points) => {
8967
+ if (points.length === 0) {
8968
+ return null;
8969
+ }
8970
+ let minX = points[0].x;
8971
+ let minY = points[0].y;
8972
+ let maxX = points[0].x;
8973
+ let maxY = points[0].y;
8974
+ for (let i = 1; i < points.length; i++) {
8975
+ const point2 = points[i];
8976
+ if (point2.x < minX) minX = point2.x;
8977
+ if (point2.y < minY) minY = point2.y;
8978
+ if (point2.x > maxX) maxX = point2.x;
8979
+ if (point2.y > maxY) maxY = point2.y;
8980
+ }
8981
+ return { minX, minY, maxX, maxY };
8982
+ };
8983
+
8984
+ // lib/websafe/get-easyeda-cad-placement-helpers.ts
8985
+ var getCadSvgNode = (easyEdaJson) => {
8986
+ const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
8987
+ (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
8988
+ );
8989
+ return svgNode?.type === "SVGNODE" ? svgNode : null;
8990
+ };
8991
+ var isSvgChildNodeWithAttrs = (childNode) => typeof childNode === "object" && childNode !== null;
8992
+ var getXyBoundsFromModelBounds = (bounds) => ({
8993
+ minX: bounds.min.x,
8994
+ minY: bounds.min.y,
8995
+ maxX: bounds.max.x,
8996
+ maxY: bounds.max.y
8997
+ });
8998
+ var rotateScenePoint = (point2, rotationDeg) => {
8999
+ switch (rotationDeg) {
9000
+ case 0:
9001
+ return point2;
9002
+ case 90:
9003
+ return { x: point2.y, y: -point2.x };
9004
+ case 180:
9005
+ return { x: -point2.x, y: -point2.y };
9006
+ case 270:
9007
+ return { x: -point2.y, y: point2.x };
9008
+ }
9009
+ };
9010
+ var getEasyEdaModelOriginOnBoardMm = ({
9011
+ svgNode,
9012
+ footprintCenterMm
9013
+ }) => {
9014
+ const points = [];
9015
+ for (const childNode of svgNode.svgData.childNodes ?? []) {
9016
+ if (!isSvgChildNodeWithAttrs(childNode)) continue;
9017
+ const rawPoints = childNode.attrs?.points;
9018
+ if (!rawPoints) continue;
9019
+ const values = String(rawPoints).trim().split(/\s+/).map(Number);
9020
+ for (let i = 0; i + 1 < values.length; i += 2) {
9021
+ const x = values[i];
9022
+ const y = values[i + 1];
9023
+ if (Number.isFinite(x) && Number.isFinite(y)) {
9024
+ points.push({ x: mil10ToMm(x), y: mil10ToMm(y) });
9025
+ }
9026
+ }
9027
+ }
9028
+ let modelOriginMm = null;
9029
+ if (points.length > 0) {
9030
+ const bounds = getBoundsFromPoints(points);
9031
+ modelOriginMm = bounds ? getBoundsCenter(bounds) : null;
9032
+ } else {
9033
+ const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? "0,0").split(",").map((value) => Number(value.trim()));
9034
+ if (Number.isFinite(originX) && Number.isFinite(originY)) {
9035
+ modelOriginMm = { x: mil10ToMm(originX), y: mil10ToMm(originY) };
9036
+ }
9037
+ }
9038
+ if (!modelOriginMm) return null;
9039
+ return {
9040
+ x: modelOriginMm.x - footprintCenterMm.x,
9041
+ y: footprintCenterMm.y - modelOriginMm.y
9042
+ };
9043
+ };
9044
+ var snapZero = (value) => Math.abs(value) < 1e-6 ? 0 : value;
9045
+ var normalizePoint = (point2) => ({
9046
+ x: snapZero(point2.x),
9047
+ y: snapZero(point2.y)
9048
+ });
9049
+ var getCadModelOffsetMm = (easyEdaJson) => {
9050
+ const svgNode = getCadSvgNode(easyEdaJson);
9051
+ return getCadModelOffsetMmFromBounds(
9052
+ easyEdaJson,
9053
+ easyEdaJson._objMetadata?.bounds
9054
+ );
9055
+ };
9056
+ var getCadModelOffsetMmFromBounds = (easyEdaJson, bounds, {
9057
+ footprintBoundsCenterMm
9058
+ } = {}) => {
9059
+ const svgNode = getCadSvgNode(easyEdaJson);
9060
+ if (!svgNode || !bounds) return null;
9061
+ const [, , rotationZRaw] = String(
9062
+ svgNode.svgData.attrs?.c_rotation ?? "0,0,0"
9063
+ ).split(",").map((value) => Number(value.trim()));
9064
+ const rotationDeg = (rotationZRaw % 360 + 360) % 360;
9065
+ if (![0, 90, 180, 270].includes(rotationDeg)) return null;
9066
+ const modelCenter = getBoundsCenter(getXyBoundsFromModelBounds(bounds));
9067
+ const footprintCenter = easyEdaJson.packageDetail.dataStr.head;
9068
+ const footprintCenterMm = footprintBoundsCenterMm ?? {
9069
+ x: mil10ToMm(footprintCenter.x),
9070
+ y: mil10ToMm(footprintCenter.y)
9071
+ };
9072
+ const targetOriginOnBoardMm = getEasyEdaModelOriginOnBoardMm({
9073
+ svgNode,
9074
+ footprintCenterMm
9075
+ });
9076
+ if (!targetOriginOnBoardMm) return null;
9077
+ const targetOriginInModelFrame = rotateScenePoint(
9078
+ targetOriginOnBoardMm,
9079
+ rotationDeg
9080
+ );
9081
+ return normalizePoint({
9082
+ x: modelCenter.x - targetOriginInModelFrame.x,
9083
+ y: modelCenter.y - targetOriginInModelFrame.y
9084
+ });
9085
+ };
9086
+ var getCadSvgNodeZOffsetMm = (easyEdaJson) => {
9087
+ const svgNode = getCadSvgNode(easyEdaJson);
9088
+ if (!svgNode) return null;
9089
+ const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
9090
+ if (!Number.isFinite(svgNodeZ)) return null;
9091
+ return mil10ToMm(svgNodeZ);
9092
+ };
9093
+ var getCadSvgNodeModelUuid = (easyEdaJson) => getCadSvgNode(easyEdaJson)?.svgData.attrs?.uuid ?? null;
9094
+
8959
9095
  // lib/utils/normalize-pin-labels.ts
8960
9096
  var normalizePinLabels = (inputPinLabels) => {
8961
9097
  const uniqueInputPinLabels = inputPinLabels.map((labels) => [
@@ -9172,6 +9308,7 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
9172
9308
  cadPositionXMm,
9173
9309
  cadPositionYMm,
9174
9310
  cadPositionZMm,
9311
+ cadModelBounds,
9175
9312
  showDesignator = false
9176
9313
  } = {}) => {
9177
9314
  const resolvedCadPositionZMm = cadPositionZMm ?? getCadPositionZMmFromMetadata(easyEdaJson);
@@ -9310,7 +9447,7 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
9310
9447
  } else if (pad.shape === "ELLIPSE") {
9311
9448
  soupShape = "rect";
9312
9449
  } else if (pad.shape === "OVAL") {
9313
- soupShape = "rect";
9450
+ soupShape = "pill";
9314
9451
  } else if (pad.shape === "POLYGON") {
9315
9452
  soupShape = "polygon";
9316
9453
  }
@@ -9330,12 +9467,17 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
9330
9467
  x: mil2mm(pad.center.x),
9331
9468
  y: mil2mm(pad.center.y)
9332
9469
  },
9333
- ...soupShape === "rect" ? rectSize : soupShape === "polygon" && pad.points ? {
9470
+ ...soupShape === "rect" ? rectSize : soupShape === "pill" ? {
9471
+ ...rectSize,
9472
+ radius: Math.min(rectSize.width, rectSize.height) / 2
9473
+ } : soupShape === "polygon" && pad.points ? {
9334
9474
  points: pad.points.map((p) => ({
9335
9475
  x: milx10(p.x),
9336
9476
  y: milx10(p.y)
9337
9477
  }))
9338
- } : { radius: Math.min(mil2mm(pad.width), mil2mm(pad.height)) / 2 },
9478
+ } : {
9479
+ radius: Math.min(mil2mm(pad.width), mil2mm(pad.height)) / 2
9480
+ },
9339
9481
  layer: "top",
9340
9482
  port_hints: [`pin${pinNumber}`],
9341
9483
  pcb_component_id: "pcb_component_1",
@@ -9524,6 +9666,14 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
9524
9666
  if (!cad.model_origin_position) {
9525
9667
  cad.model_origin_position = { x: 0, y: 0, z: 0 };
9526
9668
  }
9669
+ const resolvedCadModelBounds = cadModelBounds ?? easyEdaJson._objMetadata?.bounds;
9670
+ const recenteredCadOffset = resolvedCadModelBounds && getCadModelOffsetMmFromBounds(easyEdaJson, resolvedCadModelBounds, {
9671
+ footprintBoundsCenterMm: bounds.center
9672
+ });
9673
+ if (recenteredCadOffset) {
9674
+ cad.model_origin_position.x = recenteredCadOffset.x;
9675
+ cad.model_origin_position.y = recenteredCadOffset.y;
9676
+ }
9527
9677
  const side = pcb_component2.layer ?? "top";
9528
9678
  const t = DEFAULT_PCB_THICKNESS_MM / 2;
9529
9679
  const attrs = svgNode?.svgData?.attrs ?? {};
@@ -10343,98 +10493,6 @@ function normalizeManufacturerPartNumber(partNumber) {
10343
10493
  return normalized;
10344
10494
  }
10345
10495
 
10346
- // lib/websafe/get-easyeda-cad-placement-helpers.ts
10347
- var milToMm = (mil) => mil * 0.0254;
10348
- var getBoundsCenter = (bounds) => ({
10349
- x: (bounds.min.x + bounds.max.x) / 2,
10350
- y: (bounds.min.y + bounds.max.y) / 2
10351
- });
10352
- var getCadSvgNode = (easyEdaJson) => {
10353
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10354
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10355
- );
10356
- return svgNode?.type === "SVGNODE" ? svgNode : null;
10357
- };
10358
- var parseMil10Value = (value) => Number(String(value).replace("mil", "")) / 10;
10359
- var isZeroishModelCenter = (value) => Math.abs(value) < 1e-6;
10360
- var isZeroishFootprintDelta = (value) => Math.abs(value) < 1e-3;
10361
- var getPadCenter = (easyEdaJson) => {
10362
- const pads = easyEdaJson.packageDetail.dataStr.shape.filter(
10363
- (shape) => shape.type === "PAD"
10364
- );
10365
- if (pads.length === 0) return null;
10366
- const xs = pads.map((pad) => parseMil10Value(pad.center.x));
10367
- const ys = pads.map((pad) => parseMil10Value(pad.center.y));
10368
- return {
10369
- x: (Math.min(...xs) + Math.max(...xs)) / 2,
10370
- y: (Math.min(...ys) + Math.max(...ys)) / 2
10371
- };
10372
- };
10373
- var getRotatedOffsetMm = ({
10374
- bounds,
10375
- rawOffsetMil,
10376
- rotationDeg
10377
- }) => {
10378
- const center = getBoundsCenter(bounds);
10379
- const offsetX = milToMm(rawOffsetMil.x);
10380
- const offsetY = milToMm(rawOffsetMil.y);
10381
- switch (rotationDeg) {
10382
- case 0:
10383
- return { x: center.x + offsetX, y: center.y + offsetY };
10384
- case 90:
10385
- return { x: center.x + offsetY, y: center.y + offsetX };
10386
- case 180:
10387
- return { x: center.x - offsetX, y: center.y - offsetY };
10388
- case 270:
10389
- return { x: center.x - offsetY, y: center.y - offsetX };
10390
- }
10391
- };
10392
- var getCadModelOffsetMm = (easyEdaJson) => {
10393
- const svgNode = getCadSvgNode(easyEdaJson);
10394
- return getCadModelOffsetMmFromBounds(
10395
- easyEdaJson,
10396
- easyEdaJson._objMetadata?.bounds
10397
- );
10398
- };
10399
- var getCadModelOffsetMmFromBounds = (easyEdaJson, bounds) => {
10400
- const svgNode = getCadSvgNode(easyEdaJson);
10401
- if (!svgNode || !bounds) return null;
10402
- const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? "0,0").split(",").map((value) => Number(value.trim()));
10403
- if (!Number.isFinite(originX) || !Number.isFinite(originY)) return null;
10404
- const [, , rotationZRaw] = String(
10405
- svgNode.svgData.attrs?.c_rotation ?? "0,0,0"
10406
- ).split(",").map((value) => Number(value.trim()));
10407
- const rotationDeg = (rotationZRaw % 360 + 360) % 360;
10408
- if (![0, 90, 180, 270].includes(rotationDeg)) return null;
10409
- const modelCenter = getBoundsCenter(bounds);
10410
- const footprintCenter = easyEdaJson.packageDetail.dataStr.head;
10411
- const padCenter = getPadCenter(easyEdaJson);
10412
- const padCenterDelta = padCenter ? {
10413
- x: padCenter.x - footprintCenter.x,
10414
- y: padCenter.y - footprintCenter.y
10415
- } : null;
10416
- const rawOffsetMil = {
10417
- x: (originX - footprintCenter.x) * 10,
10418
- y: (originY - footprintCenter.y) * 10
10419
- };
10420
- if (padCenter && padCenterDelta && isZeroishModelCenter(modelCenter.x) && isZeroishModelCenter(modelCenter.y) && isZeroishFootprintDelta(padCenterDelta.x) && isZeroishFootprintDelta(padCenterDelta.y)) {
10421
- return { x: 0, y: 0 };
10422
- }
10423
- return getRotatedOffsetMm({
10424
- bounds,
10425
- rawOffsetMil,
10426
- rotationDeg
10427
- });
10428
- };
10429
- var getCadSvgNodeZOffsetMm = (easyEdaJson) => {
10430
- const svgNode = getCadSvgNode(easyEdaJson);
10431
- if (!svgNode) return null;
10432
- const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
10433
- if (!Number.isFinite(svgNodeZ)) return null;
10434
- return mil10ToMm(svgNodeZ);
10435
- };
10436
- var getCadSvgNodeModelUuid = (easyEdaJson) => getCadSvgNode(easyEdaJson)?.svgData.attrs?.uuid ?? null;
10437
-
10438
10496
  // lib/websafe/get-model-cdn-url.ts
10439
10497
  var getModelObjCdnUrl = ({
10440
10498
  easyedaModelUuid,
@@ -10600,8 +10658,14 @@ var generateFootprintTsx = (circuitJson, options = {}) => {
10600
10658
  `<smtpad portHints={${JSON.stringify(mapPortHints(smtPad.port_hints, options.portHintsMap))}} pcbX="${mmStr(smtPad.x)}" pcbY="${mmStr(smtPad.y)}" radius="${mmStr(smtPad.radius)}" shape="circle" />`
10601
10659
  );
10602
10660
  } else if (smtPad.shape === "rect") {
10661
+ const cornerRadius = smtPad.corner_radius ?? smtPad.rect_border_radius ?? void 0;
10662
+ const cornerRadiusAttr = cornerRadius !== void 0 ? ` cornerRadius="${mmStr(cornerRadius)}"` : "";
10663
+ elementStrings.push(
10664
+ `<smtpad portHints={${JSON.stringify(smtPad.port_hints)}} pcbX="${mmStr(smtPad.x)}" pcbY="${mmStr(smtPad.y)}" width="${mmStr(smtPad.width)}" height="${mmStr(smtPad.height)}"${cornerRadiusAttr} shape="rect" />`
10665
+ );
10666
+ } else if (smtPad.shape === "pill") {
10603
10667
  elementStrings.push(
10604
- `<smtpad portHints={${JSON.stringify(mapPortHints(smtPad.port_hints, options.portHintsMap))}} pcbX="${mmStr(smtPad.x)}" pcbY="${mmStr(smtPad.y)}" width="${mmStr(smtPad.width)}" height="${mmStr(smtPad.height)}" shape="rect" />`
10668
+ `<smtpad portHints={${JSON.stringify(smtPad.port_hints)}} pcbX="${mmStr(smtPad.x)}" pcbY="${mmStr(smtPad.y)}" width="${mmStr(smtPad.width)}" height="${mmStr(smtPad.height)}" radius="${mmStr(smtPad.radius)}" shape="pill" />`
10605
10669
  );
10606
10670
  } else if (smtPad.shape === "polygon") {
10607
10671
  const pointsStr = smtPad.points.map((p) => `{x: "${mmStr(p.x)}", y: "${mmStr(p.y)}"}`).join(", ");
@@ -10837,6 +10901,7 @@ var convertBetterEasyToTsx = async ({
10837
10901
  cadPositionXMm: cadPlacement?.positionXMm,
10838
10902
  cadPositionYMm: cadPlacement?.positionYMm,
10839
10903
  cadPositionZMm: cadPlacement?.positionZMm,
10904
+ cadModelBounds: cadPlacement?.bounds,
10840
10905
  showDesignator: true
10841
10906
  });
10842
10907
  const [cadComponent] = su(circuitJson).cad_component.list();