al-dic-3d 1.0.0__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 (254) hide show
  1. al_dic_3d-1.0.0/.github/workflows/ci.yml +73 -0
  2. al_dic_3d-1.0.0/.github/workflows/publish.yml +113 -0
  3. al_dic_3d-1.0.0/.gitignore +55 -0
  4. al_dic_3d-1.0.0/CITATION.cff +74 -0
  5. al_dic_3d-1.0.0/LICENSE +29 -0
  6. al_dic_3d-1.0.0/PKG-INFO +395 -0
  7. al_dic_3d-1.0.0/README.md +352 -0
  8. al_dic_3d-1.0.0/docs/COORDINATES.md +97 -0
  9. al_dic_3d-1.0.0/docs/DEPENDS_ON_2D.md +102 -0
  10. al_dic_3d-1.0.0/docs/RELEASING.md +178 -0
  11. al_dic_3d-1.0.0/docs/architecture/00_INDEX.md +400 -0
  12. al_dic_3d-1.0.0/docs/architecture/01_technical_baseline.md +340 -0
  13. al_dic_3d-1.0.0/docs/architecture/02_correspondence_strategies.md +289 -0
  14. al_dic_3d-1.0.0/docs/architecture/03_opus_phase_prompts.md +104 -0
  15. al_dic_3d-1.0.0/docs/strain3d_math.md +158 -0
  16. al_dic_3d-1.0.0/docs/user-guide/01-overview.md +99 -0
  17. al_dic_3d-1.0.0/docs/user-guide/02-installation-launching.md +123 -0
  18. al_dic_3d-1.0.0/docs/user-guide/03-loading-images.md +70 -0
  19. al_dic_3d-1.0.0/docs/user-guide/04-calibration.md +155 -0
  20. al_dic_3d-1.0.0/docs/user-guide/05-workflow-type.md +103 -0
  21. al_dic_3d-1.0.0/docs/user-guide/06-initial-guess.md +77 -0
  22. al_dic_3d-1.0.0/docs/user-guide/07-region-of-interest.md +92 -0
  23. al_dic_3d-1.0.0/docs/user-guide/08-parameters.md +89 -0
  24. al_dic_3d-1.0.0/docs/user-guide/09-running.md +76 -0
  25. al_dic_3d-1.0.0/docs/user-guide/10-viewing-results.md +81 -0
  26. al_dic_3d-1.0.0/docs/user-guide/11-strain-processing.md +113 -0
  27. al_dic_3d-1.0.0/docs/user-guide/12-export.md +190 -0
  28. al_dic_3d-1.0.0/docs/user-guide/13-session.md +107 -0
  29. al_dic_3d-1.0.0/docs/user-guide/14-troubleshooting.md +118 -0
  30. al_dic_3d-1.0.0/docs/user-guide/index.md +58 -0
  31. al_dic_3d-1.0.0/pyproject.toml +149 -0
  32. al_dic_3d-1.0.0/src/al_dic_3d/__init__.py +22 -0
  33. al_dic_3d-1.0.0/src/al_dic_3d/__main__.py +10 -0
  34. al_dic_3d-1.0.0/src/al_dic_3d/calibration/__init__.py +99 -0
  35. al_dic_3d-1.0.0/src/al_dic_3d/calibration/boards.py +301 -0
  36. al_dic_3d-1.0.0/src/al_dic_3d/calibration/bundle.py +336 -0
  37. al_dic_3d-1.0.0/src/al_dic_3d/calibration/detect.py +571 -0
  38. al_dic_3d-1.0.0/src/al_dic_3d/calibration/geometry.py +95 -0
  39. al_dic_3d-1.0.0/src/al_dic_3d/calibration/importers.py +404 -0
  40. al_dic_3d-1.0.0/src/al_dic_3d/calibration/model.py +93 -0
  41. al_dic_3d-1.0.0/src/al_dic_3d/calibration/printout.py +108 -0
  42. al_dic_3d-1.0.0/src/al_dic_3d/calibration/report.py +243 -0
  43. al_dic_3d-1.0.0/src/al_dic_3d/calibration/solve.py +484 -0
  44. al_dic_3d-1.0.0/src/al_dic_3d/calibration/verify.py +212 -0
  45. al_dic_3d-1.0.0/src/al_dic_3d/cli.py +393 -0
  46. al_dic_3d-1.0.0/src/al_dic_3d/export/__init__.py +91 -0
  47. al_dic_3d-1.0.0/src/al_dic_3d/export/animation.py +260 -0
  48. al_dic_3d-1.0.0/src/al_dic_3d/export/colorbar.py +255 -0
  49. al_dic_3d-1.0.0/src/al_dic_3d/export/params.py +84 -0
  50. al_dic_3d-1.0.0/src/al_dic_3d/export/ply.py +135 -0
  51. al_dic_3d-1.0.0/src/al_dic_3d/export/render.py +435 -0
  52. al_dic_3d-1.0.0/src/al_dic_3d/export/render3d.py +398 -0
  53. al_dic_3d-1.0.0/src/al_dic_3d/export/tables.py +156 -0
  54. al_dic_3d-1.0.0/src/al_dic_3d/export/utils.py +49 -0
  55. al_dic_3d-1.0.0/src/al_dic_3d/export/vtu.py +114 -0
  56. al_dic_3d-1.0.0/src/al_dic_3d/gui/__init__.py +18 -0
  57. al_dic_3d-1.0.0/src/al_dic_3d/gui/app.py +104 -0
  58. al_dic_3d-1.0.0/src/al_dic_3d/gui/controller.py +129 -0
  59. al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/__init__.py +5 -0
  60. al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/roi_controller.py +165 -0
  61. al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/strain_controller.py +191 -0
  62. al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/viz_controller.py +135 -0
  63. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/__init__.py +1 -0
  64. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/about_dialog.py +109 -0
  65. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/calibration_dialog.py +750 -0
  66. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/calibration_support.py +266 -0
  67. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_dialog.py +342 -0
  68. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/__init__.py +32 -0
  69. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/animation_tab.py +186 -0
  70. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/common.py +464 -0
  71. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/data_tab.py +213 -0
  72. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/images_tab.py +191 -0
  73. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/preview_tab.py +433 -0
  74. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/view3d_tab.py +225 -0
  75. al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/manual_params_dialog.py +168 -0
  76. al_dic_3d-1.0.0/src/al_dic_3d/gui/display_units.py +81 -0
  77. al_dic_3d-1.0.0/src/al_dic_3d/gui/fft_activity.py +37 -0
  78. al_dic_3d-1.0.0/src/al_dic_3d/gui/file_association.py +96 -0
  79. al_dic_3d-1.0.0/src/al_dic_3d/gui/issue_text.py +56 -0
  80. al_dic_3d-1.0.0/src/al_dic_3d/gui/main_window.py +735 -0
  81. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/__init__.py +5 -0
  82. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/canvas_area.py +792 -0
  83. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/canvas_tools.py +263 -0
  84. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/left_sidebar.py +796 -0
  85. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/mesh_preview.py +167 -0
  86. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/right_sidebar.py +777 -0
  87. al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/sidebar_images.py +25 -0
  88. al_dic_3d-1.0.0/src/al_dic_3d/gui/persistence.py +92 -0
  89. al_dic_3d-1.0.0/src/al_dic_3d/gui/run_worker.py +64 -0
  90. al_dic_3d-1.0.0/src/al_dic_3d/gui/state.py +86 -0
  91. al_dic_3d-1.0.0/src/al_dic_3d/gui/strain_render.py +93 -0
  92. al_dic_3d-1.0.0/src/al_dic_3d/gui/strain_window.py +800 -0
  93. al_dic_3d-1.0.0/src/al_dic_3d/gui/view_state.py +131 -0
  94. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/__init__.py +9 -0
  95. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/advanced_section.py +95 -0
  96. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/calibration_section.py +181 -0
  97. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/camera_drop_zone.py +129 -0
  98. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/config_overlay.py +96 -0
  99. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/console_log3d.py +52 -0
  100. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/field_selector.py +123 -0
  101. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/frame_navigator.py +141 -0
  102. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/frame_prefetcher.py +98 -0
  103. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/image_view.py +751 -0
  104. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/image_view_brush.py +121 -0
  105. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/info_icon.py +44 -0
  106. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/init_guess_section.py +231 -0
  107. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/mesh_appearance.py +77 -0
  108. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/mesh_overlay.py +223 -0
  109. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/next_step_hint.py +54 -0
  110. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/pair_list.py +79 -0
  111. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/ref_update_section.py +166 -0
  112. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/roi_toolbar.py +293 -0
  113. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/section_header.py +42 -0
  114. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_field_selector.py +109 -0
  115. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_navigator.py +165 -0
  116. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_param_panel.py +429 -0
  117. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_support.py +133 -0
  118. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_viz_panel.py +95 -0
  119. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/units_section.py +83 -0
  120. al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/view3d.py +244 -0
  121. al_dic_3d-1.0.0/src/al_dic_3d/gui/workers.py +153 -0
  122. al_dic_3d-1.0.0/src/al_dic_3d/i18n/__init__.py +62 -0
  123. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_de.qm +0 -0
  124. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_es.qm +0 -0
  125. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_fr.qm +0 -0
  126. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_ja.qm +0 -0
  127. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_ko.qm +0 -0
  128. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_zh_CN.qm +0 -0
  129. al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_zh_TW.qm +0 -0
  130. al_dic_3d-1.0.0/src/al_dic_3d/i18n/scan.py +136 -0
  131. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_de.ts +3650 -0
  132. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_es.ts +3659 -0
  133. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_fr.ts +3656 -0
  134. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_ja.ts +3633 -0
  135. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_ko.ts +3634 -0
  136. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_zh_CN.ts +3627 -0
  137. al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_zh_TW.ts +3627 -0
  138. al_dic_3d-1.0.0/src/al_dic_3d/matching/__init__.py +44 -0
  139. al_dic_3d-1.0.0/src/al_dic_3d/matching/contracts.py +142 -0
  140. al_dic_3d-1.0.0/src/al_dic_3d/matching/crack_mesh.py +57 -0
  141. al_dic_3d-1.0.0/src/al_dic_3d/matching/diagnostics.py +227 -0
  142. al_dic_3d-1.0.0/src/al_dic_3d/matching/primitives.py +311 -0
  143. al_dic_3d-1.0.0/src/al_dic_3d/matching/quality.py +42 -0
  144. al_dic_3d-1.0.0/src/al_dic_3d/matching/seed.py +147 -0
  145. al_dic_3d-1.0.0/src/al_dic_3d/matching/seed_propagation.py +392 -0
  146. al_dic_3d-1.0.0/src/al_dic_3d/matching/stereo.py +157 -0
  147. al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/__init__.py +14 -0
  148. al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/_common.py +265 -0
  149. al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/ref_direct.py +247 -0
  150. al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/stereo_each_frame.py +251 -0
  151. al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/track_both.py +498 -0
  152. al_dic_3d-1.0.0/src/al_dic_3d/matching/strategy.py +83 -0
  153. al_dic_3d-1.0.0/src/al_dic_3d/matching/temporal.py +559 -0
  154. al_dic_3d-1.0.0/src/al_dic_3d/memcheck.py +147 -0
  155. al_dic_3d-1.0.0/src/al_dic_3d/pathsafe.py +145 -0
  156. al_dic_3d-1.0.0/src/al_dic_3d/project/__init__.py +40 -0
  157. al_dic_3d-1.0.0/src/al_dic_3d/project/draft.py +295 -0
  158. al_dic_3d-1.0.0/src/al_dic_3d/project/relocate.py +195 -0
  159. al_dic_3d-1.0.0/src/al_dic_3d/project/session.py +371 -0
  160. al_dic_3d-1.0.0/src/al_dic_3d/project/state.py +50 -0
  161. al_dic_3d-1.0.0/src/al_dic_3d/py.typed +0 -0
  162. al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/__init__.py +24 -0
  163. al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/outliers.py +105 -0
  164. al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/reconstruction.py +108 -0
  165. al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/triangulate.py +96 -0
  166. al_dic_3d-1.0.0/src/al_dic_3d/runner.py +801 -0
  167. al_dic_3d-1.0.0/src/al_dic_3d/sequence/__init__.py +27 -0
  168. al_dic_3d-1.0.0/src/al_dic_3d/sequence/lazy.py +135 -0
  169. al_dic_3d-1.0.0/src/al_dic_3d/sequence/model.py +161 -0
  170. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/__init__.py +35 -0
  171. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/compute.py +217 -0
  172. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/crack.py +80 -0
  173. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/edgetrim.py +160 -0
  174. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/gradients.py +518 -0
  175. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/kernels.py +340 -0
  176. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/model.py +72 -0
  177. al_dic_3d-1.0.0/src/al_dic_3d/strain3d/specimen.py +58 -0
  178. al_dic_3d-1.0.0/src/al_dic_3d/viz3d/__init__.py +37 -0
  179. al_dic_3d-1.0.0/src/al_dic_3d/viz3d/fieldmap.py +429 -0
  180. al_dic_3d-1.0.0/src/al_dic_3d/viz3d/lru.py +48 -0
  181. al_dic_3d-1.0.0/src/al_dic_3d/viz3d/maskwarp.py +100 -0
  182. al_dic_3d-1.0.0/src/al_dic_3d/viz3d/surface.py +347 -0
  183. al_dic_3d-1.0.0/tests/__init__.py +0 -0
  184. al_dic_3d-1.0.0/tests/conftest.py +114 -0
  185. al_dic_3d-1.0.0/tests/synth_calib.py +164 -0
  186. al_dic_3d-1.0.0/tests/synth_parity.py +310 -0
  187. al_dic_3d-1.0.0/tests/synth_stereo.py +158 -0
  188. al_dic_3d-1.0.0/tests/synth_surface.py +241 -0
  189. al_dic_3d-1.0.0/tests/test_alien_paths.py +259 -0
  190. al_dic_3d-1.0.0/tests/test_architecture.py +151 -0
  191. al_dic_3d-1.0.0/tests/test_audit_fixes_compute.py +199 -0
  192. al_dic_3d-1.0.0/tests/test_audit_gui_honesty.py +206 -0
  193. al_dic_3d-1.0.0/tests/test_batch_q_core.py +486 -0
  194. al_dic_3d-1.0.0/tests/test_batch_q_gui.py +388 -0
  195. al_dic_3d-1.0.0/tests/test_calib_boards.py +96 -0
  196. al_dic_3d-1.0.0/tests/test_calib_dialogs.py +232 -0
  197. al_dic_3d-1.0.0/tests/test_calib_enhancements.py +302 -0
  198. al_dic_3d-1.0.0/tests/test_calib_realworld_hardening.py +155 -0
  199. al_dic_3d-1.0.0/tests/test_calibration_gate.py +260 -0
  200. al_dic_3d-1.0.0/tests/test_calibration_importers.py +443 -0
  201. al_dic_3d-1.0.0/tests/test_cli.py +64 -0
  202. al_dic_3d-1.0.0/tests/test_cli_calibrate.py +130 -0
  203. al_dic_3d-1.0.0/tests/test_controller.py +65 -0
  204. al_dic_3d-1.0.0/tests/test_crack_batch_c.py +472 -0
  205. al_dic_3d-1.0.0/tests/test_crack_composition.py +79 -0
  206. al_dic_3d-1.0.0/tests/test_crack_render.py +87 -0
  207. al_dic_3d-1.0.0/tests/test_crack_wysiwyg.py +294 -0
  208. al_dic_3d-1.0.0/tests/test_diagnostics.py +144 -0
  209. al_dic_3d-1.0.0/tests/test_draft.py +90 -0
  210. al_dic_3d-1.0.0/tests/test_export_geometry.py +270 -0
  211. al_dic_3d-1.0.0/tests/test_export_render.py +762 -0
  212. al_dic_3d-1.0.0/tests/test_export_tables.py +107 -0
  213. al_dic_3d-1.0.0/tests/test_geometry_roundtrip.py +118 -0
  214. al_dic_3d-1.0.0/tests/test_gui_safety.py +376 -0
  215. al_dic_3d-1.0.0/tests/test_gui_smoke.py +476 -0
  216. al_dic_3d-1.0.0/tests/test_i18n.py +75 -0
  217. al_dic_3d-1.0.0/tests/test_incremental_mode.py +72 -0
  218. al_dic_3d-1.0.0/tests/test_init_guess.py +256 -0
  219. al_dic_3d-1.0.0/tests/test_lazy_provider.py +168 -0
  220. al_dic_3d-1.0.0/tests/test_matching_contracts.py +109 -0
  221. al_dic_3d-1.0.0/tests/test_memcheck.py +89 -0
  222. al_dic_3d-1.0.0/tests/test_parity_gate.py +57 -0
  223. al_dic_3d-1.0.0/tests/test_pathsafe.py +174 -0
  224. al_dic_3d-1.0.0/tests/test_perf_batch_p2.py +546 -0
  225. al_dic_3d-1.0.0/tests/test_perf_batch_p3.py +591 -0
  226. al_dic_3d-1.0.0/tests/test_primitives.py +128 -0
  227. al_dic_3d-1.0.0/tests/test_quality_gate.py +100 -0
  228. al_dic_3d-1.0.0/tests/test_reconstruction.py +105 -0
  229. al_dic_3d-1.0.0/tests/test_ref_direct.py +64 -0
  230. al_dic_3d-1.0.0/tests/test_relocate.py +192 -0
  231. al_dic_3d-1.0.0/tests/test_robustness_r1.py +254 -0
  232. al_dic_3d-1.0.0/tests/test_roi_controller.py +108 -0
  233. al_dic_3d-1.0.0/tests/test_runner.py +365 -0
  234. al_dic_3d-1.0.0/tests/test_seed_propagation.py +399 -0
  235. al_dic_3d-1.0.0/tests/test_sequence.py +88 -0
  236. al_dic_3d-1.0.0/tests/test_session.py +183 -0
  237. al_dic_3d-1.0.0/tests/test_session_fidelity.py +410 -0
  238. al_dic_3d-1.0.0/tests/test_session_fidelity_gui.py +322 -0
  239. al_dic_3d-1.0.0/tests/test_smoke_import.py +39 -0
  240. al_dic_3d-1.0.0/tests/test_stereo_each_frame.py +67 -0
  241. al_dic_3d-1.0.0/tests/test_stereo_match.py +93 -0
  242. al_dic_3d-1.0.0/tests/test_strain3d.py +137 -0
  243. al_dic_3d-1.0.0/tests/test_strain3d_kernel.py +177 -0
  244. al_dic_3d-1.0.0/tests/test_strain_window.py +294 -0
  245. al_dic_3d-1.0.0/tests/test_synth_surface.py +55 -0
  246. al_dic_3d-1.0.0/tests/test_temporal_honesty.py +176 -0
  247. al_dic_3d-1.0.0/tests/test_temporal_track.py +163 -0
  248. al_dic_3d-1.0.0/tests/test_track_both_e2e.py +219 -0
  249. al_dic_3d-1.0.0/tests/test_ux_batch_g2.py +385 -0
  250. al_dic_3d-1.0.0/tests/test_ux_batch_g3.py +577 -0
  251. al_dic_3d-1.0.0/tests/test_view3d.py +197 -0
  252. al_dic_3d-1.0.0/tests/test_view3d_degradation.py +96 -0
  253. al_dic_3d-1.0.0/tests/test_viz_dense.py +231 -0
  254. al_dic_3d-1.0.0/tests/test_znssd_chunk.py +45 -0
