本文将介绍如何使用Python和MATLAB生成ZOS-API中各个分析的可用数据类型(IAR类型)列表。
作者 Michael Cheng
附件下载引言当使用ZOS-API访问OpticStudio时,通常会运行诸如点列图(Spot Diagram) 、调制传递函数(Modulation Transfer Function , MTF)或点扩散函数(Point Spread Function , PSF)之类的分析。不同的分析会生成不同类型的数据。ZOS-API支持以下数据类型:
通常,一种分析只返回一到两种数据类型。例如,快速傅里叶变换(Fast Fourier Transform,FFT)MTF分析的结果以数据集(DataSeries)格式返回。若要求FFT MTF分析返回数据网格(DataGrid)格式,将导致结果为空。并不是所有的分析窗口都会产生结果。尽管每种分析都有相关的数据类型,但是也要测试相应的数据类型以确保其包含数据。对于没有数据的分析,使用简单直接的GetTextFile将数据保存到磁盘,然后手动解析数据。
可以使用表格轻易地查看可供分析使用的数据类型。如下两个示例演示如何使用Python和MATLAB生成表格。这两个表格的源代码在本文的“示例文件”部分提供。
从OpticStudio生成模板代码之后,从“ # Insert Code here ”开始,下面的代码片段是第一个代码块。默认情况下,这段代码是用来测试序列分析。若要生成用于非序列分析的表格,请取消对第二行代码的注释。
# Insert Code here
TheSystem = zosapi.TheSystem
# Uncomment following line for non-sequential analyses
# TheSystem.MakeNonSequential()
TheAnalyses = TheSystem.Analyses
在下一部分代码中,所有枚举名称都是使用 “ constants. dicts__[0].keys() ” 检索的 (“ constants ”包含ZOS-API使用的所有枚举)。然后使用for循环检查所有枚举,以找到包含“ AnalysisIDM_”的枚举。当找到匹配的枚举时,代码段使用 “ constants. dicts__[0].get(i) ”查找其值,并记录在 “ analIDM ” 列表中。最后,代码段对analIDM列表进行排序,以便于用户使用。
analIDM = []
API_enum = list(constants.__dicts__[0].keys())
for i in API_enum:
if i.find('AnalysisIDM_') != -1:
analIDM.append(constants.__dicts__[0].get(i))
print(constants.__dicts__[0].get(i), ': ', i)
analIDM.sort()
如下代码可打印输出数据类型名称。
print('Name\tSetting\tDatGrid\tDatGridRgb\tDatSrs\tDatSrsRgb\t' + 'DatScat\tDatScatRgb\tRayData\tCriRayDat\tPathAnal\tSpotDat')
analIDM 列表包含了所有的分析。在下一个代码片段中,使用for循环打开所有使用“ TheAnalyses.New_Analysis(k) ” 的可用分析。
如果分析是空 ( None ) 类型,则打印输出一条错误消息。为了获得关于这些分析的信息,代码应该将系统更改为对应模式(序列或非序列)。
如果分析是有效类型(而不是空类型),如下代码片段将测试并报告每种数据类型的可用性。
for k in analIDM:
a = TheAnalyses.New_Analysis(k)
if a is None :
print('This analysis cannot be opened in ',
'Sequential Mode' if TheSystem.Mode == 0 else 'Non-Sequential Mode',
': enumID ',k)
continue
ar = a.GetResults()
print(a.GetAnalysisName, '\t',
a.HasAnalysisSpecificSettings, '\t',
ar.DataGrids is not None and ar.NumberOfDataGrids > 0, '\t',
ar.DataGridsRgb is not None and ar.NumberOfDataGridsRgb > 0, '\t',
ar.DataSeries is not None and ar.NumberOfDataSeries > 0, '\t',
ar.DataSeriesRgb is not None and ar.NumberOfDataSeriesRgb > 0, '\t',
ar.DataScatterPoints is not None and ar.NumberOfDataScatterPoints > 0, '\t',
ar.DataScatterPointsRgb is not None and ar.NumberOfDataScatterPoints > 0, '\t',
ar.RayData is not None, '\t',
ar.CriticalRayData is not None, '\t',
ar.PathAnalysisData is not None, '\t',
ar.SpotData is not None)
a.Close()
结果如下所示:
不同的值由制表符分隔,因此可以轻松地将数据复制并粘贴到EXCEL电子表格中。
MATLAB 示例首先,在OpticStudio中生成模板代码,然后在 “ % Add your custom code here…” 后面添加自定义代码。如下的代码片段是第一个代码块。默认情况下,这段代码测试序列分析。要生成非序列分析表格,则要取消注释 “ TheSystem.MakeNonSequential() ” 行。
% Add your custom code here...
% Uncomment following line for non-sequential analyses
% TheSystem.MakeNonSequential()
TheAnalyses = TheSystem.Analyses;
在下一个代码块中,代码片段将分析枚举 ZOSAPI.Analysis.AnalysisIDM 保存在变量 analIDM 中,然后使用 “ System.Enum.GetValues(analIDM. gettype) ” 获取值。
analIDM = ZOSAPI.Analysis.AnalysisIDM; analValue = System.Enum.GetValues(analIDM.GetType);
下一行打印数据类型名称。LogicStr用于在输出中打印易于读取的布尔值。在MATLAB中打印输出布尔值,默认情况下,布尔值错误时的输出为 “0” ,布尔值正确时的输出为 “1” 。通过预先定义LogicStr,可以在布尔值正确时打印输出 “true” ,布尔值错误时打印输出 “false”。
print('Name\tSetting\tDatGrid\tDatGridRgb\tDatSrs\tDatSrsRgb\t' + 'DatScat\tDatScatRgb\tRayData\tCriRayDat\tPathAnal\tSpotDat')
列表analIDM包含了所有的分析。在下一个代码块中,将for循环用于 “TheAnalyses.New_Analysis(analValue(idx))”,打开所有可用的分析。如果返回的分析对象不是空的,则该代码段将测试并报告每种数据类型的可用性。如果返回的分析对象为空,则代码将打印输出一条报错信息。为了获得关于这些分析的信息,代码片段将系统更改为相应的模式(序列或非序列)。
for idx = 1:analValue.Length
a = TheAnalyses.New_Analysis(analValue(idx));
if not(isempty(a))
ar = a.GetResults();
fprintf('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n',...
char(a.GetAnalysisName),...
LogicalStr{(a.HasAnalysisSpecificSettings > 0) + 1},...
LogicalStr{(ar.NumberOfDataGrids > 0) + 1},...
LogicalStr{(ar.NumberOfDataGridsRgb > 0) + 1},...
LogicalStr{(ar.NumberOfDataSeries > 0) + 1},...
LogicalStr{(ar.NumberOfDataSeriesRgb > 0) + 1},...
LogicalStr{(ar.NumberOfDataScatterPoints > 0) + 1},...
LogicalStr{(ar.NumberOfDataScatterPointsRgb > 0) + 1},...
LogicalStr{(ar.NumberOfRayData > 0) + 1},...
LogicalStr{(~isempty(ar.CriticalRayData)) + 1},...
LogicalStr{(~isempty(ar.PathAnalysisData)) + 1},...
LogicalStr{(~isempty(ar.SpotData)) + 1});
a.Close()
else
fprintf('This analysis cannot be opened in %s. Mode. enumID: %s\n', char(TheSystem.Mode), char(analValue(idx)));
end
end
结果如下所示
不同的值由制表符分隔,因此可以将它们复制并粘贴到Excel电子表格中。如下所示:
有关如何获取数据类型中没有值的分析的数据,请参考ZOS-API语法帮助 ( ZOS-API Syntax Help ) 中的 GetTextFile() 方法。
Ansys Zemax国内可靠代理商
光研科技南京有限公司是国内可靠的光学软件和仪器光电供应商,提供企业定制化上门培训服务,承接各类光学设计项目,并有一系列自主编写出版的光学设计书籍。公司拥有一支高素质、高水平、实战经验丰富的管理,销售以及研发团队,从成立到现在已经为广大企业,研究所以及高校提供了很多优秀的产品和服务,是光电圈内值得信赖的企业。追光逐梦,研以致用!以用户的需求为起点,为客户提供有价值的光学产品和服务一直都是光研科技南京有限公司的宗旨。
AnsysZemax光学软件咨询与订购联系方式
联系人:南京光研 徐保平
手机号:15051861513
微信号:13627124798
您也可以扫一扫下面的二维码直接咨询
暂无评论