iso10110.notation#

ISO 10110 Notation Models

Typed, validated containers for per-surface and per-element fabrication specifications. Built on stdlib dataclasses that reject unknown keywords, so a typo’d or renamed keyword argument raises immediately rather than being silently dropped. All fields default to None / empty string; unspecified fields are rendered as the placeholder dash (—) in the drawing.

ISO 10110 part mapping#

0/  Stress birefringence          → ElementSpec.birefringence
1/  Bubbles and inclusions        → ElementSpec.bubbles
2/  Inhomogeneity and striae      → ElementSpec.homogeneity_grade / nh_class /
                                    striae_grade / striae_density /
                                    striae_shadowgraph
3/  Surface form error            → SurfaceSpec.sag_tolerance / irregularity /
                                    rotationally_symmetric / test_wavelength
4/  Centration tolerance          → SurfaceSpec.centration / centration_decentration
5/  Surface imperfections         → SurfaceSpec.imperfections / scratches /
                                    edge_chips / coating_imperfections
6/  Laser damage threshold        → SurfaceSpec.laser_damage
7/  Surface treatment / coatings  → SurfaceSpec.coating
8/  Surface texture               → SurfaceSpec.roughness
13/ Transmitted wavefront         → SurfaceSpec.wavefront_deformation
15/ Assembly surface imperfections→ SurfaceSpec.assembly_imperfections

Bernhard Lutzer, 2026

Module Attributes

NH_CLASSES

Valid NH homogeneity class designators.

GRATING_TYPES

2017 Table 5.

Functions

round_to_r5(value)

Round value up to the nearest Renard R5 preferred number.

Classes

ElementSpec([birefringence, bubbles, ...])

ISO 10110 fabrication specifications for a lens element (bulk glass).

SurfaceSpec([sag_tolerance, irregularity, ...])

ISO 10110 fabrication specifications for a single optical surface.

class ElementSpec(birefringence: float | None = None, bubbles: str | None = None, homogeneity_grade: int | None = None, nh_class: str | None = None, striae_grade: str | None = None, striae_density: int | None = None, striae_shadowgraph: str | None = None, part_number: str = '', revision: str = 'A', drawn_by: str = '', approved_by: str = '', notes: str = '', diameter: float | None = None, diameter_tolerance: str | float | None = None, ct_tolerance: str | float | None = None, matched_pair: bool = False)[source]#

ISO 10110 fabrication specifications for a lens element (bulk glass).

Bulk-glass codes#

  • birefringence: maximum stress birefringence in nm/cm (ISO 10110-2, 0/).

  • bubbles: bubble-and-inclusion string, e.g. "1×0.16" → 1/ 1×0.16 (ISO 10110-3).

  • homogeneity_grade: legacy refractive-index homogeneity class 0–5 (ISO 10110-4). Prefer nh_class for contemporary drawings.

  • nh_class: contemporary homogeneity designator per ISO 10110-18:2019, e.g. "NH040". Preferred values (ISO 10110-18:2019 Table 2): NH100, NH040, NH010, NH004, NH002, NH001. Legacy values also accepted: NH40, NH20, NH10, NH5, NH2, NH1, NH0.5, NH0.2, NH0.1. When set, takes precedence over homogeneity_grade in the 2/ code.

  • striae_grade: legacy striae class string (e.g. "A"), kept for backward compatibility. Prefer striae_density or striae_shadowgraph.

  • striae_density: striae density class 1–5 (ISO 10110-4, density method).

  • striae_shadowgraph: striae shadowgraph class A–D (ISO 10110-4, shadowgraph method).

Dimensions#

  • diameter: physical edge diameter of the element in mm.

  • diameter_tolerance: symmetric ± tolerance on the physical diameter (mm).

  • ct_tolerance: symmetric ± tolerance on the centre thickness (mm).

Title-block fields#

  • part_number, revision, drawn_by, approved_by, notes.

