migraeda 0.1.0__tar.gz
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.
- migraeda-0.1.0/LICENSE +21 -0
- migraeda-0.1.0/PKG-INFO +397 -0
- migraeda-0.1.0/README.md +377 -0
- migraeda-0.1.0/pyproject.toml +47 -0
- migraeda-0.1.0/setup.cfg +4 -0
- migraeda-0.1.0/src/migraeda/__init__.py +3 -0
- migraeda-0.1.0/src/migraeda/__main__.py +4 -0
- migraeda-0.1.0/src/migraeda/adascii.py +274 -0
- migraeda-0.1.0/src/migraeda/audit.py +127 -0
- migraeda-0.1.0/src/migraeda/cli.py +495 -0
- migraeda-0.1.0/src/migraeda/convert.py +539 -0
- migraeda-0.1.0/src/migraeda/diff.py +138 -0
- migraeda-0.1.0/src/migraeda/epcb.py +352 -0
- migraeda-0.1.0/src/migraeda/eprj_lib.py +107 -0
- migraeda-0.1.0/src/migraeda/eprj_pcb_write.py +290 -0
- migraeda-0.1.0/src/migraeda/eprj_sqlite.py +559 -0
- migraeda-0.1.0/src/migraeda/eprj_write.py +622 -0
- migraeda-0.1.0/src/migraeda/epro_parse.py +167 -0
- migraeda-0.1.0/src/migraeda/fuzz.py +187 -0
- migraeda-0.1.0/src/migraeda/ir.py +102 -0
- migraeda-0.1.0/src/migraeda/libdiff.py +166 -0
- migraeda-0.1.0/src/migraeda/libinspect.py +109 -0
- migraeda-0.1.0/src/migraeda/libmodel.py +58 -0
- migraeda-0.1.0/src/migraeda/lvs.py +161 -0
- migraeda-0.1.0/src/migraeda/mcp_server.py +403 -0
- migraeda-0.1.0/src/migraeda/mcp_tools.py +404 -0
- migraeda-0.1.0/src/migraeda/migrate.py +158 -0
- migraeda-0.1.0/src/migraeda/models.py +114 -0
- migraeda-0.1.0/src/migraeda/netlist_model.py +37 -0
- migraeda-0.1.0/src/migraeda/normalize.py +33 -0
- migraeda-0.1.0/src/migraeda/pcb_panel.py +73 -0
- migraeda-0.1.0/src/migraeda/pcbascii.py +293 -0
- migraeda-0.1.0/src/migraeda/pcbdiff.py +320 -0
- migraeda-0.1.0/src/migraeda/pcbdoc.py +440 -0
- migraeda-0.1.0/src/migraeda/pcblib.py +91 -0
- migraeda-0.1.0/src/migraeda/report.py +122 -0
- migraeda-0.1.0/src/migraeda/report_common.py +93 -0
- migraeda-0.1.0/src/migraeda/samples.py +99 -0
- migraeda-0.1.0/src/migraeda/schdoc.py +395 -0
- migraeda-0.1.0/src/migraeda/schgeom.py +265 -0
- migraeda-0.1.0/src/migraeda/schlib.py +81 -0
- migraeda-0.1.0/src/migraeda/selfcheck.py +109 -0
- migraeda-0.1.0/src/migraeda/selfcheck_pcb.py +197 -0
- migraeda-0.1.0/src/migraeda/verify_report.py +151 -0
- migraeda-0.1.0/src/migraeda.egg-info/PKG-INFO +397 -0
- migraeda-0.1.0/src/migraeda.egg-info/SOURCES.txt +69 -0
- migraeda-0.1.0/src/migraeda.egg-info/dependency_links.txt +1 -0
- migraeda-0.1.0/src/migraeda.egg-info/entry_points.txt +3 -0
- migraeda-0.1.0/src/migraeda.egg-info/requires.txt +7 -0
- migraeda-0.1.0/src/migraeda.egg-info/top_level.txt +1 -0
- migraeda-0.1.0/tests/test_audit.py +17 -0
- migraeda-0.1.0/tests/test_cli.py +94 -0
- migraeda-0.1.0/tests/test_convert.py +132 -0
- migraeda-0.1.0/tests/test_convert_pcb.py +17 -0
- migraeda-0.1.0/tests/test_diff.py +34 -0
- migraeda-0.1.0/tests/test_epcb.py +42 -0
- migraeda-0.1.0/tests/test_epro_parse.py +23 -0
- migraeda-0.1.0/tests/test_libconvert.py +65 -0
- migraeda-0.1.0/tests/test_libdiff.py +129 -0
- migraeda-0.1.0/tests/test_libinspect.py +40 -0
- migraeda-0.1.0/tests/test_mcp_tools.py +144 -0
- migraeda-0.1.0/tests/test_migrate.py +14 -0
- migraeda-0.1.0/tests/test_multipart.py +59 -0
- migraeda-0.1.0/tests/test_normalize.py +18 -0
- migraeda-0.1.0/tests/test_pcb_panel.py +22 -0
- migraeda-0.1.0/tests/test_pcbascii.py +77 -0
- migraeda-0.1.0/tests/test_pcbdiff.py +88 -0
- migraeda-0.1.0/tests/test_report.py +18 -0
- migraeda-0.1.0/tests/test_report_sections.py +13 -0
- migraeda-0.1.0/tests/test_samples.py +50 -0
- migraeda-0.1.0/tests/test_selfcheck_pcb.py +20 -0
migraeda-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dan luo / MigraEDA contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
migraeda-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: migraeda
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Pin-level verified conversion between JLCEDA (.eprj) and Altium Designer (.SchDoc, .PcbDoc), plus EasyEDA Pro (.epro) migration checks.
|
|
5
|
+
Author: dan luo
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: jlc,jlceda,easyeda,eprj,altium,schdoc,pcbdoc,kicad,eda,lvs,pcb,schematic
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: olefile>=0.46
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
17
|
+
Provides-Extra: mcp
|
|
18
|
+
Requires-Dist: mcp>=1.8; extra == "mcp"
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
|
|
21
|
+
# MigraEDA
|
|
22
|
+
|
|
23
|
+
**嘉立创 EDA ↔ Altium Designer 双向转换 + 闭环校验:原理图逐引脚对网,PCB 连板框、走线、过孔、铜皮一起比对——哪里接错、哪里丢铜,转完当场列出来,而不是等打样回来才发现。**
|
|
24
|
+
|
|
25
|
+
[English](README.en.md)
|
|
26
|
+
|
|
27
|
+
<p align="center">
|
|
28
|
+
<a href="LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-yellow.svg"></a>
|
|
29
|
+
<a href="https://www.python.org/downloads/"><img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-blue.svg"></a>
|
|
30
|
+
<a href="https://github.com/Apollo-lwx/MigraEDA/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/Apollo-lwx/MigraEDA/actions/workflows/ci.yml/badge.svg"></a>
|
|
31
|
+
<a href="https://github.com/Apollo-lwx/MigraEDA"><img alt="GitHub stars" src="https://img.shields.io/github/stars/Apollo-lwx/MigraEDA?style=flat"></a>
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
| | |
|
|
35
|
+
|---|---|
|
|
36
|
+
| 仓库 | [github.com/Apollo-lwx/MigraEDA](https://github.com/Apollo-lwx/MigraEDA) |
|
|
37
|
+
| 安装 | `pip install -e ".[dev]"`(Python 3.10+,运行时只依赖 olefile 一个纯 Python 小包) |
|
|
38
|
+
| 许可 | [MIT](LICENSE) |
|
|
39
|
+
| 当前版本 | 0.1.0 |
|
|
40
|
+
|
|
41
|
+
## 为什么需要它
|
|
42
|
+
|
|
43
|
+
嘉立创和 Altium 互转,官方导入导出转完都显示「成功」。但实际上:
|
|
44
|
+
|
|
45
|
+
- 符号变成方框
|
|
46
|
+
- 电源符号退化成普通网络
|
|
47
|
+
- 网络被悄悄改名
|
|
48
|
+
- 封装映射失败
|
|
49
|
+
- PCB 的走线、过孔、铺铜悄悄缺斤短两
|
|
50
|
+
|
|
51
|
+
**这些全都没有任何提示。** 一块 200 个元件的板子,没人真能开着两个 EDA 逐屏对完。于是调试口 GND 和 +5V 对调、保险丝从火线挪到零线、二极管画反——都是打样回来才发现的。
|
|
52
|
+
|
|
53
|
+
MigraEDA 的做法很直接:**写出文件后立刻读回来,自己跟自己比对。** 原理图按 `位号.引脚` 逐脚对网;PCB 先做刚体对齐,再比板框、元件布局、焊盘位置、过孔和每个网络的铜皮统计。对不上就逐条打印,退出码为 2,CI 直接拦住。原理图、PCB 和库都在校验范围内。
|
|
54
|
+
|
|
55
|
+
## 30 秒看效果
|
|
56
|
+
|
|
57
|
+

|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
migraeda convert 板子.eprj --to ad
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
direction: eprj -> ad-ascii-schdoc
|
|
65
|
+
written: .migraeda/板子.SchDoc
|
|
66
|
+
loop-verify: common_pins=367 mismatched=0 nets_matched=115
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`mismatched=0` 表示这次转换在引脚连通上与源文件完全一致。有错位时会逐条打印出 `位号.引脚`,退出码为 2。
|
|
70
|
+
|
|
71
|
+
PCB 也一样,不只是「能打开」——走线、过孔、铺铜的数量和几何都会被核对:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
migraeda convert 板子.eprj --to adpcb
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
direction: eprj-pcb -> ad-ascii-pcbdoc
|
|
79
|
+
source: 203 components, 1420 pads, 3560 tracks, 412 vias, 28 pour polygons
|
|
80
|
+
written: .migraeda/板子.PcbDoc
|
|
81
|
+
fidelity-verify: PASS (pins 1420/1420, tracks 3560/3560, vias 412/412, polygons 28/28, geom PASS)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
反过来,如果转换真的把网接错了——比如调试口的 GND 和 +5V 被对调——输出会是这样:
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
loop-verify: common_pins=367 mismatched=2 nets_matched=115
|
|
88
|
+
mismatch: J3.2 src='GND' out='+5V'
|
|
89
|
+
mismatch: J3.3 src='+5V' out='GND'
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
退出码为 2。接在 CI 里,这一步直接挡住后续流程——错误的文件出不了流水线,也就到不了打样。
|
|
93
|
+
|
|
94
|
+
## 谁适合用
|
|
95
|
+
|
|
96
|
+
- 板子在嘉立创画的,但工厂 / 客户 / 同事要 Altium 文件(或反过来)
|
|
97
|
+
- 团队里嘉立创、Altium 混用,想确认两份文件是不是同一份设计
|
|
98
|
+
- 用了官方导入导出,想在交付前做一次独立核对
|
|
99
|
+
- 想把「转换有没有丢网」放进 CI,自动拦住而不是靠人对屏
|
|
100
|
+
|
|
101
|
+
## 和官方导入导出的区别
|
|
102
|
+
|
|
103
|
+
转换和验证在同一次命令里完成。产物用同一套解析器读回,原理图比对到引脚,PCB 比对到走线、过孔和铜皮,给出 PASS / WARN / FAIL。
|
|
104
|
+
|
|
105
|
+
| 能力 | 官方导入导出 | MigraEDA |
|
|
106
|
+
|------|----------------|----------|
|
|
107
|
+
| 转换结果 | 丢了也不提示 | 引脚级闭环验证,错位精确到 `位号.引脚` |
|
|
108
|
+
| 人工核对 | 开两个 EDA 对屏 | Markdown 报告,退出码 0 / 1 / 2 |
|
|
109
|
+
| 覆盖范围 | 多为原理图 | 原理图 + PCB(走线、过孔、铜皮)+ 库(符号、封装) |
|
|
110
|
+
|
|
111
|
+
## 核心特性
|
|
112
|
+
|
|
113
|
+
- **双向转换**:嘉立创 `.eprj` ↔ Altium `.SchDoc` / `.PcbDoc`,写出的 ASCII 文件 Altium Designer 可直接打开
|
|
114
|
+
- **原理图引脚级闭环验证**:转换产物立刻重解析,按 `位号.引脚` 逐脚对网,错位逐条打印
|
|
115
|
+
- **PCB 几何级闭环验证**:板框、元件布局、焊盘位置、过孔数量与位置、每个网络的走线长度与铜皮统计,先刚体对齐再比对,容差可调
|
|
116
|
+
- **三重独立验证**:转换内环、双文件比对、A→B→A' 往返比对
|
|
117
|
+
- **CI 友好**:退出码 PASS = 0 / WARN = 1 / FAIL = 2,报告是普通 Markdown,可直接归档为构建产物
|
|
118
|
+
- **零重型依赖、纯本地**:运行时只需 olefile 一个纯 Python 小包,没有账号、没有上传,设计文件不出本机
|
|
119
|
+
- **MCP 服务**:内置 stdio MCP server,可在 Cursor、WorkBuddy 里直接调用
|
|
120
|
+
|
|
121
|
+
## 支持的格式
|
|
122
|
+
|
|
123
|
+
| 格式 | 读 | 写 | 说明 |
|
|
124
|
+
|------|----|----|------|
|
|
125
|
+
| 嘉立创 `.eprj` | 原理图、PCB(docType=3)、内嵌库 | 原理图、PCB、库包 | SQLite 工程,解析不依赖官方客户端 |
|
|
126
|
+
| Altium `.SchDoc` | 二进制与 ASCII | ASCII | 多部件、多显示模式按当前部件/当前模式取引脚 |
|
|
127
|
+
| Altium `.PcbDoc` | 二进制与 ASCII | ASCII | 焊盘、过孔、走线、圆弧、铺铜、板框 |
|
|
128
|
+
| Altium `.SchLib` / `.PcbLib` | 可读,供 `libinspect` / `libdiff` / `libconvert` | 写出待真实样本校准后开放 | 库写出目前落在嘉立创侧 |
|
|
129
|
+
| 嘉立创专业版 `.epro` | 早期迁移检查 | — | 见下方「命令」里的 `.epro` 管道 |
|
|
130
|
+
|
|
131
|
+
写出的 `.SchDoc` / `.PcbDoc` 是 ASCII,Altium Designer 可以直接打开。二进制 PcbDoc 只读不写。
|
|
132
|
+
|
|
133
|
+
## 安装与快速开始
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
git clone https://github.com/Apollo-lwx/MigraEDA.git
|
|
137
|
+
cd MigraEDA
|
|
138
|
+
pip install -e ".[dev]"
|
|
139
|
+
pytest -q
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
设计文件放在 `samples/<项目名>/`,按扩展名识别。该目录已在 `.gitignore` 中,内容不会进仓库,约定见 [`samples/README.md`](samples/README.md)。所有命令也接受任意路径,`samples/` 只是方便批处理。
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
migraeda samples
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
G318: AD PCB, AD原理图, 嘉立创工程
|
|
150
|
+
SME-IOT-1: AD PCB, AD原理图, 嘉立创工程
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 嘉立创工程转成 Altium
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
migraeda convert samples/G318/板子.eprj --to ad
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
不写 `-o` 时,产物写到源文件旁边的 `.migraeda/`(已在 `.gitignore` 里)。
|
|
160
|
+
|
|
161
|
+
```text
|
|
162
|
+
direction: eprj -> ad-ascii-schdoc
|
|
163
|
+
written: samples/G318/.migraeda/板子.SchDoc
|
|
164
|
+
loop-verify: common_pins=367 mismatched=0 nets_matched=115
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
PCB 用 `--to adpcb`。Altium 原理图转回嘉立创用 `--to eprj`。手边已有 Altium PCB 时,加上 `--with-pcb 板子.PcbDoc`,布局会写进新的 `.eprj`。多行拼板(仅 `adpcb`)用 `--panel-rows N`。
|
|
168
|
+
|
|
169
|
+
### 两份文件是不是同一份设计
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
migraeda verify samples/G318/嘉立创.eprj samples/G318/AD.SchDoc --report samples/G318/.migraeda/verify.md
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
common pins: 351, mismatched: 34, nets matched: 110
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
差异写到位号、引脚和两侧网络名。PCB 对 PCB:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
migraeda pcbdiff a.PcbDoc b.PcbDoc --tol 2.0 --report .migraeda/pcb.md
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`.PcbDoc`(二进制或 ASCII)和带 PCB 页的 `.eprj` 可以混比。坐标系或拼板差异会先做刚体对齐,再比板框、元件、焊盘、过孔和铜皮。
|
|
186
|
+
|
|
187
|
+
### 官方导入之后,核对有没有丢网
|
|
188
|
+
|
|
189
|
+
在嘉立创客户端导入 Altium 并另存为 `.eprj` 之后:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
migraeda verify 原始.SchDoc 导入后.eprj --report .migraeda/check.md
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
一条命令做原理图往返,并在工程里带 PCB 时把 PCB 往返一并跑完:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
migraeda roundtrip samples/G318/板子.eprj
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
中间文件留在 `.migraeda/roundtrip/`。结论只有两种:
|
|
202
|
+
|
|
203
|
+
```text
|
|
204
|
+
roundtrip: IDENTICAL ✅
|
|
205
|
+
pcb roundtrip: PASS ✅
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## 命令速查
|
|
209
|
+
|
|
210
|
+
转换默认带闭环验证。`--no-verify` 可以关掉。省略 `-o` 时,文件写到源文件旁边的 `.migraeda/`;`roundtrip` 写到 `.migraeda/roundtrip/`。
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
migraeda convert <输入> --to ad|eprj|adpcb [-o 目录] [--with-pcb PCBDOC] [--panel-rows N] [--report 报告.md]
|
|
214
|
+
migraeda libconvert <库源> [-o 目录] # .eprj / .SchLib / .PcbLib / .PcbDoc → 嘉立创库包
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
| `--to` | 输入 | 产物 |
|
|
218
|
+
|--------|------|------|
|
|
219
|
+
| `ad` | `.eprj` | ASCII `.SchDoc` |
|
|
220
|
+
| `eprj` | `.SchDoc`(二进制或 ASCII) | 嘉立创 `.eprj` |
|
|
221
|
+
| `adpcb` | 含 PCB 页的 `.eprj` | ASCII `.PcbDoc` |
|
|
222
|
+
|
|
223
|
+
验证与往返:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
migraeda verify <a> <b> [--report out.md] [--limit 30]
|
|
227
|
+
migraeda pcbdiff <a> <b> [--tol 2.0] [--report out.md]
|
|
228
|
+
migraeda libdiff <a> <b> [--tol 1.0] [--report out.md]
|
|
229
|
+
migraeda roundtrip <输入.eprj 或 .SchDoc> [-o 目录]
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
`<a>` / `<b>` 可以是 `.eprj`、`.SchDoc`、`.PcbDoc` 的任意组合(`pcbdiff` 的两侧须是 PCB:`.PcbDoc` 或含 PCB 的 `.eprj`)。退出码:PASS = 0,WARN = 1,FAIL = 2。原理图 `verify` 在出现引脚错位时返回 2。
|
|
233
|
+
|
|
234
|
+
辅助命令:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
migraeda samples [--root samples] [--check] # 列出样本;--check 逐个跑结构自检
|
|
238
|
+
migraeda libinspect <文件> # 只打印结构元数据,适合外发求助
|
|
239
|
+
migraeda selfcheck <文件> [--pcb] [--converted PCBDOC] [--report out.md]
|
|
240
|
+
migraeda fuzz <文件> [-n 50] [--seed 42] # 变异输入,找解析器崩溃
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
`.epro` 早期管道(没有 KiCad 时 dry-run 仍可跑通):
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
migraeda migrate <input.epro> -o <outdir> [--dry-run]
|
|
247
|
+
migraeda diff <source.epro> <kicad 或 stats.json> -o report.md
|
|
248
|
+
migraeda report <diff.json> -o report.md # 加 --html 出 HTML
|
|
249
|
+
migraeda rollback <migration_id>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`diff` 的分级:元件数、网络名集合、过孔数一致为 PASS;元件数一致且网络对称差 ≤ 2 或过孔差为 1 时为 WARN;元件数不等、网络对称差 > 2 或过孔差 > 1 为 FAIL。
|
|
253
|
+
|
|
254
|
+
## 验证怎么成立
|
|
255
|
+
|
|
256
|
+
1. **内环。** 转换产物马上用同一套解析器读回,和源网表做引脚级 LVS,有错位就失败。
|
|
257
|
+
2. **外环。** 产物再和另一份已知设计(例如客户手上的原厂文件)比对。多出来的差异就是转换器的问题。旋转手性一类的错误是在这一层被收成零的。
|
|
258
|
+
3. **往返。** `A → B → A'`,终稿和原稿逐引脚比较。`roundtrip` 会把中间文件留在磁盘上。
|
|
259
|
+
|
|
260
|
+
PCB 侧用 `pcbdiff`:先做刚体对齐,吸收坐标系和拼板差异,再比板框尺寸、元件位置、焊盘偏移、过孔配对和逐网络铜皮统计(走线条数与总长、过孔数、铺铜)。`roundtrip` 在工程带 PCB 页时会自动把 PCB 往返一并跑完。
|
|
261
|
+
|
|
262
|
+
几何连通和这些规则对齐:导线端点与 T 型相接、零长度网络点、引脚直接对碰、多部件元件只激活当前部件的引脚、多显示模式取当前模式、Altium 网络名大小写不敏感、拼板实例先归并再比较。
|
|
263
|
+
|
|
264
|
+
## 已知边界
|
|
265
|
+
|
|
266
|
+
- 符号图形按引脚位置合成方框。引脚编号、位置和连通保持精确,原厂符号美术不在转换范围内。封装保留名称引用和焊盘几何。
|
|
267
|
+
- PCB 写出为 ASCII `.PcbDoc`。二进制 `.PcbDoc` 可以读、可以比,不能写回二进制。
|
|
268
|
+
- 库文件写出目前只到嘉立创 `.eprj` 库包。Altium `.SchLib` / `.PcbLib` 的写出要等真实样本校准。
|
|
269
|
+
- 生成的 `.eprj` 按已验证过的 schema 复刻,并用自带解析器回读。用嘉立创客户端打开时,请以你手上的客户端版本实测为准。
|
|
270
|
+
- `fixtures/golden/*.epro` 是合成 ZIP + JSON,字段名贴近公开资料,不是官方完整 schema。重建:`python scripts/build_fixtures.py`。
|
|
271
|
+
|
|
272
|
+
## 常见问题
|
|
273
|
+
|
|
274
|
+
<details>
|
|
275
|
+
<summary>嘉立创 <code>.eprj</code> 怎么转成 Altium <code>.SchDoc</code>?</summary>
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
migraeda convert 工程.eprj --to ad
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
输出是 ASCII `.SchDoc`,写在 `工程.eprj` 旁边的 `.migraeda/工程.SchDoc`,Altium Designer 可以直接打开。命令结束时会打印 `loop-verify`。`mismatched=0` 才算这轮引脚连通通过。
|
|
282
|
+
|
|
283
|
+
</details>
|
|
284
|
+
|
|
285
|
+
<details>
|
|
286
|
+
<summary>嘉立创 PCB 怎么转成 Altium <code>.PcbDoc</code>?</summary>
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
migraeda convert 工程.eprj --to adpcb
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
工程里需要有 PCB 页。输出包含焊盘、过孔、走线、圆弧、铺铜和板框,同样是 ASCII,Altium 可直接打开。
|
|
293
|
+
|
|
294
|
+
</details>
|
|
295
|
+
|
|
296
|
+
<details>
|
|
297
|
+
<summary>Altium 原理图怎么转回嘉立创?</summary>
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
migraeda convert 原理图.SchDoc --to eprj
|
|
301
|
+
migraeda convert 原理图.SchDoc --to eprj --with-pcb 板子.PcbDoc
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
二进制和 ASCII 的 `.SchDoc` 都能读。第二行把已有 PCB 嵌进新的 `.eprj`。
|
|
305
|
+
|
|
306
|
+
</details>
|
|
307
|
+
|
|
308
|
+
<details>
|
|
309
|
+
<summary>怎么确认转换没有把网络接错?</summary>
|
|
310
|
+
|
|
311
|
+
看三条独立的证据,由严到宽:`convert` 自带的 loop-verify、`migraeda verify` 对两份任意来源的文件、`migraeda roundtrip` 的往返自比对。三处都用同一套引脚级 LVS。引脚错位的退出码是 2,WARN 是 1,通过是 0。
|
|
312
|
+
|
|
313
|
+
</details>
|
|
314
|
+
|
|
315
|
+
<details>
|
|
316
|
+
<summary>和嘉立创官方的导入导出有什么不同?</summary>
|
|
317
|
+
|
|
318
|
+
官方路径负责把文件打开。MigraEDA 在写出之后重解析产物,把不一致的引脚打印出来,并用退出码挡住后续流程。官方导入完成之后,也可以用 `migraeda verify 原始文件 导入后.eprj` 做一次独立核对。
|
|
319
|
+
|
|
320
|
+
</details>
|
|
321
|
+
|
|
322
|
+
<details>
|
|
323
|
+
<summary>符号会变成方框吗?</summary>
|
|
324
|
+
|
|
325
|
+
会。转换后的符号是按引脚位置合成的方框,引脚编号、坐标和网络连通按 LVS 核对。原厂符号图形和封装丝印美术不在本工具的转换范围内。封装侧保留名称和焊盘几何。
|
|
326
|
+
|
|
327
|
+
</details>
|
|
328
|
+
|
|
329
|
+
<details>
|
|
330
|
+
<summary>能放进 CI 吗?</summary>
|
|
331
|
+
|
|
332
|
+
可以。安装只需 Python 3.10+,运行时依赖只有 olefile 一个纯 Python 小包。`mismatched` 非零或 PCB 分级为 FAIL 时退出码为 2。报告是普通 Markdown,可直接作为构建产物归档。
|
|
333
|
+
|
|
334
|
+
</details>
|
|
335
|
+
|
|
336
|
+
<details>
|
|
337
|
+
<summary>设计文件会离开本机吗?</summary>
|
|
338
|
+
|
|
339
|
+
不会。解析、转换、比对全部在本地完成,没有账号,也没有上传接口。产物默认在源文件旁的 `.migraeda/`,`samples/` 与 `.migraeda/` 都已被 git 忽略。需要对外求助时,用 `migraeda libinspect`,它只打印结构元数据。
|
|
340
|
+
|
|
341
|
+
</details>
|
|
342
|
+
|
|
343
|
+
<details>
|
|
344
|
+
<summary>支持 KiCad 吗?</summary>
|
|
345
|
+
|
|
346
|
+
主路径是嘉立创 `.eprj` 与 Altium。嘉立创专业版 `.epro` 仍保留早期的 `migrate` / `diff` / `report` / `rollback`,用于可复查的 KiCad 迁移检查;机器上没有 KiCad 时 `--dry-run` 可以跑完统计和报告。
|
|
347
|
+
|
|
348
|
+
</details>
|
|
349
|
+
|
|
350
|
+
## 参与贡献
|
|
351
|
+
|
|
352
|
+
问题请到 [GitHub Issues](https://github.com/Apollo-lwx/MigraEDA/issues) 提交。复现转换问题时,优先附上 `migraeda libinspect <文件>` 的输出和 `verify` / `pcbdiff` 的 Markdown 报告,不必附上整份原理图。
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
pip install -e ".[dev]"
|
|
356
|
+
pytest -q
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## 本地 MCP
|
|
360
|
+
|
|
361
|
+
本机 stdio 服务,给 Cursor、WorkBuddy 这类客户端调用。设计文件只在运行这条命令的电脑上读写,没有远程接口。
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
pip install -e ".[mcp]"
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
`mcp.json`(Cursor 用项目或用户配置,WorkBuddy 用 `~/.workbuddy/mcp.json`):
|
|
368
|
+
|
|
369
|
+
```json
|
|
370
|
+
{
|
|
371
|
+
"mcpServers": {
|
|
372
|
+
"migraeda": {
|
|
373
|
+
"command": "python",
|
|
374
|
+
"args": ["-m", "migraeda.mcp_server"]
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
虚拟环境里也可以把 `command` 写成 `migraeda-mcp`,去掉 `args`。
|
|
381
|
+
|
|
382
|
+
| 工具 | 作用 | 是否写文件 |
|
|
383
|
+
|------|------|------------|
|
|
384
|
+
| `migraeda_convert` | `.eprj` ↔ `.SchDoc` / `.PcbDoc`,带引脚级闭环验证 | 写到 `.migraeda/` |
|
|
385
|
+
| `migraeda_verify` | 两份设计的引脚网络比对 | 不写 |
|
|
386
|
+
| `migraeda_pcbdiff` | 两份 PCB 的板框、元件、焊盘、过孔、铜皮 | 不写 |
|
|
387
|
+
| `migraeda_roundtrip` | 转出再转回,和原稿比对;有 PCB 页时一并跑 | 写到 `.migraeda/roundtrip/` |
|
|
388
|
+
| `migraeda_libinspect` | 结构元数据,可外发求助 | 不写 |
|
|
389
|
+
| `migraeda_selfcheck` | 单份文件的悬空引脚、重复位号等信号 | 不写 |
|
|
390
|
+
|
|
391
|
+
返回里的错位列表默认最多 20 条。`grade` 为 `PASS`、`WARN`、`FAIL` 或 `SKIPPED`。大板把 `timeout_seconds` 调到 300 以内,上限 600。
|
|
392
|
+
|
|
393
|
+
## 许可
|
|
394
|
+
|
|
395
|
+
核心代码 [MIT](LICENSE)。Copyright (c) 2026 dan luo / MigraEDA contributors。
|
|
396
|
+
|
|
397
|
+
不要把 GPL 的 EasyKiConverter 静态链接进本项目。
|