reverse3d 0.5.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {reverse3d-0.5.0/reverse3d.egg-info → reverse3d-0.5.1}/PKG-INFO +3 -1
  2. {reverse3d-0.5.0 → reverse3d-0.5.1}/README.md +2 -0
  3. reverse3d-0.5.1/reverse3d/_version.py +1 -0
  4. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/autopilot.py +10 -6
  5. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/vision/feature_matcher.py +5 -2
  6. {reverse3d-0.5.0 → reverse3d-0.5.1/reverse3d.egg-info}/PKG-INFO +3 -1
  7. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_vision.py +1 -1
  8. reverse3d-0.5.0/reverse3d/_version.py +0 -1
  9. {reverse3d-0.5.0 → reverse3d-0.5.1}/LICENSE +0 -0
  10. {reverse3d-0.5.0 → reverse3d-0.5.1}/NOTICE +0 -0
  11. {reverse3d-0.5.0 → reverse3d-0.5.1}/pyproject.toml +0 -0
  12. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/__init__.py +0 -0
  13. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/__main__.py +0 -0
  14. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/_about.py +0 -0
  15. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/__init__.py +0 -0
  16. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/compact.py +0 -0
  17. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/mcp_server.py +0 -0
  18. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/prompts.py +0 -0
  19. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/skill/SKILL.md +0 -0
  20. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/tools.py +0 -0
  21. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/cli.py +0 -0
  22. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/config.py +0 -0
  23. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/doctor.py +0 -0
  24. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/errors.py +0 -0
  25. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/hardware.py +0 -0
  26. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/imaging.py +0 -0
  27. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/logging_utils.py +0 -0
  28. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/mesh_io.py +0 -0
  29. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/offline.py +0 -0
  30. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/profiles.py +0 -0
  31. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/py.typed +0 -0
  32. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/recipes.py +0 -0
  33. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/__init__.py +0 -0
  34. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/depth_estimation.py +0 -0
  35. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/photogrammetry.py +0 -0
  36. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/pointcloud.py +0 -0
  37. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/__init__.py +0 -0
  38. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/_blender_job.py +0 -0
  39. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/blender_render.py +0 -0
  40. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/preview.py +0 -0
  41. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/__init__.py +0 -0
  42. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/geometry_fit.py +0 -0
  43. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/measure.py +0 -0
  44. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/mesh_cleaner.py +0 -0
  45. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/parametric.py +0 -0
  46. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/security.py +0 -0
  47. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/setup_agents.py +0 -0
  48. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/userconfig.py +0 -0
  49. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/vision/__init__.py +0 -0
  50. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/vision/mask_extractor.py +0 -0
  51. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/watch.py +0 -0
  52. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/SOURCES.txt +0 -0
  53. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/dependency_links.txt +0 -0
  54. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/entry_points.txt +0 -0
  55. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/requires.txt +0 -0
  56. {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/top_level.txt +0 -0
  57. {reverse3d-0.5.0 → reverse3d-0.5.1}/setup.cfg +0 -0
  58. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_agent_tools.py +0 -0
  59. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_authorship.py +0 -0
  60. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_automation.py +0 -0
  61. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_cli.py +0 -0
  62. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_cli_automation.py +0 -0
  63. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_config.py +0 -0
  64. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_geometry_fit.py +0 -0
  65. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_heic.py +0 -0
  66. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_mesh.py +0 -0
  67. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_offline_autopilot.py +0 -0
  68. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_optional_extras.py +0 -0
  69. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_reconstruction.py +0 -0
  70. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_render.py +0 -0
  71. {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_security.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reverse3d
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: AI-agent-ready toolkit for 3D reverse engineering: image analysis, photogrammetry, mesh repair, primitive fitting and headless rendering.
5
5
  Author-email: Voxel Enterprise <info@voxel.lat>
6
6
  Maintainer-email: Voxel Enterprise <info@voxel.lat>
@@ -425,6 +425,8 @@ Si las fotos están borrosas o falta una herramienta, **no reintenta en vano**:
425
425
 
426
426
  **Formatos:** imágenes `png jpg jpeg tif tiff bmp webp`, y fotos de iPhone `heic heif` (se convierten a JPEG conservando el EXIF) · mallas `stl obj ply glb gltf off` · nubes `ply xyz pcd`.
427
427
 
428
+ **¿Cómo tomar las fotos?** Mínimo 20, recomendadas 40-60, en 4 perfiles (anillos a 10-20°, 35-45° y 60-70°, y 4 desde arriba), sin mover el objeto, con luz pareja y sin reflejos. Guía completa: [docs/captura.md](docs/captura.md).
429
+
428
430
  ---
429
431
 
430
432
  ## Herramientas externas opcionales
@@ -358,6 +358,8 @@ Si las fotos están borrosas o falta una herramienta, **no reintenta en vano**:
358
358
 
359
359
  **Formatos:** imágenes `png jpg jpeg tif tiff bmp webp`, y fotos de iPhone `heic heif` (se convierten a JPEG conservando el EXIF) · mallas `stl obj ply glb gltf off` · nubes `ply xyz pcd`.
360
360
 
361
+ **¿Cómo tomar las fotos?** Mínimo 20, recomendadas 40-60, en 4 perfiles (anillos a 10-20°, 35-45° y 60-70°, y 4 desde arriba), sin mover el objeto, con luz pareja y sin reflejos. Guía completa: [docs/captura.md](docs/captura.md).
362
+
361
363
  ---
362
364
 
363
365
  ## Herramientas externas opcionales
@@ -0,0 +1 @@
1
+ __version__ = "0.5.1"
@@ -68,6 +68,14 @@ KIND_LABEL_ES: dict[str, str] = {
68
68
  }
69
69
 
70
70
  _MIN_PHOTOS = 3
71
+
72
+ #: Capture guide in one sentence (docs/captura.md has the full guide; Studio shows it too).
73
+ CAPTURE_ADVICE_ES = (
74
+ "Para un modelo 3D completo: 40-60 fotos (mínimo 20) en 4 perfiles: anillo bajo a 10-20° "
75
+ "(16 fotos), medio a 35-45° (16), alto a 60-70° (12) y 4 desde arriba; con 60-80 % de "
76
+ "solape, sin mover el objeto, luz pareja y sin reflejos (luces RGB apagadas; en superficies "
77
+ "brillantes, spray mate o talco). Guía completa: docs/captura.md."
78
+ )
71
79
  _ANALYSIS_SIDE = 256
72
80
 
73
81
 
@@ -149,7 +157,7 @@ def detect_input(path: str | Path) -> Detection:
149
157
  "unknown",
150
158
  None,
151
159
  f"only {len(images)} photos: photogrammetry needs at least {_MIN_PHOTOS} "
152
- "(ideally 20-60)",
160
+ "(ideally 40-60)",
153
161
  str(src),
154
162
  )
155
163
  return Detection("unknown", None, "no photos, drawings or 3D files in the folder", str(src))
@@ -388,11 +396,7 @@ def auto_run(
388
396
 
389
397
  if summary is None and detection.kind == "photos" and last_error is not None:
390
398
  reason = last_error.message.split(":", 1)[0].rstrip(".")
391
- capture_advice = [
392
- "Para un modelo 3D completo: 30-60 fotos en orden alrededor del objeto, sin moverlo, "
393
- "con luz pareja y sin reflejos (las luces RGB apagadas; en superficies brillantes, "
394
- "spray mate o talco).",
395
- ]
399
+ capture_advice = [CAPTURE_ADVICE_ES]
396
400
  try:
397
401
  summary = _relief_fallback(source, out, settings, base, reason, history)
398
402
  except Reverse3DError as exc:
@@ -308,10 +308,13 @@ def analyze_image_set(
308
308
  recommendations: list[str] = []
309
309
  if n < 3:
310
310
  recommendations.append(
311
- "Capture at least 20-40 photos around the object for photogrammetry."
311
+ "Take at least 20 photos (40-60 recommended) around the object: three rings at "
312
+ "10-20, 35-45 and 60-70 degrees plus a few from above (see docs/captura.md)."
312
313
  )
313
314
  elif n < 15:
314
- recommendations.append("Few images: add more viewpoints (aim for 60-80% overlap).")
315
+ recommendations.append(
316
+ "Few images: aim for 40-60 photos with 60-80% overlap between neighbours."
317
+ )
315
318
  blurry = [q.name for q in qualities if "blurry" in q.issues]
316
319
  if blurry:
317
320
  recommendations.append(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reverse3d
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: AI-agent-ready toolkit for 3D reverse engineering: image analysis, photogrammetry, mesh repair, primitive fitting and headless rendering.
5
5
  Author-email: Voxel Enterprise <info@voxel.lat>
6
6
  Maintainer-email: Voxel Enterprise <info@voxel.lat>
@@ -425,6 +425,8 @@ Si las fotos están borrosas o falta una herramienta, **no reintenta en vano**:
425
425
 
426
426
  **Formatos:** imágenes `png jpg jpeg tif tiff bmp webp`, y fotos de iPhone `heic heif` (se convierten a JPEG conservando el EXIF) · mallas `stl obj ply glb gltf off` · nubes `ply xyz pcd`.
427
427
 
428
+ **¿Cómo tomar las fotos?** Mínimo 20, recomendadas 40-60, en 4 perfiles (anillos a 10-20°, 35-45° y 60-70°, y 4 desde arriba), sin mover el objeto, con luz pareja y sin reflejos. Guía completa: [docs/captura.md](docs/captura.md).
429
+
428
430
  ---
429
431
 
430
432
  ## Herramientas externas opcionales
@@ -119,7 +119,7 @@ class TestFeatureMatching:
119
119
  assert report.image_count == 2
120
120
  assert len(report.pairs) == 1
121
121
  assert report.suitable_for_photogrammetry is False # only 2 images
122
- assert any("20-40" in r for r in report.recommendations)
122
+ assert any("at least 20 photos" in r for r in report.recommendations)
123
123
 
124
124
 
125
125
  def test_largest_group_ignores_capture_order() -> None:
@@ -1 +0,0 @@
1
- __version__ = "0.5.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes