Files
SteelXR2/.lovable/plan.md
T
gpt-engineer-app[bot] 82624995d8 Changes
Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
2026-05-21 13:04:13 +00:00

51 lines
2.6 KiB
Markdown

# Correções no modo Medir
## Problemas
1. Ao ativar **Medir**, o OrbitControls é desabilitado (`enabled={!positionMode && !measureMode}`), bloqueando rotação/zoom/pan naturais com o mouse.
2. O label da medida usa `useLabelDistanceFactor` que recalcula `distanceFactor` por frame para manter tamanho **constante** na tela. Resultado: ao aproximar a peça o texto não cresce e fica ilegível.
## Mudanças em `src/components/three/ModelViewer.tsx`
### 1. Reabilitar controles de câmera no modo Medir
No `<OrbitControls>` (linha ~792), trocar:
```tsx
enabled={!positionMode && !measureMode}
```
por:
```tsx
enabled={!positionMode}
```
O `MeasureClickHandler` já tem **drag gate de 4 px** (`pointerdown` + `pointerup` só conta como clique se o mouse moveu menos que 4 px e foi botão esquerdo). Isso significa:
- Botão esquerdo arrastando → OrbitControls rotaciona, nenhum ponto é adicionado.
- Botão direito → pan do OrbitControls (handler ignora `e.button !== 0`).
- Roda → zoom do OrbitControls (handler ignora).
- Clique curto esquerdo → adiciona ponto de medida (com snap).
### 2. Label da medida escala com o zoom e fica ~4x maior
Substituir `MeasurementLabel` para usar `distanceFactor` **fixo** (em vez de calculado por frame). Com `<Html distanceFactor={N}>`, o tamanho na tela é proporcional a `N / distance` — ou seja, **cresce naturalmente ao aproximar a câmera**.
- Remover o uso de `useLabelDistanceFactor` no label de medida (manter, se desejado, apenas no `hoverInfo`).
- Definir `distanceFactor` fixo calibrado para 1:1 mm (valor inicial ~`8`, ajustável).
- Aumentar o tamanho base do texto de `text-[11px]` para `text-[16px]` e `px-2 py-0.5``px-3 py-1` para acompanhar a proporção (~4x área visual final somando o aumento do distanceFactor + texto).
```tsx
function MeasurementLabel({ position, text, variant }: { ... }) {
const borderClass = variant === 'success' ? 'border-success/60' : 'border-primary/60';
const textClass = variant === 'success' ? 'text-success' : 'text-primary';
return (
<Html position={position} center distanceFactor={8} zIndexRange={[100, 0]} style={{ pointerEvents: 'none' }}>
<div className={`rounded bg-card/95 border ${borderClass} px-3 py-1 shadow-lg backdrop-blur-sm`}>
<span className={`font-mono text-[16px] font-bold ${textClass} whitespace-nowrap`}>
{text}
</span>
</div>
</Html>
);
}
```
O `hoverInfo` (auto-detect) pode manter o comportamento atual de tamanho constante para não poluir a cena ao passar o mouse.
## Sem mudanças em outros arquivos
Store, AR, snap e PointMarker permanecem intocados.