95 lines
3.3 KiB
Markdown
95 lines
3.3 KiB
Markdown
|
|
# Prueba técnica: pieza plana por extrusión (plan B)
|
|||
|
|
|
|||
|
|
La viabilidad de la reconstrucción desde tres vistas ya la demostró
|
|||
|
|
`prototipo/reconstruir.py` con CUBE01. Esta segunda prueba comprueba el **plan B**
|
|||
|
|
acordado en las decisiones: si la reconstrucción completa no llega a tiempo, o el
|
|||
|
|
plano tiene una sola vista, generar una pieza plana extruyendo su contorno con un
|
|||
|
|
espesor.
|
|||
|
|
|
|||
|
|
También sirve para probar la lectura de contornos cerrados y agujeros con ezdxf y
|
|||
|
|
la exportación a STEP y STL con CadQuery, que se reutilizan en el motor.
|
|||
|
|
|
|||
|
|
Los scripts están en `prototipo/lizette/`.
|
|||
|
|
|
|||
|
|
## 1. Objetivo
|
|||
|
|
|
|||
|
|
- Comprobar que ezdxf lee bien las polilíneas cerradas y los círculos.
|
|||
|
|
- Comprobar que CadQuery genera el sólido por extrusión y resta los agujeros.
|
|||
|
|
- Comprobar que el STEP y el STL generados se abren bien en un programa CAD.
|
|||
|
|
|
|||
|
|
## 2. Alcance
|
|||
|
|
|
|||
|
|
Es un script independiente: no usa la API ni la base de datos, ni `motor/api.py`. Admite polilíneas cerradas
|
|||
|
|
y círculos. El contorno de mayor área se toma como exterior y el resto se restan
|
|||
|
|
como agujeros.
|
|||
|
|
|
|||
|
|
Quedan fuera, y se resolverán en `motor/pieza_plana.py`:
|
|||
|
|
|
|||
|
|
- Los arcos dentro de las polilíneas (*bulge*).
|
|||
|
|
- Unir líneas y arcos sueltos en contornos cerrados.
|
|||
|
|
- Comprobar que los agujeros están dentro del contorno exterior.
|
|||
|
|
- Las unidades.
|
|||
|
|
|
|||
|
|
## 3. Pieza de prueba
|
|||
|
|
|
|||
|
|
Una placa rectangular de 100 × 60 mm con dos taladros de Ø20 mm, generada con
|
|||
|
|
`prototipo/lizette/pieza_prueba.py`.
|
|||
|
|
|
|||
|
|
**[ Captura de `placa.dxf` abierto en LibreCAD o AutoCAD ]**
|
|||
|
|
|
|||
|
|
*Figura 1. Plano 2D de entrada*
|
|||
|
|
|
|||
|
|
## 4. Ejecución
|
|||
|
|
|
|||
|
|
En local, con el entorno del proyecto (`uv sync`):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd prototipo/lizette
|
|||
|
|
uv run python pieza_prueba.py
|
|||
|
|
uv run python conversion.py placa.dxf 10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
O dentro del contenedor del backend, sin instalar nada en el equipo:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker compose run --rm -w /app/prototipo/lizette pruebas python pieza_prueba.py
|
|||
|
|
docker compose run --rm -w /app/prototipo/lizette pruebas python conversion.py placa.dxf 10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`conversion.py` recibe el DXF y el espesor en mm, y genera `resultado.step` y
|
|||
|
|
`resultado.stl`.
|
|||
|
|
|
|||
|
|
**[ Captura de la terminal con la salida del script ]**
|
|||
|
|
|
|||
|
|
*Figura 2. Ejecución de la prueba*
|
|||
|
|
|
|||
|
|
## 5. Resultado
|
|||
|
|
|
|||
|
|
**[ Captura de `resultado.step` abierto en FreeCAD o Fusion 360 ]**
|
|||
|
|
|
|||
|
|
*Figura 3. Placa de 10 mm de espesor con dos taladros*
|
|||
|
|
|
|||
|
|
Volumen esperado: 100 × 60 × 10 − 2 × π × 10² × 10 ≈ **53 717 mm³**. Se puede
|
|||
|
|
comprobar en FreeCAD o con `solido.val().Volume()`.
|
|||
|
|
|
|||
|
|
## 6. Conclusiones
|
|||
|
|
|
|||
|
|
**[ Completar tras ejecutar: ¿se ha generado bien?, ¿coincide el volumen?, ¿cuánto ha tardado?, ¿algún problema? ]**
|
|||
|
|
|
|||
|
|
Siguientes pasos para llevarlo al motor (`motor/pieza_plana.py`):
|
|||
|
|
|
|||
|
|
1. Leer los arcos de las polilíneas (*bulge*) y unir líneas y arcos sueltos en
|
|||
|
|
contornos (con shapely).
|
|||
|
|
2. Comprobar que cada agujero está dentro del contorno exterior y avisar si no.
|
|||
|
|
3. Convertir las unidades a mm.
|
|||
|
|
4. Devolver un `Resultado` del contrato, con el aviso `SIN_PERFIL_CERRADO` en lugar
|
|||
|
|
de una excepción.
|
|||
|
|
5. Añadir la placa al catálogo (`pruebas/catalogo/PLACA01/`) con su prueba
|
|||
|
|
automática.
|
|||
|
|
6. Probar la conversión completa desde la API: subir `placa.dxf` en Swagger
|
|||
|
|
(`/docs`), consultar el estado y descargar el STEP.
|
|||
|
|
|
|||
|
|
**[ Captura de Swagger UI (http://localhost:8000/docs) con los endpoints ]**
|
|||
|
|
|
|||
|
|
*Figura 4. Endpoints de la API en Swagger*
|