乐于分享
好东西不私藏

Python光学软件开发全流程实例

Python光学软件开发全流程实例

这一期我们介绍如何用Python进行光学软件的开发。这个例子中我们尝试用Python的PyQt5搭建界面,用matplotlib和numpy完成绘图和计算。
PyQt5 是 Qt5 C++ 图形界面框架 的官方 Python 绑定之一,由英国的 Riverbank Computing 公司开发并维护。它让你能够用纯 Python 编写跨平台的桌面应用程序,在 Windows、macOS、Linux 等系统上获得原生观感的界面。
使用PyQt5可以为工业应用搭建成熟的界面,使用诸如QApplication, QMainWindow, QWidget, QSpinBox等控件创建界面。
目标
在这个例子中,我们的目标是搭建一个高斯光束经过多个掩膜后传输的情况。我们需要定义网格、入射光束、添加不同的掩膜,然后查看绘图。
界面搭建
在进行光学软件开发的时候,需要明确界面和业务。在界面上我们初步采用左边控件,右边绘图的布局,并且将各个绘图用下拉列表的格式调出。
添加掩膜
用PyQt5中的Dialog控件创建掩膜列表,支持从初始界面到最后界面逐个添加。支持Phase掩膜和Amplitude掩膜两种,支持导入灰度图掩膜。本质上,界面只是负责一个参数和信号的传递,核心的业务层还是由实现业务的函数执行,这样的界面和业务的分离有利于代码后续的扩展(比如优化界面)。这里给Dialog添加了三个小圆点,分别用于最小化、最大化和关闭。
光场传输
之前的文章中介绍过光场传输的几种算法,SFT,DFT,角谱法、矢量积分等。这里采用角谱法作为光场传输的内核。
分步传输
在这里采用分布传输,不管是振幅掩膜还是相位掩膜,在任意两个掩膜之间的传输都采用角谱法,并且当作在自由空间传输。后续也可以添加定义两端掩膜之间的折射率,作为非空气介质中传输。
打包
最后一步是添加Icon和Splash,用Pyinstaller打包为exe程序。
首先需要创建一个Spec文件,如:
# -*- mode: python ; coding: utf-8 -*-a = Analysis(    ['Bo.py'],    pathex=[],    binaries=[],    datas=[('icons/app_icon.png''icons'), ('icons/app_icon.svg''icons'), ('icons/splash_bg.svg''icons')],    hiddenimports=[],    hookspath=[],    hooksconfig={},    runtime_hooks=[],    excludes=[],    noarchive=False,    optimize=0,)pyz = PYZ(a.pure)exe = EXE(    pyz,    a.scripts,    a.binaries,    a.datas,    [],    name='BeamProp',    debug=False,    bootloader_ignore_signals=False,    strip=False,    upx=True,    upx_exclude=[],    runtime_tmpdir=None,    console=False,    disable_windowed_traceback=False,    argv_emulation=False,    target_arch=None,    codesign_identity=None,    entitlements_file=None,    icon='icons/app_icon.png',)
然后使用Pyinstaller将其打包,把这个文件命名为BeamProp.spec,然后在终端运行:
>>pyinstaller.exe BeamProp.spec
就可以得到可执行文件。
综上所述,这一期,为大家介绍了如何用Python开发一款建议的光学软件。PyQt让我们可以方便的搭建出界面,根据业务的需要采用不同的内核。相比起Matlab,用PyQT开发界面更加成熟,同时不妨碍将Matlab的业务逻辑移植过来。
后续的更新优化
后续可以在这个基础上添加更多入射光源的定义(如部分相干光源、矢量光源)、更多的掩膜定义、折射率定义、更自由的传输算法选择(BPM, ASM,矢量传输)、更多的物理量(实部、虚部、强度、振幅、相位)、数据输入、输出。
        加入群聊免费领取当前版本测试文件: