{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Optical Prescription Report\n", "\n", "Optiland features a powerful, automated **Prescription Report Generator** that automatically extracts and formats system properties, surface geometry, materials, and aberrations into standard professional reports." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optional Dependencies\n", "\n", "To use all rendering options of the prescription generator, you must install the optional dependencies:\n", "- **All Features** (Console and PDF): `pip install optiland[prescription]`\n", "- **Console-only** (Requires `rich`): `pip install optiland[prescription-console]`\n", "- **PDF-only** (Requires `reportlab`): `pip install optiland[prescription-pdf]`" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from optiland.samples.objectives import CookeTriplet\n", "from optiland.prescription import Prescription" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading a Sample System\n", "\n", "Let's load the classic Cooke Triplet objective lens sample system." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "lens = CookeTriplet()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Printing the Prescription to the Console\n", "\n", "To view the report instantly inside your console or terminal, use the `.view()` method. This utilizes the `rich` library to draw clean, beautifully formatted tables and sections." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\n",
       "Optical Prescription — Unnamed System\n",
       "╰──────────────────────────────────────── Generated: 2026-05-20 15:35 UTC ────────────────────────────────────────╯\n",
       "
\n" ], "text/plain": [ "\u001b[48;5;18m╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m\n", "\u001b[48;5;18m│\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription — Unnamed System\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m│\u001b[0m\n", "\u001b[48;5;18m╰─\u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m Generated: 2026-05-20 15:35 UTC \u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m─╯\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────────── System Overview ─────────────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────────── \u001b[0m\u001b[1mSystem Overview\u001b[0m\u001b[92m ─────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                 \n",
       "  Name              (unnamed)    \n",
       "  Surfaces          6            \n",
       "  Stop Surface      4.0000       \n",
       "  Aperture Type     EPDAperture  \n",
       "  Aperture Value    10.0000      \n",
       "  Object Distance   \n",
       "  Image Distance    42.2078      \n",
       "                                 \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[2;36m \u001b[0m\u001b[2;36mName \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m(unnamed) \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mSurfaces \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m6 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mStop Surface \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m4.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mAperture Type \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37mEPDAperture\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mAperture Value \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mObject Distance\u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m∞ \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mImage Distance \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m42.2078 \u001b[0m\u001b[37m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Wavelengths\n",
       "
\n" ], "text/plain": [ "\u001b[1m Wavelengths\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                 \n",
       "  #   Wavelength (µm)   Primary  \n",
       " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
       "  1   0.4800                     \n",
       "  2   0.5500            \n",
       "  3   0.6500                     \n",
       "                                 \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[1;35m \u001b[0m\u001b[1;35m#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mWavelength (µm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mPrimary\u001b[0m\u001b[1;35m \u001b[0m \n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n", " 1 0.4800 \n", " \u001b[2m \u001b[0m\u001b[2m2\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.5500 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m✓ \u001b[0m\u001b[2m \u001b[0m \n", " 3 0.6500 \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Fields\n",
       "
\n" ], "text/plain": [ "\u001b[1m Fields\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                              \n",
       "  #   Type         X        Y         Weight  \n",
       " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
       "  1   AngleField   0.0000   0.0000    1.0000  \n",
       "  2   AngleField   0.0000   14.0000   1.0000  \n",
       "  3   AngleField   0.0000   20.0000   1.0000  \n",
       "                                              \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[1;35m \u001b[0m\u001b[1;35m#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mType \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mX \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mY \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mWeight\u001b[0m\u001b[1;35m \u001b[0m \n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n", " 1 AngleField 0.0000 0.0000 1.0000 \n", " \u001b[2m \u001b[0m\u001b[2m2\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mAngleField\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m14.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000\u001b[0m\u001b[2m \u001b[0m \n", " 3 AngleField 0.0000 20.0000 1.0000 \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────── First-Order Properties ──────────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m ──────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                           \n",
       "  Effective Focal Length (EFL)   49.9998   \n",
       "  Front Focal Length (FFL)       -49.9998  \n",
       "  Back Focal Length (BFL)        0.2071    \n",
       "  Front Principal Plane (P1)     12.6541   \n",
       "  Back Principal Plane (P2)      -49.7927  \n",
       "  Front Nodal Plane (N1)         12.6541   \n",
       "  Back Nodal Plane (N2)          -49.7927  \n",
       "  Image-Space F/#                5.0000    \n",
       "  Entrance Pupil Diameter        10.0000   \n",
       "  Entrance Pupil Location        11.5122   \n",
       "  Exit Pupil Diameter            10.2337   \n",
       "  Exit Pupil Location            -50.9613  \n",
       "  Transverse Magnification       -0.0000   \n",
       "  Lagrange Invariant             -1.8199   \n",
       "                                           \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[2;36m \u001b[0m\u001b[2;36mEffective Focal Length (EFL)\u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m49.9998 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mFront Focal Length (FFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.9998\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mBack Focal Length (BFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m0.2071 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mFront Principal Plane (P1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mBack Principal Plane (P2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mFront Nodal Plane (N1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mBack Nodal Plane (N2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mImage-Space F/# \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m5.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m11.5122 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.2337 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-50.9613\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mTransverse Magnification \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-0.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mLagrange Invariant \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-1.8199 \u001b[0m\u001b[37m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────── Surface Data — Geometry ─────────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mSurface Data — Geometry\u001b[0m\u001b[92m ─────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                          \n",
       "  S#   Type       Radius (mm)   Thickness (mm)   Conic    Stop   Comment  \n",
       " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
       "  0    Plane      ∞             ∞                —                        \n",
       "  1    standard   22.0136       3.2590           0.0000                   \n",
       "  2    standard   -435.7604     6.0076           0.0000                   \n",
       "  3    standard   -22.2133      1.0000           0.0000                   \n",
       "  4    standard   20.2919       4.7504           0.0000   ✓               \n",
       "  5    standard   79.6836       2.9521           0.0000                   \n",
       "  6    standard   -18.3953      42.2078          0.0000                   \n",
       "  7    standard    0.0000                            \n",
       "                                                                          \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[1;35m \u001b[0m\u001b[1;35mS#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mType \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mRadius (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mThickness (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mConic \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mStop\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mComment\u001b[0m\u001b[1;35m \u001b[0m \n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n", " 0 Plane ∞ ∞ — \n", " \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m22.0136 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m3.2590 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 2 standard -435.7604 6.0076 0.0000 \n", " \u001b[2m \u001b[0m\u001b[2m3 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-22.2133 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 4 standard 20.2919 4.7504 0.0000 ✓ \n", " \u001b[2m \u001b[0m\u001b[2m5 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m79.6836 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m2.9521 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 6 standard -18.3953 42.2078 0.0000 \n", " \u001b[2m \u001b[0m\u001b[2m7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m∞ \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
──────────────────────────────────────────── Surface Data — Materials ─────────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m──────────────────────────────────────────── \u001b[0m\u001b[1mSurface Data — Materials\u001b[0m\u001b[92m ─────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                   \n",
       "  S#   Material   nd       Vd        Semi-Diameter (mm)   Coating  \n",
       " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
       "  0    Air        1.0000   —         —                    —        \n",
       "  1    SK16       1.6204   60.2809    \n",
       "  2    Air        1.0000   —         —                    —        \n",
       "  3    F2         1.6200   36.3665    \n",
       "  4    Air        1.0000   —         —                    —        \n",
       "  5    SK16       1.6204   60.2809    \n",
       "  6    Air        1.0000   —         —                    —        \n",
       "  7    Air        1.0000     \n",
       "                                                                   \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[1;35m \u001b[0m\u001b[1;35mS#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mMaterial\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mnd \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mVd \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSemi-Diameter (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mCoating\u001b[0m\u001b[1;35m \u001b[0m \n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n", " 0 Air 1.0000 — — — \n", " \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mSK16 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.6204\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m60.2809\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n", " 2 Air 1.0000 — — — \n", " \u001b[2m \u001b[0m\u001b[2m3 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mF2 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.6200\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m36.3665\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n", " 4 Air 1.0000 — — — \n", " \u001b[2m \u001b[0m\u001b[2m5 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mSK16 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.6204\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m60.2809\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n", " 6 Air 1.0000 — — — \n", " \u001b[2m \u001b[0m\u001b[2m7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mAir \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────── Seidel Aberration Coefficients ──────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────── \u001b[0m\u001b[1mSeidel Aberration Coefficients\u001b[0m\u001b[92m ──────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                                                  \n",
       "  S#      SI (Sph)    SII (Coma)   SIII (Astig)   SIV (Petz)   SV (Dist)   CL (LCA)    CT (TCA)   \n",
       " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
       "  1       -0.013855   -0.010591    -0.008096      -0.057727    -0.050318   -0.014412   -0.011017  \n",
       "  2       -0.011256   0.035011     -0.108897      -0.002916    0.347781    -0.010088   0.031376   \n",
       "  3       0.052115    -0.081389    0.127106       0.057268     -0.287939   0.031745    -0.049577  \n",
       "  4       0.024135    0.043874     0.079756       0.062690     0.258946    0.021172    0.038488   \n",
       "  5       -0.004080   -0.016132    -0.063784      -0.015948    -0.315255   -0.006189   -0.024472  \n",
       "  6       -0.054020   0.030462     -0.017178      -0.069082    0.048643    -0.017462   0.009847   \n",
       "  Total   -0.006960   0.001235     0.008907       -0.025716    0.001859    0.004767    -0.005356  \n",
       "                                                                                                  \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[1;35m \u001b[0m\u001b[1;35mS# \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSI (Sph) \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSII (Coma)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSIII (Astig)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSIV (Petz)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSV (Dist)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mCL (LCA) \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mCT (TCA) \u001b[0m\u001b[1;35m \u001b[0m \n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n", " 1 -0.013855 -0.010591 -0.008096 -0.057727 -0.050318 -0.014412 -0.011017 \n", " \u001b[2m \u001b[0m\u001b[2m2 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.011256\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.035011 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.108897 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.002916 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.347781 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.010088\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.031376 \u001b[0m\u001b[2m \u001b[0m \n", " 3 0.052115 -0.081389 0.127106 0.057268 -0.287939 0.031745 -0.049577 \n", " \u001b[2m \u001b[0m\u001b[2m4 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.024135 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.043874 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.079756 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.062690 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.258946 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.021172 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.038488 \u001b[0m\u001b[2m \u001b[0m \n", " 5 -0.004080 -0.016132 -0.063784 -0.015948 -0.315255 -0.006189 -0.024472 \n", " \u001b[2m \u001b[0m\u001b[2m6 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.054020\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.030462 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.017178 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.069082 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.048643 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.017462\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.009847 \u001b[0m\u001b[2m \u001b[0m \n", " Total -0.006960 0.001235 0.008907 -0.025716 0.001859 0.004767 -0.005356 \n", " \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "prescription = Prescription(lens)\n", "prescription.view()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Explaining Report Sections\n", "\n", "By default, the report generates five standard sections:\n", "1. **System Overview**: General details, wavelengths, and field definitions.\n", "2. **First-Order Properties**: Paraxial parameters (EFL, F-Number, magnification, pupil parameters).\n", "3. **Surface Data - Geometry**: Radii of curvature, thicknesses, stop designations, and conic constants.\n", "4. **Surface Data - Materials**: Material names and corresponding refractive indices ($n_d$, $V_d$).\n", "5. **Seidel Aberration Coefficients**: Monochromatic and chromatic Seidel aberrations per surface and system totals.\n", "\n", "### Customizing Sections\n", "You can customize and re-order the sections included in your report by passing a list of section instances to the `Prescription` constructor:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\n",
       "Optical Prescription — Unnamed System\n",
       "╰──────────────────────────────────────── Generated: 2026-05-20 15:35 UTC ────────────────────────────────────────╯\n",
       "
\n" ], "text/plain": [ "\u001b[48;5;18m╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m\n", "\u001b[48;5;18m│\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription — Unnamed System\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m│\u001b[0m\n", "\u001b[48;5;18m╰─\u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m Generated: 2026-05-20 15:35 UTC \u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m─╯\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────── First-Order Properties ──────────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m ──────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                           \n",
       "  Effective Focal Length (EFL)   49.9998   \n",
       "  Front Focal Length (FFL)       -49.9998  \n",
       "  Back Focal Length (BFL)        0.2071    \n",
       "  Front Principal Plane (P1)     12.6541   \n",
       "  Back Principal Plane (P2)      -49.7927  \n",
       "  Front Nodal Plane (N1)         12.6541   \n",
       "  Back Nodal Plane (N2)          -49.7927  \n",
       "  Image-Space F/#                5.0000    \n",
       "  Entrance Pupil Diameter        10.0000   \n",
       "  Entrance Pupil Location        11.5122   \n",
       "  Exit Pupil Diameter            10.2337   \n",
       "  Exit Pupil Location            -50.9613  \n",
       "  Transverse Magnification       -0.0000   \n",
       "  Lagrange Invariant             -1.8199   \n",
       "                                           \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[2;36m \u001b[0m\u001b[2;36mEffective Focal Length (EFL)\u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m49.9998 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mFront Focal Length (FFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.9998\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mBack Focal Length (BFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m0.2071 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mFront Principal Plane (P1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mBack Principal Plane (P2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mFront Nodal Plane (N1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mBack Nodal Plane (N2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mImage-Space F/# \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m5.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m11.5122 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.2337 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-50.9613\u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mTransverse Magnification \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-0.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \u001b[2;36m \u001b[0m\u001b[2;36mLagrange Invariant \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-1.8199 \u001b[0m\u001b[37m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────── Surface Data — Geometry ─────────────────────────────────────────────\n",
       "
\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mSurface Data — Geometry\u001b[0m\u001b[92m ─────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                          \n",
       "  S#   Type       Radius (mm)   Thickness (mm)   Conic    Stop   Comment  \n",
       " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
       "  0    Plane      ∞             ∞                —                        \n",
       "  1    standard   22.0136       3.2590           0.0000                   \n",
       "  2    standard   -435.7604     6.0076           0.0000                   \n",
       "  3    standard   -22.2133      1.0000           0.0000                   \n",
       "  4    standard   20.2919       4.7504           0.0000   ✓               \n",
       "  5    standard   79.6836       2.9521           0.0000                   \n",
       "  6    standard   -18.3953      42.2078          0.0000                   \n",
       "  7    standard    0.0000                            \n",
       "                                                                          \n",
       "
\n" ], "text/plain": [ " \n", " \u001b[1;35m \u001b[0m\u001b[1;35mS#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mType \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mRadius (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mThickness (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mConic \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mStop\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mComment\u001b[0m\u001b[1;35m \u001b[0m \n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n", " 0 Plane ∞ ∞ — \n", " \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m22.0136 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m3.2590 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 2 standard -435.7604 6.0076 0.0000 \n", " \u001b[2m \u001b[0m\u001b[2m3 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-22.2133 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 4 standard 20.2919 4.7504 0.0000 ✓ \n", " \u001b[2m \u001b[0m\u001b[2m5 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m79.6836 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m2.9521 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 6 standard -18.3953 42.2078 0.0000 \n", " \u001b[2m \u001b[0m\u001b[2m7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m∞ \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from optiland.prescription.sections import FirstOrderSection, SurfaceGeometryTableSection\n", "\n", "# Create a prescription containing only first-order and surface geometry data\n", "custom_sections = [\n", " FirstOrderSection(),\n", " SurfaceGeometryTableSection()\n", "]\n", "\n", "custom_prescription = Prescription(lens, sections=custom_sections)\n", "custom_prescription.view()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Saving and Exporting Reports\n", "\n", "You can save the report to a file using the `.save(path)` method. The file output format is automatically inferred from the file extension:\n", "- **Plain Text (`.txt`, `.log`, etc.)**: Renders standard plain-text tables.\n", "- **PDF (`.pdf`)**: Generates a professional PDF document." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Export as plain-text\n", "prescription.save(\"cooke_triplet_prescription.txt\")\n", "\n", "# Export as a formatted PDF document\n", "prescription.save(\"cooke_triplet_prescription.pdf\")" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }