编排:动作与报告
换一块玻璃,要回答的从来不只是「像质变了多少」:热离焦会不会超出焦深、镜头轻了还是重了、新玻璃的化学稳定性和供货状态怎样、 验收还过不过。以前要在软件里一项项打开分析窗口、做热分析、查玻璃数据表,再手工抄表对比。
编排把这件事拆成两样东西,都写在 .lens 里、随设计走、能 diff:
- 动作(
action):要试的改动,如「第 3 片换成 N-F2,再重新对焦」。在设计的副本上执行,不改当前设计 - 报告(
report):改完要看什么、按什么顺序,如「光学、热效应、重量、材料、验收」
一条命令把每个动作做一遍、按报告逐项评估,出改前 / 改后的对比汇总:
lb report-run cooke.lens # 基线和全部动作并排对比
lb report-run cooke.lens 换玻璃评估 --actions "无铅 全国产"
lb report-run cooke.lens --out reports/glass_study # 同时写 summary.md / summary.json / 各方案的 .lens
lb report-run cooke.lens --save # 写到默认目录 <镜头目录>/reports/<镜头名>_<报告名>/
lb action-run cooke.lens 无铅 --dry-run # 选中一个方案:先看补丁,再去掉 --dry-run 应用编排行不进模型哈希:只改编排,任何分析数字和证据 id 都不变。AI 经 MCP 用 action_add、report_add 等命令改编排, 和人改走的是同一套命令。
在桌面端
- 功能区「交付 › 编排…」打开编排窗口。动作与报告可以在窗口里编辑:「+ 评估项」给报告加一项;各项与各步按住行首的 ⠿ 拖动 调顺序(也可以点 ↑ ↓),× 删掉;有选项的评估项(光学、热效应、公差)点「选项」展开表单,空着的用默认值,「应用」只改这一行里 对应的选项(同
lb report-set,可撤销);「编辑动作」里写动作名和一步(如set 3 glass=SCHOTT:N-F2)加进去。这些都只是改 底部「报告编排」页签里的文本(同一份.lens),在那里直接改也一样 - 选一份报告、勾选要比较的动作,点「运行」——在后台评估(界面照常可用,显示「第 k / N 步」与进度条,可以取消), 完成后窗口里是每个方案的关键变化(变差的排前面、标红)、改了什么,以及各评估项的对比表(每个方案一列,变好绿、变差红)
- 方案下面的「采用…」在右侧「参数」页里填好
action_run:先看 diff 与改前改后的指标,点应用才写入,可撤销 - 每次运行都把汇总写到
<镜头目录>/reports/<镜头名>_<报告名>/(summary.md、summary.json、各方案的 .lens;没存盘的设计写到临时目录), 窗口里显示路径、可以复制,右侧「产物」里也看得到 - 「复制汇总」把整份对比(同
lb report-run的输出)放进剪贴板,可以直接贴进报告或发给 AI - 同一组里还有「热分析」「镜片重量」「材料数据」,结果写在终端页

