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.
- al_dic_3d-1.0.0/.github/workflows/ci.yml +73 -0
- al_dic_3d-1.0.0/.github/workflows/publish.yml +113 -0
- al_dic_3d-1.0.0/.gitignore +55 -0
- al_dic_3d-1.0.0/CITATION.cff +74 -0
- al_dic_3d-1.0.0/LICENSE +29 -0
- al_dic_3d-1.0.0/PKG-INFO +395 -0
- al_dic_3d-1.0.0/README.md +352 -0
- al_dic_3d-1.0.0/docs/COORDINATES.md +97 -0
- al_dic_3d-1.0.0/docs/DEPENDS_ON_2D.md +102 -0
- al_dic_3d-1.0.0/docs/RELEASING.md +178 -0
- al_dic_3d-1.0.0/docs/architecture/00_INDEX.md +400 -0
- al_dic_3d-1.0.0/docs/architecture/01_technical_baseline.md +340 -0
- al_dic_3d-1.0.0/docs/architecture/02_correspondence_strategies.md +289 -0
- al_dic_3d-1.0.0/docs/architecture/03_opus_phase_prompts.md +104 -0
- al_dic_3d-1.0.0/docs/strain3d_math.md +158 -0
- al_dic_3d-1.0.0/docs/user-guide/01-overview.md +99 -0
- al_dic_3d-1.0.0/docs/user-guide/02-installation-launching.md +123 -0
- al_dic_3d-1.0.0/docs/user-guide/03-loading-images.md +70 -0
- al_dic_3d-1.0.0/docs/user-guide/04-calibration.md +155 -0
- al_dic_3d-1.0.0/docs/user-guide/05-workflow-type.md +103 -0
- al_dic_3d-1.0.0/docs/user-guide/06-initial-guess.md +77 -0
- al_dic_3d-1.0.0/docs/user-guide/07-region-of-interest.md +92 -0
- al_dic_3d-1.0.0/docs/user-guide/08-parameters.md +89 -0
- al_dic_3d-1.0.0/docs/user-guide/09-running.md +76 -0
- al_dic_3d-1.0.0/docs/user-guide/10-viewing-results.md +81 -0
- al_dic_3d-1.0.0/docs/user-guide/11-strain-processing.md +113 -0
- al_dic_3d-1.0.0/docs/user-guide/12-export.md +190 -0
- al_dic_3d-1.0.0/docs/user-guide/13-session.md +107 -0
- al_dic_3d-1.0.0/docs/user-guide/14-troubleshooting.md +118 -0
- al_dic_3d-1.0.0/docs/user-guide/index.md +58 -0
- al_dic_3d-1.0.0/pyproject.toml +149 -0
- al_dic_3d-1.0.0/src/al_dic_3d/__init__.py +22 -0
- al_dic_3d-1.0.0/src/al_dic_3d/__main__.py +10 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/__init__.py +99 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/boards.py +301 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/bundle.py +336 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/detect.py +571 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/geometry.py +95 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/importers.py +404 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/model.py +93 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/printout.py +108 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/report.py +243 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/solve.py +484 -0
- al_dic_3d-1.0.0/src/al_dic_3d/calibration/verify.py +212 -0
- al_dic_3d-1.0.0/src/al_dic_3d/cli.py +393 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/__init__.py +91 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/animation.py +260 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/colorbar.py +255 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/params.py +84 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/ply.py +135 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/render.py +435 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/render3d.py +398 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/tables.py +156 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/utils.py +49 -0
- al_dic_3d-1.0.0/src/al_dic_3d/export/vtu.py +114 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/__init__.py +18 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/app.py +104 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/controller.py +129 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/__init__.py +5 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/roi_controller.py +165 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/strain_controller.py +191 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/controllers/viz_controller.py +135 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/__init__.py +1 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/about_dialog.py +109 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/calibration_dialog.py +750 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/calibration_support.py +266 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_dialog.py +342 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/__init__.py +32 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/animation_tab.py +186 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/common.py +464 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/data_tab.py +213 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/images_tab.py +191 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/preview_tab.py +433 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/export_tabs/view3d_tab.py +225 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/dialogs/manual_params_dialog.py +168 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/display_units.py +81 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/fft_activity.py +37 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/file_association.py +96 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/issue_text.py +56 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/main_window.py +735 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/__init__.py +5 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/canvas_area.py +792 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/canvas_tools.py +263 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/left_sidebar.py +796 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/mesh_preview.py +167 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/right_sidebar.py +777 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/panels/sidebar_images.py +25 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/persistence.py +92 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/run_worker.py +64 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/state.py +86 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/strain_render.py +93 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/strain_window.py +800 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/view_state.py +131 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/__init__.py +9 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/advanced_section.py +95 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/calibration_section.py +181 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/camera_drop_zone.py +129 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/config_overlay.py +96 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/console_log3d.py +52 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/field_selector.py +123 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/frame_navigator.py +141 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/frame_prefetcher.py +98 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/image_view.py +751 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/image_view_brush.py +121 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/info_icon.py +44 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/init_guess_section.py +231 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/mesh_appearance.py +77 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/mesh_overlay.py +223 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/next_step_hint.py +54 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/pair_list.py +79 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/ref_update_section.py +166 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/roi_toolbar.py +293 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/section_header.py +42 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_field_selector.py +109 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_navigator.py +165 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_param_panel.py +429 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_support.py +133 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/strain_viz_panel.py +95 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/units_section.py +83 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/widgets/view3d.py +244 -0
- al_dic_3d-1.0.0/src/al_dic_3d/gui/workers.py +153 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/__init__.py +62 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_de.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_es.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_fr.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_ja.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_ko.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_zh_CN.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/compiled/al_dic_3d_zh_TW.qm +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/scan.py +136 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_de.ts +3650 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_es.ts +3659 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_fr.ts +3656 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_ja.ts +3633 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_ko.ts +3634 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_zh_CN.ts +3627 -0
- al_dic_3d-1.0.0/src/al_dic_3d/i18n/source/al_dic_3d_zh_TW.ts +3627 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/__init__.py +44 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/contracts.py +142 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/crack_mesh.py +57 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/diagnostics.py +227 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/primitives.py +311 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/quality.py +42 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/seed.py +147 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/seed_propagation.py +392 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/stereo.py +157 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/__init__.py +14 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/_common.py +265 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/ref_direct.py +247 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/stereo_each_frame.py +251 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/strategies/track_both.py +498 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/strategy.py +83 -0
- al_dic_3d-1.0.0/src/al_dic_3d/matching/temporal.py +559 -0
- al_dic_3d-1.0.0/src/al_dic_3d/memcheck.py +147 -0
- al_dic_3d-1.0.0/src/al_dic_3d/pathsafe.py +145 -0
- al_dic_3d-1.0.0/src/al_dic_3d/project/__init__.py +40 -0
- al_dic_3d-1.0.0/src/al_dic_3d/project/draft.py +295 -0
- al_dic_3d-1.0.0/src/al_dic_3d/project/relocate.py +195 -0
- al_dic_3d-1.0.0/src/al_dic_3d/project/session.py +371 -0
- al_dic_3d-1.0.0/src/al_dic_3d/project/state.py +50 -0
- al_dic_3d-1.0.0/src/al_dic_3d/py.typed +0 -0
- al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/__init__.py +24 -0
- al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/outliers.py +105 -0
- al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/reconstruction.py +108 -0
- al_dic_3d-1.0.0/src/al_dic_3d/reconstruct/triangulate.py +96 -0
- al_dic_3d-1.0.0/src/al_dic_3d/runner.py +801 -0
- al_dic_3d-1.0.0/src/al_dic_3d/sequence/__init__.py +27 -0
- al_dic_3d-1.0.0/src/al_dic_3d/sequence/lazy.py +135 -0
- al_dic_3d-1.0.0/src/al_dic_3d/sequence/model.py +161 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/__init__.py +35 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/compute.py +217 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/crack.py +80 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/edgetrim.py +160 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/gradients.py +518 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/kernels.py +340 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/model.py +72 -0
- al_dic_3d-1.0.0/src/al_dic_3d/strain3d/specimen.py +58 -0
- al_dic_3d-1.0.0/src/al_dic_3d/viz3d/__init__.py +37 -0
- al_dic_3d-1.0.0/src/al_dic_3d/viz3d/fieldmap.py +429 -0
- al_dic_3d-1.0.0/src/al_dic_3d/viz3d/lru.py +48 -0
- al_dic_3d-1.0.0/src/al_dic_3d/viz3d/maskwarp.py +100 -0
- al_dic_3d-1.0.0/src/al_dic_3d/viz3d/surface.py +347 -0
- al_dic_3d-1.0.0/tests/__init__.py +0 -0
- al_dic_3d-1.0.0/tests/conftest.py +114 -0
- al_dic_3d-1.0.0/tests/synth_calib.py +164 -0
- al_dic_3d-1.0.0/tests/synth_parity.py +310 -0
- al_dic_3d-1.0.0/tests/synth_stereo.py +158 -0
- al_dic_3d-1.0.0/tests/synth_surface.py +241 -0
- al_dic_3d-1.0.0/tests/test_alien_paths.py +259 -0
- al_dic_3d-1.0.0/tests/test_architecture.py +151 -0
- al_dic_3d-1.0.0/tests/test_audit_fixes_compute.py +199 -0
- al_dic_3d-1.0.0/tests/test_audit_gui_honesty.py +206 -0
- al_dic_3d-1.0.0/tests/test_batch_q_core.py +486 -0
- al_dic_3d-1.0.0/tests/test_batch_q_gui.py +388 -0
- al_dic_3d-1.0.0/tests/test_calib_boards.py +96 -0
- al_dic_3d-1.0.0/tests/test_calib_dialogs.py +232 -0
- al_dic_3d-1.0.0/tests/test_calib_enhancements.py +302 -0
- al_dic_3d-1.0.0/tests/test_calib_realworld_hardening.py +155 -0
- al_dic_3d-1.0.0/tests/test_calibration_gate.py +260 -0
- al_dic_3d-1.0.0/tests/test_calibration_importers.py +443 -0
- al_dic_3d-1.0.0/tests/test_cli.py +64 -0
- al_dic_3d-1.0.0/tests/test_cli_calibrate.py +130 -0
- al_dic_3d-1.0.0/tests/test_controller.py +65 -0
- al_dic_3d-1.0.0/tests/test_crack_batch_c.py +472 -0
- al_dic_3d-1.0.0/tests/test_crack_composition.py +79 -0
- al_dic_3d-1.0.0/tests/test_crack_render.py +87 -0
- al_dic_3d-1.0.0/tests/test_crack_wysiwyg.py +294 -0
- al_dic_3d-1.0.0/tests/test_diagnostics.py +144 -0
- al_dic_3d-1.0.0/tests/test_draft.py +90 -0
- al_dic_3d-1.0.0/tests/test_export_geometry.py +270 -0
- al_dic_3d-1.0.0/tests/test_export_render.py +762 -0
- al_dic_3d-1.0.0/tests/test_export_tables.py +107 -0
- al_dic_3d-1.0.0/tests/test_geometry_roundtrip.py +118 -0
- al_dic_3d-1.0.0/tests/test_gui_safety.py +376 -0
- al_dic_3d-1.0.0/tests/test_gui_smoke.py +476 -0
- al_dic_3d-1.0.0/tests/test_i18n.py +75 -0
- al_dic_3d-1.0.0/tests/test_incremental_mode.py +72 -0
- al_dic_3d-1.0.0/tests/test_init_guess.py +256 -0
- al_dic_3d-1.0.0/tests/test_lazy_provider.py +168 -0
- al_dic_3d-1.0.0/tests/test_matching_contracts.py +109 -0
- al_dic_3d-1.0.0/tests/test_memcheck.py +89 -0
- al_dic_3d-1.0.0/tests/test_parity_gate.py +57 -0
- al_dic_3d-1.0.0/tests/test_pathsafe.py +174 -0
- al_dic_3d-1.0.0/tests/test_perf_batch_p2.py +546 -0
- al_dic_3d-1.0.0/tests/test_perf_batch_p3.py +591 -0
- al_dic_3d-1.0.0/tests/test_primitives.py +128 -0
- al_dic_3d-1.0.0/tests/test_quality_gate.py +100 -0
- al_dic_3d-1.0.0/tests/test_reconstruction.py +105 -0
- al_dic_3d-1.0.0/tests/test_ref_direct.py +64 -0
- al_dic_3d-1.0.0/tests/test_relocate.py +192 -0
- al_dic_3d-1.0.0/tests/test_robustness_r1.py +254 -0
- al_dic_3d-1.0.0/tests/test_roi_controller.py +108 -0
- al_dic_3d-1.0.0/tests/test_runner.py +365 -0
- al_dic_3d-1.0.0/tests/test_seed_propagation.py +399 -0
- al_dic_3d-1.0.0/tests/test_sequence.py +88 -0
- al_dic_3d-1.0.0/tests/test_session.py +183 -0
- al_dic_3d-1.0.0/tests/test_session_fidelity.py +410 -0
- al_dic_3d-1.0.0/tests/test_session_fidelity_gui.py +322 -0
- al_dic_3d-1.0.0/tests/test_smoke_import.py +39 -0
- al_dic_3d-1.0.0/tests/test_stereo_each_frame.py +67 -0
- al_dic_3d-1.0.0/tests/test_stereo_match.py +93 -0
- al_dic_3d-1.0.0/tests/test_strain3d.py +137 -0
- al_dic_3d-1.0.0/tests/test_strain3d_kernel.py +177 -0
- al_dic_3d-1.0.0/tests/test_strain_window.py +294 -0
- al_dic_3d-1.0.0/tests/test_synth_surface.py +55 -0
- al_dic_3d-1.0.0/tests/test_temporal_honesty.py +176 -0
- al_dic_3d-1.0.0/tests/test_temporal_track.py +163 -0
- al_dic_3d-1.0.0/tests/test_track_both_e2e.py +219 -0
- al_dic_3d-1.0.0/tests/test_ux_batch_g2.py +385 -0
- al_dic_3d-1.0.0/tests/test_ux_batch_g3.py +577 -0
- al_dic_3d-1.0.0/tests/test_view3d.py +197 -0
- al_dic_3d-1.0.0/tests/test_view3d_degradation.py +96 -0
- al_dic_3d-1.0.0/tests/test_viz_dense.py +231 -0
- 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.
|
al_dic_3d-1.0.0/LICENSE
ADDED
|
@@ -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.
|