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.
- package/dist/browser/index.js +146 -26
- package/dist/browser/index.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +146 -26
- package/dist/index.js.map +1 -1
- package/dist/main.cjs +148 -28
- package/dist/main.cjs.map +1 -1
- package/package.json +2 -2
package/dist/browser/index.js
CHANGED
|
@@ -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, {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
10366
|
-
|
|
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
|
|
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
|
-
|
|
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) {
|