创建光学系统#
已在中创建的 {py:class} OpticStudioSystem <zospy.zpcore.OpticStudioSystem>对象oss连接到 OpticStudio可用于从 Python 控制连接的 OpticStudio 实例。此对象将 ZOS-API 命名空间公开为属性。记录这些命名空间不是本文档的目的,因为它们已在 OpticStudio 帮助文件中进行了详细记录。
要创建和修改序列光学系统,可以通过 {py:attr} oss.LDE <zospy.zpcore.OpticStudioSystem.LDE>属性访问镜头数据编辑器。
例子#
import zospy as zp
# Connect to OpticStudio
zos = zp.ZOS()
oss = zos.connect()
# Create a new, empty system
oss.new()
# Insert a new surface at index 1 and adjust its radius and thickness
surface_1 = oss.LDE.InsertNewSurfaceAt(1)
surface_1.Radius = 10
surface_1.Thickness = 5
# Get the STOP surface and adjust its semi-diameter
surface_stop = oss.LDE.GetSurfaceAt(oss.LDE.StopSurface)
surface_stop.SemiDiameter = 2
使用求解器#
OpticStudio 允许使用求解器动态设置表面属性。ZOSPy 通过 {py:mod} zospy.solvers模块公开这些求解器。以下示例展示了如何使用 {py:func} position <zospy.solvers.position>求解器设置表面的厚度,以及如何使用 {py:func} material_model <zospy.solvers.material_model>求解器设置材料的折射率。
import zospy as zp
# Connect to OpticStudio
zos = zp.ZOS()
oss = zos.connect()
surface = oss.LDE.GetSurfaceAt(2)
zp.solvers.position(surface.ThicknessCell, from_surface=oss.LDE.GetSurfaceAt(1), length=10)
zp.solvers.material_model(surface.MaterialCell, refractive_index=1.5)
贡献求解器#
OpticStudio 有许多求解器,但并非所有求解器都已在 ZOSPy 中实现(目前)。如果您想使用尚未实现的求解器,请考虑将其贡献给 ZOSPy。所有求解器都遵循相同的结构,编写新的求解器非常简单。以下是设置元素功率的求解器的示例:
def element_power(radius_cell: _ZOSAPI.Editors.IEditorCell, power: float) -> _ZOSAPI.Editors.ISolveElementPower:
"""Solver for element power.
Adjusts the value of `radius_cell` to create an element with the specified `power`. This solver should be set on
the last surface of the element.
Parameters
----------
radius_cell : ZOSAPI.Editors.IEditorCell
Radius cell of the last element surface
power : float
Element power in diopters
Returns
-------
solve_data : ZOSAPI.Editors.ISolveElementPower
The solve data for the element power
"""
# Create an OpticStudio solve data object
solve_data = radius_cell.CreateSolveType(zp.constants.Editors.SolveType.ElementPower)._S_ElementPower
# Apply the settings to the solve data
solve_data.Power = power
# Add the solve data to the Lens Data Editor cell
radius_cell.SetSolveData(solve_data)
return solve_data