easyeda 0.0.252 → 0.0.254

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.
@@ -8896,9 +8896,6 @@ var mmStr = (n) => {
8896
8896
  return `${mm(n)}mm`;
8897
8897
  };
8898
8898
 
8899
- // lib/constants.ts
8900
- var DEFAULT_PCB_THICKNESS_MM = 1.6;
8901
-
8902
8899
  // lib/math/arc-utils.ts
8903
8900
  function generateArcFromSweep(startX, startY, endX, endY, radius, largeArcFlag, sweepFlag) {
8904
8901
  const start = { x: startX, y: startY };
@@ -9024,6 +9021,9 @@ var normalizeSymbolName = (name) => {
9024
9021
  return trimmedName;
9025
9022
  };
9026
9023
 
9024
+ // lib/constants.ts
9025
+ var DEFAULT_PCB_THICKNESS_MM = 1.6;
9026
+
9027
9027
  // lib/convert-easyeda-json-to-tscircuit-soup-json.ts
9028
9028
  var EASYEDA_STEP_MODEL_URL = "https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y";
9029
9029
  var EASYEDA_OBJ_MODEL_URL = "https://modules.easyeda.com/3dmodel";
@@ -9159,7 +9159,14 @@ 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
+ showDesignator = false
9169
+ } = {}) => {
9163
9170
  const resolvedCadPositionZMm = cadPositionZMm ?? getCadPositionZMmFromMetadata(easyEdaJson);
9164
9171
  const circuitElements = [];
9165
9172
  const source_component = any_source_component.parse({
@@ -9347,6 +9354,7 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecente
9347
9354
  ).forEach((sr, index) => {
9348
9355
  circuitElements.push(handleCutout(sr, index));
9349
9356
  });
9357
+ let hasFoundDesignator = false;
9350
9358
  easyEdaJson.packageDetail.dataStr.shape.forEach((shape, index) => {
9351
9359
  if (shape.type === "TRACK") {
9352
9360
  if (!isCourtyardLayer(shape.layer)) {
@@ -9358,12 +9366,22 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecente
9358
9366
  }
9359
9367
  } else if (shape.type === "TEXT") {
9360
9368
  if (isCourtyardLayer(shape.layer)) return;
9369
+ let text = shape.text;
9370
+ const designatorPrefix = easyEdaJson.dataStr.head.c_para.pre || "U";
9371
+ const normalizedPrefix = designatorPrefix.replace(/\?/g, "");
9372
+ const trimmedText = text.trim();
9373
+ const isDesignator = trimmedText === designatorPrefix || trimmedText === `${normalizedPrefix}?` || trimmedText === normalizedPrefix;
9374
+ if (isDesignator) {
9375
+ if (!showDesignator) return;
9376
+ text = "{NAME}";
9377
+ hasFoundDesignator = true;
9378
+ }
9361
9379
  circuitElements.push(
9362
9380
  pcb_silkscreen_text.parse({
9363
9381
  type: "pcb_silkscreen_text",
9364
9382
  pcb_silkscreen_text_id: `pcb_silkscreen_text_${index + 1}`,
9365
9383
  pcb_component_id: "pcb_component_1",
9366
- text: normalizeSymbolName(shape.text),
9384
+ text,
9367
9385
  anchor_position: {
9368
9386
  x: mil2mm(shape.x),
9369
9387
  y: mil2mm(shape.y)
@@ -9373,12 +9391,31 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecente
9373
9391
  C: "center",
9374
9392
  R: "bottom_right"
9375
9393
  }[shape.textAnchor ?? "L"],
9376
- font_size: shape.size_mm ? shape.size_mm : void 0,
9394
+ font_size: shape.size_mm || 1,
9377
9395
  layer: "top"
9378
9396
  })
9379
9397
  );
9380
9398
  }
9381
9399
  });
9400
+ if (!hasFoundDesignator && showDesignator) {
9401
+ const bbox = easyEdaJson.packageDetail.dataStr.BBox;
9402
+ circuitElements.push(
9403
+ pcb_silkscreen_text.parse({
9404
+ type: "pcb_silkscreen_text",
9405
+ pcb_silkscreen_text_id: `pcb_silkscreen_text_designator_fallback`,
9406
+ pcb_component_id: "pcb_component_1",
9407
+ text: "{NAME}",
9408
+ anchor_position: {
9409
+ x: milx10(bbox.x + bbox.width / 2),
9410
+ y: milx10(bbox.y) - 1
9411
+ // 1mm above top edge
9412
+ },
9413
+ anchor_alignment: "center",
9414
+ font_size: 1,
9415
+ layer: "top"
9416
+ })
9417
+ );
9418
+ }
9382
9419
  const pcbElements = circuitElements.filter(
9383
9420
  (e) => e.type === "pcb_smtpad" || e.type === "pcb_plated_hole" || e.type === "pcb_hole" || e.type === "pcb_via" || e.type === "pcb_courtyard_outline" || e.type === "pcb_silkscreen_path" || e.type === "pcb_silkscreen_text"
9384
9421
  );
@@ -9404,8 +9441,8 @@ var convertEasyEdaJsonToCircuitJson = (easyEdaJson, { useModelCdn, shouldRecente
9404
9441
  anchor_alignment: "center_of_component_on_board_surface",
9405
9442
  model_origin_alignment: "center_of_component_on_board_surface",
9406
9443
  model_origin_position: {
9407
- x: 0,
9408
- y: 0,
9444
+ x: cadPositionXMm ?? 0,
9445
+ y: cadPositionYMm ?? 0,
9409
9446
  z: resolvedCadPositionZMm ?? position2.z
9410
9447
  },
9411
9448
  position: { x: 0, y: 0, z: 0 },
@@ -10293,6 +10330,92 @@ function normalizeManufacturerPartNumber(partNumber) {
10293
10330
  return normalized;
10294
10331
  }
10295
10332
 
10333
+ // lib/websafe/get-easyeda-cad-placement-helpers.ts
10334
+ var milToMm = (mil) => mil * 0.0254;
10335
+ var getBoundsCenter = (bounds) => ({
10336
+ x: (bounds.min.x + bounds.max.x) / 2,
10337
+ y: (bounds.min.y + bounds.max.y) / 2
10338
+ });
10339
+ var getCadSvgNode = (easyEdaJson) => {
10340
+ const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(
10341
+ (shape) => shape.type === "SVGNODE" && shape.svgData.attrs?.uuid
10342
+ );
10343
+ return svgNode?.type === "SVGNODE" ? svgNode : null;
10344
+ };
10345
+ var parseMil10Value = (value) => Number(String(value).replace("mil", "")) / 10;
10346
+ var isZeroishModelCenter = (value) => Math.abs(value) < 1e-6;
10347
+ var isZeroishFootprintDelta = (value) => Math.abs(value) < 1e-3;
10348
+ var getPadCenter = (easyEdaJson) => {
10349
+ const pads = easyEdaJson.packageDetail.dataStr.shape.filter(
10350
+ (shape) => shape.type === "PAD"
10351
+ );
10352
+ if (pads.length === 0) return null;
10353
+ const xs = pads.map((pad) => parseMil10Value(pad.center.x));
10354
+ const ys = pads.map((pad) => parseMil10Value(pad.center.y));
10355
+ return {
10356
+ x: (Math.min(...xs) + Math.max(...xs)) / 2,
10357
+ y: (Math.min(...ys) + Math.max(...ys)) / 2
10358
+ };
10359
+ };
10360
+ var getRotatedOffsetMm = ({
10361
+ bounds,
10362
+ rawOffsetMil,
10363
+ rotationDeg
10364
+ }) => {
10365
+ const center = getBoundsCenter(bounds);
10366
+ const offsetX = milToMm(rawOffsetMil.x);
10367
+ const offsetY = milToMm(rawOffsetMil.y);
10368
+ switch (rotationDeg) {
10369
+ case 0:
10370
+ return { x: center.x + offsetX, y: center.y + offsetY };
10371
+ case 90:
10372
+ return { x: center.x + offsetY, y: center.y + offsetX };
10373
+ case 180:
10374
+ return { x: center.x - offsetX, y: center.y - offsetY };
10375
+ case 270:
10376
+ return { x: center.x - offsetY, y: center.y - offsetX };
10377
+ }
10378
+ };
10379
+ var getCadModelOffsetMm = (easyEdaJson) => {
10380
+ const svgNode = getCadSvgNode(easyEdaJson);
10381
+ const bounds = easyEdaJson._objMetadata?.bounds;
10382
+ if (!svgNode || !bounds) return null;
10383
+ const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? "0,0").split(",").map((value) => Number(value.trim()));
10384
+ if (!Number.isFinite(originX) || !Number.isFinite(originY)) return null;
10385
+ const [, , rotationZRaw] = String(
10386
+ svgNode.svgData.attrs?.c_rotation ?? "0,0,0"
10387
+ ).split(",").map((value) => Number(value.trim()));
10388
+ const rotationDeg = (rotationZRaw % 360 + 360) % 360;
10389
+ if (![0, 90, 180, 270].includes(rotationDeg)) return null;
10390
+ const modelCenter = getBoundsCenter(bounds);
10391
+ const footprintCenter = easyEdaJson.packageDetail.dataStr.head;
10392
+ const padCenter = getPadCenter(easyEdaJson);
10393
+ const padCenterDelta = padCenter ? {
10394
+ x: padCenter.x - footprintCenter.x,
10395
+ y: padCenter.y - footprintCenter.y
10396
+ } : null;
10397
+ const rawOffsetMil = {
10398
+ x: (originX - footprintCenter.x) * 10,
10399
+ y: (originY - footprintCenter.y) * 10
10400
+ };
10401
+ if (padCenter && padCenterDelta && isZeroishModelCenter(modelCenter.x) && isZeroishModelCenter(modelCenter.y) && isZeroishFootprintDelta(padCenterDelta.x) && isZeroishFootprintDelta(padCenterDelta.y)) {
10402
+ return { x: 0, y: 0 };
10403
+ }
10404
+ return getRotatedOffsetMm({
10405
+ bounds,
10406
+ rawOffsetMil,
10407
+ rotationDeg
10408
+ });
10409
+ };
10410
+ var getCadSvgNodeZOffsetMm = (easyEdaJson) => {
10411
+ const svgNode = getCadSvgNode(easyEdaJson);
10412
+ if (!svgNode) return null;
10413
+ const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0);
10414
+ if (!Number.isFinite(svgNodeZ)) return null;
10415
+ return mil10ToMm(svgNodeZ);
10416
+ };
10417
+ var getCadSvgNodeModelUuid = (easyEdaJson) => getCadSvgNode(easyEdaJson)?.svgData.attrs?.uuid ?? null;
10418
+
10296
10419
  // lib/websafe/get-model-cdn-url.ts
10297
10420
  var getModelObjCdnUrl = ({
10298
10421
  easyedaModelUuid,
@@ -10342,28 +10465,16 @@ var parseObjBounds = (objText) => {
10342
10465
  max: { x: maxX, y: maxY, z: maxZ }
10343
10466
  };
10344
10467
  };
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
10468
  var getPositionZMmFromBounds = (bounds, svgNodeZOffsetMm) => {
10355
10469
  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z;
10356
10470
  return minZ - svgNodeZOffsetMm;
10357
10471
  };
10358
10472
  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;
10473
+ const modelUuid = getCadSvgNodeModelUuid(easyEdaJson);
10364
10474
  const partNumber = easyEdaJson.lcsc.number;
10365
- const svgNodeZOffsetMm = getSvgNodeZOffsetMm(easyEdaJson);
10366
- if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !fetch2) {
10475
+ const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson);
10476
+ const svgNodeZOffsetMm = getCadSvgNodeZOffsetMm(easyEdaJson);
10477
+ if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !derivedOffsetMm || !fetch2) {
10367
10478
  return null;
10368
10479
  }
10369
10480
  const modelObjUrl = getModelObjCdnUrl({
@@ -10378,6 +10489,8 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalTh
10378
10489
  if (metadataBounds) {
10379
10490
  return {
10380
10491
  modelObjUrl,
10492
+ positionXMm: derivedOffsetMm.x,
10493
+ positionYMm: derivedOffsetMm.y,
10381
10494
  modelStepUrl,
10382
10495
  bounds: metadataBounds,
10383
10496
  positionZMm: getPositionZMmFromBounds(metadataBounds, svgNodeZOffsetMm)
@@ -10395,6 +10508,8 @@ var getEasyEdaCadModelPlacement = async (easyEdaJson, { fetch: fetch2 = globalTh
10395
10508
  if (!bounds) return null;
10396
10509
  return {
10397
10510
  modelObjUrl,
10511
+ positionXMm: derivedOffsetMm.x,
10512
+ positionYMm: derivedOffsetMm.y,
10398
10513
  modelStepUrl,
10399
10514
  bounds,
10400
10515
  // Align the EasyEDA SVG-node Z against the model's minimum Z.
@@ -10474,8 +10589,10 @@ var generateFootprintTsx = (circuitJson) => {
10474
10589
  );
10475
10590
  }
10476
10591
  for (const silkscreenText of silkscreenTexts) {
10592
+ const isRefDes = silkscreenText.text === "{NAME}";
10593
+ const textValue = isRefDes ? "{props.name}" : JSON.stringify(silkscreenText.text);
10477
10594
  elementStrings.push(
10478
- `<silkscreentext text="${silkscreenText.text}" pcbX="${mmStr(silkscreenText.anchor_position.x)}" pcbY="${mmStr(silkscreenText.anchor_position.y)}" anchorAlignment="${silkscreenText.anchor_alignment}" ${silkscreenText.font_size ? `fontSize="${mmStr(silkscreenText.font_size)}"` : ""} />`
10595
+ `<silkscreentext text=${textValue} pcbX="${mmStr(silkscreenText.anchor_position.x)}" pcbY="${mmStr(silkscreenText.anchor_position.y)}" anchorAlignment="${silkscreenText.anchor_alignment}" ${silkscreenText.font_size ? `fontSize="${mmStr(silkscreenText.font_size)}"` : ""} />`
10479
10596
  );
10480
10597
  }
10481
10598
  for (const courtyardOutline of courtyardOutlines) {
@@ -10557,7 +10674,10 @@ var convertBetterEasyToTsx = async ({
10557
10674
  const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {
10558
10675
  useModelCdn: true,
10559
10676
  shouldRecenter: true,
10560
- cadPositionZMm: cadPlacement?.positionZMm
10677
+ cadPositionXMm: cadPlacement?.positionXMm,
10678
+ cadPositionYMm: cadPlacement?.positionYMm,
10679
+ cadPositionZMm: cadPlacement?.positionZMm,
10680
+ showDesignator: true
10561
10681
  });
10562
10682
  const [cadComponent] = su(circuitJson).cad_component.list();
10563
10683
  if (cadComponent) {