在 Python 里用 LensBench
在 Python 脚本里调同一套计算:打开一个镜头,调用操作数、算表达式、取分析数据、出图、改设计。写法是 numpy 风格。 通常让 AI 写脚本:脚本放在设计文件旁边的 scripts/ 里,结果(图、表)写到 reports/,在桌面端左边浏览器底下的 「脚本和产物」里看(见桌面端「脚本和产物」)。
import numpy as np
from lensbench.workspace import Lens
L = Lens("cooke.lens") # 或 Lens(text="…")
L.effl() # 50.0214
h = np.linspace(0, 1, 21)
r = L.rsce(ring=3, hy=h) # 21 个视场的 RMS 弥散斑(mm),numpy 数组
L.calc("max(RSCE(ring=3, Hy=0:0.25:1))") # 与 lb calc 相同运行脚本要一个装了 LensBench 的 Python(从源码安装的开发环境)。安装包里的程序是编译好的,暂时不能在你自己的 Python / Jupyter 里 import lensbench,桌面端里也还不能运行脚本——之后提供:第一次用时联网下载运行环境(带 numpy 与 LensBench 库)。在那之前, 要算的东西让 AI 客户端经 MCP 直接调命令算(不用写脚本),或者用命令行 lb calc。
操作数是小写方法
每个操作数(操作数参考)都是 Lens 的一个小写方法,参数名同参考文档、不分大小写:
| 写法 | 说明 |
|---|---|
L.effl()、L.effl(wave=1) | 一个数(float) |
L.ctva(3)、L.reay(L.image, hy=1, py=1) | 第一个位置参数同 op 行(面号等);L.image 是像面面号 |
L.rsce(ring=3, hy=np.linspace(0, 1, 11)) | 参数是数组时逐个展开,返回数组(多个数组参数要等长) |
L.mnct((1, 6)) | 面号范围参数写成 (lo, hi),返回各面的值 |
值用操作数自己的单位(长度 mm、波前 λ、角度 °、畸变 %)。与评价函数里的 op 行、表达式里的调用是同一个实现,数值逐位相同; 只有带面号范围的边界操作数(mnct 等)例外:这里返回各面的值,op 行里按 Zemax 合成一个数(目标 + 各面超限量之和)。
表达式、分析数据、出图
L.calc("EFFL(wave=1) - EFFL(wave=3)") # 表达式(写法见 optimization.md「表达式」),一个数或数组
d = L.analysis("mtf") # 图的原始数据(与桌面端、lb plot 同一份):dict
d = L.analysis("rms_field", num=11) # 选项写法同 view 语句
L.plot("spot", out="spot.png") # LensBench 的出图样式与图框,返回结果(.evidence 是证据 id)
L.plot("mtf", out="mtf.pdf", max_freq="100/mm") # 有量纲的选项带单位改设计一律走命令
L.set(3, R=-21.5, T=4) # 改第 3 面:只动这两个数,注释和排版不变
L.set("IMA", R=-60)
L.run("vary", refs=["R1", "R2"]) # 任何命令:名字同 lb(连字符换成下划线),参数同命令参考
L.run("optimize", cycles=20, dry_run=True).text
L.undo()
L.save("cooke_v2.lens")
print(L.text)和命令行、桌面端、AI 用的是同一套命令:引入错误的修改会被拒绝(抛 LensError,消息就是命令给的原因与提示), 可以撤销。
和 MATLAB 的对照
| MATLAB | LensBench(Python) |
|---|---|
h = linspace(0, 1, 21); | h = np.linspace(0, 1, 21) |
r = rsce(lens, h); | r = L.rsce(hy=h) |
max(r)、mean(r) | r.max()、r.mean()(numpy) |
plot(h, r*1000) | matplotlib.pyplot.plot(h, r * 1000),或用 L.plot(...) 出 LensBench 样式的图 |
脚本放哪、结果在哪看
都在设计文件旁边:scripts/ 放脚本,reports/ 放产物(lb plot、素材包等命令出的文件本来就默认写在这里)。在设计文件所在的 目录里运行脚本(python scripts/field_rms.py),脚本里的相对路径就按这个目录算,结果落进 reports/:
# scripts/field_rms.py:各视场的 RMS 弥散斑,写成表和图
import numpy as np
from lensbench.workspace import Lens
L = Lens("cooke_triplet.lens")
h = np.linspace(0, 1, 21)
r = L.rsce(ring=3, hy=h) * 1000 # µm
np.savetxt("reports/field_rms.csv", np.column_stack([h, r]), delimiter=",",
header="hy,rms_um", comments="")
L.plot("spot", out="reports/spot.png")桌面端左边浏览器最底下的「脚本和产物」列出这两个目录里的文件(展开着时每 5 秒刷新,新写的文件自己出现),单击在「产物」窗口里看 图片、表格与文本,脚本按 Python 着色;svg、pdf 用默认程序打开。
用 Python 写的自定义操作数(.lens 里能直接用)在后续版本里提供。