第三章 数据交换基础:ZMX、ZDA与SEQ、LEN的互转

做光学设计的人,手里多半会同时装着Zemax和CodeV。说实话,这两套软件各有各的脾气。Zemax的ZMX文件,CodeV的SEQ文件,看起来都是文本,但格式差异大得让人头疼。我最早做联合仿真时,就吃过这个亏——在Zemax里调好的镜头,转到CodeV里一看,玻璃全变了,曲率半径也走了样。

这一章,咱们就聊聊文件互转的那些事。说白了,就是让Zemax和CodeV能“说同一种语言”。

3.1 文件格式的本质差异

先看个简单的对比:

项目 Zemax (ZMX) CodeV (SEQ)
存储方式 纯文本,键值对结构 纯文本,固定列宽格式
面型定义 SURF 后跟参数列表 每行一个面,列对齐
玻璃数据 GLASS 关键字 + 名称 GLA 关键字 + 名称
波长单位 微米 (μm) 纳米 (nm)
坐标系统 右手系,Z轴为光轴 右手系,Z轴为光轴

嗯,这里有个坑要注意:波长单位。Zemax默认用微米,CodeV默认用纳米。你直接复制粘贴,波长就差了1000倍。我有个同事就因为这个,折腾了一整天。

3.2 ZMX转SEQ:手动操作流程

我个人习惯用Zemax自带的导出功能。操作路径是这样的:

  1. 在Zemax中打开你的镜头文件
  2. 点击 File → Export → CodeV Sequential
  3. 选择保存路径,文件名后缀自动为 .seq
  4. 点击保存

导出后,用记事本打开SEQ文件,你会看到类似这样的内容:

! Zemax Export to CodeV
! Date: 2024-01-15
LENS
  NAME "Double Gauss"
  WAVL 0.4861 0.5876 0.6563
  UNITS MM
  GLA SCHOTT N-BK7
  GLA SCHOTT SF2
  ...
  SURF
    0 0.000000 0.000000 0.000000
    1 50.000000 0.000000 0.000000
    2 -200.000000 5.000000 0.000000
  END

这里有个细节:WAVL后面的数值,Zemax导出时自动转换成了微米单位。但CodeV内部还是按纳米处理的,所以你需要手动乘以1000。我建议在导出前,先在Zemax里把波长单位改成纳米,这样导出后就不用再改了。

小技巧: 如果你经常做互转,可以在Zemax里建一个模板文件。把波长、玻璃库、单位都设好,每次直接套用。省时省力。

3.3 SEQ转ZMX:反向操作

反过来,从CodeV转到Zemax,流程也差不多:

  1. 在CodeV中打开SEQ文件
  2. 点击 File → Export → Zemax
  3. 选择保存路径,文件名后缀为 .zmx
  4. 点击保存

但这里有个大坑——非球面系数。CodeV和Zemax对非球面系数的定义方式不同。CodeV用的是标准偶次非球面公式,Zemax也是,但系数顺序和符号可能不一样。我曾经遇到过一个非球面镜片,转过去后像质完全变了,查了半天才发现是系数符号反了。

警告: 非球面系数转换时,务必手动核对前几项系数。特别是4阶、6阶项,符号最容易出错。建议在转换后,用两个软件分别计算一下边缘光线高度,对比是否一致。

3.4 玻璃库与材料数据的统一

这是最让人头疼的部分。Zemax和CodeV的玻璃库不通用。Zemax用AGF文件,CodeV用GLC文件。你从Zemax导出的镜头,到了CodeV里,玻璃名称可能根本找不到。

我的做法是这样的:

  • 第一步: 在Zemax中,把所有玻璃都换成标准玻璃库里的材料。比如SCHOTT、OHARA这些大厂的。
  • 第二步: 导出到CodeV后,如果提示找不到玻璃,手动在CodeV的玻璃库中搜索相近的材料。
  • 第三步: 如果实在找不到,就用CodeV的“玻璃替换”功能,让软件自动匹配折射率和阿贝数最接近的玻璃。

举个例子,Zemax里的N-BK7,在CodeV里叫SCHOTT N-BK7。但如果你用的是国产玻璃,比如H-K9L,CodeV里可能就没有。这时候,我建议你在CodeV里手动添加这个玻璃。操作路径:

CodeV 菜单栏 → Tools → Glass Catalog → Add Glass
输入名称: H-K9L
输入折射率 nd: 1.5168
输入阿贝数 vd: 64.17
点击 OK

嗯,这样就能用了。但要注意,折射率和阿贝数只是基础数据。如果你需要精确的色散曲线,还得输入部分色散数据。否则,在消色差设计时可能会出问题。

核心要点: 玻璃库统一的关键,是保证两个软件使用同一套材料数据。要么都用标准库,要么手动添加自定义玻璃。千万别偷懒,否则后期像质优化时,你会发现怎么调都调不好。

3.5 实战:一个完整的互转案例

咱们拿一个双高斯镜头来演示。假设你在Zemax里已经设计好了,现在要转到CodeV里继续优化。

步骤1:在Zemax中准备文件

  • 检查所有玻璃是否来自标准库
  • 将波长单位改为纳米
  • 将镜头单位设为毫米
  • 保存ZMX文件

步骤2:导出为SEQ

  • File → Export → CodeV Sequential
  • 保存为 double_gauss.seq

步骤3:在CodeV中打开

  • File → Open → 选择 double_gauss.seq
  • 如果提示玻璃缺失,按上面方法处理
  • 检查波长数值是否正确(乘以1000)

步骤4:验证数据一致性

  • 在CodeV中计算系统焦距、后截距
  • 与Zemax中的结果对比
  • 如果偏差超过0.1%,检查曲率半径和厚度

我记得有一次,转完以后焦距差了0.5%。查了半天,发现是Zemax里用了“求解类型”的厚度,导出时被固定成了某个值。所以,导出前最好把所有求解都取消,转成固定值。

3.6 知识体系总览

下面这张图,是我自己总结的数据交换核心逻辑。你看一眼,心里就有数了:

Zemax ZMX 文件 ZDA 文件 玻璃库: AGF CodeV SEQ 文件 LEN 文件 玻璃库: GLC 导出为 SEQ 导出为 ZMX 注意事项 波长单位转换 非球面系数核对 玻璃库统一 核心流程:准备 → 导出 → 导入 → 验证 → 优化

这张图把整个数据交换的脉络理清楚了。你照着这个流程走,基本不会出大问题。

3.7 避坑指南

最后,分享几个我踩过的坑:

  • 坐标断点: Zemax里的坐标断点面,转到CodeV后可能变成倾斜面。我建议在导出前,把所有坐标断点都“展平”成标准面。
  • 多重结构: Zemax的多重结构,CodeV不直接支持。你需要手动拆成多个SEQ文件。
  • 非序列组件: 这个就别想了。Zemax的非序列模式,CodeV完全读不了。老老实实手动重建吧。

我曾经因为一个坐标断点没处理好,导致整个系统在CodeV里光路全乱了。从那以后,我每次导出前都会做一个“清理”操作——把所有坐标断点、求解、多重结构都处理干净。虽然麻烦点,但后面省心多了。

好了,数据交换这块就聊到这儿。你只要记住:准备充分、导出规范、验证仔细,这三点做到了,互转就不是问题。


公众号:蓝海资料掘金营,微信deep3321