CoolFace
Apppublic

ofcCONSUULTORIA/lensthickness-wizard

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
script.js105 linesDownload Raw Back to root
1 2document.addEventListener('DOMContentLoaded', () => {3    // Material options mapping4    const materials = {5        'cr39': { name: 'CR-39', index: 1.5 },6'policarbonato': { name: 'Policarbonato', index: 1.586 },7        'trivex': { name: 'Trivex', index: 1.53 },8        'alto_indice_1_6': { name: 'Alto Índice 1.6', index: 1.6 },9        'alto_indice_1_67': { name: 'Alto Índice 1.67', index: 1.67 },10        'alto_indice_1_74': { name: 'Alto Índice 1.74', index: 1.74 }11    };12 13    // Setup material selector14    const materialSelect = document.createElement('select');15    materialSelect.id = 'materialSelect';16    materialSelect.className = 'w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500';17    materialSelect.innerHTML = `18        <option value="">Selecione um material...</option>19        ${Object.entries(materials).map(([key, mat]) => 20            `<option value="${key}" ${key === 'cr39' ? 'selected' : ''}>${mat.name} (n = ${mat.index})</option>`21).join('')}22    `;23    24    materialSelect.addEventListener('change', function() {25        const selected = materials[this.value];26        if (selected) {27            document.getElementById('indice_n').value = selected.index;28        }29    });30 31    // Insert material selector before index input32    const indexInput = document.getElementById('indice_n');33    indexInput.parentNode.insertBefore(materialSelect, indexInput);34 35    // Form submission handler36    const lensForm = document.getElementById('lensForm');37    lensForm.addEventListener('submit', function(event) {38        event.preventDefault();39        calcularEspessura();40    });41 42    function calcularEspessura() {43        // 1. Collect and convert form data44        const de = parseFloat(document.getElementById('esferico').value) || 0;45        const dc = parseFloat(document.getElementById('cilindrico').value) || 0;46        const eixo = parseFloat(document.getElementById('eixo').value) || 0;47        48        const indice_n = parseFloat(document.getElementById('indice_n').value);49        const diametro = parseFloat(document.getElementById('diametro').value);50        const maior_diagonal_ed = parseFloat(document.getElementById('maior_diagonal_ed').value);51        const dnp = parseFloat(document.getElementById('dnp').value);52        let espessura_centro_ec;53        54        // Auto-determine center thickness based on prescription55        if (de < 0) { // Negative lenses (myopia)56            espessura_centro_ec = 2.0;57        } else { // Positive lenses (hyperopia)58            // For positive lenses, calculate edge thickness first59            const decentracao = Math.abs((maior_diagonal_ed / 2) - dnp);60            const raio_efetivo = (maior_diagonal_ed / 2) + decentracao;61            const angulo_rad = Math.PI * (180 - eixo) / 180;62            const potencia_efetiva_meridiano = de + (dc * (Math.sin(angulo_rad)**2));63            const sagita = (potencia_efetiva_meridiano * raio_efetivo**2) / (2000 * (indice_n - 1));64            espessura_centro_ec = sagita + 1.5; // Edge thickness of 1.5mm for positive lenses65        }66// 2. Data validation67        const resultadoDiv = document.getElementById('resultado');68        const resultContent = document.getElementById('resultContent');69 70        if (isNaN(indice_n) || isNaN(diametro) || isNaN(maior_diagonal_ed) || isNaN(dnp)) {71            resultadoDiv.classList.remove('hidden');72            resultContent.innerHTML = `<p class="font-bold text-red-600">Erro: Preencha todos os campos obrigatórios com valores numéricos.</p>`;73            return;74        }75 76        if (indice_n <= 1) {77            resultadoDiv.classList.remove('hidden');78            resultContent.innerHTML = `<p class="font-bold text-red-600">Erro: O Índice de Refração deve ser maior que 1.</p>`;79            return;80        }81 82        // 3. Main calculations (corrected logic)83        const decentracao = Math.abs((maior_diagonal_ed / 2) - dnp);84        const raio_efetivo = (maior_diagonal_ed / 2) + decentracao;85        const angulo_rad = Math.PI * (180 - eixo) / 180;86        const potencia_efetiva_meridiano = de + (dc * (Math.sin(angulo_rad)**2));87        const sagita = (potencia_efetiva_meridiano * raio_efetivo**2) / (2000 * (indice_n - 1));88        const espessura_borda = de < 0 ? (espessura_centro_ec - sagita) : 1.5;89// 4. Display results90        resultadoDiv.classList.remove('hidden');91        resultContent.innerHTML = `92            <p><strong>Material:</strong> ${materialSelect.options[materialSelect.selectedIndex].text || 'Personalizado'}</p>93            <p><strong>Espessura no Centro:</strong> ${espessura_centro_ec.toFixed(2)} mm</p>94<p class="mt-2 text-xl font-bold text-blue-800">95<strong>Espessura Máxima Estimada na Borda:</strong> 96                <span class="text-blue-600 font-extrabold">${Math.abs(espessura_borda).toFixed(2)} mm</span>97            </p>98            ${espessura_borda < 0 ? '<p class="text-yellow-600 font-semibold">Atenção: Valor negativo indica que a lente pode ficar muito fina!</p>' : ''}99        `;100 101        resultadoDiv.scrollIntoView({ behavior: 'smooth' });102        feather.replace();103    }104});105