ofcCONSUULTORIA/lensthickness-wizard
0
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 