approved_by: str = ''#
birefringence: float | None = None#
bubbles: str | None = None#
ct_tolerance: str | float | None = None#
diameter: float | None = None#
diameter_tolerance: str | float | None = None#
drawn_by: str = ''#
fmt_birefringence() → str[source]#

Return 0/ A where A is max stress birefringence in nm/cm.

Per ISO 10110-2 §5.2: 0/ A where A is the OPD in nm/cm. Integer-valued specs are shown without a trailing .0 (e.g. 0/ 5 nm/cm rather than 0/ 5.0 nm/cm).

fmt_bubbles() → str[source]#
fmt_homogeneity() → str[source]#

Return the ISO 2/ code string.

Homogeneity part: uses nh_class (e.g. NH20) when set, falls back to legacy homogeneity_grade integer (0–5).

Striae part: uses striae_density (1–5) or striae_shadowgraph (A–D) when set; falls back to legacy striae_grade string.

Format: 2/ <homogeneity>; <striae>

classmethod from_dict(d: dict) → ElementSpec[source]#
homogeneity_grade: int | None = None#
matched_pair: bool = False#
nh_class: str | None = None#
notes: str = ''#
part_number: str = ''#
revision: str = 'A'#
striae_density: int | None = None#
striae_grade: str | None = None#
striae_shadowgraph: str | None = None#
to_dict() → dict[source]#
GRATING_TYPES: frozenset[str] = frozenset({'AG', 'CG', 'CGH', 'IG', 'LG', 'RG', 'SG', 'TG'})#

2017 Table 5. LG = linear grating, CG = concentric grating, CGH = computer-generated hologram, TG = transmission, RG = reflection, AG = amplitude grating, SG = surface-relief grating, IG = index grating.

Type:

Valid grating-type designators per ISO 10110-16

NH_CLASSES: frozenset[str] = frozenset({'NH0.1', 'NH0.2', 'NH0.5', 'NH001', 'NH002', 'NH004', 'NH010', 'NH040', 'NH1', 'NH10', 'NH100', 'NH2', 'NH20', 'NH40', 'NH5'})#

Valid NH homogeneity class designators. Preferred designators per ISO 10110-18:2019 Table 2 are NH100, NH040, NH010, NH004, NH002, NH001. The older series (NH40, NH20 …) is retained for backward compatibility with legacy drawings.

class SurfaceSpec(sag_tolerance: float | None = None, irregularity: float | None = None, rotationally_symmetric: float | None = None, test_wavelength: float | None = None, form_unit: str = 'fr', centration: float | None = None, centration_decentration: float | None = None, imperfections: str | None = None, coating_imperfections: str | None = None, scratches: str | None = None, edge_chips: str | None = None, coating: str | None = None, r_tolerance: str | float | None = None, ca_diameter: float | None = None, ca_tolerance: str | float | None = None, laser_damage: str | None = None, wavefront_deformation: str | None = None, assembly_imperfections: str | None = None, roughness: str | None = None, chamfer: str | None = None, chamfer_angle: float | None = None, sharp_edge: bool = False, pyramid_error: float | None = None, grating_type: str = 'LG')[source]#

ISO 10110 fabrication specifications for a single optical surface.

3/ Surface form (ISO 10110-5)#

Format: 3/ A(B/C)

  • sag_tolerance (A): maximum sag error from test plate in fringes. Use None (rendered as —) when the radius tolerance is given as a dimension on the drawing.

  • irregularity (B): p-v irregularity in fringes, placed in parentheses.

  • rotationally_symmetric (C): rotationally-symmetric component of the irregularity (optional second value after / inside the parentheses).

  • test_wavelength: test wavelength in nm. When set and ≠ 546.07 nm the drawn 3/ code appends @ λ=<value> nm per ISO 10110-5.

4/ Centering (ISO 10110-6)#

  • centration: wedge angle tolerance in arc minutes.

  • centration_decentration: optional lateral decentration δ in mm.

