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.
@@ -2245,13 +2245,11 @@ declare const EasyEdaJsonSchema: z.ZodObject<{
2245
2245
  type RawEasyEdaJson = z.input<typeof EasyEdaJsonSchema>;
2246
2246
  type BetterEasyEdaJson = z.infer<typeof EasyEdaJsonSchema>;
2247
2247
 
2248
- declare const convertRawEasyToTsx: ({ rawEasy, format, }: {
2248
+ declare const convertRawEasyToTsx: ({ rawEasy }: {
2249
2249
  rawEasy: any;
2250
- format?: "obj" | "step";
2251
2250
  }) => Promise<string>;
2252
- declare const convertBetterEasyToTsx: ({ betterEasy, format, }: {
2251
+ declare const convertBetterEasyToTsx: ({ betterEasy, }: {
2253
2252
  betterEasy: BetterEasyEdaJson;
2254
- format?: "obj" | "step";
2255
2253
  }) => Promise<string>;
2256
2254
 
2257
2255
  declare function fetchEasyEDAComponent(jlcpcbPartNumber: string, { fetch, includeModelMetadata, }?: {
@@ -2264,8 +2262,9 @@ declare const generateFootprintTsx: (circuitJson: AnyCircuitElement[]) => string
2264
2262
  type Params = {
2265
2263
  easyedaPartNumber: string;
2266
2264
  easyedaModelUuid: string;
2267
- format?: "obj" | "step";
2268
2265
  };
2269
- declare const getModelCdnUrl: ({ easyedaModelUuid, easyedaPartNumber, format, }: Params) => string;
2266
+ declare const getModelObjCdnUrl: ({ easyedaModelUuid, easyedaPartNumber, }: Params) => string;
2267
+ declare const getModelStepCdnUrl: ({ easyedaModelUuid, easyedaPartNumber, }: Params) => string;
2268
+ declare const getModelCdnUrl: ({ easyedaModelUuid, easyedaPartNumber, }: Params) => string;
2270
2269
 
2271
- export { convertBetterEasyToTsx, convertRawEasyToTsx, fetchEasyEDAComponent, generateFootprintTsx, getModelCdnUrl };
2270
+ export { convertBetterEasyToTsx, convertRawEasyToTsx, fetchEasyEDAComponent, generateFootprintTsx, getModelCdnUrl, getModelObjCdnUrl, getModelStepCdnUrl };
@@ -9159,7 +9159,13 @@ var getCadPositionZMmFromMetadata = (easyEdaJson) => {
9159
9159
  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z;
9160
9160
  return minZ - mil10ToMm(svgNodeZ);
9161
9161
  };
9162
- var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecenter = true, cadPositionZMm } = {}) => {
9162
+ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, {
9163
+ useModelCdn,
9164
+ shouldRecenter = true,
9165
+ cadPositionXMm,
9166
+ cadPositionYMm,
9167
+ cadPositionZMm
9168
+ } = {}) => {
9163
9169
  const resolvedCadPositionZMm = cadPositionZMm ?? getCadPositionZMmFromMetadata(easyEdaJson);
9164
9170
  const circuitElements = [];
9165
9171
  const source_component = any_source_component.parse({
@@ -9404,8 +9410,8 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecente
9404
9410
  anchor_alignment: "center_of_component_on_board_surface",
9405
9411
  model_origin_alignment: "center_of_component_on_board_surface",
9406
9412
  model_origin_position: {
9407
- x: 0,
9408
- y: 0,
9413
+ x: cadPositionXMm ?? 0,
9414
+ y: cadPositionYMm ?? 0,
9409
9415
  z: resolvedCadPositionZMm ?? position2.z
9410
9416
  },
9411
9417
  position: { x: 0, y: 0, z: 0 },
@@ -10293,15 +10299,106 @@ function normalizeManufacturerPartNumber(partNumber) {
10293
10299
  return normalized;
10294
10300
  }
10295
10301
 
10302
+ // lib/websafe/get-easyeda-cad-placement-helpers.ts
10303
+ var milToMm = (mil) => mil * 0.0254;
10304
+ var getBoundsCenter = (bounds) => ({
10305
+ x: (bounds.min.x + bounds.max.x) / 2,
10306
+ y: (bounds.min.y + bounds.max.y) / 2
10307
+ });
10308
+ var getCadSvgNode = (easyEdaJson) => {
10309
+ const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10310
+ (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10311
+ );
10312
+ return svgNode?.type === "SVGNODE" ? svgNode : null;
10313
+ };
10314
+ var parseMil10Value = (value) => Number(String(value).replace("mil", "")) / 10;
10315
+ var isZeroishModelCenter = (value) => Math.abs(value) < 1e-6;
10316
+ var isZeroishFootprintDelta = (value) => Math.abs(value) < 1e-3;
10317
+ var getPadCenter = (easyEdaJson) => {
10318
+ const pads = easyEdaJson.packageDetail.dataStr.shape.filter(
10319
+ (shape) => shape.type === "PAD"
10320
+ );
10321
+ if (pads.length === 0) return null;
10322
+ const xs = pads.map((pad) => parseMil10Value(pad.center.x));
10323
+ const ys = pads.map((pad) => parseMil10Value(pad.center.y));
10324
+ return {
10325
+ x: (Math.min(...xs) + Math.max(...xs)) / 2,
10326
+ y: (Math.min(...ys) + Math.max(...ys)) / 2
10327
+ };
10328
+ };
10329
+ var getRotatedOffsetMm = ({
10330
+ bounds,
10331
+ rawOffsetMil,
10332
+ rotationDeg
10333
+ }) => {
10334
+ const center = getBoundsCenter(bounds);
10335
+ const offsetX = milToMm(rawOffsetMil.x);
10336
+ const offsetY = milToMm(rawOffsetMil.y);
10337
+ switch (rotationDeg) {
10338
+ case 0:
10339
+ return { x: center.x + offsetX, y: center.y + offsetY };
10340
+ case 90:
10341
+ return { x: center.x + offsetY, y: center.y + offsetX };
10342
+ case 180:
10343
+ return { x: center.x - offsetX, y: center.y - offsetY };
10344
+ case 270:
10345
+ return { x: center.x - offsetY, y: center.y - offsetX };
10346
+ }
10347
+ };
10348
+ var getCadModelOffsetMm = (easyEdaJson) => {
10349
+ const svgNode = getCadSvgNode(easyEdaJson);
10350
+ const bounds = easyEdaJson._objMetadata?.bounds;
10351
+ if (!svgNode || !bounds) return null;
10352
+ const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? "0,0").split(",").map((value) => Number(value.trim()));
10353
+ if (!Number.isFinite(originX) || !Number.isFinite(originY)) return null;
10354
+ const [, , rotationZRaw] = String(
10355
+ svgNode.svgData.attrs?.c_rotation ?? "0,0,0"
10356
+ ).split(",").map((value) => Number(value.trim()));
10357
+ const rotationDeg = (rotationZRaw % 360 + 360) % 360;
10358
+ if (![0, 90, 180, 270].includes(rotationDeg)) return null;
10359
+ const modelCenter = getBoundsCenter(bounds);
10360
+ const footprintCenter = easyEdaJson.packageDetail.dataStr.head;
10361
+ const padCenter = getPadCenter(easyEdaJson);
10362
+ const padCenterDelta = padCenter ? {
10363
+ x: padCenter.x - footprintCenter.x,
10364
+ y: padCenter.y - footprintCenter.y
10365
+ } : null;
10366
+ const rawOffsetMil = {
10367
+ x: (originX - footprintCenter.x) * 10,
10368
+ y: (originY - footprintCenter.y) * 10
10369
+ };
10370
+ if (padCenter && padCenterDelta && isZeroishModelCenter(modelCenter.x) && isZeroishModelCenter(modelCenter.y) && isZeroishFootprintDelta(padCenterDelta.x) && isZeroishFootprintDelta(padCenterDelta.y)) {
10371
+ return { x: 0, y: 0 };
10372
+ }
10373
+ return getRotatedOffsetMm({
10374
+ bounds,
10375
+ rawOffsetMil,
10376
+ rotationDeg
10377
+ });
10378
+ };
10379
+ var getCadSvgNodeZOffsetMm = (easyEdaJson) => {
10380
+ const svgNode = getCadSvgNode(easyEdaJson);
10381
+ if (!svgNode) return null;
10382
+ const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
10383
+ if (!Number.isFinite(svgNodeZ)) return null;
10384
+ return mil10ToMm(svgNodeZ);
10385
+ };
10386
+ var getCadSvgNodeModelUuid = (easyEdaJson) => getCadSvgNode(easyEdaJson)?.svgData.attrs?.uuid ?? null;
10387
+
10296
10388
  // lib/websafe/get-model-cdn-url.ts
10297
- var getModelCdnUrl = ({
10389
+ var getModelObjCdnUrl = ({
10298
10390
  easyedaModelUuid,
10299
- easyedaPartNumber,
10300
- format = "obj"
10391
+ easyedaPartNumber
10301
10392
  }) => {
10302
- const extension = format === "step" ? "step" : "obj";
10303
- return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.${extension}?uuid=${easyedaModelUuid}`;
10393
+ return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`;
10304
10394
  };
10395
+ var getModelStepCdnUrl = ({
10396
+ easyedaModelUuid,
10397
+ easyedaPartNumber
10398
+ }) => {
10399
+ return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.step?uuid=${easyedaModelUuid}`;
10400
+ };
10401
+ var getModelCdnUrl = getModelObjCdnUrl;
10305
10402
 
10306
10403
  // lib/websafe/get-easyeda-cad-model-placement.ts
10307
10404
  var placementCache = /* @__PURE__ */ new Map();
@@ -10337,43 +10434,32 @@ var parseObjBounds = (objText) => {
10337
10434
  max: { x: maxX, y: maxY, z: maxZ }
10338
10435
  };
10339
10436
  };
10340
- var getSvgNodeZOffsetMm = (easyEdaJson) => {
10341
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10342
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10343
- );
10344
- if (!svgNode || svgNode.type !== "SVGNODE") return null;
10345
- const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
10346
- if (!Number.isFinite(svgNodeZ)) return null;
10347
- return mil10ToMm(svgNodeZ);
10348
- };
10349
10437
  var getPositionZMmFromBounds = (bounds, svgNodeZOffsetMm) => {
10350
10438
  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z;
10351
10439
  return minZ - svgNodeZOffsetMm;
10352
10440
  };
10353
10441
  var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalThis.fetch } = {}) => {
10354
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10355
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10356
- );
10357
- if (!svgNode || svgNode.type !== "SVGNODE") return null;
10358
- const modelUuid = svgNode.svgData.attrs?.uuid;
10442
+ const modelUuid = getCadSvgNodeModelUuid(easyEdaJson);
10359
10443
  const partNumber = easyEdaJson.lcsc.number;
10360
- const svgNodeZOffsetMm = getSvgNodeZOffsetMm(easyEdaJson);
10361
- if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !fetch2) {
10444
+ const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson);
10445
+ const svgNodeZOffsetMm = getCadSvgNodeZOffsetMm(easyEdaJson);
10446
+ if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !derivedOffsetMm || !fetch2) {
10362
10447
  return null;
10363
10448
  }
10364
- const modelObjUrl = getModelCdnUrl({
10449
+ const modelObjUrl = getModelObjCdnUrl({
10365
10450
  easyedaModelUuid: modelUuid,
10366
10451
  easyedaPartNumber: partNumber
10367
10452
  });
10368
- const modelStepUrl = getModelCdnUrl({
10453
+ const modelStepUrl = getModelStepCdnUrl({
10369
10454
  easyedaModelUuid: modelUuid,
10370
- easyedaPartNumber: partNumber,
10371
- format: "step"
10455
+ easyedaPartNumber: partNumber
10372
10456
  });
10373
10457
  const metadataBounds = easyEdaJson._objMetadata?.bounds;
10374
10458
  if (metadataBounds) {
10375
10459
  return {
10376
10460
  modelObjUrl,
10461
+ positionXMm: derivedOffsetMm.x,
10462
+ positionYMm: derivedOffsetMm.y,
10377
10463
  modelStepUrl,
10378
10464
  bounds: metadataBounds,
10379
10465
  positionZMm: getPositionZMmFromBounds(metadataBounds, svgNodeZOffsetMm)
@@ -10391,6 +10477,8 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalTh
10391
10477
  if (!bounds) return null;
10392
10478
  return {
10393
10479
  modelObjUrl,
10480
+ positionXMm: derivedOffsetMm.x,
10481
+ positionYMm: derivedOffsetMm.y,
10394
10482
  modelStepUrl,
10395
10483
  bounds,
10396
10484
  // Align the EasyEDA SVG-node Z against the model's minimum Z.
@@ -10539,25 +10627,22 @@ ${cadModelLines}
10539
10627
  };
10540
10628
 
10541
10629
  // lib/websafe/convert-to-typescript-component/index.tsx
10542
- var convertRawEasyToTsx = async ({
10543
- rawEasy,
10544
- format = "obj"
10545
- }) => {
10630
+ var convertRawEasyToTsx = async ({ rawEasy }) => {
10546
10631
  const betterEasy = EasyEdaJsonSchema.parse(rawEasy);
10547
10632
  const result = await convertBetterEasyToTsx({
10548
- betterEasy,
10549
- format
10633
+ betterEasy
10550
10634
  });
10551
10635
  return result;
10552
10636
  };
10553
10637
  var convertBetterEasyToTsx = async ({
10554
- betterEasy,
10555
- format = "obj"
10638
+ betterEasy
10556
10639
  }) => {
10557
10640
  const cadPlacement = await getEasyEdaCadModelPlacement(betterEasy);
10558
10641
  const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {
10559
10642
  useModelCdn: true,
10560
10643
  shouldRecenter: true,
10644
+ cadPositionXMm: cadPlacement?.positionXMm,
10645
+ cadPositionYMm: cadPlacement?.positionYMm,
10561
10646
  cadPositionZMm: cadPlacement?.positionZMm
10562
10647
  });
10563
10648
  const [cadComponent] = su(circuitJson).cad_component.list();
@@ -10594,8 +10679,6 @@ var convertBetterEasyToTsx = async ({
10594
10679
  modelStepUrl = cadComponent.model_step_url;
10595
10680
  }
10596
10681
  }
10597
- const selectedObjUrl = format === "obj" ? modelObjUrl : void 0;
10598
- const selectedStepUrl = format === "step" ? modelStepUrl : void 0;
10599
10682
  const supplierPartNumbers = {
10600
10683
  jlcpcb: [betterEasy.lcsc.number]
10601
10684
  };
@@ -10603,8 +10686,8 @@ var convertBetterEasyToTsx = async ({
10603
10686
  componentName: pn,
10604
10687
  manufacturerPartNumber: pn,
10605
10688
  pinLabels,
10606
- objUrl: selectedObjUrl,
10607
- stepUrl: selectedStepUrl,
10689
+ objUrl: modelObjUrl,
10690
+ stepUrl: modelStepUrl,
10608
10691
  circuitJson,
10609
10692
  supplierPartNumbers
10610
10693
  });
@@ -10753,6 +10836,8 @@ export {
10753
10836
  convertRawEasyToTsx,
10754
10837
  fetchEasyEDAComponent,
10755
10838
  generateFootprintTsx,
10756
- getModelCdnUrl
10839
+ getModelCdnUrl,
10840
+ getModelObjCdnUrl,
10841
+ getModelStepCdnUrl
10757
10842
  };
10758
10843
  //# sourceMappingURL=index.js.map