pyarchinit-photogrammetry 1.3.0__tar.gz → 1.3.2__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.
- {pyarchinit_photogrammetry-1.3.0/src/pyarchinit_photogrammetry.egg-info → pyarchinit_photogrammetry-1.3.2}/PKG-INFO +5 -1
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/pyproject.toml +5 -1
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/ppg_launcher.py +38 -10
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/__init__.py +1 -1
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/cli.py +156 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/chunk.py +44 -2
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/versions.py +2 -1
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/engine/mesh_cut.py +416 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/multispectral.py +11 -3
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/ortho.py +18 -2
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/probe.py +13 -5
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/texturing.py +30 -3
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/thermal.py +14 -6
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/__init__.py +18 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/calibration_dialog.py +3 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/dialogs.py +23 -1
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/icons.py +1 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/image_views.py +93 -11
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/logging_setup.py +4 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/main_window.py +397 -8
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/model_view.py +31 -2
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/panels.py +50 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/pottery_dialog.py +3 -0
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/gui/table_export.py +155 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/timeline_dialog.py +28 -5
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/translations/en.json +97 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/us_proposal_dialog.py +4 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/exports.py +30 -9
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/gpkg.py +14 -3
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/mesh_import.py +523 -0
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/pdf_report.py +554 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/qfield.py +1 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/qgis_link.py +11 -5
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/report.py +136 -0
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/report_content.py +1912 -0
- pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/tables.py +885 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/gcp.py +15 -8
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/api.py +70 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/manager.py +4 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry.egg-info}/PKG-INFO +5 -1
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/SOURCES.txt +9 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/requires.txt +4 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_cleaning.py +3 -1
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_start.py +17 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_integrations.py +7 -2
- pyarchinit_photogrammetry-1.3.2/tests/test_mesh_cut.py +272 -0
- pyarchinit_photogrammetry-1.3.2/tests/test_model_import.py +295 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_ortho.py +6 -1
- pyarchinit_photogrammetry-1.3.2/tests/test_packaging.py +60 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_plugins.py +84 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_qfield.py +26 -0
- pyarchinit_photogrammetry-1.3.2/tests/test_report.py +637 -0
- pyarchinit_photogrammetry-1.3.0/src/pyarchinit_photogrammetry/io/report.py +0 -92
- pyarchinit_photogrammetry-1.3.0/tests/test_packaging.py +0 -25
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/LICENSE +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/README.md +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/setup.cfg +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/__main__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/_env.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/_native.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/classify.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/learn.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/learned_net.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/learned_worker.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/sam.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/sam_env.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/sam_worker.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/app.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/measures.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/munsell.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/pottery.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/proxies.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/relief.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/sections.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/stones.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/stratigraphy.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/terrain.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/timeline.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/us_proposal.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/batch.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/bim/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/bim/ifc.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/camera.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/crs.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/document.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/geometry.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/marker.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/paradata.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/pointcloud.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/progress.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/demo.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/doctor.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/bundle.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/chunks.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/cleaning.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/colmap_log.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/colour.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/confidence.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/crop.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/dem.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/dem_edit.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/dense.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/diagnostics.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/elevation.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/fieldcheck.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/isolate.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/learned.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/masks.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/meshing.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/nodes.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/normalmap.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/overviews.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/panorama.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/patches.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/precision.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/quality.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/region.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/satellite.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/sfm.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/tiepoints.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/tsdf.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/video.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/visibility.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/__main__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/batch_dialog.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/flow_layout.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/i18n.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/matches_dialog.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/multispectral_pane.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/nodes_dialog.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/plugins_dialog.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/resources/logo.svg +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/scene.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/start_page.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/theme.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/undo.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/update_dialog.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/worker.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/metashape.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/photo3d.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/webodm.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/copc.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/exif.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/flythrough.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/i3s.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/mesh_ply.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/scans.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/web.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/refine.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/targets.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/index.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/scaffold.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/bridge.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/config.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/database.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/demo_db.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/media.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/pyarchinit5_schema.sql +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/testing/__init__.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/testing/synthetic.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/updates.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/dependency_links.txt +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/entry_points.txt +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/top_level.txt +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_alignment_modes.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_archaeo.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_batch.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_bim_ai.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_bundle.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_chunks.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_classify.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_colmap_log.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_colour.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_dem_edit.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_dem_fill.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_dem_spikes.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_depth_mesh.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_diagnostics.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_elevation.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_env.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_exports_web.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_fieldcheck.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_fisheye_panorama.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_geometry.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_cleaning.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_layers.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_patches.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_i18n.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_i3s.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_ifc_strat.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_isolate.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_learn.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_learned.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_marker_refine.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_markers.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_masks.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_measures.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_mesh_ply.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_meshing_fallback.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_multispectral.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_munsell.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_native.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_nodes.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_normalmap.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_overviews.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_paradata.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_patches.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_photos.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pipeline.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pottery_demo.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pottery_search.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_precision.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_probe.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_progress_dialog.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_proxies.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pyarchinit.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pyarchinit_media.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_quality_video.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_raster_detail.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_reference_cameras.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_region.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_regressions.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_relief.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_satellite.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_scalebars.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_scans.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_sfm_global_check.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_stones.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_texture.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_thermal.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_tiepoints.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_timeline.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_tools_3d.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_undo.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_updates.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_us_proposal.py +0 -0
- {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_versions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyarchinit-photogrammetry
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.2
|
|
4
4
|
Summary: Open-source photogrammetry engine for archaeology and BIM, integrated with PyArchInit
|
|
5
5
|
Author-email: Enzo Cocca <enzo.ccc@gmail.com>
|
|
6
6
|
License-Expression: GPL-2.0-or-later
|
|
@@ -26,9 +26,13 @@ Requires-Dist: shapely>=2.0
|
|
|
26
26
|
Requires-Dist: trimesh>=4.0
|
|
27
27
|
Requires-Dist: contourpy>=1.1
|
|
28
28
|
Requires-Dist: ezdxf>=1.1
|
|
29
|
+
Requires-Dist: matplotlib>=3.7
|
|
29
30
|
Requires-Dist: laspy[lazrs]>=2.4
|
|
30
31
|
Requires-Dist: sqlalchemy>=2.0
|
|
31
32
|
Requires-Dist: typer>=0.9
|
|
33
|
+
Requires-Dist: fpdf2>=2.8
|
|
34
|
+
Requires-Dist: openpyxl>=3.1
|
|
35
|
+
Requires-Dist: threadpoolctl>=3.1
|
|
32
36
|
Provides-Extra: mesh
|
|
33
37
|
Requires-Dist: open3d!=0.20.0,>=0.18; extra == "mesh"
|
|
34
38
|
Provides-Extra: bim
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyarchinit-photogrammetry"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.2"
|
|
8
8
|
description = "Open-source photogrammetry engine for archaeology and BIM, integrated with PyArchInit"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "GPL-2.0-or-later"
|
|
@@ -31,9 +31,13 @@ dependencies = [
|
|
|
31
31
|
"trimesh>=4.0",
|
|
32
32
|
"contourpy>=1.1",
|
|
33
33
|
"ezdxf>=1.1",
|
|
34
|
+
"matplotlib>=3.7", # drawings (pottery, plugins' sections and logs); came only through pyvista before
|
|
34
35
|
"laspy[lazrs]>=2.4",
|
|
35
36
|
"sqlalchemy>=2.0",
|
|
36
37
|
"typer>=0.9",
|
|
38
|
+
"fpdf2>=2.8", # the processing report as PDF (io.pdf_report)
|
|
39
|
+
"openpyxl>=3.1", # the tables as Excel workbooks (io.tables)
|
|
40
|
+
"threadpoolctl>=3.1", # BLAS on one thread where results must not depend on the threads (engine.ortho)
|
|
37
41
|
]
|
|
38
42
|
|
|
39
43
|
[project.optional-dependencies]
|
|
@@ -263,6 +263,41 @@ def _persistent_matplotlib_cache() -> None:
|
|
|
263
263
|
_crash_file = None # kept open while the application runs
|
|
264
264
|
|
|
265
265
|
|
|
266
|
+
def _log_folder() -> str:
|
|
267
|
+
"""The log folder of the interface (as ``gui.logging_setup``; ``PPG_LOG_DIR`` overrides it)."""
|
|
268
|
+
folder = os.environ.get("PPG_LOG_DIR")
|
|
269
|
+
if folder:
|
|
270
|
+
return folder
|
|
271
|
+
if sys.platform == "darwin":
|
|
272
|
+
return os.path.expanduser("~/Library/Logs/pyarchinit-photogrammetry")
|
|
273
|
+
if os.name == "nt":
|
|
274
|
+
return os.path.join(os.environ.get("LOCALAPPDATA") or os.path.expanduser("~/AppData/Local"),
|
|
275
|
+
"pyarchinit-photogrammetry", "logs")
|
|
276
|
+
return os.path.join(os.environ.get("XDG_STATE_HOME") or os.path.expanduser("~/.local/state"),
|
|
277
|
+
"pyarchinit-photogrammetry", "logs")
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
_hang_file = None
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def check_watchdog() -> bool:
|
|
284
|
+
"""The smoke test of a build (``--check``) that stalls says where: after ``PPG_CHECK_TIMEOUT``
|
|
285
|
+
seconds (420 by default, less than the build script waits) the traceback of every thread goes
|
|
286
|
+
to ``check-hang.txt`` in the log folder and the process ends. True when it is armed."""
|
|
287
|
+
global _hang_file
|
|
288
|
+
import faulthandler
|
|
289
|
+
|
|
290
|
+
try:
|
|
291
|
+
seconds = float(os.environ.get("PPG_CHECK_TIMEOUT", "420"))
|
|
292
|
+
folder = _log_folder()
|
|
293
|
+
os.makedirs(folder, exist_ok=True)
|
|
294
|
+
_hang_file = open(os.path.join(folder, "check-hang.txt"), "w", encoding="utf-8")
|
|
295
|
+
faulthandler.dump_traceback_later(seconds, exit=True, file=_hang_file)
|
|
296
|
+
return True
|
|
297
|
+
except (OSError, ValueError):
|
|
298
|
+
return False
|
|
299
|
+
|
|
300
|
+
|
|
266
301
|
def crash_log() -> bool:
|
|
267
302
|
"""Native crashes (segfault, abort) written to ``crash.log`` in the log folder of the
|
|
268
303
|
interface (as ``gui.logging_setup``, ``PPG_LOG_DIR`` overrides it) from the very start,
|
|
@@ -274,16 +309,7 @@ def crash_log() -> bool:
|
|
|
274
309
|
|
|
275
310
|
if faulthandler.is_enabled():
|
|
276
311
|
return True
|
|
277
|
-
folder =
|
|
278
|
-
if not folder:
|
|
279
|
-
if sys.platform == "darwin":
|
|
280
|
-
folder = os.path.expanduser("~/Library/Logs/pyarchinit-photogrammetry")
|
|
281
|
-
elif os.name == "nt":
|
|
282
|
-
folder = os.path.join(os.environ.get("LOCALAPPDATA") or os.path.expanduser("~/AppData/Local"),
|
|
283
|
-
"pyarchinit-photogrammetry", "logs")
|
|
284
|
-
else:
|
|
285
|
-
folder = os.path.join(os.environ.get("XDG_STATE_HOME") or os.path.expanduser("~/.local/state"),
|
|
286
|
-
"pyarchinit-photogrammetry", "logs")
|
|
312
|
+
folder = _log_folder()
|
|
287
313
|
try:
|
|
288
314
|
os.makedirs(folder, exist_ok=True)
|
|
289
315
|
_crash_file = open(os.path.join(folder, "crash.log"), "a", encoding="utf-8")
|
|
@@ -306,6 +332,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
306
332
|
|
|
307
333
|
return gui_main(argv)
|
|
308
334
|
crash_log()
|
|
335
|
+
if "--check" in argv:
|
|
336
|
+
check_watchdog()
|
|
309
337
|
os.environ.setdefault("QT_API", "pyside6") # qtpy (pyvistaqt) must not pick another binding
|
|
310
338
|
os.environ.setdefault("GLOG_minloglevel", "2")
|
|
311
339
|
try:
|
|
@@ -35,7 +35,7 @@ from .core import (ARCHAEO_CLASSES, ASPRS_CLASSES, Camera, Chunk, Document, Mark
|
|
|
35
35
|
from .core.progress import Cancelled, Progress, print_progress
|
|
36
36
|
from . import demo # noqa: E402 (ppg.demo.create_demo)
|
|
37
37
|
|
|
38
|
-
__version__ = "1.3.
|
|
38
|
+
__version__ = "1.3.2"
|
|
39
39
|
|
|
40
40
|
__all__ = ["app", "Document", "Chunk", "Camera", "Sensor", "Marker", "Projection", "Reference", "ScaleBar",
|
|
41
41
|
"PointCloud", "ASPRS_CLASSES", "ARCHAEO_CLASSES", "Progress", "Cancelled", "print_progress", "__version__"]
|
|
@@ -92,6 +92,106 @@ def import_scans_cmd(project: Path, files: list[Path], label: Optional[str] = No
|
|
|
92
92
|
typer.echo(f"{ch.label}: {len(ch.point_cloud)} points from {len(ch.meta['scans'])} scans")
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
@app.command("import-model")
|
|
96
|
+
def import_model_cmd(project: Path, file: Path,
|
|
97
|
+
chunk: Optional[str] = typer.Option(None, help="chunk to import into (default: the active one)"),
|
|
98
|
+
new_chunk: Optional[str] = typer.Option(None, "--new-chunk", help="put the model in a new chunk "
|
|
99
|
+
"with this name"),
|
|
100
|
+
internal: bool = typer.Option(False, help="the file is in the internal frame of the chunk "
|
|
101
|
+
"(its model.ply edited elsewhere)"),
|
|
102
|
+
up: str = typer.Option("auto", help="vertical axis of the file: auto (Y for glTF), z or y"),
|
|
103
|
+
scale: float = typer.Option(1.0, help="multiplies the coordinates of the file (0.001 for mm)"),
|
|
104
|
+
offset: Optional[str] = typer.Option(None, help="X,Y,Z added after the scale (default: the "
|
|
105
|
+
"origin of a GLB of this program, else 0)"),
|
|
106
|
+
crs: Optional[str] = typer.Option(None, help="CRS of a new or empty chunk (e.g. EPSG:32633)"),
|
|
107
|
+
overwrite: bool = typer.Option(False, help="replace the current model instead of keeping it "
|
|
108
|
+
"as a version"),
|
|
109
|
+
name: Optional[str] = typer.Option(None, help="name of the new version of the model")):
|
|
110
|
+
"""A mesh of another program (OBJ, PLY, GLB/glTF, STL, ...) as the model of a chunk, with its
|
|
111
|
+
colours and texture; the current model is kept as a version."""
|
|
112
|
+
from .io.mesh_import import import_model, import_model_chunk
|
|
113
|
+
|
|
114
|
+
xyz = None
|
|
115
|
+
if offset:
|
|
116
|
+
xyz = [float(v) for v in offset.replace(";", ",").split(",")]
|
|
117
|
+
if len(xyz) != 3:
|
|
118
|
+
raise typer.BadParameter("offset: X,Y,Z")
|
|
119
|
+
kw = {"frame": "internal" if internal else "world", "up": up, "scale": scale, "offset": xyz}
|
|
120
|
+
if new_chunk is not None:
|
|
121
|
+
doc = Document.open(project)
|
|
122
|
+
ch, r = import_model_chunk(doc, file, label=new_chunk or None, crs=crs, progress=print_progress, **kw)
|
|
123
|
+
else:
|
|
124
|
+
doc, ch = _open(project, chunk)
|
|
125
|
+
r = import_model(ch, file, crs=crs, keep=not overwrite, name=name, progress=print_progress, **kw)
|
|
126
|
+
doc.save()
|
|
127
|
+
typer.echo(f"{ch.label}: {r['faces']} faces, {r['vertices']} vertices, {r['pages']} texture pages"
|
|
128
|
+
+ (f", previous model kept as version {r['kept']}" if r["kept"] else ""))
|
|
129
|
+
if r["missing_textures"]:
|
|
130
|
+
typer.echo(f"textures not found: {', '.join(r['missing_textures'])}")
|
|
131
|
+
if r["distance"]:
|
|
132
|
+
typer.echo(f"warning: the model lies {r['distance']:.1f} m from the data of the chunk "
|
|
133
|
+
"(check the coordinate system, --offset, --scale and --up)")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@app.command("cut-model")
|
|
137
|
+
def cut_model_cmd(project: Path,
|
|
138
|
+
horizontal: Optional[float] = typer.Option(None, help="horizontal plane at this height"),
|
|
139
|
+
vertical: Optional[str] = typer.Option(None, help="vertical plane through the line X1,Y1,X2,Y2 "
|
|
140
|
+
"(above = to the left of the walker from 1 to 2)"),
|
|
141
|
+
points: Optional[str] = typer.Option(None, help="plane through three points X1,Y1,Z1,X2,Y2,Z2,"
|
|
142
|
+
"X3,Y3,Z3"),
|
|
143
|
+
plane: Optional[str] = typer.Option(None, help="a point and the normal X,Y,Z,NX,NY,NZ"),
|
|
144
|
+
dip: Optional[str] = typer.Option(None, help="X,Y,Z,DIP_DIRECTION,DIP (degrees, from north)"),
|
|
145
|
+
keep: str = typer.Option("above", help="above, below, slab, both or series"),
|
|
146
|
+
thickness: Optional[float] = typer.Option(None, help="metres: the slab, or each slice of a series"),
|
|
147
|
+
step: Optional[float] = typer.Option(None, help="metres between the slices of a series"),
|
|
148
|
+
count: Optional[int] = typer.Option(None, help="slices of a series (default: across the model)"),
|
|
149
|
+
out: Optional[Path] = typer.Option(None, help="file (.ply/.obj) for a part, the stem of the two "
|
|
150
|
+
"parts, the folder of a series; without it the part kept "
|
|
151
|
+
"becomes the model"),
|
|
152
|
+
overwrite: bool = typer.Option(False, help="do not keep the current model as a version"),
|
|
153
|
+
name: Optional[str] = typer.Option(None, help="name of the new version of the model"),
|
|
154
|
+
cap: bool = typer.Option(True, help="close the solids cut on the plane (each in its colour)"),
|
|
155
|
+
chunk: Optional[str] = None):
|
|
156
|
+
"""Cut the model with a plane: keep one side, a slice, both sides as files or a series of slices."""
|
|
157
|
+
import numpy as np
|
|
158
|
+
|
|
159
|
+
from .engine import mesh_cut
|
|
160
|
+
|
|
161
|
+
def numbers(text, n, what):
|
|
162
|
+
values = [float(v) for v in text.replace(";", ",").split(",")]
|
|
163
|
+
if len(values) != n:
|
|
164
|
+
raise typer.BadParameter(f"{what}: {n} numbers separated by commas")
|
|
165
|
+
return values
|
|
166
|
+
|
|
167
|
+
given = [v is not None for v in (horizontal, vertical, points, plane, dip)]
|
|
168
|
+
if sum(given) != 1:
|
|
169
|
+
raise typer.BadParameter("give one plane: --horizontal, --vertical, --points, --plane or --dip")
|
|
170
|
+
if horizontal is not None:
|
|
171
|
+
p, n = mesh_cut.horizontal(horizontal)
|
|
172
|
+
elif vertical is not None:
|
|
173
|
+
v = numbers(vertical, 4, "--vertical")
|
|
174
|
+
p, n = mesh_cut.vertical(v[:2], v[2:])
|
|
175
|
+
elif points is not None:
|
|
176
|
+
v = numbers(points, 9, "--points")
|
|
177
|
+
p, n = mesh_cut.through_points(v[:3], v[3:6], v[6:])
|
|
178
|
+
elif plane is not None:
|
|
179
|
+
v = numbers(plane, 6, "--plane")
|
|
180
|
+
p, n = np.asarray(v[:3]), np.asarray(v[3:]) / np.linalg.norm(v[3:])
|
|
181
|
+
else:
|
|
182
|
+
v = numbers(dip, 5, "--dip")
|
|
183
|
+
p, n = mesh_cut.dipping(v[:3], v[3], v[4])
|
|
184
|
+
doc, ch = _open(project, chunk)
|
|
185
|
+
r = ch.cut_model(p, n, keep=keep, thickness=thickness, step=step, count=count, out=out,
|
|
186
|
+
as_version=not overwrite, name=name, cap=cap, progress=print_progress)
|
|
187
|
+
if not r["files"]:
|
|
188
|
+
doc.save()
|
|
189
|
+
typer.echo(f"{ch.label}: model cut, {r['faces']} -> {r['faces_kept']} faces"
|
|
190
|
+
+ (f", previous model kept as version {r['kept']}" if r["kept"] else ""))
|
|
191
|
+
for f in r["files"]:
|
|
192
|
+
typer.echo(f)
|
|
193
|
+
|
|
194
|
+
|
|
95
195
|
@app.command("colour-scan")
|
|
96
196
|
def colour_scan(project: Path, scan: str = typer.Option(..., help="label of the chunk to colour"),
|
|
97
197
|
photos: str = typer.Option(..., help="label of the chunk with the aligned photos")):
|
|
@@ -861,6 +961,62 @@ def export(project: Path, ortho: Optional[Path] = None, dem: Optional[Path] = No
|
|
|
861
961
|
typer.echo(str(ch.export_cameras(cameras, fmt="csv" if cameras.suffix == ".csv" else "colmap")))
|
|
862
962
|
|
|
863
963
|
|
|
964
|
+
def _language(lang: Optional[str]) -> Optional[str]:
|
|
965
|
+
if lang and lang.strip().lower()[:2] not in ("it", "en"):
|
|
966
|
+
raise typer.BadParameter(f"--lang: it or en, not {lang!r}")
|
|
967
|
+
return lang.strip().lower()[:2] if lang else None
|
|
968
|
+
|
|
969
|
+
|
|
970
|
+
@app.command()
|
|
971
|
+
def report(project: Path,
|
|
972
|
+
pdf: Optional[Path] = typer.Option(None, help="the PDF to write (default: <project>_report.pdf beside the "
|
|
973
|
+
"project when --html is not given)"),
|
|
974
|
+
html: Optional[Path] = typer.Option(None, help="also, or only, the report as an HTML page"),
|
|
975
|
+
lang: Optional[str] = typer.Option(None, help="it or en (default: the language of the interface or of the "
|
|
976
|
+
"system)"),
|
|
977
|
+
chunk: Optional[str] = typer.Option(None, help="only this chunk (label or key); default: every enabled chunk"),
|
|
978
|
+
title: Optional[str] = typer.Option(None, help="title on the first page"),
|
|
979
|
+
description: str = typer.Option("", help="text on the first page")):
|
|
980
|
+
"""The processing report: survey, calibration, accuracy of the references, processing parameters,
|
|
981
|
+
products with their figures, multispectral and thermal products, measuring points."""
|
|
982
|
+
from .io.pdf_report import generate_pdf_report
|
|
983
|
+
from .io.report import generate_report
|
|
984
|
+
|
|
985
|
+
language = _language(lang)
|
|
986
|
+
doc = Document.open(project)
|
|
987
|
+
if not doc.chunks:
|
|
988
|
+
raise typer.BadParameter("the project has no chunks")
|
|
989
|
+
chunks = None
|
|
990
|
+
if chunk is not None:
|
|
991
|
+
found = next((c for c in doc.chunks if c.label == chunk or str(c.key) == chunk), None)
|
|
992
|
+
if found is None:
|
|
993
|
+
raise typer.BadParameter(f"no chunk {chunk!r} in the project")
|
|
994
|
+
chunks = [found]
|
|
995
|
+
if pdf is None and html is None:
|
|
996
|
+
pdf = project.with_name(project.stem + "_report.pdf")
|
|
997
|
+
if pdf is not None:
|
|
998
|
+
typer.echo(str(generate_pdf_report(doc, pdf, language=language, chunks=chunks, title=title,
|
|
999
|
+
description=description, progress=print_progress)))
|
|
1000
|
+
if html is not None:
|
|
1001
|
+
target = chunks[0] if chunks else doc
|
|
1002
|
+
typer.echo(str(generate_report(target, html, language=language)))
|
|
1003
|
+
|
|
1004
|
+
|
|
1005
|
+
@app.command()
|
|
1006
|
+
def tables(project: Path, out: Path = typer.Argument(..., help="the Excel workbook to write (.xlsx)"),
|
|
1007
|
+
chunk: Optional[str] = typer.Option(None, help="label or key of the chunk (default: the active one)"),
|
|
1008
|
+
lang: Optional[str] = typer.Option(None, help="language of the headers: it or en (default: of the "
|
|
1009
|
+
"interface or of the system)")):
|
|
1010
|
+
"""Every table of a chunk in one Excel workbook, a sheet each: cameras, sensors, markers, scale bars,
|
|
1011
|
+
products, point classes, versions, parameters, multispectral bands, indices and zones, thermal measure,
|
|
1012
|
+
measuring points, spot heights, units, stones, proxies, sections."""
|
|
1013
|
+
from .io.tables import export_tables
|
|
1014
|
+
|
|
1015
|
+
language = _language(lang)
|
|
1016
|
+
_, ch = _open(project, chunk)
|
|
1017
|
+
typer.echo(str(export_tables(ch, out, language=language, progress=print_progress)))
|
|
1018
|
+
|
|
1019
|
+
|
|
864
1020
|
def _numbers(text: Optional[str], count: int, what: str) -> Optional[tuple]:
|
|
865
1021
|
"""``"16,2.0"`` -> ``(16.0, 2.0)`` (None when not given)."""
|
|
866
1022
|
if not text:
|
|
@@ -821,6 +821,31 @@ class Chunk:
|
|
|
821
821
|
crs_wkt=crs_mod.wkt(self.crs))
|
|
822
822
|
return pc.transformed(self.transform).save(path, crs_wkt=crs_mod.wkt(self.crs))
|
|
823
823
|
|
|
824
|
+
def import_model(self, path: str | os.PathLike, frame: str = "world", offset=None, scale: float = 1.0,
|
|
825
|
+
up: str = "auto", crs: str | None = None, keep: bool = True, name: str | None = None,
|
|
826
|
+
progress: ProgressCallback | None = None) -> dict:
|
|
827
|
+
"""A mesh of another program (OBJ, PLY, GLB/glTF, STL, ...) as the model of the chunk, with
|
|
828
|
+
its colours and texture; the current model kept as a version (``keep``). See
|
|
829
|
+
:func:`io.mesh_import.import_model` for the coordinates (``frame``, ``offset``, ``scale``,
|
|
830
|
+
``up``, ``crs``)."""
|
|
831
|
+
from ..io.mesh_import import import_model
|
|
832
|
+
|
|
833
|
+
return import_model(self, path, frame=frame, offset=offset, scale=scale, up=up, crs=crs, keep=keep,
|
|
834
|
+
name=name, progress=as_progress(progress))
|
|
835
|
+
|
|
836
|
+
def cut_model(self, point, normal, keep: str = "above", thickness: float | None = None,
|
|
837
|
+
step: float | None = None, count: int | None = None, out: str | os.PathLike | None = None,
|
|
838
|
+
as_version: bool = True, name: str | None = None, cap: bool = True,
|
|
839
|
+
progress: ProgressCallback | None = None) -> dict:
|
|
840
|
+
"""Cut the model with the plane through ``point`` with ``normal`` (world coordinates): one side
|
|
841
|
+
(``keep`` "above"/"below"), a slice of ``thickness`` ("slab") as the new model or to the file
|
|
842
|
+
``out``; both sides ("both") or slices every ``step`` ("series") to files; ``cap``: closed
|
|
843
|
+
solids closed on the plane. See :func:`engine.mesh_cut.cut_model`."""
|
|
844
|
+
from ..engine.mesh_cut import cut_model
|
|
845
|
+
|
|
846
|
+
return cut_model(self, point, normal, keep=keep, thickness=thickness, step=step, count=count, out=out,
|
|
847
|
+
as_version=as_version, name=name, cap=cap, progress=as_progress(progress))
|
|
848
|
+
|
|
824
849
|
def export_model(self, path: str | os.PathLike, region=None, zmin: float | None = None,
|
|
825
850
|
zmax: float | None = None) -> Path:
|
|
826
851
|
"""The model in world coordinates (OBJ with the texture when built, PLY with colours and
|
|
@@ -905,10 +930,27 @@ class Chunk:
|
|
|
905
930
|
cut = crop_raster(src, Path(tmp) / "cut.tif", region)
|
|
906
931
|
return export_cog(cut, path, compression, quality)
|
|
907
932
|
|
|
908
|
-
def generate_report(self, path: str | os.PathLike) -> Path:
|
|
933
|
+
def generate_report(self, path: str | os.PathLike, language: str | None = "en") -> Path:
|
|
934
|
+
"""The processing report as an HTML page (``language``: ``en``, ``it``, None for the
|
|
935
|
+
language of the interface or of the system)."""
|
|
909
936
|
from ..io import report
|
|
910
937
|
|
|
911
|
-
return report.generate_report(self, path)
|
|
938
|
+
return report.generate_report(self, path, language=language)
|
|
939
|
+
|
|
940
|
+
def generate_pdf_report(self, path: str | os.PathLike, language: str | None = None,
|
|
941
|
+
progress: ProgressCallback | None = None, **options) -> Path:
|
|
942
|
+
"""The processing report of this chunk as a printable PDF (:func:`io.pdf_report.generate_pdf_report`:
|
|
943
|
+
``title``, ``description``, ``index_palette``, ``thermal_palette``)."""
|
|
944
|
+
from ..io.pdf_report import generate_pdf_report
|
|
945
|
+
|
|
946
|
+
return generate_pdf_report(self, path, language=language, progress=progress, **options)
|
|
947
|
+
|
|
948
|
+
def export_tables(self, path: str | os.PathLike, language: str | None = None,
|
|
949
|
+
progress: ProgressCallback | None = None) -> Path:
|
|
950
|
+
"""Every table of the chunk in one Excel workbook, a sheet each (:func:`io.tables.project_tables`)."""
|
|
951
|
+
from ..io.tables import export_tables
|
|
952
|
+
|
|
953
|
+
return export_tables(self, path, language=language, progress=progress)
|
|
912
954
|
|
|
913
955
|
# ----------------------------------------------------------- serialisation
|
|
914
956
|
def _base_dir(self) -> Path | None:
|
|
@@ -67,7 +67,8 @@ def _describe(chunk, product: str) -> str:
|
|
|
67
67
|
bits.append(f"qualita' {meta['quality']}")
|
|
68
68
|
elif product == "model" and meta.get("source"):
|
|
69
69
|
bits.append({"depth_maps": "mappe di profondita'", "point_cloud": "nuvola densa",
|
|
70
|
-
"tie_points": "punti di legame"
|
|
70
|
+
"tie_points": "punti di legame", "import": f"importato da {meta.get('file', 'un file')}"}
|
|
71
|
+
.get(meta["source"], meta["source"]))
|
|
71
72
|
if meta.get("classes"):
|
|
72
73
|
bits.append("classi " + ", ".join(str(c) for c in meta["classes"]))
|
|
73
74
|
if product == "orthomosaic" and meta.get("hidden_classes"):
|