pyvale 2025.7.1__tar.gz → 2025.8.1__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.
Potentially problematic release.
This version of pyvale might be problematic. Click here for more details.
- {pyvale-2025.7.1/src/pyvale.egg-info → pyvale-2025.8.1}/PKG-INFO +6 -7
- {pyvale-2025.7.1 → pyvale-2025.8.1}/README.md +5 -5
- {pyvale-2025.7.1 → pyvale-2025.8.1}/pyproject.toml +7 -2
- {pyvale-2025.7.1 → pyvale-2025.8.1}/setup.py +9 -5
- pyvale-2025.8.1/src/pyvale/__init__.py +21 -0
- pyvale-2025.8.1/src/pyvale/blender/__init__.py +23 -0
- pyvale-2025.7.1/src/pyvale/pyvaleexceptions.py → pyvale-2025.8.1/src/pyvale/blender/blenderexceptions.py +0 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/blender}/blenderlightdata.py +3 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/blender}/blendermaterialdata.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/blender}/blenderrenderdata.py +5 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/blender}/blenderscene.py +33 -30
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/blender}/blendertools.py +14 -10
- pyvale-2025.8.1/src/pyvale/dataset/__init__.py +7 -0
- pyvale-2025.8.1/src/pyvale/dataset/dataset.py +443 -0
- pyvale-2025.8.1/src/pyvale/dic/__init__.py +20 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicfourier.cpp +36 -4
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicinterpolator.cpp +56 -1
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicmain.cpp +24 -19
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicoptimizer.cpp +6 -1
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicscanmethod.cpp +32 -32
- pyvale-2025.8.1/src/pyvale/dic/cpp/dicsignalhandler.cpp +16 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicstrain.cpp +7 -3
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicutil.cpp +79 -23
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dic2d.py +51 -29
- pyvale-2025.8.1/src/pyvale/dic/dic2dconv.py +6 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicchecks.py +28 -16
- pyvale-2025.8.1/src/pyvale/dic/dicdataimport.py +370 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicregionofinterest.py +169 -12
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicresults.py +4 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicstrain.py +9 -9
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_1_basicscalars_therm2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1a_basicscalars_therm2d.py +12 -9
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_2_sensormodel_therm2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1b_sensormodel_therm2d.py +17 -14
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_3_customsens_therm3d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1c_customsens_therm3d.py +27 -24
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_4_basicerrors_therm3d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1d_basicerrors_therm3d.py +32 -29
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_5_fielderrs_therm3d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1e_fielderrs_therm3d.py +19 -15
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_6_caliberrs_therm2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1f_caliberrs_therm2d.py +20 -16
- pyvale-2025.7.1/src/pyvale/examples/basics/ex1_7_spatavg_therm2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex1g_spatavg_therm2d.py +19 -16
- pyvale-2025.7.1/src/pyvale/examples/basics/ex2_1_basicvectors_disp2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex2a_basicvectors_disp2d.py +13 -10
- pyvale-2025.7.1/src/pyvale/examples/basics/ex2_2_vectorsens_disp2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex2b_vectorsens_disp2d.py +19 -15
- pyvale-2025.7.1/src/pyvale/examples/basics/ex2_3_sensangle_disp2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex2c_sensangle_disp2d.py +21 -18
- pyvale-2025.7.1/src/pyvale/examples/basics/ex2_4_chainfielderrs_disp2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex2d_chainfielderrs_disp2d.py +31 -29
- pyvale-2025.7.1/src/pyvale/examples/basics/ex2_5_vectorfields3d_disp3d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex2e_vectorfields3d_disp3d.py +21 -18
- pyvale-2025.7.1/src/pyvale/examples/basics/ex3_1_basictensors_strain2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex3a_basictensors_strain2d.py +16 -14
- pyvale-2025.7.1/src/pyvale/examples/basics/ex3_2_tensorsens2d_strain2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex3b_tensorsens2d_strain2d.py +17 -14
- pyvale-2025.7.1/src/pyvale/examples/basics/ex3_3_tensorsens3d_strain3d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex3c_tensorsens3d_strain3d.py +25 -22
- pyvale-2025.7.1/src/pyvale/examples/basics/ex4_1_expsim2d_thermmech2d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex4a_expsim2d_thermmech2d.py +17 -14
- pyvale-2025.7.1/src/pyvale/examples/basics/ex4_2_expsim3d_thermmech3d.py → pyvale-2025.8.1/src/pyvale/examples/basics/ex4b_expsim3d_thermmech3d.py +37 -34
- pyvale-2025.8.1/src/pyvale/examples/basics/ex5_nomesh.py +24 -0
- {pyvale-2025.7.1/src/pyvale/examples/renderblender → pyvale-2025.8.1/src/pyvale/examples/dic}/ex1_2_blenderdeformed.py +22 -18
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/dic/ex1_region_of_interest.py +6 -3
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/dic/ex2_plate_with_hole.py +21 -18
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/dic/ex3_plate_with_hole_strain.py +8 -6
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/dic/ex4_dic_blender.py +17 -15
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/dic/ex5_dic_challenge.py +19 -14
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/genanalyticdata/ex1_1_scalarvisualisation.py +16 -10
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/genanalyticdata/ex1_2_scalarcasebuild.py +3 -3
- pyvale-2025.8.1/src/pyvale/examples/genanalyticdata/ex2_1_analyticsensors.py +86 -0
- pyvale-2025.8.1/src/pyvale/examples/genanalyticdata/ex2_2_analyticsensors_nomesh.py +67 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +12 -9
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex0_create_moose_config.py +65 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex1a_modify_moose_input.py +71 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex1b_modify_gmsh_input.py +69 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex2a_run_moose_once.py +80 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex2b_run_gmsh_once.py +64 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex2c_run_both_once.py +114 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex3_run_moose_seq_para.py +157 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex4_run_gmsh-moose_seq_para.py +176 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex5_run_moose_paramulti.py +136 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex6_read_moose_exodus.py +163 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex7a_read_moose_herd_results.py +153 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex7b_read_multi_herd_results.py +116 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex7c_read_multi_gmshmoose_results.py +127 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex7d_readconfig_multi_gmshmoose_results.py +143 -0
- pyvale-2025.8.1/src/pyvale/examples/mooseherder/ex8_read_existing_sweep_output.py +72 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderblender/ex1_1_blenderscene.py +24 -20
- pyvale-2025.8.1/src/pyvale/examples/renderblender/ex1_2_blenderdeformed.py +174 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderblender/ex2_1_stereoscene.py +36 -29
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderblender/ex2_2_stereodeformed.py +26 -20
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderblender/ex3_1_blendercalibration.py +24 -17
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderrasterisation/ex_rastenp.py +14 -12
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderrasterisation/ex_rastercyth_oneframe.py +14 -15
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderrasterisation/ex_rastercyth_static_cypara.py +13 -11
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/renderrasterisation/ex_rastercyth_static_pypara.py +13 -11
- pyvale-2025.8.1/src/pyvale/mooseherder/__init__.py +32 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/directorymanager.py +416 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/exodusreader.py +763 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/gmshrunner.py +163 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/inputmodifier.py +236 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/mooseconfig.py +226 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/mooseherd.py +527 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/mooserunner.py +303 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/outputreader.py +22 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/simdata.py +92 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/simrunner.py +31 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/sweepreader.py +356 -0
- pyvale-2025.8.1/src/pyvale/mooseherder/sweeptools.py +76 -0
- pyvale-2025.8.1/src/pyvale/sensorsim/__init__.py +82 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/camera.py +7 -7
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/camerasensor.py +7 -7
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/camerastereo.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/cameratools.py +4 -4
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/cython/rastercyth.c +596 -596
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/cython/rastercyth.py +16 -17
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorcalculator.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorintegrator.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorrand.py +4 -4
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorsyscalib.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorsysdep.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorsysfield.py +8 -8
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errorsysindep.py +3 -3
- pyvale-2025.8.1/src/pyvale/sensorsim/exceptions.py +8 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/experimentsimulator.py +23 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/field.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/fieldconverter.py +72 -19
- pyvale-2025.8.1/src/pyvale/sensorsim/fieldinterp.py +37 -0
- pyvale-2025.8.1/src/pyvale/sensorsim/fieldinterpmesh.py +124 -0
- pyvale-2025.8.1/src/pyvale/sensorsim/fieldinterppoints.py +55 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/fieldsampler.py +4 -4
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/fieldscalar.py +28 -24
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/fieldtensor.py +33 -31
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/fieldvector.py +33 -31
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/imagedef2d.py +9 -5
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/integratorfactory.py +6 -6
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/integratorquadrature.py +3 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/integratorrectangle.py +3 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/integratorspatial.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/rastercy.py +5 -5
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/rasternp.py +9 -9
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/rasteropts.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/renderer.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/rendermesh.py +5 -5
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/renderscene.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/sensorarray.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/sensorarrayfactory.py +12 -12
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/sensorarraypoint.py +10 -8
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/sensordata.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/sensortools.py +2 -20
- pyvale-2025.8.1/src/pyvale/sensorsim/simtools.py +174 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualexpplotter.py +3 -3
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualimages.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualsimanimator.py +4 -4
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualsimplotter.py +5 -5
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualsimsensors.py +12 -12
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualtools.py +1 -1
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualtraceplotter.py +2 -2
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case17.geo +3 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case17.i +4 -4
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/run_1case.py +1 -9
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/run_all_cases.py +1 -1
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/run_build_case.py +1 -1
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/run_example_cases.py +1 -1
- pyvale-2025.8.1/src/pyvale/verif/__init__.py +12 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/verif}/analyticsimdatafactory.py +2 -2
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/verif}/analyticsimdatagenerator.py +2 -2
- pyvale-2025.8.1/src/pyvale/verif/psens.py +125 -0
- pyvale-2025.8.1/src/pyvale/verif/psensconst.py +18 -0
- pyvale-2025.8.1/src/pyvale/verif/psensmech.py +227 -0
- pyvale-2025.8.1/src/pyvale/verif/psensmultiphys.py +187 -0
- pyvale-2025.8.1/src/pyvale/verif/psensscalar.py +347 -0
- pyvale-2025.8.1/src/pyvale/verif/psenstensor.py +123 -0
- pyvale-2025.8.1/src/pyvale/verif/psensvector.py +116 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1/src/pyvale.egg-info}/PKG-INFO +6 -7
- pyvale-2025.8.1/src/pyvale.egg-info/SOURCES.txt +262 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale.egg-info/requires.txt +0 -1
- pyvale-2025.7.1/src/pyvale/__init__.py +0 -101
- pyvale-2025.7.1/src/pyvale/dataset.py +0 -415
- pyvale-2025.7.1/src/pyvale/dicdataimport.py +0 -247
- pyvale-2025.7.1/src/pyvale/examples/genanalyticdata/ex2_1_analyticsensors.py +0 -80
- pyvale-2025.7.1/src/pyvale/simtools.py +0 -67
- pyvale-2025.7.1/src/pyvale.egg-info/SOURCES.txt +0 -213
- {pyvale-2025.7.1 → pyvale-2025.8.1}/LICENSE +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/setup.cfg +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/blender}/blendercalibrationdata.py +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/DIC_Challenge_Star_Noise_Def.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/DIC_Challenge_Star_Noise_Ref.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/__init__.py +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/cal_target.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case00_HEX20_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case00_HEX27_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case00_HEX8_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case00_TET10_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case00_TET14_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case00_TET4_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case13_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case16_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case17_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case18_1_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case18_2_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case18_3_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case25_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/case26_out.e +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/optspeckle_2464x2056px_spec5px_8bit_gblur1px.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/plate_hole_def0000.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/plate_hole_def0001.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/plate_hole_ref0000.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/plate_rigid_def0000.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/plate_rigid_def0001.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/data/plate_rigid_ref0000.tiff +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicbruteforce.cpp +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicrg.cpp +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/dic/cpp/dicsmooth.cpp +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicspecklegenerator.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicspecklequality.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/dic}/dicstrainresults.py +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/examples/__init__.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/cameradata.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/cameradata2d.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/errordriftcalc.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/fieldtransform.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/generatorsrandom.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/imagetools.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/integratortype.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/output.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/raster.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/sensordescriptor.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualimagedef.py +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/sensorsim}/visualopts.py +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case00_HEX20.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case00_HEX27.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case00_HEX8.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case00_TET10.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case00_TET14.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case00_TET4.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case01.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case02.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case03.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case04.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case05.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case06.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case07.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case07.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case08.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case08.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case09.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case09.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case10.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case10.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case11.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case11.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case12.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case12.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case13.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case14.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case15.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case15.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case16.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case16.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case18.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case18_1.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case18_2.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case18_3.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case19.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case19.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case20.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case20.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case21.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case21.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case22.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case22.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case23.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case23.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case24.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case24.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case25.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case25.i +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case26.geo +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale/simcases/case26.i +0 -0
- {pyvale-2025.7.1/src/pyvale → pyvale-2025.8.1/src/pyvale/verif}/analyticmeshgen.py +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale.egg-info/dependency_links.txt +0 -0
- {pyvale-2025.7.1 → pyvale-2025.8.1}/src/pyvale.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyvale
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.8.1
|
|
4
4
|
Summary: An all-in-one package for sensor simulation, sensor uncertainty quantification, sensor placement optimisation and simulation calibration or validation.
|
|
5
5
|
Author-email: "scepticalrabbit et al." <thescepticalrabbit@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -29,7 +29,6 @@ Project-URL: Issue Tracker, https://github.com/Digital-Validation-Laboratory/pyv
|
|
|
29
29
|
Requires-Python: ==3.11.*
|
|
30
30
|
Description-Content-Type: text/markdown
|
|
31
31
|
License-File: LICENSE
|
|
32
|
-
Requires-Dist: mooseherder>=0.1.0
|
|
33
32
|
Requires-Dist: numpy<2.0.0
|
|
34
33
|
Requires-Dist: scipy>=1.14.0
|
|
35
34
|
Requires-Dist: netCDF4>=1.6.5
|
|
@@ -54,22 +53,22 @@ Dynamic: license-file
|
|
|
54
53
|
# pyvale
|
|
55
54
|

