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
Valid NH homogeneity class designators. |
|
2017 Table 5. |
Functions
|
Round value up to the nearest Renard R5 preferred number. |
Classes
|
ISO 10110 fabrication specifications for a lens element (bulk glass). |
|
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 the2/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.
- fmt_birefringence() str[source]#
Return
0/ Awhere A is max stress birefringence in nm/cm.Per ISO 10110-2 §5.2:
0/ Awhere A is the OPD in nm/cm. Integer-valued specs are shown without a trailing.0(e.g.0/ 5 nm/cmrather than0/ 5.0 nm/cm).
- 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]#
- 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> nmper 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)
- 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 isNone, 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
xseparator 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 isNone, 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.
- classmethod from_dict(d: dict) SurfaceSpec[source]#
- 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