5/ Surface imperfections (ISO 10110-7)#

Format: 5/ NxA; CN'xA'; LN"xA"; EA'"

  • imperfections: base dig specification string, e.g. "2×0.04".

  • coating_imperfections: coating digs, C-prefix, e.g. "1×0.016".

  • scratches: long scratches, L-prefix, e.g. "1×0.001" (N scratches × width in mm).

  • edge_chips: edge-chip protrusion, E-prefix, e.g. "0.5" (mm).

6/ Laser damage threshold (ISO 10110-17)#

  • laser_damage: free-form laser damage threshold string per ISO 10110-17, e.g. "H 20J/cm²; 10ns; 1064nm".

7/ Coating (ISO 10110-9 / ISO 9211)#

  • coating: free-form coating callout, e.g. "AR 400-700 nm R<0.5%".

Dimensions#

  • r_tolerance: ± radius tolerance in mm shown next to R on the drawing.

  • ca_diameter: clear aperture diameter in mm (the usable optical zone, usually smaller than the physical edge diameter).

  • ca_tolerance: tolerance string for the CA, e.g. "+0.1/-0" or "±0.1".

8/ Surface texture (ISO 10110-8:2019)#

  • roughness: surface finish designator string (ISO 10110-8:2019 §5). Valid forms:

    • "P" — polished, no quantitative spec (§5.3.1)

    • "P1" / "P2" / "P3" / "P4" — polish grade (§5.3.2, Table 1): P1 ≤ 8 nm, P2 ≤ 4 nm, P3 ≤ 2 nm, P4 ≤ 1 nm Rq over the spatial band 0.002–1.0 mm.

    • "G" — matte/ground surface (§5.2); Rq in μm may follow, e.g. "G / 0.0025-0.8 / Rq 2"

    • "-1/Rq 0.002" — polished with upper spatial-band limit 1 mm and Rq ≤ 0.002 μm (§5.3.3)

    • "0.002-1/Rq 0.002" — polished with full spatial band (§5.3.3)

assembly_imperfections: str | None = None#
ca_diameter: float | None = None#
ca_tolerance: str | float | None = None#
centration: float | None = None#
centration_decentration: float | None = None#
chamfer: str | None = None#
chamfer_angle: float | None = None#
coating: str | None = None#
coating_imperfections: str | None = None#
edge_chips: str | None = None#
fmt_assembly_imperfections() → str[source]#

Return the ISO 15/ assembly surface imperfections string (ISO 10110-7).

Applies to cemented or contacted surfaces evaluated as a sub-assembly. Returns "15/ —" when not specified.

fmt_centration() → str[source]#

Return the ISO 4/ code string.

Format: 4/ σ'(δ) where σ = tilt tolerance in arc-minutes and δ = lateral decentration in mm (optional, per ISO 10110-6).

fmt_coating() → str[source]#

Return the ISO 7/ coating designation string (ISO 10110-9).

Returns "7/ —" when no coating is specified so the field is never omitted from the drawing (ISO 10110 requires all codes to appear). No λ prefix — ISO 10110-9 / ISO 9211 notation does not use one.

fmt_form_error() → str[source]#

Return the ISO 3/ code string.

Format: 3/ A(B/C) where A = sag error from test plate, B = p-v irregularity, C = rotationally-symmetric component.

Units follow form_unit: "fr" (fringes, default) or "nm" (nanometres, preferred by ISO 10110-5 since 2016 revision). When "nm" each numeric value is suffixed with `` nm``.

A is omitted entirely when sag_tolerance is None (radius tolerance is given as a dimension on the drawing). The parenthesised B/C group is omitted when neither irregularity nor RSI is given.

Per ISO 10110-5:2016 §4.3, when fringe units are used the wavelength must always be stated: the string appends ; λ=<value> nm. If test_wavelength is None, the ISO standard green-mercury reference wavelength 546.07 nm is assumed. For nm units no wavelength annotation is needed.