@@ -0,0 +1,73 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ name: test (${{ matrix.os }}, py${{ matrix.python-version }})
12
+ runs-on: ${{ matrix.os }}
13
+ timeout-minutes: 45
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ # Alien-environment matrix (G3): every desktop OS x the endpoints of
18
+ # the classified Python range (01 §G: 3.10-3.12; 3.11 sits between the
19
+ # endpoints and adds no distinct wheel/ABI surface worth a 7th job).
20
+ os: [ubuntu-latest, windows-latest, macos-latest]
21
+ python-version: ["3.10", "3.12"]
22
+
23
+ env:
24
+ # Headless Qt everywhere — the exact mode the GUI tests use locally.
25
+ # pyvista/[viz3d] is NOT installed in CI: 3D-view tests skip via
26
+ # importorskip, and View3D's no-GL degradation path is covered by
27
+ # tests/test_view3d_degradation.py without any OpenGL context.
28
+ QT_QPA_PLATFORM: offscreen
29
+
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+
33
+ - name: Set up Python ${{ matrix.python-version }}
34
+ uses: actions/setup-python@v5
35
+ with:
36
+ python-version: ${{ matrix.python-version }}
37
+ cache: pip
38
+
39
+ - name: Install Qt runtime libraries (Linux)
40
+ # PySide6 wheels bundle Qt but dlopen these system libraries even on
41
+ # the offscreen platform. fonts-dejavu-core + QT_QPA_FONTDIR gives the
42
+ # offscreen renderer real glyphs (mirrors the tests' Windows FONTDIR).
43
+ if: runner.os == 'Linux'
44
+ run: |
45
+ sudo apt-get update
46
+ sudo apt-get install -y \
47
+ libegl1 libgl1 libopengl0 libxkbcommon0 libxkbcommon-x11-0 \
48
+ libdbus-1-3 libglib2.0-0 libfontconfig1 libxrender1 \
49
+ fonts-dejavu-core
50
+ echo "QT_QPA_FONTDIR=/usr/share/fonts/truetype/dejavu" >> "$GITHUB_ENV"
51
+
52
+ - name: Install dependencies
53
+ # `al-dic==0.7.*` resolves from PyPI (published); the sibling 2D repo
54
+ # is never touched in CI. [dev] brings pytest/ruff/PySide6/matplotlib.
55
+ run: |
56
+ python -m pip install --upgrade pip
57
+ pip install -e ".[dev]"
58
+
59
+ # Lint/format are NOT run here: this mirrors the 2D repo's pytest-only CI.
60
+ # Style is enforced by the pinned pre-commit hooks (.pre-commit-config.yaml),
61
+ # so a new ruff release cannot red an otherwise-unchanged build.
62
+
63
+ - name: Gate — import al_dic_3d
64
+ run: python -c "import al_dic_3d; print('al_dic_3d', al_dic_3d.__version__)"
65
+
66
+ - name: Gate — al-dic-3d --help
67
+ run: al-dic-3d --help
68
+
69
+ - name: Gate — test suite
70
+ # -m "not perf": throughput tests are excluded (runner CPU varies).
71
+ # Dataset-bound tests (MATLAB reference repo, real examples) skip
72
+ # themselves when the local data is absent — CI runs synthetic-only.
73
+ run: pytest --tb=short -q -m "not perf"
@@ -0,0 +1,113 @@
1
+ name: Publish to PyPI
2
+
3
+ # Publishes when a version tag is pushed. Uses PyPI Trusted Publishing
4
+ # (OpenID Connect), so there is no API token to paste, store or rotate:
5
+ # PyPI verifies the workflow's short-lived identity instead.
6
+ #
7
+ # One-time setup on PyPI (Your projects -> al-dic-3d -> Publishing, or a
8
+ # *pending* publisher before the first release — see docs/RELEASING.md):
9
+ # Owner zachtong
10
+ # Repository pyALDIC-3D
11
+ # Workflow publish.yml
12
+ # Environment pypi
13
+ #
14
+ # Release flow after that:
15
+ # git tag -a v1.0.0 -m "..." && git push origin v1.0.0
16
+ # -> this builds, checks and publishes, then attaches the artifacts
17
+ # to the GitHub Release for that tag.
18
+
19
+ on:
20
+ push:
21
+ tags: ["v*"]
22
+ workflow_dispatch: # manual re-run, e.g. after a failed publish
23
+
24
+ permissions:
25
+ contents: read
26
+
27
+ jobs:
28
+ build:
29
+ name: Build distributions
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@v4
33
+
34
+ - name: Set up Python
35
+ uses: actions/setup-python@v5
36
+ with:
37
+ python-version: "3.11"
38
+
39
+ - name: Build wheel and sdist
40
+ run: |
41
+ python -m pip install --upgrade pip build twine
42
+ python -m build
43
+
44
+ - name: Check metadata
45
+ run: python -m twine check dist/*
46
+
47
+ - name: Verify the tag matches the package version
48
+ if: startsWith(github.ref, 'refs/tags/')
49
+ # The version is hatchling-dynamic: pyproject.toml has no
50
+ # [project].version — the single source of truth is __version__ in
51
+ # src/al_dic_3d/__init__.py, so read it from there.
52
+ run: |
53
+ TAG="${GITHUB_REF_NAME#v}"
54
+ PKG=$(python -c "import re,pathlib;print(re.search(r'__version__\s*=\s*\"([^\"]+)\"', pathlib.Path('src/al_dic_3d/__init__.py').read_text()).group(1))")
55
+ echo "tag=$TAG __init__.py=$PKG"
56
+ if [ "$TAG" != "$PKG" ]; then
57
+ echo "::error::Tag v$TAG does not match package version $PKG"
58
+ exit 1
59
+ fi
60
+
61
+ - uses: actions/upload-artifact@v4
62
+ with:
63
+ name: dist
64
+ path: dist/
65
+
66
+ publish:
67
+ name: Publish to PyPI
68
+ needs: build
69
+ runs-on: ubuntu-latest
70
+ environment: pypi # gate releases behind an environment rule if wanted
71
+ permissions:
72
+ id-token: write # required for Trusted Publishing
73
+ steps:
74
+ - uses: actions/download-artifact@v4
75
+ with:
76
+ name: dist
77
+ path: dist/
78
+
79
+ - name: Publish
80
+ uses: pypa/gh-action-pypi-publish@release/v1
81
+ # No password / token: the action exchanges GitHub's OIDC identity
82
+ # for a short-lived PyPI credential.
83
+ with:
84
+ # A version already on PyPI is skipped rather than failing the run,
85
+ # so re-running after a partial publish is safe -- and a manual
86
+ # dispatch can verify the trusted-publisher setup without needing a
87
+ # new version to push.
88
+ skip-existing: true
89
+
90
+ attach:
91
+ name: Attach artifacts to the GitHub Release
92
+ needs: publish
93
+ if: startsWith(github.ref, 'refs/tags/') # no release exists for a manual run
94
+ runs-on: ubuntu-latest
95
+ permissions:
96
+ contents: write
97
+ steps:
98
+ - uses: actions/download-artifact@v4
99
+ with:
100
+ name: dist
101
+ path: dist/
102
+
103
+ - name: Create the GitHub Release for this tag (if missing) and upload
104
+ env:
105
+ GH_TOKEN: ${{ github.token }}
106
+ # Creating the GitHub *Release* (not just the tag) is what triggers the
107
+ # Zenodo DOI mint once the GitHub-Zenodo integration is enabled — see
108
+ # docs/RELEASING.md. Re-run safe: an existing release is reused and
109
+ # --clobber overwrites previously uploaded artifacts.
110
+ run: |
111
+ gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 || \
112
+ gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --verify-tag --generate-notes
113
+ gh release upload "$GITHUB_REF_NAME" dist/* --clobber --repo "$GITHUB_REPOSITORY"
@@ -0,0 +1,55 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ *.egg
6
+ .eggs/
7
+ build/
8
+ dist/
9
+ *.whl
10
+
11
+ # Virtual environments
12
+ .venv/
13
+ venv/
14
+ env/
15
+
16
+ # Test / coverage / tool caches
17
+ .pytest_cache/
18
+ .coverage
19
+ .coverage.*
20
+ htmlcov/
21
+ .hypothesis/
22
+ .mypy_cache/
23
+ .ruff_cache/
24
+
25
+ # Phase reports: matplotlib PdfPages output. `reports/` holds ONLY PDFs, is
26
+ # gitignored, and is NEVER referenced from README (see CLAUDE.md engineering
27
+ # rules). Regenerate with `python tools/phase0_report.py`.
28
+ reports/
29
+
30
+ # Session / dataset artifacts
31
+ *.aldic3d
32
+ datasets/
33
+ test_data/
34
+
35
+ # IDE / editor
36
+ .vscode/
37
+ .idea/
38
+ .cspell/
39
+
40
+ # OS junk
41
+ Thumbs.db
42
+ .DS_Store
43
+ desktop.ini
44
+
45
+ # Git worktrees
46
+ .worktrees/
47
+
48
+ # Claude Code: the settings.json (cross-repo read-only boundary + permissions)
49
+ # and CLAUDE.md (session bootstrap / invariants) ARE versioned on purpose — they
50
+ # are this repo's operating contract. Ignore only transient local .claude state.
51
+ .claude/*
52
+ !.claude/settings.json
53
+
54
+ # Read-only reference clones of third-party repos (never committed)
55
+ reference/
@@ -0,0 +1,74 @@
1
+ # Citation metadata for pyALDIC-3D (Citation File Format 1.2.0).
2
+ # Maintainer notes:
3
+ # - `version` must be bumped together with src/al_dic_3d/__init__.py at every
4
+ # release (see docs/RELEASING.md).
5
+ # - `date-released` and the Zenodo concept DOI are filled in at the FIRST public
6
+ # release: Zenodo mints the DOI when the first GitHub Release is published
7
+ # (do not invent a DOI before that).
8
+ cff-version: 1.2.0
9
+ message: >-
10
+ If you use pyALDIC-3D in your research, please cite it using the metadata in
11
+ this file, together with the method papers listed under `references`.
12
+ type: software
13
+ title: "pyALDIC-3D: stereo / 3D Digital Image Correlation built on the pyALDIC platform"
14
+ abstract: >-
15
+ pyALDIC-3D is an independent, self-contained desktop application and headless
16
+ CLI for stereo (two-camera) Digital Image Correlation. It reconstructs
17
+ full-field 3D shape, displacement, and Green-Lagrange surface strain from
18
+ synchronized stereo image sequences, using the Augmented-Lagrangian DIC engine
19
+ of the pyALDIC 2D platform (al-dic) and following the MATLAB 3D-Stereo-ALDIC
20
+ reference implementation as its mathematical model.
21
+ authors:
22
+ - family-names: Tong
23
+ given-names: Zixiang
24
+ alias: Zach
25
+ email: zachtong@utexas.edu
26
+ affiliation: The University of Texas at Austin
27
+ # orcid: "https://orcid.org/XXXX-XXXX-XXXX-XXXX" # TODO: fill in real ORCID
28
+ license: BSD-3-Clause
29
+ version: 1.0.0
30
+ # date-released: YYYY-MM-DD # TODO: set at first public release
31
+ repository-code: "https://github.com/zachtong/pyALDIC-3D"
32
+ url: "https://github.com/zachtong/pyALDIC-3D"
33
+ # identifiers:
34
+ # - type: doi
35
+ # value: 10.5281/zenodo.XXXXXXX # concept DOI — minted by Zenodo at the
36
+ # # first GitHub Release; paste it here then.
37
+ # description: Zenodo concept DOI (all versions)
38
+ keywords:
39
+ - digital image correlation
40
+ - DIC
41
+ - stereo DIC
42
+ - 3D DIC
43
+ - stereo
44
+ - experimental mechanics
45
+ - strain measurement
46
+ - photogrammetry
47
+ - triangulation
48
+ references:
49
+ - type: article
50
+ title: 3D Stereo Adaptive Mesh Augmented Lagrangian Digital Image Correlation
51
+ authors:
52
+ - family-names: Tong
53
+ given-names: Zixiang
54
+ - family-names: Yang
55
+ given-names: Jin
56
+ journal: Experimental Mechanics
57
+ year: 2025
58
+ doi: 10.1007/s11340-025-01225-7
59
+ notes: The MATLAB reference implementation this software ports.
60
+ - type: article
61
+ title: >-
62
+ pyALDIC: A Python Implementation of Augmented Lagrangian Digital Image
63
+ Correlation with a GUI, Adaptive Meshing, and Mask-Aware Subset Splitting
64
+ authors:
65
+ - family-names: Tong
66
+ given-names: Zixiang
67
+ - family-names: Yang
68
+ given-names: Jin
69
+ year: 2026
70
+ doi: 10.48550/arXiv.2607.22755
71
+ url: "https://arxiv.org/abs/2607.22755"
72
+ notes: >-
73
+ Preprint (under review) describing the pyALDIC 2D platform (al-dic) this
74
+ application builds on.
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Zixiang (Zach) Tong
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.