CODE V 10.2 API 批量获取 MTF:VBA 脚本实现 6 视场数据自动导出 CODE V 10.2 API 批量获取 MTFVBA 脚本实现 6 视场数据自动导出光学设计工程师经常需要从 CODE V 中提取 MTF调制传递函数数据进行分析和报告。手动操作不仅耗时还容易出错。本文将介绍如何利用 CODE V 10.2 的 API通过 VBA 脚本实现 MTF 数据的自动化批量获取与导出显著提升工作效率。1. 环境准备与基础配置在开始编写 VBA 脚本前需要确保开发环境已正确配置。首先确认已安装 CODE V 10.2 和 Microsoft Excel。VBA 脚本将通过 COM 接口与 CODE V 交互因此需要确保 CODE V 的 COM 组件已注册。关键组件检查清单Microsoft Excel 2016 或更高版本CODE V 10.2 安装目录下的CodeV.Command.102COM 组件Excel 中启用的 VBA 开发环境通过文件 选项 自定义功能区勾选开发工具提示若遇到 COM 组件未注册的错误可以管理员身份运行命令提示符执行regsvr32 C:\Program Files\CODEV\CodeV.Command.102.dll进行手动注册。2. VBA 脚本核心架构以下是一个完整的 VBA 脚本框架用于连接 CODE V 并获取 MTF 数据。脚本分为三个主要部分初始化连接、数据获取和结果输出。Option Explicit Sub GetMTFDataBatch() 定义 CODE V 会话对象 Dim cvSession As Object Dim result As String Dim i As Integer 初始化 CODE V 会话 On Error Resume Next Set cvSession CreateObject(CodeV.Command.102) If cvSession Is Nothing Then MsgBox 无法创建 CODE V 会话请检查 CODE V 10.2 是否正确安装, vbCritical Exit Sub End If 设置工作目录并启动 CODE V cvSession.SetStartingDirectory C:\CVUSER cvSession.StartCodeV 加载镜头文件 result cvSession.Command(res cv_lens:dbgauss) If Left(result, 5) ERROR Then MsgBox 镜头加载失败: result, vbCritical GoTo CleanUp End If 获取并处理 MTF 数据 Call ProcessMTFData(cvSession) CleanUp: 清理资源 cvSession.StopCodeV Set cvSession Nothing End Sub Sub ProcessMTFData(cvSession As Object) MTF 参数配置 Dim frequency As Double: frequency 10 空间频率 (lp/mm) Dim azimuth As Double: azimuth 0 方位角 (0子午,90弧矢) Dim nrd As Integer: nrd 0 非径向对称标志 Dim mtfValues() As Double Dim outputArray(1 To 6) As Double 获取视场数量 Dim fieldCount As Integer fieldCount cvSession.GetFieldCount() 准备 Excel 输出 Dim ws As Worksheet Set ws ThisWorkbook.Sheets.Add(After:ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) ws.Name MTF_Results 设置表头 ws.Cells(1, 1).Value 视场编号 ws.Cells(1, 2).Value 视场位置 ws.Cells(1, 3).Value frequency lp/mm MTF 遍历所有视场获取数据 Dim i As Integer For i 1 To fieldCount 获取当前视场位置 Dim fieldPos As Double fieldPos cvSession.GetFieldPosition(i) 调用 MTF 计算函数 Dim mtfResult As Double mtfResult cvSession.MTF_1FLD(1, i, frequency, azimuth, nrd, outputArray, DIF, SIW) 输出到 Excel ws.Cells(i 1, 1).Value i ws.Cells(i 1, 2).Value fieldPos ws.Cells(i 1, 3).Value outputArray(1) Next i 格式化输出表格 ws.Range(A1:C1).Font.Bold True ws.Columns(A:C).AutoFit End Sub3. MTF_1FLD 函数深度解析MTF_1FLD是 CODE V API 中用于计算单个视场 MTF 的核心函数其完整参数列表如下MTF_1FLD(zoom_pos, field_pos, frequency, azimuth, nrd, output_array, dif_or_geo, sin_or_sqw)参数详解表参数名称类型描述典型值zoom_posInteger变焦位置编号1 (固定焦距系统)field_posInteger视场位置编号1 到 GetFieldCount() 返回值frequencyDouble空间频率 (lp/mm)10, 20, 30 等azimuthDouble方位角度 (度)0 (子午), 90 (弧矢)nrdInteger非径向对称标志0 (默认)output_arrayDouble Array输出数组 (6个元素)必须预先声明dif_or_geoString衍射/几何 MTF 标志DIF (衍射), GEO (几何)sin_or_sqwString正弦/方波响应标志SIW (正弦), SQW (方波)输出数组内容解析output_array(1): 指定频率下的 MTF 值output_array(2): 衍射极限 MTFoutput_array(3): 几何 MTFoutput_array(4): 相对照度output_array(5): 子午方向 MTF (当 azimuth0)output_array(6): 弧矢方向 MTF (当 azimuth90)注意output_array必须预先声明为至少包含 6 个元素的双精度数组否则会导致运行时错误。4. 多视场批量处理与数据导出实际工程中常需要处理多个视场的数据并将结果按特定格式导出。以下增强版脚本支持同时获取多个频率的 MTF 数据将结果导出到不同工作表生成 CSV 文件备份Sub GetMultiFrequencyMTF() Dim cvSession As Object Set cvSession CreateObject(CodeV.Command.102) cvSession.SetStartingDirectory C:\CVUSER cvSession.StartCodeV 加载镜头文件 Dim lensFile As String lensFile dbgauss.lens 替换为实际镜头文件 Dim res As String res cvSession.Command(res lensFile) 配置要分析的频率列表 (lp/mm) Dim frequencies() As Variant frequencies Array(10, 20, 30, 40, 50) 获取视场数量 Dim fieldCount As Integer fieldCount cvSession.GetFieldCount() 创建 Excel 工作表 Dim ws As Worksheet Set ws ThisWorkbook.Sheets.Add ws.Name MultiFrequency_MTF 设置表头 ws.Cells(1, 1).Value 视场 ws.Cells(1, 2).Value 位置 Dim col As Integer For col 0 To UBound(frequencies) ws.Cells(1, col 3).Value frequencies(col) lp/mm Next col 遍历所有视场 Dim i As Integer For i 1 To fieldCount 获取视场位置 Dim fieldPos As Double fieldPos cvSession.GetFieldPosition(i) ws.Cells(i 1, 1).Value i ws.Cells(i 1, 2).Value fieldPos 获取各频率 MTF Dim outputArray(1 To 6) As Double For col 0 To UBound(frequencies) cvSession.MTF_1FLD 1, i, frequencies(col), 0, 0, outputArray, DIF, SIW ws.Cells(i 1, col 3).Value outputArray(1) Next col Next i 导出为 CSV Dim csvPath As String csvPath C:\CVUSER\MTF_Export_ Format(Now(), yyyymmdd_hhmmss) .csv Call ExportToCSV(ws, csvPath) cvSession.StopCodeV Set cvSession Nothing End Sub Sub ExportToCSV(ws As Worksheet, filePath As String) Dim fNum As Integer fNum FreeFile() Open filePath For Output As #fNum Dim lastRow As Long, lastCol As Long lastRow ws.Cells(ws.Rows.Count, 1).End(xlUp).Row lastCol ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 写入标题行 Dim header As String, col As Integer For col 1 To lastCol header header ws.Cells(1, col).Value , Next col Print #fNum, Left(header, Len(header) - 1) 写入数据行 Dim row As Long, line As String For row 2 To lastRow line For col 1 To lastCol line line ws.Cells(row, col).Value , Next col Print #fNum, Left(line, Len(line) - 1) Next row Close #fNum MsgBox 数据已导出到: filePath, vbInformation End Sub5. 高级应用与错误处理在实际应用中需要考虑各种异常情况和性能优化。以下是几个关键增强点错误处理机制添加超时处理防止长时间无响应检查镜头文件是否存在验证 API 调用返回值性能优化技巧减少不必要的 CODE V 命令调用使用数组批量操作 Excel 单元格合理设置计算精度与速度的平衡增强版错误处理示例Sub GetMTFWithErrorHandling() On Error GoTo ErrorHandler Dim cvSession As Object Set cvSession CreateObject(CodeV.Command.102) If cvSession Is Nothing Then Err.Raise vbObjectError 1, , 无法创建 CODE V 会话对象 End If 设置超时时间为 30 秒 cvSession.SetTimeout 30000 启动 CODE V Dim startResult As String startResult cvSession.StartCodeV If Left(startResult, 5) ERROR Then Err.Raise vbObjectError 2, , 启动 CODE V 失败: startResult End If 加载镜头文件 Dim lensFile As String lensFile InputBox(请输入镜头文件名 (如 dbgauss.lens):, 镜头文件) If lensFile Then Exit Sub Dim res As String res cvSession.Command(res lensFile) If Left(res, 5) ERROR Then Err.Raise vbObjectError 3, , 加载镜头失败: res End If 正常处理流程 Call ProcessMTFData(cvSession) CleanUp: 确保资源释放 If Not cvSession Is Nothing Then cvSession.StopCodeV Set cvSession Nothing End If Exit Sub ErrorHandler: MsgBox 错误 Err.Number : Err.Description, vbCritical Resume CleanUp End SubMTF 数据分析扩展表分析类型实现方法应用场景MTF 曲线生成获取多个频率数据并绘制图表全面评估成像质量视场均匀性分析比较不同视场的 MTF 衰减广角镜头设计验证衍射极限对比输出数组中包含衍射极限值评估设计接近理论极限的程度温度/波长分析结合多重结构数据环境适应性评估通过以上方法可以构建一个健壮的 MTF 自动化分析系统大幅提升光学设计评估的效率。实际项目中建议将这些脚本封装为 Excel 插件或独立应用程序便于团队共享使用。