一个例子
Cooke 三片式的中间片用的是含铅的 F2。客户要求无铅、最好全部国产化:
action 无铅 set 3 glass=SCHOTT:N-F2
action 无铅 refocus
action 全国产 set 1 glass=CDGM:H-ZK9B
action 全国产 set 3 glass=CDGM:H-F4
action 全国产 set 5 glass=CDGM:H-ZK9B
action 全国产 refocus
report 换玻璃评估 optics freq=40/mm
report 换玻璃评估 thermal temp=-20C..60C housing=aluminum
report 换玻璃评估 weight
report 换玻璃评估 material
report 换玻璃评估 verifylb report-run 的输出开头是每个方案相对基线的关键变化(变差的排前面),后面是每个评估项的对比表:
## 关键变化(相对基线)
- 无铅:热离焦 最大(绝对值) 45.53 → 49.02 µm(+3.5) ✗;热离焦 / 焦深(> 1 即超出焦深) 1.55 → 1.67(+0.119) ✗;
RMS 弥散斑 最差视场 17.73 → 17.07 µm(-0.661) ✓;…;玻璃总质量 3.417 → 3.352 g(-0.0656,-1.9 %) ✓
- 无铅 改了:面 3 glass SCHOTT:F2 → SCHOTT:N-F2;面 6 T 42.20778 → 42.268769✓ 变好、✗ 变差、* 变了但没有好坏(如牌号、nd);括号里是相对基线的变化。按显示的有效数字相同的不标。 每个评估项在每一版设计上的结果都登记了证据 id,报告里引用的数可以用 lb check-report 逐个核对。
仓库的 examples/studies/ 里有三个完整的例子:
| 文件 | 问题 |
|---|---|
cooke_glass_swap.lens | 换无铅 / 国产玻璃:像质、热离焦、重量、材料、验收;第三个方案换完再优化 |
double_gauss_weight.lens | 双高斯减重:换密度小的等效牌号能轻多少,像质、边厚、热离焦会不会变差 |
telephoto_thermal.lens | 长焦镜头在 −40…+85 °C:铝合金、钛合金、殷钢三种镜筒的热离焦对比,再试换后组玻璃 |
cooke_tolerance.lens | 换成国产玻璃并再优化以后,公差变松了还是变紧了:灵敏度(最敏感的是中间片与后片的偏心)与蒙特卡洛良率并排比 |
动作
action <名字> <步骤> [参数 …],一行一步,同名的行按书写顺序合成一个动作:
| 步骤 | 写法 | 做什么 |
|---|---|---|
set | set 3 glass=CDGM:H-ZF52A、set 4 T=5 R=-20 | 改某个面的参数,同 lb set(面号也可写 OBJ / STO / IMA) |
system | system "aperture FNO 4" | 替换一条系统设置语句,同 lb system |
refocus | refocus | 像面前那段厚度调到 RMS 弥散斑最小(同 solve(focus),结果写成数);那段厚度本来就有 solve 时不动 |
optimize | optimize cycles=30 | 按设计里的 var / op / default 做一次局部优化,同 lb optimize |
每一步就是那条命令本身,所以规矩也一样:改出新错误的一步会被拒绝,整个动作停在那一步,报告里写明是哪一步、为什么。
报告
report <名字> <评估项> [选项=值 …],一行一项,同名的行按书写顺序合成一份报告。不写 report 时用默认报告 (光学、热效应、重量、材料、验收、可制造性)。同一种评估项可以写几条、取不同的选项,比如三种镜筒材料各一条 thermal。
| 评估项 | 看什么 | 选项 |
|---|---|---|
optics 光学 | EFFL、BFL、F/#、总长;各视场复色 RMS 弥散斑;同一频率的子午 / 弧矢 MTF;最大畸变;最大垂轴色差 | freq= |
thermal 热效应 | 温度范围两端的热离焦、最大热离焦、斜率(µm/°C)、与焦深之比;焦距漂移;像面不动时全温度的最差 RMS 与 MTF | temp= steps= ref= housing= pres= freq= |
weight 重量 | 每片玻璃的质量、玻璃总质量与总体积 | — |
material 材料 | 每种玻璃的 nd、vd、密度、线膨胀系数、dn/dT、ΔPgF、供货状态、化学稳定性 | — |
verify 验收 | 每条 spec 的值与过 / 不过、通过的条数(同 lb verify) | — |
manufacturing 可制造性 | 每片的边厚、装夹违例与边厚过小的警告 | — |
tolerance 公差 | 按设计里的 tol 行做公差分析(同 lb tolerance,补偿器重新优化后算判据)。灵敏度:判据名义值、均方根合成的估计、影响最大的几项;蒙特卡洛:均值、标准差、50 / 90 % 分位、最差,写了 limit 再给良率。算得慢,默认报告里没有,要写出来才算 | mode= trials= seed= cycles= top= limit= |
整份报告用同一个 MTF 频率比较:第一个写了 freq= 的评估项的频率,都没写就取基线截止频率的 1/8(取整到 5)。
热效应的选项:temp=-20C..60C(温度范围,°C)、steps=5(温度点数,含两端)、ref=20C(名义温度,设计所在的温度)、 housing=aluminum(镜筒材料:aluminum 铝合金 23.6、steel 不锈钢 17.3、brass 黄铜 20.5、titanium 钛合金 8.6、 invar 殷钢 1.3(×10⁻⁶/K)、none 间隔不变)、pres=1(气压,相对 1 atm;0 = 真空)。
热分析怎么算
热效应(也可以单独用 lb thermal)对每个温度点建一份设计的拷贝再求值:
- 折射率:按厂商目录的热色散系数(Schott 公式),Δn_abs = (n² − 1)/(2n)·[D0ΔT + D1ΔT² + D2ΔT³ + (E0ΔT + E1ΔT²)/(λ² − λtk²)], 再换算成该温度、气压下相对空气的折射率(空气折射率随温度、气压变化,同 Zemax 的环境修正)
- 镜片:半径、非球面系数、固定半口径与中心厚,按这块玻璃的线膨胀系数等比伸缩(面形整体缩放)
- 空气间隔:隔圈、镜筒和像面安装都按镜筒材料伸缩;物距不变
- 热离焦:近轴边缘光线的像点(同
solve(marginal_height, 0))相对像面的距离,减去名义温度下的同一个量;正值表示焦点在像面之后。 与焦深 ±2λF#² 比较:比值大于 1 就超出了焦深 - 像面不动时的像质:各温度下不重新对焦,算 RMS 弥散斑与 MTF
假设整个镜头温度均匀、处处相同(没有温度梯度),不计应力双折射、胶层与镜片的固定方式。厂商目录里没有热色散系数或线膨胀系数的 材料(模型玻璃、部分晶体与塑料)按 0 算,结果里会写明是哪几种。公式与单透镜的独立解析解核对过(计算可信度)。
重量与材料数据
- 质量(也可以单独用
lb weight):一片玻璃 = 相邻两个面之间的玻璃,外径取两面半口径中较大的,半口径较小的一面在自己的半口径之外按 平面延伸(同 Zemax 的 VOLU / TMAS),体积乘厂商目录的密度。只算玻璃,不含镜筒和隔圈 - 材料数据(也可以单独用
lb materials):取自厂商目录——随包材料库,或agf行加载的 AGF(其中的 TD、ED、OD 行)。 化学稳定性按厂商自己的分级,数越小越好;不同厂商的分级体系不完全一样,跨厂商比较时看说明
输出与 AI
--out 目录写三样:summary.md(同命令输出)、summary.json(全部数据:每版设计、每个评估项的每一行、证据 id、各温度点的明细)、variants/<动作>.lens(每个方案改完的设计,可直接打开、复现)- 要写正式报告时,把
summary.json和报告素材包一起交给 AI:数字照录、引用证据 id,写完用lb check-report核对 - MCP 里同名的工具:
report_run、action_run、action_add/action_delete/action_move、report_add/report_delete/report_move、thermal、weight、materials。report_run和action_run可以background=true在后台跑 - 全部语句与参数见 .lens 语句参考,命令见命令参考