## Plano: Ferramentas de Medicao Inteligentes (Smart Snap + Auto-Detect) ### 3 Funcionalidades **1. Vertex Snap (snap magnetico)** - No `MeasureClickHandler`, ao mover o mouse, fazer raycast continuo (`onPointerMove`) - Para cada hit, buscar o vertice mais proximo do ponto de intersecao na geometria do mesh - Se a distancia ao vertice mais proximo for menor que um threshold (ex: 5px em screen space), "snapar" para esse vertice - Renderizar um marcador visual (anel/circulo amarelo) no vertice snappado via `MeasurementOverlay` - Ao clicar, usar o ponto snappado em vez do ponto bruto do raycast - Novo state no store: `snapPoint: MeasurePoint | null` e `setSnapPoint` **2. Auto-detect diametro de furos (hover)** - Ao fazer hover sobre uma face, analisar a geometria local: - Coletar as edges do `EdgesGeometry` que formam um loop fechado (circulo/oblongo) proximo ao ponto de hover - Alternativa mais robusta: analisar os vertices ao redor do ponto de intersecao, detectar se formam um arco/circulo usando fitting de circulo (least-squares circle fit nos vertices vizinhos) - Abordagem pratica: usar as normais das faces -- furos em chapas tem faces com normais apontando para o centro do furo. Agrupar faces cilindricas coplanares e calcular o raio - Apos 1 segundo de hover estavel (debounce), mostrar tooltip HTML com o diametro em mm (1 casa decimal) - Novo state: `hoverInfo: { type: 'hole' | 'edge', position: [x,y,z], value: number } | null` **3. Auto-detect comprimento de aresta (hover)** - Ao hover proximo de uma edge line, identificar o segmento de aresta mais proximo - Calcular o comprimento desse segmento em mm - Apos 1 segundo de hover estavel, mostrar tooltip com o comprimento ### Arquivos a modificar **`src/stores/useModelStore.ts`** - Adicionar `snapPoint`, `setSnapPoint`, `hoverInfo`, `setHoverInfo` **`src/components/three/ModelViewer.tsx`** - Novo componente `SmartSnapHandler`: useFrame com raycast no mouse, busca vertice mais proximo, atualiza `snapPoint` - Novo componente `HoverDetector`: onPointerMove com debounce de 1s, analisa geometria para detectar furos (faces cilindricas) e arestas, atualiza `hoverInfo` - Atualizar `MeasurementOverlay` para renderizar o snap marker (anel amarelo) e o tooltip de hover - Atualizar `MeasureClickHandler` para usar `snapPoint` quando disponivel **`src/components/three/SmartMeasure.tsx`** (novo) - Logica de deteccao de furos: analise de curvatura local dos vertices - Logica de deteccao de arestas: segmentos de EdgesGeometry mais proximos ao cursor - Funcoes utilitarias: `findNearestVertex`, `detectHoleRadius`, `findNearestEdge` ### Detalhes tecnicos ```text Vertex Snap: raycast hit → mesh.geometry.attributes.position → iterar vertices, transformar para world space (mesh.matrixWorld) → projetar para screen space (camera.project) → encontrar o mais proximo em pixels (threshold ~8px) → mostrar anel amarelo nesse ponto Deteccao de Furos: raycast hit face → pegar faceIndex → coletar faces vizinhas com normal similar (cilindrica) → extrair vertices do loop de borda dessas faces → circle fit (least squares) → raio → diametro em mm → mostrar tooltip apos 1s de hover estavel Deteccao de Arestas: EdgesGeometry ja calculada → array de segmentos [v1, v2] → projetar todos para screen space → encontrar segmento mais proximo ao cursor → comprimento = distancia 3D * 1000 (mm) → mostrar tooltip apos 1s de hover estavel ``` ### Sem alteracoes em - Checklist, compare mode, screenshots, fine tuning, import OBJ/STL/IFC, render modes