PyZDDE:无法将过滤器字符串传递给NSC模式的检测器查看器

时间:2017-10-31 11:32:37

标签: python dde

我在Zemax中运行NSC光线跟踪,使用python zemax DDE服务器pyZDDE来运行多个配置。理想情况下,我希望能够运行所有模型配置并执行少量分析,以便我可以在一夜之间完成模型处理。

此分析的一部分涉及使用滤波器字符串来获取几个不同波长的探测器输出,但是当我尝试通过我的滤波器字符串时(在这种情况下' W2',我得到错误& #34; ValueError:无法将字符串转换为float:W2"

完整错误是:

File "C:\ProgramData\Anaconda2\lib\site-packages\pyzdde\zdde.py", line 9397, in zGetDetectorViewer
ret = _zfu.readDetectorViewerTextFile(pyz, textFileName, displayData)

File "C:\ProgramData\Anaconda2\lib\site-packages\pyzdde\zfileutils.py", line 679, in readDetectorViewerTextFile
posX = float(line_list[smoothLineNum + 2].split(':')[1].strip()) # 'Detector X'

ValueError: could not convert string to float: W2

所以对我而言,看起来它错误地将探测器信息用于过滤器字符串,但我不确定如何解决它!

我尝试过的解决方案:

  1. 检查编码 - 我使用ASCII,但在utf-8中运行 没有改变错误。
  2. 运行由Zemax生成的检测器.CFG文件 不通过pyZDDE运行时所需的输出。
  3. 最小的工作示例:

    import pyzdde.zdde as pyz
    #get rid of any non closed connections possibly hanging around
    pyz.closeLink()
    #Connect to server
    ln = pyz.createLink()
    status = ln.zDDEInit()
    
    ln.zSetTimeout(1e5)
    
    filename = 'C:\\...\\Zemax\\Samples\\MultiConfigLens.zmx'
    # Load a lens file into the ZEMAX DDE server
    ln.zLoadFile(filename)
    
    #Generate config files
    configFile0 = 'C:\\...\Zemax\\Samples\\MultiConfigLens_Config1.CFG' 
    configFile1 = 'C:\\...\Zemax\\Samples\\MultiConfigLens_Config1.CFG' 
    configFile2 = 'C:\\...\Zemax\\Samples\\MultiConfigLens_Config2.CFG'
    
    ln.zSetDetectorViewerSettings(settingsFile=configFile0, surfNum=1, detectNum=10, showAs=0, scale = 1,dType=4)
    ln.zSetDetectorViewerSettings(settingsFile=configFile1, surfNum=1, detectNum=10, zrd='RAYS1.ZRD', dfilter='W1',showAs=0, scale=1,  dType=4)
    ln.zSetDetectorViewerSettings(settingsFile=configFile2, surfNum=1, detectNum=10, zrd='RAYS1.ZRD', dfilter='W2',showAs=0, scale=1,  dType=4)
    
    #perform the ray trace
    ln.zNSCTrace(1,0,split = 1,scatter = 1,usePolar = 1,ignoreErrors = 1,randomSeed = 0,save = 1,saveFilename = 'RAYS1.ZRD',timeout = 1e5)
    
    #grab that detector data
    data0 = ln.zGetDetectorViewer(configFile0,displayData = True)
    data1 = ln.zGetDetectorViewer(configFile1,displayData = True)
    data2 = ln.zGetDetectorViewer(configFile2,displayData = True)
    

    一旦代码到达" data1"它失败并返回上面的错误信息 - 任何帮助都会非常感激!

    编辑:我找到了问题的根源,并且我将{1}}上提交的解释作为错误报告发布:

    通过zfileutils中的readDetectorViewerTextFile(第678行),看起来该函数没有考虑到当检测器中包含光线数据库和滤波器字符串时检测器输出的文本文件被更改的事实config意味着它尝试将过滤器字符串作为检测器X位置读取,从而导致值错误。

0 个答案:

没有答案