pyvale 2025.7.2__cp311-cp311-win32.whl → 2025.8.1__cp311-cp311-win32.whl
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/__init__.py +12 -92
- pyvale/blender/__init__.py +23 -0
- pyvale/{pyvaleexceptions.py → blender/blenderexceptions.py} +0 -3
- pyvale/{blenderlightdata.py → blender/blenderlightdata.py} +3 -3
- pyvale/{blendermaterialdata.py → blender/blendermaterialdata.py} +1 -1
- pyvale/{blenderrenderdata.py → blender/blenderrenderdata.py} +5 -3
- pyvale/{blenderscene.py → blender/blenderscene.py} +33 -30
- pyvale/{blendertools.py → blender/blendertools.py} +14 -10
- pyvale/dataset/__init__.py +7 -0
- pyvale/dataset/dataset.py +443 -0
- pyvale/dic/__init__.py +20 -0
- pyvale/{dic2d.py → dic/dic2d.py} +31 -36
- pyvale/dic/dic2dconv.py +6 -0
- pyvale/{dic2dcpp.cp311-win32.pyd → dic/dic2dcpp.cp311-win32.pyd} +0 -0
- pyvale/{dicdataimport.py → dic/dicdataimport.py} +8 -8
- pyvale/{dicregionofinterest.py → dic/dicregionofinterest.py} +1 -1
- pyvale/{dicresults.py → dic/dicresults.py} +1 -1
- pyvale/{dicstrain.py → dic/dicstrain.py} +9 -9
- pyvale/examples/basics/{ex1_1_basicscalars_therm2d.py → ex1a_basicscalars_therm2d.py} +12 -9
- pyvale/examples/basics/{ex1_2_sensormodel_therm2d.py → ex1b_sensormodel_therm2d.py} +17 -14
- pyvale/examples/basics/{ex1_3_customsens_therm3d.py → ex1c_customsens_therm3d.py} +27 -24
- pyvale/examples/basics/{ex1_4_basicerrors_therm3d.py → ex1d_basicerrors_therm3d.py} +32 -29
- pyvale/examples/basics/{ex1_5_fielderrs_therm3d.py → ex1e_fielderrs_therm3d.py} +19 -15
- pyvale/examples/basics/{ex1_6_caliberrs_therm2d.py → ex1f_caliberrs_therm2d.py} +20 -16
- pyvale/examples/basics/{ex1_7_spatavg_therm2d.py → ex1g_spatavg_therm2d.py} +19 -16
- pyvale/examples/basics/{ex2_1_basicvectors_disp2d.py → ex2a_basicvectors_disp2d.py} +13 -10
- pyvale/examples/basics/{ex2_2_vectorsens_disp2d.py → ex2b_vectorsens_disp2d.py} +19 -15
- pyvale/examples/basics/{ex2_3_sensangle_disp2d.py → ex2c_sensangle_disp2d.py} +21 -18
- pyvale/examples/basics/{ex2_4_chainfielderrs_disp2d.py → ex2d_chainfielderrs_disp2d.py} +31 -29
- pyvale/examples/basics/{ex2_5_vectorfields3d_disp3d.py → ex2e_vectorfields3d_disp3d.py} +21 -18
- pyvale/examples/basics/{ex3_1_basictensors_strain2d.py → ex3a_basictensors_strain2d.py} +16 -14
- pyvale/examples/basics/{ex3_2_tensorsens2d_strain2d.py → ex3b_tensorsens2d_strain2d.py} +17 -14
- pyvale/examples/basics/{ex3_3_tensorsens3d_strain3d.py → ex3c_tensorsens3d_strain3d.py} +25 -22
- pyvale/examples/basics/{ex4_1_expsim2d_thermmech2d.py → ex4a_expsim2d_thermmech2d.py} +17 -14
- pyvale/examples/basics/{ex4_2_expsim3d_thermmech3d.py → ex4b_expsim3d_thermmech3d.py} +37 -34
- pyvale/examples/basics/ex5_nomesh.py +24 -0
- pyvale/examples/dic/ex1_2_blenderdeformed.py +174 -0
- pyvale/examples/dic/ex1_region_of_interest.py +6 -3
- pyvale/examples/dic/ex2_plate_with_hole.py +21 -18
- pyvale/examples/dic/ex3_plate_with_hole_strain.py +8 -6
- pyvale/examples/dic/ex4_dic_blender.py +17 -15
- pyvale/examples/dic/ex5_dic_challenge.py +19 -14
- pyvale/examples/genanalyticdata/ex1_1_scalarvisualisation.py +16 -10
- pyvale/examples/genanalyticdata/ex1_2_scalarcasebuild.py +3 -3
- pyvale/examples/genanalyticdata/ex2_1_analyticsensors.py +29 -23
- pyvale/examples/genanalyticdata/ex2_2_analyticsensors_nomesh.py +67 -0
- pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +12 -9
- pyvale/examples/mooseherder/ex0_create_moose_config.py +65 -0
- pyvale/examples/mooseherder/ex1a_modify_moose_input.py +71 -0
- pyvale/examples/mooseherder/ex1b_modify_gmsh_input.py +69 -0
- pyvale/examples/mooseherder/ex2a_run_moose_once.py +80 -0
- pyvale/examples/mooseherder/ex2b_run_gmsh_once.py +64 -0
- pyvale/examples/mooseherder/ex2c_run_both_once.py +114 -0
- pyvale/examples/mooseherder/ex3_run_moose_seq_para.py +157 -0
- pyvale/examples/mooseherder/ex4_run_gmsh-moose_seq_para.py +176 -0
- pyvale/examples/mooseherder/ex5_run_moose_paramulti.py +136 -0
- pyvale/examples/mooseherder/ex6_read_moose_exodus.py +163 -0
- pyvale/examples/mooseherder/ex7a_read_moose_herd_results.py +153 -0
- pyvale/examples/mooseherder/ex7b_read_multi_herd_results.py +116 -0
- pyvale/examples/mooseherder/ex7c_read_multi_gmshmoose_results.py +127 -0
- pyvale/examples/mooseherder/ex7d_readconfig_multi_gmshmoose_results.py +143 -0
- pyvale/examples/mooseherder/ex8_read_existing_sweep_output.py +72 -0
- pyvale/examples/renderblender/ex1_1_blenderscene.py +24 -20
- pyvale/examples/renderblender/ex1_2_blenderdeformed.py +22 -18
- pyvale/examples/renderblender/ex2_1_stereoscene.py +36 -29
- pyvale/examples/renderblender/ex2_2_stereodeformed.py +26 -20
- pyvale/examples/renderblender/ex3_1_blendercalibration.py +24 -17
- pyvale/examples/renderrasterisation/ex_rastenp.py +14 -12
- pyvale/examples/renderrasterisation/ex_rastercyth_oneframe.py +14 -15
- pyvale/examples/renderrasterisation/ex_rastercyth_static_cypara.py +13 -11
- pyvale/examples/renderrasterisation/ex_rastercyth_static_pypara.py +13 -11
- pyvale/mooseherder/__init__.py +32 -0
- pyvale/mooseherder/directorymanager.py +416 -0
- pyvale/mooseherder/exodusreader.py +763 -0
- pyvale/mooseherder/gmshrunner.py +163 -0
- pyvale/mooseherder/inputmodifier.py +236 -0
- pyvale/mooseherder/mooseconfig.py +226 -0
- pyvale/mooseherder/mooseherd.py +527 -0
- pyvale/mooseherder/mooserunner.py +303 -0
- pyvale/mooseherder/outputreader.py +22 -0
- pyvale/mooseherder/simdata.py +92 -0
- pyvale/mooseherder/simrunner.py +31 -0
- pyvale/mooseherder/sweepreader.py +356 -0
- pyvale/mooseherder/sweeptools.py +76 -0
- pyvale/sensorsim/__init__.py +82 -0
- pyvale/{camera.py → sensorsim/camera.py} +7 -7
- pyvale/{camerasensor.py → sensorsim/camerasensor.py} +7 -7
- pyvale/{camerastereo.py → sensorsim/camerastereo.py} +2 -2
- pyvale/{cameratools.py → sensorsim/cameratools.py} +4 -4
- pyvale/{cython → sensorsim/cython}/rastercyth.c +596 -596
- pyvale/{cython → sensorsim/cython}/rastercyth.cp311-win32.pyd +0 -0
- pyvale/{cython → sensorsim/cython}/rastercyth.py +16 -17
- pyvale/{errorcalculator.py → sensorsim/errorcalculator.py} +1 -1
- pyvale/{errorintegrator.py → sensorsim/errorintegrator.py} +2 -2
- pyvale/{errorrand.py → sensorsim/errorrand.py} +4 -4
- pyvale/{errorsyscalib.py → sensorsim/errorsyscalib.py} +2 -2
- pyvale/{errorsysdep.py → sensorsim/errorsysdep.py} +2 -2
- pyvale/{errorsysfield.py → sensorsim/errorsysfield.py} +8 -8
- pyvale/{errorsysindep.py → sensorsim/errorsysindep.py} +3 -3
- pyvale/sensorsim/exceptions.py +8 -0
- pyvale/{experimentsimulator.py → sensorsim/experimentsimulator.py} +23 -3
- pyvale/{field.py → sensorsim/field.py} +1 -1
- pyvale/{fieldconverter.py → sensorsim/fieldconverter.py} +72 -19
- pyvale/sensorsim/fieldinterp.py +37 -0
- pyvale/sensorsim/fieldinterpmesh.py +124 -0
- pyvale/sensorsim/fieldinterppoints.py +55 -0
- pyvale/{fieldsampler.py → sensorsim/fieldsampler.py} +4 -4
- pyvale/{fieldscalar.py → sensorsim/fieldscalar.py} +28 -24
- pyvale/{fieldtensor.py → sensorsim/fieldtensor.py} +33 -31
- pyvale/{fieldvector.py → sensorsim/fieldvector.py} +33 -31
- pyvale/{imagedef2d.py → sensorsim/imagedef2d.py} +9 -5
- pyvale/{integratorfactory.py → sensorsim/integratorfactory.py} +6 -6
- pyvale/{integratorquadrature.py → sensorsim/integratorquadrature.py} +3 -3
- pyvale/{integratorrectangle.py → sensorsim/integratorrectangle.py} +3 -3
- pyvale/{integratorspatial.py → sensorsim/integratorspatial.py} +1 -1
- pyvale/{rastercy.py → sensorsim/rastercy.py} +5 -5
- pyvale/{rasternp.py → sensorsim/rasternp.py} +9 -9
- pyvale/{rasteropts.py → sensorsim/rasteropts.py} +1 -1
- pyvale/{renderer.py → sensorsim/renderer.py} +1 -1
- pyvale/{rendermesh.py → sensorsim/rendermesh.py} +5 -5
- pyvale/{renderscene.py → sensorsim/renderscene.py} +2 -2
- pyvale/{sensorarray.py → sensorsim/sensorarray.py} +1 -1
- pyvale/{sensorarrayfactory.py → sensorsim/sensorarrayfactory.py} +12 -12
- pyvale/{sensorarraypoint.py → sensorsim/sensorarraypoint.py} +10 -8
- pyvale/{sensordata.py → sensorsim/sensordata.py} +1 -1
- pyvale/{sensortools.py → sensorsim/sensortools.py} +2 -20
- pyvale/sensorsim/simtools.py +174 -0
- pyvale/{visualexpplotter.py → sensorsim/visualexpplotter.py} +3 -3
- pyvale/{visualimages.py → sensorsim/visualimages.py} +2 -2
- pyvale/{visualsimanimator.py → sensorsim/visualsimanimator.py} +4 -4
- pyvale/{visualsimplotter.py → sensorsim/visualsimplotter.py} +5 -5
- pyvale/{visualsimsensors.py → sensorsim/visualsimsensors.py} +12 -12
- pyvale/{visualtools.py → sensorsim/visualtools.py} +1 -1
- pyvale/{visualtraceplotter.py → sensorsim/visualtraceplotter.py} +2 -2
- pyvale/simcases/case17.geo +3 -0
- pyvale/simcases/case17.i +4 -4
- pyvale/simcases/run_1case.py +1 -9
- pyvale/simcases/run_all_cases.py +1 -1
- pyvale/simcases/run_build_case.py +1 -1
- pyvale/simcases/run_example_cases.py +1 -1
- pyvale/verif/__init__.py +12 -0
- pyvale/{analyticsimdatafactory.py → verif/analyticsimdatafactory.py} +2 -2
- pyvale/{analyticsimdatagenerator.py → verif/analyticsimdatagenerator.py} +2 -2
- pyvale/verif/psens.py +125 -0
- pyvale/verif/psensconst.py +18 -0
- pyvale/verif/psensmech.py +227 -0
- pyvale/verif/psensmultiphys.py +187 -0
- pyvale/verif/psensscalar.py +347 -0
- pyvale/verif/psenstensor.py +123 -0
- pyvale/verif/psensvector.py +116 -0
- {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/METADATA +6 -7
- pyvale-2025.8.1.dist-info/RECORD +260 -0
- pyvale/dataset.py +0 -415
- pyvale/simtools.py +0 -67
- pyvale-2025.7.2.dist-info/RECORD +0 -212
- /pyvale/{blendercalibrationdata.py → blender/blendercalibrationdata.py} +0 -0
- /pyvale/{dicchecks.py → dic/dicchecks.py} +0 -0
- /pyvale/{dicspecklegenerator.py → dic/dicspecklegenerator.py} +0 -0
- /pyvale/{dicspecklequality.py → dic/dicspecklequality.py} +0 -0
- /pyvale/{dicstrainresults.py → dic/dicstrainresults.py} +0 -0
- /pyvale/{cameradata.py → sensorsim/cameradata.py} +0 -0
- /pyvale/{cameradata2d.py → sensorsim/cameradata2d.py} +0 -0
- /pyvale/{errordriftcalc.py → sensorsim/errordriftcalc.py} +0 -0
- /pyvale/{fieldtransform.py → sensorsim/fieldtransform.py} +0 -0
- /pyvale/{generatorsrandom.py → sensorsim/generatorsrandom.py} +0 -0
- /pyvale/{imagetools.py → sensorsim/imagetools.py} +0 -0
- /pyvale/{integratortype.py → sensorsim/integratortype.py} +0 -0
- /pyvale/{output.py → sensorsim/output.py} +0 -0
- /pyvale/{raster.py → sensorsim/raster.py} +0 -0
- /pyvale/{sensordescriptor.py → sensorsim/sensordescriptor.py} +0 -0
- /pyvale/{visualimagedef.py → sensorsim/visualimagedef.py} +0 -0
- /pyvale/{visualopts.py → sensorsim/visualopts.py} +0 -0
- /pyvale/{analyticmeshgen.py → verif/analyticmeshgen.py} +0 -0
- {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/WHEEL +0 -0
- {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/licenses/LICENSE +0 -0
- {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/top_level.txt +0 -0
pyvale/__init__.py
CHANGED
|
@@ -5,97 +5,17 @@
|
|
|
5
5
|
# ==============================================================================
|
|
6
6
|
|
|
7
7
|
"""
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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.
|
|
12
15
|
"""
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
from pyvale.dataset import *
|
|
20
|
-
|
|
21
|
-
from pyvale.field import *
|
|
22
|
-
from pyvale.fieldscalar import *
|
|
23
|
-
from pyvale.fieldvector import *
|
|
24
|
-
from pyvale.fieldtensor import *
|
|
25
|
-
from pyvale.fieldconverter import *
|
|
26
|
-
from pyvale.fieldtransform import *
|
|
27
|
-
|
|
28
|
-
from pyvale.integratorspatial import *
|
|
29
|
-
from pyvale.integratorquadrature import *
|
|
30
|
-
from pyvale.integratorrectangle import *
|
|
31
|
-
from pyvale.integratorfactory import *
|
|
32
|
-
|
|
33
|
-
from pyvale.sensordescriptor import *
|
|
34
|
-
from pyvale.sensortools import *
|
|
35
|
-
from pyvale.sensorarray import *
|
|
36
|
-
from pyvale.sensorarrayfactory import *
|
|
37
|
-
from pyvale.sensorarraypoint import *
|
|
38
|
-
from pyvale.sensordata import *
|
|
39
|
-
|
|
40
|
-
from pyvale.camera import *
|
|
41
|
-
from pyvale.cameradata import *
|
|
42
|
-
from pyvale.cameradata2d import *
|
|
43
|
-
from pyvale.cameratools import *
|
|
44
|
-
from pyvale.camerastereo import *
|
|
45
|
-
|
|
46
|
-
import pyvale.cython.rastercyth as rastercyth
|
|
47
|
-
from pyvale.rastercy import *
|
|
48
|
-
|
|
49
|
-
from pyvale.renderscene import *
|
|
50
|
-
from pyvale.rendermesh import *
|
|
51
|
-
from pyvale.rasternp import *
|
|
52
|
-
|
|
53
|
-
from pyvale.imagedef2d import *
|
|
54
|
-
|
|
55
|
-
from pyvale.errorintegrator import *
|
|
56
|
-
from pyvale.errorrand import *
|
|
57
|
-
from pyvale.errorsysindep import *
|
|
58
|
-
from pyvale.errorsysdep import *
|
|
59
|
-
from pyvale.errorsysfield import *
|
|
60
|
-
from pyvale.errorsyscalib import *
|
|
61
|
-
from pyvale.errordriftcalc import *
|
|
62
|
-
|
|
63
|
-
from pyvale.generatorsrandom import *
|
|
64
|
-
|
|
65
|
-
from pyvale.visualopts import *
|
|
66
|
-
from pyvale.visualtools import *
|
|
67
|
-
from pyvale.visualsimsensors import *
|
|
68
|
-
from pyvale.visualsimanimator import *
|
|
69
|
-
from pyvale.visualexpplotter import *
|
|
70
|
-
from pyvale.visualtraceplotter import *
|
|
71
|
-
from pyvale.visualimages import *
|
|
72
|
-
from pyvale.visualimagedef import *
|
|
73
|
-
|
|
74
|
-
from pyvale.analyticmeshgen import *
|
|
75
|
-
from pyvale.analyticsimdatagenerator import *
|
|
76
|
-
from pyvale.analyticsimdatafactory import *
|
|
77
|
-
|
|
78
|
-
from pyvale.experimentsimulator import *
|
|
79
|
-
|
|
80
|
-
from pyvale.blendercalibrationdata import *
|
|
81
|
-
from pyvale.blenderlightdata import *
|
|
82
|
-
from pyvale.blendermaterialdata import *
|
|
83
|
-
from pyvale.blenderrenderdata import *
|
|
84
|
-
from pyvale.blenderscene import *
|
|
85
|
-
from pyvale.blendertools import *
|
|
86
|
-
from pyvale.simtools import *
|
|
87
|
-
|
|
88
|
-
from pyvale.output import *
|
|
89
|
-
from pyvale.pyvaleexceptions import *
|
|
90
|
-
|
|
91
|
-
from pyvale.experimentsimulator import *
|
|
92
|
-
|
|
93
|
-
from pyvale.dicspecklegenerator import *
|
|
94
|
-
from pyvale.dicspecklequality import *
|
|
95
|
-
from pyvale.dicregionofinterest import *
|
|
96
|
-
from pyvale.dic2d import *
|
|
97
|
-
from pyvale.dicdataimport import *
|
|
98
|
-
from pyvale.dicresults import *
|
|
99
|
-
from pyvale.dic2dcpp import *
|
|
100
|
-
from pyvale.dicstrain import *
|
|
101
|
-
from pyvale.dicchecks import *
|
|
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 *
|