easyeda 0.0.252 → 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.
@@ -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,6 +10299,92 @@ 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
10389
  var getModelObjCdnUrl = ({
10298
10390
  easyedaModelUuid,
@@ -10342,28 +10434,16 @@ var parseObjBounds = (objText) => {
10342
10434
  max: { x: maxX, y: maxY, z: maxZ }
10343
10435
  };
10344
10436
  };
10345
- var getSvgNodeZOffsetMm = (easyEdaJson) => {
10346
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10347
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10348
- );
10349
- if (!svgNode || svgNode.type !== "SVGNODE") return null;
10350
- const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
10351
- if (!Number.isFinite(svgNodeZ)) return null;
10352
- return mil10ToMm(svgNodeZ);
10353
- };
10354
10437
  var getPositionZMmFromBounds = (bounds, svgNodeZOffsetMm) => {
10355
10438
  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z;
10356
10439
  return minZ - svgNodeZOffsetMm;
10357
10440
  };
10358
10441
  var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalThis.fetch } = {}) => {
10359
- const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10360
- (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10361
- );
10362
- if (!svgNode || svgNode.type !== "SVGNODE") return null;
10363
- const modelUuid = svgNode.svgData.attrs?.uuid;
10442
+ const modelUuid = getCadSvgNodeModelUuid(easyEdaJson);
10364
10443
  const partNumber = easyEdaJson.lcsc.number;
10365
- const svgNodeZOffsetMm = getSvgNodeZOffsetMm(easyEdaJson);
10366
- if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !fetch2) {
10444
+ const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson);
10445
+ const svgNodeZOffsetMm = getCadSvgNodeZOffsetMm(easyEdaJson);
10446
+ if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !derivedOffsetMm || !fetch2) {
10367
10447
  return null;
10368
10448
  }
10369
10449
  const modelObjUrl = getModelObjCdnUrl({
@@ -10378,6 +10458,8 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalTh
10378
10458
  if (metadataBounds) {
10379
10459
  return {
10380
10460
  modelObjUrl,
10461
+ positionXMm: derivedOffsetMm.x,
10462
+ positionYMm: derivedOffsetMm.y,
10381
10463
  modelStepUrl,
10382
10464
  bounds: metadataBounds,
10383
10465
  positionZMm: getPositionZMmFromBounds(metadataBounds, svgNodeZOffsetMm)
@@ -10395,6 +10477,8 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalTh
10395
10477
  if (!bounds) return null;
10396
10478
  return {
10397
10479
  modelObjUrl,
10480
+ positionXMm: derivedOffsetMm.x,
10481
+ positionYMm: derivedOffsetMm.y,
10398
10482
  modelStepUrl,
10399
10483
  bounds,
10400
10484
  // Align the EasyEDA SVG-node Z against the model's minimum Z.
@@ -10557,6 +10641,8 @@ var convertBetterEasyToTsx = async ({
10557
10641
  const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {
10558
10642
  useModelCdn: true,
10559
10643
  shouldRecenter: true,
10644
+ cadPositionXMm: cadPlacement?.positionXMm,
10645
+ cadPositionYMm: cadPlacement?.positionYMm,
10560
10646
  cadPositionZMm: cadPlacement?.positionZMm
10561
10647
  });
10562
10648
  const [cadComponent] = su(circuitJson).cad_component.list();