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.
- {reverse3d-0.5.0/reverse3d.egg-info → reverse3d-0.5.1}/PKG-INFO +3 -1
- {reverse3d-0.5.0 → reverse3d-0.5.1}/README.md +2 -0
- reverse3d-0.5.1/reverse3d/_version.py +1 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/autopilot.py +10 -6
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/vision/feature_matcher.py +5 -2
- {reverse3d-0.5.0 → reverse3d-0.5.1/reverse3d.egg-info}/PKG-INFO +3 -1
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_vision.py +1 -1
- reverse3d-0.5.0/reverse3d/_version.py +0 -1
- {reverse3d-0.5.0 → reverse3d-0.5.1}/LICENSE +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/NOTICE +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/pyproject.toml +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/__init__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/__main__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/_about.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/__init__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/compact.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/mcp_server.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/prompts.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/skill/SKILL.md +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/agent/tools.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/cli.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/config.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/doctor.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/errors.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/hardware.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/imaging.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/logging_utils.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/mesh_io.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/offline.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/profiles.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/py.typed +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/recipes.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/__init__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/depth_estimation.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/photogrammetry.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reconstruction/pointcloud.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/__init__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/_blender_job.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/blender_render.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/rendering/preview.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/__init__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/geometry_fit.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/measure.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/mesh_cleaner.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/reverse_eng/parametric.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/security.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/setup_agents.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/userconfig.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/vision/__init__.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/vision/mask_extractor.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d/watch.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/SOURCES.txt +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/dependency_links.txt +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/entry_points.txt +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/requires.txt +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/reverse3d.egg-info/top_level.txt +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/setup.cfg +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_agent_tools.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_authorship.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_automation.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_cli.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_cli_automation.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_config.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_geometry_fit.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_heic.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_mesh.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_offline_autopilot.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_optional_extras.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_reconstruction.py +0 -0
- {reverse3d-0.5.0 → reverse3d-0.5.1}/tests/test_render.py +0 -0
- {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.
|
|
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
|
|
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
|
-
"
|
|
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(
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|