Examples (fringes):

sag=2, irr=0.5, rsi=0.25               → "3/ 2(0.5/0.25); λ=546.1 nm"
irr=0.5, test_wavelength=632.8          → "3/ (0.5); λ=632.8 nm"
nothing set                             → "3/ —"

Examples (nm):

form_unit="nm", sag=50, irr=20  → "3/ 50 nm(20 nm)"
fmt_imperfections() → str[source]#

Return the ISO 5/ code string with optional L, E, C extensions.

Any ASCII x separator between count and size (e.g. 2x0.04) is normalised to the ISO-standard multiplication sign × (U+00D7).

fmt_laser_damage() → str[source]#

Return the ISO 6/ laser damage threshold string (ISO 10110-17).

Returns "6/ —" when not specified.

fmt_pyramid_error() → str[source]#

Return the pyramid-error pyr σ' string (ISO 10110-6 §5.3).

Pyramid error (prismatic tolerance) constrains the maximum permissible deviation of the surface normal from the mechanical reference axis, stated in arc minutes. When not specified, returns "" (empty — not a numbered ISO code; shown inline with the centration row when present).

Example:

pyramid_error=2.5  →  "pyr 2.5′"
fmt_roughness() → str[source]#

Return the ISO 8/ surface texture code string (ISO 10110-8:2019).

Unlike the other fmt_* methods this returns "" (empty string) when roughness is None, because the 8/ code is optional — not every surface needs a texture specification.

Valid roughness designators (ISO 10110-8:2019 §5):

  • "P" — polished, no quantitative spec (§5.3.1).

  • "P1" / "P2" / "P3" / "P4" — polish grade (§5.3.2, Table 1): P1 ≤ 8 nm, P2 ≤ 4 nm, P3 ≤ 2 nm, P4 ≤ 1 nm Rq over the spatial band 0.002–1.0 mm.

  • "G" — matte/ground surface (§5.2).

  • "-1/Rq 0.002" — polished with upper spatial-band limit 1 mm and Rq ≤ 0.002 μm (§5.3.3).

  • "0.002-1/Rq 0.002" — polished with full spatial band (§5.3.3).

Examples:

roughness="P"              → "8/ P"
roughness="P2"             → "8/ P2"
roughness="-1/Rq 0.002"   → "8/ -1/Rq 0.002"
roughness=None             → ""
fmt_wavefront() → str[source]#

Return the ISO 13/ transmitted wavefront deformation string (10110-14).

Format: 13/ A(B) where A = p-v wavefront error in waves, B = irregularity component (optional, placed in parentheses).

Returns "13/ —" when not specified.

form_unit: str = 'fr'#
classmethod from_dict(d: dict) → SurfaceSpec[source]#
grating_type: str = 'LG'#
imperfections: str | None = None#
irregularity: float | None = None#
laser_damage: str | None = None#
pyramid_error: float | None = None#
r_tolerance: str | float | None = None#
rotationally_symmetric: float | None = None#
roughness: str | None = None#
sag_tolerance: float | None = None#
scratches: str | None = None#
sharp_edge: bool = False#
test_wavelength: float | None = None#
to_dict() → dict[source]#
wavefront_deformation: str | None = None#
round_to_r5(value: float) → float[source]#

Round value up to the nearest Renard R5 preferred number.

The R5 series is 1.0, 1.6, 2.5, 4.0, 6.3 and their decade multiples. Rounding is always upward (conservative — never relaxes a tolerance).

Parameters:

value – Positive number to round.

Returns:

The smallest R5 preferred number ≥ value.

Raises:

ValueError – If value is not positive.

Examples:

round_to_r5(0.05)  → 0.063
round_to_r5(0.10)  → 0.10   (already R5)
round_to_r5(0.12)  → 0.16
round_to_r5(1.8)   → 2.5