From 87d34bc71c166b43c29af7de834d51abc7e761a1 Mon Sep 17 00:00:00 2001 From: pmaasz Date: Thu, 7 May 2026 15:39:19 +0200 Subject: [PATCH 1/2] fix: prevent silent radii correction by adding use_type_defaults flag --- src/lens.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/lens.py b/src/lens.py index cc8198a..676abdd 100644 --- a/src/lens.py +++ b/src/lens.py @@ -57,7 +57,8 @@ def __init__(self, num_grooves: Optional[int] = None, model_glass_mode: bool = False, model_nd: float = 1.5168, - model_vd: float = 64.17) -> None: + model_vd: float = 64.17, + use_type_defaults: bool = False) -> None: self.id = uuid.uuid4().hex self.name = name @@ -101,11 +102,8 @@ def __init__(self, self.lens_type = lens_type - # Only update radii if using default values and lens_type differs from default - # This preserves custom radii while allowing lens_type to set defaults when appropriate - if (radius_of_curvature_1 == DEFAULT_RADIUS_1 and - radius_of_curvature_2 == DEFAULT_RADIUS_2 and - lens_type != "Biconvex"): + # Only update radii if using type defaults + if use_type_defaults and lens_type != "Biconvex": self._update_radii_for_type() # Fresnel properties @@ -227,13 +225,10 @@ def from_dict(cls, data: Dict[str, Any]) -> 'Lens': num_grooves=data.get("num_grooves", None), model_glass_mode=data.get("model_glass_mode", False), model_nd=data.get("model_nd", 1.5168), - model_vd=data.get("model_vd", 64.17) + model_vd=data.get("model_vd", 64.17), + use_type_defaults=data.get("use_type_defaults", False) ) - # Only update radii if they match defaults and lens_type is different - if (r1 == DEFAULT_RADIUS_1 and r2 == DEFAULT_RADIUS_2 and lens_type != "Biconvex"): - lens._update_radii_for_type() - lens.id = data.get("id", lens.id) lens.created_at = data.get("created_at", lens.created_at) lens.modified_at = data.get("modified_at", lens.modified_at) From c0bfebb362988b0231f3be828e0ce0b2b09090a7 Mon Sep 17 00:00:00 2001 From: pmaasz Date: Thu, 7 May 2026 16:02:42 +0200 Subject: [PATCH 2/2] fix: ensure lens modifications are persisted in LensEditorWidget --- src/gui/widgets/lens_editor.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/gui/widgets/lens_editor.py b/src/gui/widgets/lens_editor.py index a6610b7..ba06986 100644 --- a/src/gui/widgets/lens_editor.py +++ b/src/gui/widgets/lens_editor.py @@ -157,6 +157,7 @@ def _create_properties_panel(self): self._groove_pitch_input.setRange(0.01, 10) self._groove_pitch_input.setValue(0.5) self._groove_pitch_input.setSuffix(" mm") + self._groove_pitch_input.valueChanged.connect(self._on_groove_pitch_changed) self._groove_pitch_input.hide() self._groove_pitch_label.hide() fresnel_layout.addRow(self._groove_pitch_label, self._groove_pitch_input) @@ -228,9 +229,12 @@ def _on_material_changed(self, material): self._n_input.setValue(material_indices.get(material, 1.5)) if self._lens: self._lens.refractive_index = self._n_input.value() + self._lens.material = material self._update_calculated() if self._viz_widget: self._viz_widget.update_lens(self._lens) + self.lens_modified.emit(self._lens) + self.lens_updated.emit() def _on_fresnel_changed(self, state): """Handle Fresnel checkbox change""" @@ -249,11 +253,24 @@ def _on_fresnel_changed(self, state): if enabled and self._lens: self._lens.is_fresnel = True + self._lens.groove_pitch = self._groove_pitch_input.value() self._update_groove_count() + self.lens_modified.emit(self._lens) + self.lens_updated.emit() elif self._lens: self._lens.is_fresnel = False self._num_grooves_value.setText("0") + self.lens_modified.emit(self._lens) + self.lens_updated.emit() + def _on_groove_pitch_changed(self, value): + """Handle groove pitch change""" + if self._lens and getattr(self._lens, 'is_fresnel', False): + self._lens.groove_pitch = value + self._update_groove_count() + self.lens_modified.emit(self._lens) + self.lens_updated.emit() + def _update_groove_count(self): """Calculate number of grooves""" if not self._lens or not hasattr(self._lens, 'is_fresnel') or not self._lens.is_fresnel: