easyeda 0.0.251 → 0.0.253

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/main.cjs CHANGED
@@ -846,14 +846,19 @@ var require_commander = __commonJS({
846
846
  var import_commander = __toESM(require_commander(), 1);
847
847
 
848
848
  // lib/websafe/get-model-cdn-url.ts
849
- var getModelCdnUrl = ({
849
+ var getModelObjCdnUrl = ({
850
850
  easyedaModelUuid,
851
- easyedaPartNumber,
852
- format = "obj"
851
+ easyedaPartNumber
853
852
  }) => {
854
- const extension = format === "step" ? "step" : "obj";
855
- return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.${extension}?uuid=${easyedaModelUuid}`;
853
+ return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`;
856
854
  };
855
+ var getModelStepCdnUrl = ({
856
+ easyedaModelUuid,
857
+ easyedaPartNumber
858
+ }) => {
859
+ return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.step?uuid=${easyedaModelUuid}`;
860
+ };
861
+ var getModelCdnUrl = getModelObjCdnUrl;
857
862
 
858
863
  // lib/websafe/fetch-easyeda-json.ts
859
864
  var getModelUuidFromRawPackageDetail = (result) => {
@@ -992,7 +997,7 @@ var import_promises2 = __toESM(require("fs/promises"), 1);
992
997
  var package_default = {
993
998
  name: "easyeda",
994
999
  type: "module",
995
- version: "0.0.250",
1000
+ version: "0.0.252",
996
1001
  files: [
997
1002
  "dist"
998
1003
  ],
@@ -1033,7 +1038,7 @@ var package_default = {
1033
1038
  "@tscircuit/mm": "^0.0.8",
1034
1039
  "@types/bun": "latest",
1035
1040
  "bun-match-svg": "^0.0.13",
1036
- "circuit-json-to-gltf": "^0.0.84",
1041
+ "circuit-json-to-gltf": "^0.0.87",
1037
1042
  "circuit-to-svg": "^0.0.337",
1038
1043
  "looks-same": "^9.0.1",
1039
1044
  poppygl: "^0.0.19",
@@ -6319,7 +6324,13 @@ var getCadPositionZMmFromMetadata = (easyEdaJson) => {
6319
6324
  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z;
6320
6325
  return minZ - mil10ToMm(svgNodeZ);
6321
6326
  };
6322
- var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecenter = true, cadPositionZMm } = {}) => {
6327
+ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
6328
+ useModelCdn,
6329
+ shouldRecenter = true,
6330
+ cadPositionXMm,
6331
+ cadPositionYMm,
6332
+ cadPositionZMm
6333
+ } = {}) => {
6323
6334
  const resolvedCadPositionZMm = cadPositionZMm ?? getCadPositionZMmFromMetadata(easyEdaJson);
6324
6335
  const circuitElements = [];
6325
6336
  const source_component = any_source_component.parse({
@@ -6564,8 +6575,8 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecente
6564
6575
  anchor_alignment: "center_of_component_on_board_surface",
6565
6576
  model_origin_alignment: "center_of_component_on_board_surface",
6566
6577
  model_origin_position: {
6567
- x: 0,
6568
- y: 0,
6578
+ x: cadPositionXMm ?? 0,
6579
+ y: cadPositionYMm ?? 0,
6569
6580
  z: resolvedCadPositionZMm ?? position2.z
6570
6581
  },
6571
6582
  position: { x: 0, y: 0, z: 0 },
@@ -7461,6 +7472,92 @@ function normalizeManufacturerPartNumber(partNumber) {
7461
7472
  return normalized;
7462
7473
  }
7463
7474
 
7475
+ // lib/websafe/get-easyeda-cad-placement-helpers.ts
7476
+ var milToMm = (mil) => mil * 0.0254;
7477
+ var getBoundsCenter = (bounds) => ({
7478
+ x: (bounds.min.x + bounds.max.x) / 2,
7479
+ y: (bounds.min.y + bounds.max.y) / 2
7480
+ });
7481
+ var getCadSvgNode = (easyEdaJson) => {
7482
+ const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
7483
+ (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
7484
+ );
7485
+ return svgNode?.type === "SVGNODE" ? svgNode : null;
7486
+ };
7487
+ var parseMil10Value = (value) => Number(String(value).replace("mil", "")) / 10;
7488
+ var isZeroishModelCenter = (value) => Math.abs(value) < 1e-6;
7489
+ var isZeroishFootprintDelta = (value) => Math.abs(value) < 1e-3;
7490
+ var getPadCenter = (easyEdaJson) => {
7491
+ const pads = easyEdaJson.packageDetail.dataStr.shape.filter(
7492
+ (shape) => shape.type === "PAD"
7493
+ );
7494
+ if (pads.length === 0) return null;
7495
+ const xs = pads.map((pad) => parseMil10Value(pad.center.x));
7496
+ const ys = pads.map((pad) => parseMil10Value(pad.center.y));
7497
+ return {
7498
+ x: (Math.min(...xs) + Math.max(...xs)) / 2,
7499
+ y: (Math.min(...ys) + Math.max(...ys)) / 2
7500
+ };
7501
+ };
7502
+ var getRotatedOffsetMm = ({
7503
+ bounds,
7504
+ rawOffsetMil,
7505
+ rotationDeg
7506
+ }) => {
7507
+ const center = getBoundsCenter(bounds);
7508
+ const offsetX = milToMm(rawOffsetMil.x);
7509
+ const offsetY = milToMm(rawOffsetMil.y);
7510
+ switch (rotationDeg) {
7511
+ case 0:
7512
+ return { x: center.x + offsetX, y: center.y + offsetY };
7513
+ case 90:
7514
+ return { x: center.x + offsetY, y: center.y + offsetX };
7515
+ case 180:
7516
+ return { x: center.x - offsetX, y: center.y - offsetY };
7517
+ case 270:
7518
+ return { x: center.x - offsetY, y: center.y - offsetX };
7519
+ }
7520
+ };
7521
+ var getCadModelOffsetMm = (easyEdaJson) => {
7522
+ const svgNode = getCadSvgNode(easyEdaJson);
7523
+ const bounds = easyEdaJson._objMetadata?.bounds;
7524
+ if (!svgNode || !bounds) return null;
7525
+ const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? "0,0").split(",").map((value) => Number(value.trim()));
7526
+ if (!Number.isFinite(originX) || !Number.isFinite(originY)) return null;
7527
+ const [, , rotationZRaw] = String(
7528
+ svgNode.svgData.attrs?.c_rotation ?? "0,0,0"
7529
+ ).split(",").map((value) => Number(value.trim()));
7530
+ const rotationDeg = (rotationZRaw % 360 + 360) % 360;
7531
+ if (![0, 90, 180, 270].includes(rotationDeg)) return null;
7532
+ const modelCenter = getBoundsCenter(bounds);
7533
+ const footprintCenter = easyEdaJson.packageDetail.dataStr.head;
7534
+ const padCenter = getPadCenter(easyEdaJson);
7535
+ const padCenterDelta = padCenter ? {
7536
+ x: padCenter.x - footprintCenter.x,
7537
+ y: padCenter.y - footprintCenter.y
7538
+ } : null;
7539
+ const rawOffsetMil = {
7540
+ x: (originX - footprintCenter.x) * 10,
7541
+ y: (originY - footprintCenter.y) * 10
7542
+ };
7543
+ if (padCenter && padCenterDelta && isZeroishModelCenter(modelCenter.x) && isZeroishModelCenter(modelCenter.y) && isZeroishFootprintDelta(padCenterDelta.x) && isZeroishFootprintDelta(padCenterDelta.y)) {
7544
+ return { x: 0, y: 0 };
7545
+ }
7546
+ return getRotatedOffsetMm({
7547
+ bounds,
7548
+ rawOffsetMil,
7549
+ rotationDeg
7550
+ });
7551
+ };
7552
+ var getCadSvgNodeZOffsetMm = (easyEdaJson) => {
7553
+ const svgNode = getCadSvgNode(easyEdaJson);
7554
+ if (!svgNode) return null;
7555
+ const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
7556
+ if (!Number.isFinite(svgNodeZ)) return null;
7557
+ return mil10ToMm(svgNodeZ);
7558
+ };
7559
+ var getCadSvgNodeModelUuid = (easyEdaJson) => getCadSvgNode(easyEdaJson)?.svgData.attrs?.uuid ?? null;
7560
+
7464
7561
  // lib/websafe/get-easyeda-cad-model-placement.ts
7465
7562
  var placementCache = /* @__PURE__ */ new Map();
7466
7563
  var parseObjBounds2 = (objText) => {
@@ -7495,43 +7592,32 @@ var parseObjBounds2 = (objText) => {
7495
7592
  max: { x: maxX, y: maxY, z: maxZ }
7496
7593
  };
7497
7594
  };
7498
- var getSvgNodeZOffsetMm = (easyEdaJson) => {
7499
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
7500
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
7501
- );
7502
- if (!svgNode || svgNode.type !== "SVGNODE") return null;
7503
- const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
7504
- if (!Number.isFinite(svgNodeZ)) return null;
7505
- return mil10ToMm(svgNodeZ);
7506
- };
7507
7595
  var getPositionZMmFromBounds = (bounds, svgNodeZOffsetMm) => {
7508
7596
  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z;
7509
7597
  return minZ - svgNodeZOffsetMm;
7510
7598
  };
7511
7599
  var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalThis.fetch } = {}) => {
7512
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
7513
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
7514
- );
7515
- if (!svgNode || svgNode.type !== "SVGNODE") return null;
7516
- const modelUuid = svgNode.svgData.attrs?.uuid;
7600
+ const modelUuid = getCadSvgNodeModelUuid(easyEdaJson);
7517
7601
  const partNumber = easyEdaJson.lcsc.number;
7518
- const svgNodeZOffsetMm = getSvgNodeZOffsetMm(easyEdaJson);
7519
- if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !fetch2) {
7602
+ const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson);
7603
+ const svgNodeZOffsetMm = getCadSvgNodeZOffsetMm(easyEdaJson);
7604
+ if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !derivedOffsetMm || !fetch2) {
7520
7605
  return null;
7521
7606
  }
7522
- const modelObjUrl = getModelCdnUrl({
7607
+ const modelObjUrl = getModelObjCdnUrl({
7523
7608
  easyedaModelUuid: modelUuid,
7524
7609
  easyedaPartNumber: partNumber
7525
7610
  });
7526
- const modelStepUrl = getModelCdnUrl({
7611
+ const modelStepUrl = getModelStepCdnUrl({
7527
7612
  easyedaModelUuid: modelUuid,
7528
- easyedaPartNumber: partNumber,
7529
- format: "step"
7613
+ easyedaPartNumber: partNumber
7530
7614
  });
7531
7615
  const metadataBounds = easyEdaJson._objMetadata?.bounds;
7532
7616
  if (metadataBounds) {
7533
7617
  return {
7534
7618
  modelObjUrl,
7619
+ positionXMm: derivedOffsetMm.x,
7620
+ positionYMm: derivedOffsetMm.y,
7535
7621
  modelStepUrl,
7536
7622
  bounds: metadataBounds,
7537
7623
  positionZMm: getPositionZMmFromBounds(metadataBounds, svgNodeZOffsetMm)
@@ -7549,6 +7635,8 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalTh
7549
7635
  if (!bounds) return null;
7550
7636
  return {
7551
7637
  modelObjUrl,
7638
+ positionXMm: derivedOffsetMm.x,
7639
+ positionYMm: derivedOffsetMm.y,
7552
7640
  modelStepUrl,
7553
7641
  bounds,
7554
7642
  // Align the EasyEDA SVG-node Z against the model's minimum Z.
@@ -7697,25 +7785,22 @@ ${cadModelLines}
7697
7785
  };
7698
7786
 
7699
7787
  // lib/websafe/convert-to-typescript-component/index.tsx
7700
- var convertRawEasyToTsx = async ({
7701
- rawEasy,
7702
- format = "obj"
7703
- }) => {
7788
+ var convertRawEasyToTsx = async ({ rawEasy }) => {
7704
7789
  const betterEasy = EasyEdaJsonSchema.parse(rawEasy);
7705
7790
  const result = await convertBetterEasyToTsx({
7706
- betterEasy,
7707
- format
7791
+ betterEasy
7708
7792
  });
7709
7793
  return result;
7710
7794
  };
7711
7795
  var convertBetterEasyToTsx = async ({
7712
- betterEasy,
7713
- format = "obj"
7796
+ betterEasy
7714
7797
  }) => {
7715
7798
  const cadPlacement = await getEasyEdaCadModelPlacement(betterEasy);
7716
7799
  const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {
7717
7800
  useModelCdn: true,
7718
7801
  shouldRecenter: true,
7802
+ cadPositionXMm: cadPlacement?.positionXMm,
7803
+ cadPositionYMm: cadPlacement?.positionYMm,
7719
7804
  cadPositionZMm: cadPlacement?.positionZMm
7720
7805
  });
7721
7806
  const [cadComponent] = su(circuitJson).cad_component.list();
@@ -7752,8 +7837,6 @@ var convertBetterEasyToTsx = async ({
7752
7837
  modelStepUrl = cadComponent.model_step_url;
7753
7838
  }
7754
7839
  }
7755
- const selectedObjUrl = format === "obj" ? modelObjUrl : void 0;
7756
- const selectedStepUrl = format === "step" ? modelStepUrl : void 0;
7757
7840
  const supplierPartNumbers = {
7758
7841
  jlcpcb: [betterEasy.lcsc.number]
7759
7842
  };
@@ -7761,8 +7844,8 @@ var convertBetterEasyToTsx = async ({
7761
7844
  componentName: pn,
7762
7845
  manufacturerPartNumber: pn,
7763
7846
  pinLabels,
7764
- objUrl: selectedObjUrl,
7765
- stepUrl: selectedStepUrl,
7847
+ objUrl: modelObjUrl,
7848
+ stepUrl: modelStepUrl,
7766
7849
  circuitJson,
7767
7850
  supplierPartNumbers
7768
7851
  });