pyarchinit-photogrammetry 1.2.1__tar.gz → 1.2.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 (225) hide show
  1. {pyarchinit_photogrammetry-1.2.1/src/pyarchinit_photogrammetry.egg-info → pyarchinit_photogrammetry-1.2.2}/PKG-INFO +1 -1
  2. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/pyproject.toml +1 -1
  3. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/__init__.py +1 -1
  4. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/multispectral.py +28 -1
  5. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/main_window.py +19 -0
  6. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/multispectral_pane.py +16 -0
  7. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/translations/en.json +2 -0
  8. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/qgis_link.py +15 -0
  9. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2/src/pyarchinit_photogrammetry.egg-info}/PKG-INFO +1 -1
  10. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_multispectral.py +12 -0
  11. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/LICENSE +0 -0
  12. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/README.md +0 -0
  13. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/setup.cfg +0 -0
  14. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/ppg_launcher.py +0 -0
  15. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/__main__.py +0 -0
  16. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/_env.py +0 -0
  17. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/_native.py +0 -0
  18. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/ai/__init__.py +0 -0
  19. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/ai/classify.py +0 -0
  20. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/ai/learn.py +0 -0
  21. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/ai/sam.py +0 -0
  22. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/ai/sam_env.py +0 -0
  23. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/ai/sam_worker.py +0 -0
  24. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/app.py +0 -0
  25. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/__init__.py +0 -0
  26. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/measures.py +0 -0
  27. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/munsell.py +0 -0
  28. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/pottery.py +0 -0
  29. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/proxies.py +0 -0
  30. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/relief.py +0 -0
  31. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/sections.py +0 -0
  32. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/stones.py +0 -0
  33. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/stratigraphy.py +0 -0
  34. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/terrain.py +0 -0
  35. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/timeline.py +0 -0
  36. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/archaeo/us_proposal.py +0 -0
  37. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/batch.py +0 -0
  38. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/bim/__init__.py +0 -0
  39. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/bim/ifc.py +0 -0
  40. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/cli.py +0 -0
  41. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/__init__.py +0 -0
  42. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/camera.py +0 -0
  43. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/chunk.py +0 -0
  44. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/crs.py +0 -0
  45. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/document.py +0 -0
  46. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/geometry.py +0 -0
  47. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/marker.py +0 -0
  48. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/paradata.py +0 -0
  49. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/pointcloud.py +0 -0
  50. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/progress.py +0 -0
  51. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/core/versions.py +0 -0
  52. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/demo.py +0 -0
  53. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/doctor.py +0 -0
  54. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/__init__.py +0 -0
  55. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/bundle.py +0 -0
  56. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/chunks.py +0 -0
  57. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/cleaning.py +0 -0
  58. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/colour.py +0 -0
  59. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/confidence.py +0 -0
  60. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/crop.py +0 -0
  61. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/dem.py +0 -0
  62. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/dem_edit.py +0 -0
  63. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/dense.py +0 -0
  64. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/diagnostics.py +0 -0
  65. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/elevation.py +0 -0
  66. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/fieldcheck.py +0 -0
  67. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/isolate.py +0 -0
  68. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/masks.py +0 -0
  69. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/meshing.py +0 -0
  70. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/nodes.py +0 -0
  71. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/normalmap.py +0 -0
  72. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/ortho.py +0 -0
  73. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/overviews.py +0 -0
  74. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/panorama.py +0 -0
  75. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/patches.py +0 -0
  76. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/precision.py +0 -0
  77. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/quality.py +0 -0
  78. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/region.py +0 -0
  79. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/satellite.py +0 -0
  80. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/sfm.py +0 -0
  81. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/texturing.py +0 -0
  82. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/tiepoints.py +0 -0
  83. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/tsdf.py +0 -0
  84. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/video.py +0 -0
  85. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/engine/visibility.py +0 -0
  86. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/__init__.py +0 -0
  87. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/__main__.py +0 -0
  88. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/batch_dialog.py +0 -0
  89. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/calibration_dialog.py +0 -0
  90. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/dialogs.py +0 -0
  91. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/flow_layout.py +0 -0
  92. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/i18n.py +0 -0
  93. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/icons.py +0 -0
  94. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/image_views.py +0 -0
  95. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/logging_setup.py +0 -0
  96. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/matches_dialog.py +0 -0
  97. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/model_view.py +0 -0
  98. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/nodes_dialog.py +0 -0
  99. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/panels.py +0 -0
  100. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/plugins_dialog.py +0 -0
  101. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/pottery_dialog.py +0 -0
  102. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/resources/logo.svg +0 -0
  103. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/scene.py +0 -0
  104. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/start_page.py +0 -0
  105. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/theme.py +0 -0
  106. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/timeline_dialog.py +0 -0
  107. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/undo.py +0 -0
  108. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/update_dialog.py +0 -0
  109. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/us_proposal_dialog.py +0 -0
  110. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/gui/worker.py +0 -0
  111. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/integrations/__init__.py +0 -0
  112. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/integrations/metashape.py +0 -0
  113. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/integrations/photo3d.py +0 -0
  114. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/integrations/webodm.py +0 -0
  115. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/__init__.py +0 -0
  116. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/copc.py +0 -0
  117. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/exif.py +0 -0
  118. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/exports.py +0 -0
  119. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/flythrough.py +0 -0
  120. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/gpkg.py +0 -0
  121. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/i3s.py +0 -0
  122. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/mesh_ply.py +0 -0
  123. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/qfield.py +0 -0
  124. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/report.py +0 -0
  125. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/scans.py +0 -0
  126. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/io/web.py +0 -0
  127. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/markers/__init__.py +0 -0
  128. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/markers/gcp.py +0 -0
  129. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/markers/refine.py +0 -0
  130. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/markers/targets.py +0 -0
  131. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/plugins/__init__.py +0 -0
  132. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/plugins/api.py +0 -0
  133. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/plugins/index.py +0 -0
  134. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/plugins/manager.py +0 -0
  135. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/plugins/scaffold.py +0 -0
  136. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/__init__.py +0 -0
  137. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/bridge.py +0 -0
  138. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/config.py +0 -0
  139. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/database.py +0 -0
  140. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/demo_db.py +0 -0
  141. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/media.py +0 -0
  142. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/pyarchinit/pyarchinit5_schema.sql +0 -0
  143. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/testing/__init__.py +0 -0
  144. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/testing/synthetic.py +0 -0
  145. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry/updates.py +0 -0
  146. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry.egg-info/SOURCES.txt +0 -0
  147. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry.egg-info/dependency_links.txt +0 -0
  148. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry.egg-info/entry_points.txt +0 -0
  149. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry.egg-info/requires.txt +0 -0
  150. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/src/pyarchinit_photogrammetry.egg-info/top_level.txt +0 -0
  151. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_alignment_modes.py +0 -0
  152. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_archaeo.py +0 -0
  153. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_batch.py +0 -0
  154. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_bim_ai.py +0 -0
  155. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_bundle.py +0 -0
  156. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_chunks.py +0 -0
  157. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_classify.py +0 -0
  158. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_cleaning.py +0 -0
  159. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_colour.py +0 -0
  160. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_dem_edit.py +0 -0
  161. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_dem_fill.py +0 -0
  162. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_dem_spikes.py +0 -0
  163. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_depth_mesh.py +0 -0
  164. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_diagnostics.py +0 -0
  165. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_elevation.py +0 -0
  166. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_env.py +0 -0
  167. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_exports_web.py +0 -0
  168. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_fieldcheck.py +0 -0
  169. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_fisheye_panorama.py +0 -0
  170. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_geometry.py +0 -0
  171. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_gui.py +0 -0
  172. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_gui_cleaning.py +0 -0
  173. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_gui_layers.py +0 -0
  174. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_gui_patches.py +0 -0
  175. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_gui_start.py +0 -0
  176. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_i18n.py +0 -0
  177. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_i3s.py +0 -0
  178. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_ifc_strat.py +0 -0
  179. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_integrations.py +0 -0
  180. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_isolate.py +0 -0
  181. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_learn.py +0 -0
  182. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_marker_refine.py +0 -0
  183. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_markers.py +0 -0
  184. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_masks.py +0 -0
  185. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_measures.py +0 -0
  186. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_mesh_ply.py +0 -0
  187. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_meshing_fallback.py +0 -0
  188. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_munsell.py +0 -0
  189. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_native.py +0 -0
  190. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_nodes.py +0 -0
  191. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_normalmap.py +0 -0
  192. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_ortho.py +0 -0
  193. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_overviews.py +0 -0
  194. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_packaging.py +0 -0
  195. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_paradata.py +0 -0
  196. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_patches.py +0 -0
  197. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_photos.py +0 -0
  198. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_pipeline.py +0 -0
  199. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_plugins.py +0 -0
  200. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_pottery_demo.py +0 -0
  201. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_pottery_search.py +0 -0
  202. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_precision.py +0 -0
  203. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_proxies.py +0 -0
  204. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_pyarchinit.py +0 -0
  205. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_pyarchinit_media.py +0 -0
  206. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_qfield.py +0 -0
  207. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_quality_video.py +0 -0
  208. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_raster_detail.py +0 -0
  209. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_reference_cameras.py +0 -0
  210. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_region.py +0 -0
  211. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_regressions.py +0 -0
  212. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_relief.py +0 -0
  213. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_satellite.py +0 -0
  214. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_scalebars.py +0 -0
  215. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_scans.py +0 -0
  216. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_sfm_global_check.py +0 -0
  217. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_stones.py +0 -0
  218. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_texture.py +0 -0
  219. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_tiepoints.py +0 -0
  220. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_timeline.py +0 -0
  221. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_tools_3d.py +0 -0
  222. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_undo.py +0 -0
  223. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_updates.py +0 -0
  224. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.2}/tests/test_us_proposal.py +0 -0
  225. {pyarchinit_photogrammetry-1.2.1 → pyarchinit_photogrammetry-1.2.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.2.1
3
+ Version: 1.2.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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyarchinit-photogrammetry"
7
- version = "1.2.1"
7
+ version = "1.2.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"
@@ -32,7 +32,7 @@ from .core import (ARCHAEO_CLASSES, ASPRS_CLASSES, Camera, Chunk, Document, Mark
32
32
  from .core.progress import Cancelled, Progress, print_progress
33
33
  from . import demo # noqa: E402 (ppg.demo.create_demo)
34
34
 
35
- __version__ = "1.2.1"
35
+ __version__ = "1.2.2"
36
36
 
37
37
  __all__ = ["app", "Document", "Chunk", "Camera", "Sensor", "Marker", "Projection", "Reference", "ScaleBar",
38
38
  "PointCloud", "ASPRS_CLASSES", "ARCHAEO_CLASSES", "Progress", "Cancelled", "print_progress", "__version__"]
@@ -607,8 +607,35 @@ def build_reflectance(chunk: Chunk, bands: list[str] | None = None, resolution:
607
607
 
608
608
 
609
609
  # ------------------------------------------------------------------------------ indices and zoning
610
+ def formula_bands(formula: str) -> set[str]:
611
+ """The band names a formula uses (``np`` and the numbers left out)."""
612
+ import ast
613
+
614
+ try:
615
+ tree = ast.parse(formula, mode="eval")
616
+ except SyntaxError as exc:
617
+ raise ValueError(f"formula {formula!r}: {exc.msg}") from None
618
+ return {n.id for n in ast.walk(tree) if isinstance(n, ast.Name) and n.id != "np"}
619
+
620
+
621
+ def missing_bands(formula: str, available) -> list[str]:
622
+ """The bands a formula needs that ``available`` has not got (sorted)."""
623
+ return sorted(formula_bands(formula) - set(available))
624
+
625
+
626
+ def available_indices(bands) -> list[str]:
627
+ """The indices of :data:`INDICES` whose bands are all among ``bands``."""
628
+ return [name for name, (formula, _) in INDICES.items() if not missing_bands(formula, bands)]
629
+
630
+
610
631
  def index_values(formula: str, bands: dict[str, np.ndarray]) -> np.ndarray:
611
- """``formula`` over the band arrays (names as in :data:`INDICES`); NaN where undefined."""
632
+ """``formula`` over the band arrays (names as in :data:`INDICES`); NaN where undefined. A
633
+ band the captures have not got (the thermal LWIR of a camera without it) is an error that
634
+ names it, not a crash."""
635
+ missing = missing_bands(formula, bands)
636
+ if missing:
637
+ raise ValueError(f"the formula needs the band(s) {', '.join(missing)}, which these captures have not got "
638
+ f"(bands: {', '.join(bands)})")
612
639
  names = {k: np.asarray(v, np.float32) for k, v in bands.items()}
613
640
  with np.errstate(divide="ignore", invalid="ignore"):
614
641
  out = eval(formula, {"__builtins__": {}, "np": np}, names) # noqa: S307 - our own formulas
@@ -1326,6 +1326,17 @@ class MainWindow(QMainWindow):
1326
1326
  return
1327
1327
  name = "".join(c for c in label.strip() if c.isalnum() or c in "_-") or "Indice"
1328
1328
  formula = formula or None
1329
+ used = formula or ms_mod.INDICES.get(name, ("", ""))[0]
1330
+ bands = self._ms_meta().get("reflectance_bands") or self._ms_meta().get("bands") or []
1331
+ try:
1332
+ missing = ms_mod.missing_bands(used, bands) if used else []
1333
+ except ValueError as exc:
1334
+ self._warn(tr("Formula non valida: {0}", exc))
1335
+ return
1336
+ if missing:
1337
+ self._warn(tr("L'indice {0} usa le bande {1}, che queste riprese non hanno (bande: {2}).", name,
1338
+ ", ".join(missing), ", ".join(bands)))
1339
+ return
1329
1340
  self.run_task(tr("Indice {0}", name), lambda p: ms_mod.index_raster(self.chunk, name, formula),
1330
1341
  lambda path: self.ms_show("index", name))
1331
1342
 
@@ -6405,6 +6416,14 @@ class MainWindow(QMainWindow):
6405
6416
  extra_vectors.append({"name": f"Zone {zname}", "path": z["file"], "table": "zone",
6406
6417
  "geometry": "POLYGON", "color": "#1a9850", "label": "classe"})
6407
6418
 
6419
+ for provider in getattr(self, "qgis_providers", []): # plugins: their rasters and GeoPackage layers
6420
+ try:
6421
+ more_rasters, more_vectors = provider()
6422
+ rasters += list(more_rasters or [])
6423
+ extra_vectors += list(more_vectors or [])
6424
+ except Exception as exc: # noqa: BLE001 - a plugin must not stop the export
6425
+ log.warning("QGIS: layer di un plugin saltati: %s", exc)
6426
+
6408
6427
  def job(p):
6409
6428
  p(0.2, "Creazione del progetto QGIS")
6410
6429
  rep = qgis_link.build_project(project, ch.crs if ch else "", files, rasters, title=name, qgis=q,
@@ -122,6 +122,21 @@ class MultispectralPane(QWidget):
122
122
  def _show_reflectance(self) -> None:
123
123
  self.show_requested.emit("reflectance", FALSE_COLOUR if self.c_show.currentData() == "false" else TRUE_COLOUR)
124
124
 
125
+ def _offer_indices(self, bands) -> None:
126
+ """Only the indices the bands allow (no Thermal without a LWIR band), the choice kept."""
127
+ from ..engine.multispectral import available_indices
128
+
129
+ current = self.c_index.currentData()
130
+ wanted = available_indices(bands) if bands else list(INDICES)
131
+ self.c_index.blockSignals(True)
132
+ self.c_index.clear()
133
+ for name in wanted:
134
+ self.c_index.addItem(f"{name}: {INDICES[name][1]}", name)
135
+ self.c_index.addItem(tr("Formula propria..."), "formula")
136
+ k = self.c_index.findData(current)
137
+ self.c_index.setCurrentIndex(k if k >= 0 else 0)
138
+ self.c_index.blockSignals(False)
139
+
125
140
  # --------------------------------------------------------------- state
126
141
  def set_state(self, chunk) -> None:
127
142
  """What every step has: read from the chunk (captures, alignment, DEM, panel, the
@@ -164,6 +179,7 @@ class MultispectralPane(QWidget):
164
179
  self.states["reflectance"].setText(tr("Da fare dopo il DEM: un GeoTIFF a virgola mobile con una banda per banda."))
165
180
  self.b_index.setEnabled(has_refl)
166
181
  self.c_index.setEnabled(has_refl)
182
+ self._offer_indices(ms.get("reflectance_bands") or ms.get("bands") or [])
167
183
  if indices:
168
184
  self.states["index"].setText(tr("Calcolati: {0}", ", ".join(sorted(indices))))
169
185
  else:
@@ -2117,6 +2117,7 @@
2117
2117
  "File non valido: {0}": "Invalid file: {0}",
2118
2118
  "File scritti in {0}:\n": "Files written in {0}:\n",
2119
2119
  "Filtra le foto di {0}": "Filter the photos of {0}",
2120
+ "Formula non valida: {0}": "Invalid formula: {0}",
2120
2121
  "Formula sui nomi delle bande ({0}):": "Formula over the band names ({0}):",
2121
2122
  "Foto del punto X {0:.2f} Y {1:.2f} Z {2:.2f}": "Photos of the point X {0:.2f} Y {1:.2f} Z {2:.2f}",
2122
2123
  "Foto del punto X {0} Y {1} Z {2}": "Photos of the point X {0} Y {1} Z {2}",
@@ -2141,6 +2142,7 @@
2141
2142
  "Impossibile leggere {0}": "Cannot read {0}",
2142
2143
  "Indice {0}": "Index {0}",
2143
2144
  "Installazione Python: aggiorna con <code>{0}</code> (o con uv).": "Python installation: update with <code>{0}</code> (or with uv).",
2145
+ "L'indice {0} usa le bande {1}, che queste riprese non hanno (bande: {2}).": "The index {0} uses the bands {1}, which these captures have not got (bands: {2}).",
2144
2146
  "L'ortofoto ({0:.0f} m di lato, pixel di {1:.1f} cm) viene esaminata a tasselli di 1024 pixel che si sovrappongono: alla risoluzione proposta sono circa {2} tasselli. Con la GPU del Mac (MPS) un tassello richiede circa 10 s in scansione normale, 40-90 s in alta o massima. Le unita' trovate vanno nel layer «Unita' da SAM», senza numero di US.": "The orthophoto ({0:.0f} m per side, {1:.1f} cm pixels) is examined in overlapping tiles of 1024 pixels: at the proposed resolution they are about {2} tiles. With the Mac GPU (MPS) a tile takes about 10 s at normal thoroughness, 40-90 s at high or maximum. The units found go into the layer «Units from SAM», without a US number.",
2145
2147
  "L'ortofoto ({0} m di lato, pixel di {1} cm) viene esaminata a tasselli di 1024 pixel che si sovrappongono: alla risoluzione proposta sono circa {2} tasselli. Con la GPU del Mac (MPS) un tassello richiede circa 10 s in scansione normale, 40-90 s in alta o massima. Le unita' trovate vanno nel layer «Unita' da SAM», senza numero di US.": "The orthophoto ({0} m per side, {1} cm pixels) is examined in overlapping tiles of 1024 pixels: at the proposed resolution they are about {2} tiles. With the Mac GPU (MPS) a tile takes about 10 s at normal thoroughness, 40-90 s at high or maximum. The units found go into the layer «Units from SAM», without a US number.",
2146
2148
  "La scala del rilievo e' cambiata del {0:+.3f} %: {1} sono ancora nella scala di prima, ricostruiscili (Flusso di lavoro).": "The scale of the survey changed by {0:+.3f} %: {1} are still at the previous scale, rebuild them (Workflow).",
@@ -331,6 +331,21 @@ for r in cfg["rasters"]:
331
331
  lyr.setRenderer(index_renderer(lyr, float(lo), float(hi)))
332
332
  elif r.get("ramp") == "zones" and lyr.isValid():
333
333
  lyr.setRenderer(zones_renderer(lyr, int(r.get("classes") or 3)))
334
+ elif r.get("ramp") in ("grey", "grey_inverted", "diverging") and lyr.isValid(): # a geophysical grid
335
+ lo, hi = r.get("limits") or lyr.dataProvider().cumulativeCut(1, 0.02, 0.98)
336
+ lo, hi = float(lo), float(hi)
337
+ if r["ramp"] == "diverging":
338
+ stops = [(0.0, "#2166ac"), (0.5, "#f7f7f7"), (1.0, "#b2182b")]
339
+ elif r["ramp"] == "grey_inverted":
340
+ stops = [(0.0, "#ffffff"), (1.0, "#000000")]
341
+ else:
342
+ stops = [(0.0, "#000000"), (1.0, "#ffffff")]
343
+ ramp = QgsColorRampShader(lo, hi, None, QgsColorRampShader.Interpolated)
344
+ ramp.setColorRampItemList([QgsColorRampShader.ColorRampItem(lo + t * (hi - lo), QColor(c), f"{lo + t * (hi - lo):.3g}")
345
+ for t, c in stops])
346
+ shader = QgsRasterShader()
347
+ shader.setRasterShaderFunction(ramp)
348
+ lyr.setRenderer(QgsSingleBandPseudoColorRenderer(lyr.dataProvider(), int(r.get("band") or 1), shader))
334
349
  if r.get("opacity") is not None:
335
350
  lyr.setOpacity(float(r["opacity"]))
336
351
  proj.addMapLayer(lyr, False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyarchinit-photogrammetry
3
- Version: 1.2.1
3
+ Version: 1.2.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
@@ -338,3 +338,15 @@ def test_pane_tree_and_views_show_the_products(scene_dir, tmp_path, monkeypatch)
338
338
  finally:
339
339
  w_.setWindowModified(False)
340
340
  w_.close()
341
+
342
+
343
+ def test_an_index_without_its_band_is_refused_with_its_name():
344
+ """Thermal needs LWIR: without it the error names the band (a crash in 1.2.1)."""
345
+ bands = {"Red": np.ones((2, 2), np.float32), "NIR": np.ones((2, 2), np.float32)}
346
+ assert ms.available_indices(bands) == [n for n in ms.INDICES if n not in ("NDRE", "GNDVI", "NDWI", "CIRE", "Thermal")]
347
+ assert ms.missing_bands(ms.INDICES["Thermal"][0], bands) == ["LWIR"]
348
+ with pytest.raises(ValueError, match="LWIR"):
349
+ ms.index_values("LWIR", bands)
350
+ with pytest.raises(ValueError, match="formula"):
351
+ ms.index_values("NIR +", bands)
352
+ assert ms.index_values("(NIR - Red) / (NIR + Red)", bands).shape == (2, 2)