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.
Files changed (247) hide show
  1. {pyarchinit_photogrammetry-1.3.0/src/pyarchinit_photogrammetry.egg-info → pyarchinit_photogrammetry-1.3.2}/PKG-INFO +5 -1
  2. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/pyproject.toml +5 -1
  3. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/ppg_launcher.py +38 -10
  4. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/__init__.py +1 -1
  5. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/cli.py +156 -0
  6. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/chunk.py +44 -2
  7. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/versions.py +2 -1
  8. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/engine/mesh_cut.py +416 -0
  9. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/multispectral.py +11 -3
  10. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/ortho.py +18 -2
  11. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/probe.py +13 -5
  12. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/texturing.py +30 -3
  13. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/thermal.py +14 -6
  14. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/__init__.py +18 -0
  15. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/calibration_dialog.py +3 -0
  16. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/dialogs.py +23 -1
  17. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/icons.py +1 -0
  18. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/image_views.py +93 -11
  19. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/logging_setup.py +4 -0
  20. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/main_window.py +397 -8
  21. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/model_view.py +31 -2
  22. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/panels.py +50 -0
  23. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/pottery_dialog.py +3 -0
  24. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/gui/table_export.py +155 -0
  25. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/timeline_dialog.py +28 -5
  26. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/translations/en.json +97 -0
  27. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/us_proposal_dialog.py +4 -0
  28. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/exports.py +30 -9
  29. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/gpkg.py +14 -3
  30. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/mesh_import.py +523 -0
  31. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/pdf_report.py +554 -0
  32. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/qfield.py +1 -0
  33. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/qgis_link.py +11 -5
  34. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/report.py +136 -0
  35. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/report_content.py +1912 -0
  36. pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry/io/tables.py +885 -0
  37. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/gcp.py +15 -8
  38. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/api.py +70 -0
  39. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/manager.py +4 -0
  40. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2/src/pyarchinit_photogrammetry.egg-info}/PKG-INFO +5 -1
  41. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/SOURCES.txt +9 -0
  42. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/requires.txt +4 -0
  43. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_cleaning.py +3 -1
  44. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_start.py +17 -0
  45. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_integrations.py +7 -2
  46. pyarchinit_photogrammetry-1.3.2/tests/test_mesh_cut.py +272 -0
  47. pyarchinit_photogrammetry-1.3.2/tests/test_model_import.py +295 -0
  48. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_ortho.py +6 -1
  49. pyarchinit_photogrammetry-1.3.2/tests/test_packaging.py +60 -0
  50. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_plugins.py +84 -0
  51. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_qfield.py +26 -0
  52. pyarchinit_photogrammetry-1.3.2/tests/test_report.py +637 -0
  53. pyarchinit_photogrammetry-1.3.0/src/pyarchinit_photogrammetry/io/report.py +0 -92
  54. pyarchinit_photogrammetry-1.3.0/tests/test_packaging.py +0 -25
  55. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/LICENSE +0 -0
  56. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/README.md +0 -0
  57. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/setup.cfg +0 -0
  58. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/__main__.py +0 -0
  59. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/_env.py +0 -0
  60. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/_native.py +0 -0
  61. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/__init__.py +0 -0
  62. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/classify.py +0 -0
  63. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/learn.py +0 -0
  64. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/learned_net.py +0 -0
  65. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/learned_worker.py +0 -0
  66. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/sam.py +0 -0
  67. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/sam_env.py +0 -0
  68. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/ai/sam_worker.py +0 -0
  69. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/app.py +0 -0
  70. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/__init__.py +0 -0
  71. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/measures.py +0 -0
  72. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/munsell.py +0 -0
  73. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/pottery.py +0 -0
  74. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/proxies.py +0 -0
  75. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/relief.py +0 -0
  76. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/sections.py +0 -0
  77. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/stones.py +0 -0
  78. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/stratigraphy.py +0 -0
  79. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/terrain.py +0 -0
  80. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/timeline.py +0 -0
  81. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/archaeo/us_proposal.py +0 -0
  82. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/batch.py +0 -0
  83. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/bim/__init__.py +0 -0
  84. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/bim/ifc.py +0 -0
  85. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/__init__.py +0 -0
  86. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/camera.py +0 -0
  87. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/crs.py +0 -0
  88. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/document.py +0 -0
  89. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/geometry.py +0 -0
  90. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/marker.py +0 -0
  91. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/paradata.py +0 -0
  92. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/pointcloud.py +0 -0
  93. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/core/progress.py +0 -0
  94. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/demo.py +0 -0
  95. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/doctor.py +0 -0
  96. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/__init__.py +0 -0
  97. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/bundle.py +0 -0
  98. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/chunks.py +0 -0
  99. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/cleaning.py +0 -0
  100. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/colmap_log.py +0 -0
  101. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/colour.py +0 -0
  102. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/confidence.py +0 -0
  103. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/crop.py +0 -0
  104. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/dem.py +0 -0
  105. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/dem_edit.py +0 -0
  106. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/dense.py +0 -0
  107. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/diagnostics.py +0 -0
  108. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/elevation.py +0 -0
  109. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/fieldcheck.py +0 -0
  110. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/isolate.py +0 -0
  111. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/learned.py +0 -0
  112. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/masks.py +0 -0
  113. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/meshing.py +0 -0
  114. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/nodes.py +0 -0
  115. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/normalmap.py +0 -0
  116. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/overviews.py +0 -0
  117. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/panorama.py +0 -0
  118. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/patches.py +0 -0
  119. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/precision.py +0 -0
  120. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/quality.py +0 -0
  121. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/region.py +0 -0
  122. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/satellite.py +0 -0
  123. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/sfm.py +0 -0
  124. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/tiepoints.py +0 -0
  125. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/tsdf.py +0 -0
  126. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/video.py +0 -0
  127. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/engine/visibility.py +0 -0
  128. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/__main__.py +0 -0
  129. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/batch_dialog.py +0 -0
  130. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/flow_layout.py +0 -0
  131. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/i18n.py +0 -0
  132. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/matches_dialog.py +0 -0
  133. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/multispectral_pane.py +0 -0
  134. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/nodes_dialog.py +0 -0
  135. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/plugins_dialog.py +0 -0
  136. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/resources/logo.svg +0 -0
  137. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/scene.py +0 -0
  138. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/start_page.py +0 -0
  139. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/theme.py +0 -0
  140. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/undo.py +0 -0
  141. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/update_dialog.py +0 -0
  142. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/gui/worker.py +0 -0
  143. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/__init__.py +0 -0
  144. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/metashape.py +0 -0
  145. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/photo3d.py +0 -0
  146. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/integrations/webodm.py +0 -0
  147. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/__init__.py +0 -0
  148. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/copc.py +0 -0
  149. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/exif.py +0 -0
  150. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/flythrough.py +0 -0
  151. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/i3s.py +0 -0
  152. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/mesh_ply.py +0 -0
  153. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/scans.py +0 -0
  154. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/io/web.py +0 -0
  155. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/__init__.py +0 -0
  156. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/refine.py +0 -0
  157. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/markers/targets.py +0 -0
  158. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/__init__.py +0 -0
  159. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/index.py +0 -0
  160. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/plugins/scaffold.py +0 -0
  161. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/__init__.py +0 -0
  162. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/bridge.py +0 -0
  163. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/config.py +0 -0
  164. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/database.py +0 -0
  165. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/demo_db.py +0 -0
  166. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/media.py +0 -0
  167. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/pyarchinit/pyarchinit5_schema.sql +0 -0
  168. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/testing/__init__.py +0 -0
  169. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/testing/synthetic.py +0 -0
  170. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry/updates.py +0 -0
  171. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/dependency_links.txt +0 -0
  172. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/entry_points.txt +0 -0
  173. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/src/pyarchinit_photogrammetry.egg-info/top_level.txt +0 -0
  174. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_alignment_modes.py +0 -0
  175. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_archaeo.py +0 -0
  176. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_batch.py +0 -0
  177. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_bim_ai.py +0 -0
  178. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_bundle.py +0 -0
  179. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_chunks.py +0 -0
  180. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_classify.py +0 -0
  181. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_colmap_log.py +0 -0
  182. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_colour.py +0 -0
  183. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_dem_edit.py +0 -0
  184. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_dem_fill.py +0 -0
  185. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_dem_spikes.py +0 -0
  186. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_depth_mesh.py +0 -0
  187. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_diagnostics.py +0 -0
  188. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_elevation.py +0 -0
  189. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_env.py +0 -0
  190. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_exports_web.py +0 -0
  191. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_fieldcheck.py +0 -0
  192. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_fisheye_panorama.py +0 -0
  193. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_geometry.py +0 -0
  194. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui.py +0 -0
  195. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_cleaning.py +0 -0
  196. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_layers.py +0 -0
  197. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_gui_patches.py +0 -0
  198. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_i18n.py +0 -0
  199. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_i3s.py +0 -0
  200. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_ifc_strat.py +0 -0
  201. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_isolate.py +0 -0
  202. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_learn.py +0 -0
  203. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_learned.py +0 -0
  204. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_marker_refine.py +0 -0
  205. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_markers.py +0 -0
  206. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_masks.py +0 -0
  207. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_measures.py +0 -0
  208. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_mesh_ply.py +0 -0
  209. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_meshing_fallback.py +0 -0
  210. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_multispectral.py +0 -0
  211. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_munsell.py +0 -0
  212. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_native.py +0 -0
  213. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_nodes.py +0 -0
  214. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_normalmap.py +0 -0
  215. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_overviews.py +0 -0
  216. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_paradata.py +0 -0
  217. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_patches.py +0 -0
  218. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_photos.py +0 -0
  219. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pipeline.py +0 -0
  220. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pottery_demo.py +0 -0
  221. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pottery_search.py +0 -0
  222. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_precision.py +0 -0
  223. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_probe.py +0 -0
  224. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_progress_dialog.py +0 -0
  225. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_proxies.py +0 -0
  226. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pyarchinit.py +0 -0
  227. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_pyarchinit_media.py +0 -0
  228. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_quality_video.py +0 -0
  229. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_raster_detail.py +0 -0
  230. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_reference_cameras.py +0 -0
  231. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_region.py +0 -0
  232. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_regressions.py +0 -0
  233. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_relief.py +0 -0
  234. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_satellite.py +0 -0
  235. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_scalebars.py +0 -0
  236. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_scans.py +0 -0
  237. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_sfm_global_check.py +0 -0
  238. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_stones.py +0 -0
  239. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_texture.py +0 -0
  240. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_thermal.py +0 -0
  241. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_tiepoints.py +0 -0
  242. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_timeline.py +0 -0
  243. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_tools_3d.py +0 -0
  244. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_undo.py +0 -0
  245. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_updates.py +0 -0
  246. {pyarchinit_photogrammetry-1.3.0 → pyarchinit_photogrammetry-1.3.2}/tests/test_us_proposal.py +0 -0
  247. {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.0
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.0"
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 = os.environ.get("PPG_LOG_DIR")
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.0"
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"}.get(meta["source"], meta["source"]))
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"):