|
|
56
55
|
|
|
57
|
-
The python validation engine (`pyvale`) is
|
|
56
|
+
The python validation engine (`pyvale`) is your virtual engineering laboratory: An all-in-one package for sensor simulation, sensor uncertainty quantification, sensor placement optimisation and simulation calibration/validation. Used to simulate experimental data from an input multi-physics simulation by explicitly modelling sensors with realistic uncertainties. Useful for experimental design, sensor placement optimisation, testing simulation validation metrics and virtually testing digital shadows/twins.
|
|
58
57
|
|
|
59
|
-
We
|
|
58
|
+
We are actively developing dedicated tools for simulation and uncertainty quantification of imaging sensors including digital image correlation (DIC) and infra-red thermography (IRT). Check out the [documentation](https://computer-aided-validation-laboratory.github.io/pyvale/index.html) to get started with some of our examples.
|
|
60
59
|
|
|
61
60
|
## Quick Demo: Simulating Point Sensors
|
|
62
61
|
Here we demonstrate how `pyvale` can be used to simulate thermocouples and strain gauges applied to a [MOOSE](https://mooseframework.inl.gov/index.html) thermo-mechanical simulation of a fusion divertor armour heatsink. The figures below show visualisations of the virtual thermocouple and strain gauge locations on the simualtion mesh as well as time traces for each sensor over a series of simulated experiments.
|
|
63
62
|
|
|
64
|
-
The code to run the simulated experiments and produce the output shown here comes from [this example](https://computer-aided-validation-laboratory.github.io/pyvale/examples/
|
|
63
|
+
The code to run the simulated experiments and produce the output shown here comes from [this example](https://computer-aided-validation-laboratory.github.io/pyvale/examples/basics/ex4_2_expsim3d_thermmech3d.html). You can find more examples and details of `pyvale` python API in the `pyvale` [documentation](https://computer-aided-validation-laboratory.github.io/pyvale/index.html).
|
|
65
64
|
|
|
66
65
|
|||
|
|
67
66
|
|--|--|
|
|
68
|
-
|*Visualisation of the
|
|
67
|
+
|*Visualisation of the thermocouple locations.*|*Visualisation of the strain gauge locations.*|
|
|
69
68
|
|
|
70
69
|
|||
|
|
71
70
|
|--|--|
|
|
72
|
-
|*
|
|
71
|
+
|*Thermocouple time traces over a series of simulated experiments.*|*Strain gauge time traces over a series of simulated experiments.*|
|
|
73
72
|
|
|
74
73
|
|
|
75
74
|
## Quick Install
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# pyvale
|
|
2
2
|

|
|
3
3
|
|
|
4
|
-
The python validation engine (`pyvale`) is
|
|
4
|
+
The python validation engine (`pyvale`) is your virtual engineering laboratory: An all-in-one package for sensor simulation, sensor uncertainty quantification, sensor placement optimisation and simulation calibration/validation. Used to simulate experimental data from an input multi-physics simulation by explicitly modelling sensors with realistic uncertainties. Useful for experimental design, sensor placement optimisation, testing simulation validation metrics and virtually testing digital shadows/twins.
|
|
5
5
|
|
|
6
|
-
We
|
|
6
|
+
We are actively developing dedicated tools for simulation and uncertainty quantification of imaging sensors including digital image correlation (DIC) and infra-red thermography (IRT). Check out the [documentation](https://computer-aided-validation-laboratory.github.io/pyvale/index.html) to get started with some of our examples.
|
|
7
7
|
|
|
8
8
|
## Quick Demo: Simulating Point Sensors
|
|
9
9
|
Here we demonstrate how `pyvale` can be used to simulate thermocouples and strain gauges applied to a [MOOSE](https://mooseframework.inl.gov/index.html) thermo-mechanical simulation of a fusion divertor armour heatsink. The figures below show visualisations of the virtual thermocouple and strain gauge locations on the simualtion mesh as well as time traces for each sensor over a series of simulated experiments.
|
|
10
10
|
|
|
11
|
-
The code to run the simulated experiments and produce the output shown here comes from [this example](https://computer-aided-validation-laboratory.github.io/pyvale/examples/
|
|
11
|
+
The code to run the simulated experiments and produce the output shown here comes from [this example](https://computer-aided-validation-laboratory.github.io/pyvale/examples/basics/ex4_2_expsim3d_thermmech3d.html). You can find more examples and details of `pyvale` python API in the `pyvale` [documentation](https://computer-aided-validation-laboratory.github.io/pyvale/index.html).
|
|
12
12
|
|
|
13
13
|
|||
|
|
14
14
|
|--|--|
|
|
15
|
-
|*Visualisation of the
|
|
15
|
+
|*Visualisation of the thermocouple locations.*|*Visualisation of the strain gauge locations.*|
|
|
16
16
|
|
|
17
17
|
|||
|
|
18
18
|
|--|--|
|
|
19
|
-
|*
|
|
19
|
+
|*Thermocouple time traces over a series of simulated experiments.*|*Strain gauge time traces over a series of simulated experiments.*|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
## Quick Install
|
|
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
|
|
5
5
|
|
|
6
6
|
[project]
|
|
7
7
|
name = "pyvale"
|
|
8
|
-
version = "2025.
|
|
8
|
+
version = "2025.8.1"
|
|
9
9
|
description = "An all-in-one package for sensor simulation, sensor uncertainty quantification, sensor placement optimisation and simulation calibration or validation."
|
|
10
10
|
authors = [
|
|
11
11
|
{ name = "scepticalrabbit et al.", email = "thescepticalrabbit@gmail.com" },
|
|
@@ -14,7 +14,6 @@ license = { file = "LICENSE" }
|
|
|
14
14
|
readme = "README.md"
|
|
15
15
|
requires-python = "==3.11.*"
|
|
16
16
|
dependencies = [
|
|
17
|
-
"mooseherder>=0.1.0",
|
|
18
17
|
"numpy<2.0.0",
|
|
19
18
|
"scipy>=1.14.0",
|
|
20
19
|
"netCDF4>=1.6.5",
|
|
@@ -36,6 +35,12 @@ dependencies = [
|
|
|
36
35
|
"opencv-python<=4.9.0.80"
|
|
37
36
|
]
|
|
38
37
|
|
|
38
|
+
[tool.pytest.ini_options]
|
|
39
|
+
pythonpath = [
|
|
40
|
+
"src",
|
|
41
|
+
"tests"
|
|
42
|
+
]
|
|
43
|
+
|
|
39
44
|
[project.urls]
|
|
40
45
|
"Repository" = "https://github.com/Digital-Validation-Laboratory/pyvale"
|
|
41
46
|
"Issue Tracker" = "https://github.com/Digital-Validation-Laboratory/pyvale/issues"
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
#===============================================================================
|
|
2
|
+
# pyvale: the python validation engine
|
|
3
|
+
# License: MIT
|
|
4
|
+
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
+
#===============================================================================
|
|
6
|
+
|
|
1
7
|
from setuptools import setup, Extension
|
|
2
8
|
from Cython.Build import cythonize
|
|
3
9
|
import numpy
|
|
@@ -34,17 +40,15 @@ else:
|
|
|
34
40
|
|
|
35
41
|
|
|
36
42
|
ext_cython = Extension(
|
|
37
|
-
"pyvale.cython.rastercyth",
|
|
38
|
-
["src/pyvale/cython/rastercyth.py"],
|
|
43
|
+
"pyvale.sensorsim.cython.rastercyth",
|
|
44
|
+
["src/pyvale/sensorsim/cython/rastercyth.py"],
|
|
39
45
|
include_dirs=[numpy.get_include()],
|
|
40
46
|
extra_compile_args=[openmp_flag],
|
|
41
47
|
extra_link_args=[openmp_flag],
|
|
42
48
|
)
|
|
43
49
|
|
|
44
|
-
|
|
45
|
-
|
|
46
50
|
ext_dic = Extension(
|
|
47
|
-
'pyvale.dic2dcpp',
|
|
51
|
+
'pyvale.dic.dic2dcpp',
|
|
48
52
|
sorted(glob("src/pyvale/dic/cpp/dic*.cpp")),
|
|
49
53
|
language="c++",
|
|
50
54
|
include_dirs=[pybind11.get_include()],
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# pyvale: the python validation engine
|
|
3
|
+
# License: MIT
|
|
4
|
+
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
The python validation engine (`pyvale`) is your virtual engineering laboratory:
|
|
9
|
+
An all-in-one package for sensor simulation, sensor uncertainty quantification,
|
|
10
|
+
sensor placement optimisation and simulation calibration/validation. Used to
|
|
11
|
+
simulate experimental data from an input multi-physics simulation by explicitly
|
|
12
|
+
modelling sensors with realistic uncertainties. Useful for experimental design,
|
|
13
|
+
sensor placement optimisation, testing simulation validation metrics and
|
|
14
|
+
virtually testing digital shadows/twins.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from . import dic
|
|
18
|
+
from . import blender
|
|
19
|
+
from . import sensorsim
|
|
20
|
+
from . import mooseherder
|
|
21
|
+
from . import dataset
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#===============================================================================
|
|
2
|
+
# pyvale: the python validation engine
|
|
3
|
+
# License: MIT
|
|
4
|
+
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
+
#===============================================================================
|
|
6
|
+
|
|
7
|
+
from .blendercalibrationdata import CalibrationData
|
|
8
|
+
from .blenderlightdata import LightData, LightType
|
|
9
|
+
from .blendermaterialdata import MaterialData
|
|
10
|
+
from .blenderrenderdata import RenderData, RenderEngine
|
|
11
|
+
from .blenderscene import Scene
|
|
12
|
+
from .blendertools import Tools
|
|
13
|
+
from .blenderexceptions import BlenderError
|
|
14
|
+
|
|
15
|
+
__all__ = ["CalibrationData",
|
|
16
|
+
"LightData",
|
|
17
|
+
"LightType",
|
|
18
|
+
"MaterialData",
|
|
19
|
+
"RenderData",
|
|
20
|
+
"RenderEngine",
|
|
21
|
+
"Scene",
|
|
22
|
+
"Tools",
|
|
23
|
+
"BlenderError"]
|
|
@@ -10,17 +10,17 @@ from scipy.spatial.transform import Rotation
|
|
|
10
10
|
|
|
11
11
|
#TODO: docstrings
|
|
12
12
|
|
|
13
|
-
class
|
|
13
|
+
class LightType(Enum):
|
|
14
14
|
POINT = 'POINT'
|
|
15
15
|
SUN = 'SUN'
|
|
16
16
|
SPOT = 'SPOT'
|
|
17
17
|
AREA = 'AREA'
|
|
18
18
|
|
|
19
19
|
@dataclass(slots=True)
|
|
20
|
-
class
|
|
20
|
+
class LightData():
|
|
21
21
|
pos_world: np.ndarray
|
|
22
22
|
rot_world: Rotation
|
|
23
23
|
energy: int # NOTE: In Watts
|
|
24
|
-
type:
|
|
24
|
+
type: LightType = LightType.POINT
|
|
25
25
|
shadow_soft_size: float = 1.5
|
|
26
26
|
|
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
from enum import Enum
|
|
8
8
|
from dataclasses import dataclass
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
|
|
11
|
+
# Pyvale
|
|
12
|
+
from pyvale.sensorsim.cameradata import CameraData
|
|
13
|
+
from pyvale.sensorsim.output import Outputs
|
|
12
14
|
|
|
13
15
|
#TODO: docstrings
|
|
14
16
|
|
|
@@ -27,4 +29,4 @@ class RenderData:
|
|
|
27
29
|
engine: RenderEngine = RenderEngine.CYCLES
|
|
28
30
|
max_bounces: int = 12
|
|
29
31
|
bit_size: int = 8
|
|
30
|
-
threads:int = 4
|
|
32
|
+
threads:int = 4
|
|
@@ -6,18 +6,21 @@
|
|
|
6
6
|
import numpy as np
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
import bpy
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
from pyvale.
|
|
12
|
-
from pyvale.simtools import SimTools
|
|
13
|
-
from pyvale.
|
|
14
|
-
from pyvale.
|
|
15
|
-
|
|
16
|
-
from pyvale.
|
|
17
|
-
from pyvale.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
9
|
+
|
|
10
|
+
# Pyvale
|
|
11
|
+
from pyvale.sensorsim.cameradata import CameraData
|
|
12
|
+
from pyvale.sensorsim.simtools import SimTools
|
|
13
|
+
from pyvale.sensorsim.camerastereo import CameraStereo
|
|
14
|
+
from pyvale.sensorsim.rendermesh import RenderMesh
|
|
15
|
+
|
|
16
|
+
from pyvale.blender.blenderexceptions import BlenderError
|
|
17
|
+
from pyvale.blender.blendertools import Tools
|
|
18
|
+
from pyvale.blender.blenderlightdata import LightData
|
|
19
|
+
from pyvale.blender.blenderrenderdata import RenderEngine, RenderData
|
|
20
|
+
from pyvale.blender.blendermaterialdata import MaterialData
|
|
21
|
+
from pyvale.blender.blendercalibrationdata import CalibrationData
|
|
22
|
+
|
|
23
|
+
class Scene():
|
|
21
24
|
"""Namespace for creating a scene within Blender.
|
|
22
25
|
Methods include adding an object, camera, light and adding a speckle pattern,
|
|
23
26
|
as well as deforming the object, and then rendering the scene.
|
|
@@ -119,12 +122,12 @@ class BlenderScene():
|
|
|
119
122
|
cam1 = self.add_camera(stereo_system.cam_data_1)
|
|
120
123
|
return cam0, cam1
|
|
121
124
|
|
|
122
|
-
def add_light(self, light_data:
|
|
125
|
+
def add_light(self, light_data: LightData) -> bpy.data.objects:
|
|
123
126
|
"""A method to add a light object within Blender.
|
|
124
127
|
|
|
125
128
|
Parameters
|
|
126
129
|
----------
|
|
127
|
-
light_data :
|
|
130
|
+
light_data : pyvale.blender.LightData
|
|
128
131
|
A dataclass contain the necessary parameters to create a Blender
|
|
129
132
|
light object.
|
|
130
133
|
|
|
@@ -222,7 +225,7 @@ class BlenderScene():
|
|
|
222
225
|
def add_speckle(self,
|
|
223
226
|
part: bpy.data.objects,
|
|
224
227
|
speckle_path: Path | None,
|
|
225
|
-
mat_data:
|
|
228
|
+
mat_data: MaterialData | None,
|
|
226
229
|
mm_px_resolution: float,
|
|
227
230
|
cal: bool = False) -> None:
|
|
228
231
|
"""A method to add a speckle pattern to an existing mesh object within
|
|
@@ -238,7 +241,7 @@ class BlenderScene():
|
|
|
238
241
|
speckle_path : Path | None
|
|
239
242
|
The filepath containing the speckle pattern image. If this is None,
|
|
240
243
|
there will be capability to generate a speckle pattern.
|
|
241
|
-
mat_data :
|
|
244
|
+
mat_data : pyvale.blender.MaterialData | None
|
|
242
245
|
A dataclass containin the material parameters. If this is None, it
|
|
243
246
|
is initialised within the method.
|
|
244
247
|
mm_px_resolution: float
|
|
@@ -249,15 +252,15 @@ class BlenderScene():
|
|
|
249
252
|
a Blender part object. When set to True, the part object is UV
|
|
250
253
|
unwrapped differently to ensure the correct scaling, by default False
|
|
251
254
|
"""
|
|
252
|
-
|
|
255
|
+
Tools.clear_material_nodes(part)
|
|
253
256
|
if mat_data is None:
|
|
254
|
-
mat_data =
|
|
257
|
+
mat_data = MaterialData()
|
|
255
258
|
if speckle_path.exists():
|
|
256
|
-
|
|
259
|
+
Tools.add_image_texture(mat_data=mat_data, image_path=speckle_path)
|
|
257
260
|
else:
|
|
258
261
|
speckle_pattern = np.array() # Generate speckle pattern array
|
|
259
|
-
|
|
260
|
-
|
|
262
|
+
Tools.add_image_texture(mat_data=mat_data, image_array=speckle_pattern)
|
|
263
|
+
Tools.uv_unwrap_part(part, mm_px_resolution, cal)
|
|
261
264
|
|
|
262
265
|
def _debug_deform(self,
|
|
263
266
|
render_mesh: RenderMesh,
|
|
@@ -286,8 +289,8 @@ class BlenderScene():
|
|
|
286
289
|
deformed_nodes = SimTools.get_deformed_nodes(timestep,
|
|
287
290
|
render_mesh)
|
|
288
291
|
if deformed_nodes is not None:
|
|
289
|
-
|
|
290
|
-
|
|
292
|
+
Tools.deform_single_timestep(part, deformed_nodes)
|
|
293
|
+
Tools.set_new_frame(part)
|
|
291
294
|
|
|
292
295
|
def render_single_image(self,
|
|
293
296
|
render_data: RenderData,
|
|
@@ -350,7 +353,7 @@ class BlenderScene():
|
|
|
350
353
|
bpy.context.scene.render.filepath = str(filepath)
|
|
351
354
|
if stage_image:
|
|
352
355
|
bpy.ops.render.render(write_still=True)
|
|
353
|
-
image_array =
|
|
356
|
+
image_array = Tools.save_render_as_array(filepath)
|
|
354
357
|
image_arrays.append(image_array)
|
|
355
358
|
else:
|
|
356
359
|
bpy.ops.render.render(write_still=True)
|
|
@@ -367,7 +370,7 @@ class BlenderScene():
|
|
|
367
370
|
bpy.context.scene.render.filepath = str(filepath)
|
|
368
371
|
if stage_image:
|
|
369
372
|
bpy.ops.render.render(write_still=True)
|
|
370
|
-
image_array =
|
|
373
|
+
image_array = Tools.save_render_as_array(filepath)
|
|
371
374
|
return image_array
|
|
372
375
|
else:
|
|
373
376
|
bpy.ops.render.render(write_still=True)
|
|
@@ -375,7 +378,7 @@ class BlenderScene():
|
|
|
375
378
|
def render_deformed_images(self,
|
|
376
379
|
render_mesh: RenderMesh,
|
|
377
380
|
sim_spat_dim: int,
|
|
378
|
-
render_data:RenderData,
|
|
381
|
+
render_data: RenderData,
|
|
379
382
|
part: bpy.data.objects,
|
|
380
383
|
stage_image: bool | None = True) -> None | np.ndarray:
|
|
381
384
|
"""A method to deform the mesh object at all timesteps, and render
|
|
@@ -439,8 +442,8 @@ class BlenderScene():
|
|
|
439
442
|
deformed_nodes = SimTools.get_deformed_nodes(timestep,
|
|
440
443
|
render_mesh)
|
|
441
444
|
if deformed_nodes is not None:
|
|
442
|
-
|
|
443
|
-
|
|
445
|
+
Tools.deform_single_timestep(part, deformed_nodes)
|
|
446
|
+
Tools.set_new_frame(part)
|
|
444
447
|
|
|
445
448
|
if isinstance(render_data.cam_data, tuple):
|
|
446
449
|
cam_count = 0
|
|
@@ -454,7 +457,7 @@ class BlenderScene():
|
|
|
454
457
|
bpy.context.scene.render.filepath = str(filepath)
|
|
455
458
|
if stage_image:
|
|
456
459
|
bpy.ops.render.render(write_still=True)
|
|
457
|
-
image_array =
|
|
460
|
+
image_array = Tools.save_render_as_array(filepath)
|
|
458
461
|
image_arrays.append(image_array)
|
|
459
462
|
else:
|
|
460
463
|
bpy.ops.render.render(write_still=True)
|
|
@@ -467,7 +470,7 @@ class BlenderScene():
|
|
|
467
470
|
bpy.context.scene.render.filepath = str(filepath)
|
|
468
471
|
if stage_image:
|
|
469
472
|
bpy.ops.render.render(write_still=True)
|
|
470
|
-
image_array =
|
|
473
|
+
image_array = Tools.save_render_as_array(filepath)
|
|
471
474
|
image_arrays.append(image_array)
|
|
472
475
|
else:
|
|
473
476
|
bpy.ops.render.render(write_still=True)
|
|
@@ -8,14 +8,18 @@ from pathlib import Path
|
|
|
8
8
|
from scipy.spatial.transform import Rotation
|
|
9
9
|
from PIL import Image
|
|
10
10
|
import bpy
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
from pyvale.
|
|
14
|
-
from pyvale.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
|
|
12
|
+
# Pyvale
|
|
13
|
+
from pyvale.sensorsim.cameratools import CameraTools
|
|
14
|
+
from pyvale.sensorsim.output import Outputs
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
from pyvale.blender.blenderexceptions import BlenderError
|
|
18
|
+
from pyvale.blender.blenderrenderdata import RenderEngine, RenderData
|
|
19
|
+
from pyvale.blender.blendermaterialdata import MaterialData
|
|
20
|
+
from pyvale.blender.blendercalibrationdata import CalibrationData
|
|
21
|
+
|
|
22
|
+
class Tools:
|
|
19
23
|
"""Namespace for tools used within the pyvale Blender module.
|
|
20
24
|
"""
|
|
21
25
|
|
|
@@ -146,7 +150,7 @@ class BlenderTools:
|
|
|
146
150
|
"""
|
|
147
151
|
if part.data.shape_keys is None:
|
|
148
152
|
part.shape_key_add()
|
|
149
|
-
|
|
153
|
+
Tools.set_new_frame(part)
|
|
150
154
|
shape_key = part.shape_key_add()
|
|
151
155
|
part.data.shape_keys.use_relative = False
|
|
152
156
|
|
|
@@ -207,7 +211,7 @@ class BlenderTools:
|
|
|
207
211
|
part.select_set(False)
|
|
208
212
|
|
|
209
213
|
@staticmethod
|
|
210
|
-
def add_image_texture(mat_data:
|
|
214
|
+
def add_image_texture(mat_data: MaterialData,
|
|
211
215
|
image_path: Path | None = None,
|
|
212
216
|
image_array: np.ndarray | None = None) -> None:
|
|
213
217
|
"""A method to add an image texture to a Blender object, this will
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#===============================================================================
|
|
2
|
+
# pyvale: the python validation engine
|
|
3
|
+
# License: MIT
|
|
4
|
+
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
+
#===============================================================================
|
|
6
|
+
|
|
7
|
+
from .dataset import *
|