From e8c7f211388b534c37ed16637cd541ef60e6174d Mon Sep 17 00:00:00 2001 From: Aldo Ruiz Luna Date: Fri, 2 Oct 2026 15:21:48 -0600 Subject: [PATCH 1/2] feat(microscope-slide-holder): explicit fit_clearance_slide behind the legacy material injection Declare fit_clearance_slide (mm, default 0.0) for the OpenSCAD box, staining rack and cabinet drawer. The vendored slide library reads it in slide_slot_width(); while yantra4d RENDER_MATERIAL_INJECTION is on, an injected mat_clear_slide still wins, so today's geometry is unchanged. The legacy branch is marked for removal at the flip. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Aldo Ruiz Luna --- .../microscope-slide-hyperobject/slide.scad | 42 ++++++++++++++----- microscope-slide-holder/project.json | 23 ++++++++++ 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/microscope-slide-holder/libs/microscope-slide-hyperobject/slide.scad b/microscope-slide-holder/libs/microscope-slide-hyperobject/slide.scad index 51f138f2..114a9702 100644 --- a/microscope-slide-holder/libs/microscope-slide-hyperobject/slide.scad +++ b/microscope-slide-holder/libs/microscope-slide-hyperobject/slide.scad @@ -1,17 +1,34 @@ // ---------------------------------------------------- -// Material Hyperobject Compensations -// (Passed dynamically by the Commons API) +// Fit and scale compensation (explicit geometry inputs) // ---------------------------------------------------- -mat_shrinkage_x = 1.0; -mat_shrinkage_y = 1.0; -mat_shrinkage_z = 1.0; +// scale_comp_x/y/z: unitless scale factors applied to the slide body +// (1.0 = none). Manifest parameters of microscope-slide-hyperobject. +scale_comp_x = 1.0; +scale_comp_y = 1.0; +scale_comp_z = 1.0; +// fit_clearance_slide: extra slot clearance in mm that slide_slot_width() +// adds for a sliding fit (0 = none). A library input: microscope-slide-holder +// declares it; microscope-slide-hyperobject renders no slot, so it does not. +fit_clearance_slide = 0.0; -mat_clear_press = 0.0; -mat_clear_slide = 0.0; -mat_clear_loose = 0.0; +// LEGACY material injection. REMOVE AT THE FLIP of the yantra4d flag +// RENDER_MATERIAL_INJECTION (owner ruling "flag now, flip later"). +// While that flag is on, a render request naming target_material makes the +// platform pass the material card's mat_shrinkage_x/y/z and mat_clear_slide +// with -D. They are undef unless injected, and an injected value WINS over +// the explicit parameter above, so a render with the flag on is unchanged. +// At the flip, delete these four assignments and _legacy_or() and read the +// explicit parameters directly. mat_clear_press and mat_clear_loose were +// declared here but never read, so they are no longer declared. +mat_shrinkage_x = undef; +mat_shrinkage_y = undef; +mat_shrinkage_z = undef; +mat_clear_slide = undef; +function _legacy_or(legacy, explicit) = is_undef(legacy) ? explicit : legacy; // Standard Microscope Slide Dimensions (ISO 8037) -function slide_slot_width(thickness, tolerance) = thickness + tolerance + mat_clear_slide + 0.1; +function slide_slot_width(thickness, tolerance) = + thickness + tolerance + _legacy_or(mat_clear_slide, fit_clearance_slide) + 0.1; function slide_pitch(slot_w, rib_w) = slot_w + rib_w; module slide_retention_rib(height, depth, root_w, tip_w, chamfer_h) { @@ -87,8 +104,11 @@ render_mode = 0; // [0:main] if (render_mode == 0) { // Material simulation logic for transparency via OpenSCAD nightly alpha color([0.8, 0.9, 0.9, 0.4]) { - // Apply Material Hyperobject Shrinkage Compensation - scale([mat_shrinkage_x, mat_shrinkage_y, mat_shrinkage_z]) { + // Scale compensation: the explicit scale_comp_* parameters, or the legacy + // injected mat_shrinkage_* while the platform still injects them. + scale([_legacy_or(mat_shrinkage_x, scale_comp_x), + _legacy_or(mat_shrinkage_y, scale_comp_y), + _legacy_or(mat_shrinkage_z, scale_comp_z)]) { if (slide_standard == 0) { // ISO 8037-1 Primary iso_8037_slide(76.0, 26.0, 1.0); diff --git a/microscope-slide-holder/project.json b/microscope-slide-holder/project.json index 66853e81..3c32e3f9 100644 --- a/microscope-slide-holder/project.json +++ b/microscope-slide-holder/project.json @@ -565,6 +565,29 @@ "es": "Holgura añadida al grosor de laminilla (ancho de ranura)" } }, + { + "id": "fit_clearance_slide", + "type": "slider", + "default": 0.0, + "min": 0.0, + "max": 1.0, + "step": 0.01, + "group": "tolerance", + "visible_in_modes": ["box", "staining_rack", "cabinet_drawer"], + "visibility_level": "advanced", + "label": { + "en": "Extra slide-fit clearance (mm)", + "es": "Holgura extra de ajuste deslizante (mm)", + "fr": "Jeu supplémentaire d'ajustement glissant (mm)", + "pt": "Folga extra de ajuste deslizante (mm)" + }, + "tooltip": { + "en": "Added to every slot width of the OpenSCAD box, staining rack and cabinet drawer (slot = slide thickness + Z tolerance + this + 0.1 mm). 0 adds nothing. A caller that resolves a sliding-fit clearance elsewhere passes the number here.", + "es": "Se suma al ancho de cada ranura de la caja, el bastidor de tinción y el cajón de gabinete en OpenSCAD (ranura = grosor de laminilla + tolerancia Z + este valor + 0.1 mm). 0 no añade nada. Quien resuelve una holgura de ajuste deslizante en otro lugar pasa aquí el número.", + "fr": "S'ajoute à la largeur de chaque fente de la boîte, du portoir de coloration et du tiroir de cabinet OpenSCAD (fente = épaisseur de lame + tolérance Z + cette valeur + 0,1 mm). 0 n'ajoute rien. Un appelant qui calcule ailleurs un jeu d'ajustement glissant transmet ici la valeur.", + "pt": "Somada à largura de cada ranhura da caixa, do suporte de coloração e da gaveta de gabinete em OpenSCAD (ranhura = espessura da lâmina + tolerância Z + este valor + 0,1 mm). 0 não acrescenta nada. Quem resolve uma folga de ajuste deslizante em outro lugar passa aqui o número." + } + }, { "id": "density", "type": "select", From 78a48f68ea533f91dcaf7801cd314e9e49ed676a Mon Sep 17 00:00:00 2001 From: Aldo Ruiz Luna Date: Fri, 2 Oct 2026 15:24:14 -0600 Subject: [PATCH 2/2] docs(microscope-slide-holder): note the staining rack pitch floor in the fit clearance tooltip Co-Authored-By: Claude Opus 5.5 Signed-off-by: Aldo Ruiz Luna --- microscope-slide-holder/project.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/microscope-slide-holder/project.json b/microscope-slide-holder/project.json index 3c32e3f9..d735c6fa 100644 --- a/microscope-slide-holder/project.json +++ b/microscope-slide-holder/project.json @@ -582,10 +582,10 @@ "pt": "Folga extra de ajuste deslizante (mm)" }, "tooltip": { - "en": "Added to every slot width of the OpenSCAD box, staining rack and cabinet drawer (slot = slide thickness + Z tolerance + this + 0.1 mm). 0 adds nothing. A caller that resolves a sliding-fit clearance elsewhere passes the number here.", - "es": "Se suma al ancho de cada ranura de la caja, el bastidor de tinción y el cajón de gabinete en OpenSCAD (ranura = grosor de laminilla + tolerancia Z + este valor + 0.1 mm). 0 no añade nada. Quien resuelve una holgura de ajuste deslizante en otro lugar pasa aquí el número.", - "fr": "S'ajoute à la largeur de chaque fente de la boîte, du portoir de coloration et du tiroir de cabinet OpenSCAD (fente = épaisseur de lame + tolérance Z + cette valeur + 0,1 mm). 0 n'ajoute rien. Un appelant qui calcule ailleurs un jeu d'ajustement glissant transmet ici la valeur.", - "pt": "Somada à largura de cada ranhura da caixa, do suporte de coloração e da gaveta de gabinete em OpenSCAD (ranhura = espessura da lâmina + tolerância Z + este valor + 0,1 mm). 0 não acrescenta nada. Quem resolve uma folga de ajuste deslizante em outro lugar passa aqui o número." + "en": "Added to every slot width of the OpenSCAD box, staining rack and cabinet drawer (slot = slide thickness + Z tolerance + this + 0.1 mm). 0 adds nothing. The staining rack keeps a 5 mm minimum pitch, so there it only matters for thick slides. A caller that resolves a sliding-fit clearance elsewhere passes the number here.", + "es": "Se suma al ancho de cada ranura de la caja, el bastidor de tinción y el cajón de gabinete en OpenSCAD (ranura = grosor de laminilla + tolerancia Z + este valor + 0.1 mm). 0 no añade nada. El bastidor de tinción mantiene un paso mínimo de 5 mm, así que ahí solo influye con laminillas gruesas. Quien resuelve una holgura de ajuste deslizante en otro lugar pasa aquí el número.", + "fr": "S'ajoute à la largeur de chaque fente de la boîte, du portoir de coloration et du tiroir de cabinet OpenSCAD (fente = épaisseur de lame + tolérance Z + cette valeur + 0,1 mm). 0 n'ajoute rien. Le portoir de coloration garde un pas minimal de 5 mm : il n'y compte que pour les lames épaisses. Un appelant qui calcule ailleurs un jeu d'ajustement glissant transmet ici la valeur.", + "pt": "Somada à largura de cada ranhura da caixa, do suporte de coloração e da gaveta de gabinete em OpenSCAD (ranhura = espessura da lâmina + tolerância Z + este valor + 0,1 mm). 0 não acrescenta nada. O suporte de coloração mantém um passo mínimo de 5 mm, então ali só influi com lâminas grossas. Quem resolve uma folga de ajuste deslizante em outro lugar passa aqui o número." } }, {