pyvale 2025.7.2__cp311-cp311-macosx_13_0_x86_64.whl → 2025.8.1__cp311-cp311-macosx_13_0_x86_64.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.

Files changed (177) hide show
  1. pyvale/__init__.py +12 -92
  2. pyvale/blender/__init__.py +23 -0
  3. pyvale/{pyvaleexceptions.py → blender/blenderexceptions.py} +0 -3
  4. pyvale/{blenderlightdata.py → blender/blenderlightdata.py} +3 -3
  5. pyvale/{blendermaterialdata.py → blender/blendermaterialdata.py} +1 -1
  6. pyvale/{blenderrenderdata.py → blender/blenderrenderdata.py} +5 -3
  7. pyvale/{blenderscene.py → blender/blenderscene.py} +33 -30
  8. pyvale/{blendertools.py → blender/blendertools.py} +14 -10
  9. pyvale/dataset/__init__.py +7 -0
  10. pyvale/dataset/dataset.py +443 -0
  11. pyvale/dic/__init__.py +20 -0
  12. pyvale/{dic2d.py → dic/dic2d.py} +31 -36
  13. pyvale/dic/dic2dconv.py +6 -0
  14. pyvale/{dic2dcpp.cpython-311-darwin.so → dic/dic2dcpp.cpython-311-darwin.so} +0 -0
  15. pyvale/{dicdataimport.py → dic/dicdataimport.py} +8 -8
  16. pyvale/{dicregionofinterest.py → dic/dicregionofinterest.py} +1 -1
  17. pyvale/{dicresults.py → dic/dicresults.py} +1 -1
  18. pyvale/{dicstrain.py → dic/dicstrain.py} +9 -9
  19. pyvale/examples/basics/{ex1_1_basicscalars_therm2d.py → ex1a_basicscalars_therm2d.py} +12 -9
  20. pyvale/examples/basics/{ex1_2_sensormodel_therm2d.py → ex1b_sensormodel_therm2d.py} +17 -14
  21. pyvale/examples/basics/{ex1_3_customsens_therm3d.py → ex1c_customsens_therm3d.py} +27 -24
  22. pyvale/examples/basics/{ex1_4_basicerrors_therm3d.py → ex1d_basicerrors_therm3d.py} +32 -29
  23. pyvale/examples/basics/{ex1_5_fielderrs_therm3d.py → ex1e_fielderrs_therm3d.py} +19 -15
  24. pyvale/examples/basics/{ex1_6_caliberrs_therm2d.py → ex1f_caliberrs_therm2d.py} +20 -16
  25. pyvale/examples/basics/{ex1_7_spatavg_therm2d.py → ex1g_spatavg_therm2d.py} +19 -16
  26. pyvale/examples/basics/{ex2_1_basicvectors_disp2d.py → ex2a_basicvectors_disp2d.py} +13 -10
  27. pyvale/examples/basics/{ex2_2_vectorsens_disp2d.py → ex2b_vectorsens_disp2d.py} +19 -15
  28. pyvale/examples/basics/{ex2_3_sensangle_disp2d.py → ex2c_sensangle_disp2d.py} +21 -18
  29. pyvale/examples/basics/{ex2_4_chainfielderrs_disp2d.py → ex2d_chainfielderrs_disp2d.py} +31 -29
  30. pyvale/examples/basics/{ex2_5_vectorfields3d_disp3d.py → ex2e_vectorfields3d_disp3d.py} +21 -18
  31. pyvale/examples/basics/{ex3_1_basictensors_strain2d.py → ex3a_basictensors_strain2d.py} +16 -14
  32. pyvale/examples/basics/{ex3_2_tensorsens2d_strain2d.py → ex3b_tensorsens2d_strain2d.py} +17 -14
  33. pyvale/examples/basics/{ex3_3_tensorsens3d_strain3d.py → ex3c_tensorsens3d_strain3d.py} +25 -22
  34. pyvale/examples/basics/{ex4_1_expsim2d_thermmech2d.py → ex4a_expsim2d_thermmech2d.py} +17 -14
  35. pyvale/examples/basics/{ex4_2_expsim3d_thermmech3d.py → ex4b_expsim3d_thermmech3d.py} +37 -34
  36. pyvale/examples/basics/ex5_nomesh.py +24 -0
  37. pyvale/examples/dic/ex1_2_blenderdeformed.py +174 -0
  38. pyvale/examples/dic/ex1_region_of_interest.py +6 -3
  39. pyvale/examples/dic/ex2_plate_with_hole.py +21 -18
  40. pyvale/examples/dic/ex3_plate_with_hole_strain.py +8 -6
  41. pyvale/examples/dic/ex4_dic_blender.py +17 -15
  42. pyvale/examples/dic/ex5_dic_challenge.py +19 -14
  43. pyvale/examples/genanalyticdata/ex1_1_scalarvisualisation.py +16 -10
  44. pyvale/examples/genanalyticdata/ex1_2_scalarcasebuild.py +3 -3
  45. pyvale/examples/genanalyticdata/ex2_1_analyticsensors.py +29 -23
  46. pyvale/examples/genanalyticdata/ex2_2_analyticsensors_nomesh.py +67 -0
  47. pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +12 -9
  48. pyvale/examples/mooseherder/ex0_create_moose_config.py +65 -0
  49. pyvale/examples/mooseherder/ex1a_modify_moose_input.py +71 -0
  50. pyvale/examples/mooseherder/ex1b_modify_gmsh_input.py +69 -0
  51. pyvale/examples/mooseherder/ex2a_run_moose_once.py +80 -0
  52. pyvale/examples/mooseherder/ex2b_run_gmsh_once.py +64 -0
  53. pyvale/examples/mooseherder/ex2c_run_both_once.py +114 -0
  54. pyvale/examples/mooseherder/ex3_run_moose_seq_para.py +157 -0
  55. pyvale/examples/mooseherder/ex4_run_gmsh-moose_seq_para.py +176 -0
  56. pyvale/examples/mooseherder/ex5_run_moose_paramulti.py +136 -0
  57. pyvale/examples/mooseherder/ex6_read_moose_exodus.py +163 -0
  58. pyvale/examples/mooseherder/ex7a_read_moose_herd_results.py +153 -0
  59. pyvale/examples/mooseherder/ex7b_read_multi_herd_results.py +116 -0
  60. pyvale/examples/mooseherder/ex7c_read_multi_gmshmoose_results.py +127 -0
  61. pyvale/examples/mooseherder/ex7d_readconfig_multi_gmshmoose_results.py +143 -0
  62. pyvale/examples/mooseherder/ex8_read_existing_sweep_output.py +72 -0
  63. pyvale/examples/renderblender/ex1_1_blenderscene.py +24 -20
  64. pyvale/examples/renderblender/ex1_2_blenderdeformed.py +22 -18
  65. pyvale/examples/renderblender/ex2_1_stereoscene.py +36 -29
  66. pyvale/examples/renderblender/ex2_2_stereodeformed.py +26 -20
  67. pyvale/examples/renderblender/ex3_1_blendercalibration.py +24 -17
  68. pyvale/examples/renderrasterisation/ex_rastenp.py +14 -12
  69. pyvale/examples/renderrasterisation/ex_rastercyth_oneframe.py +14 -15
  70. pyvale/examples/renderrasterisation/ex_rastercyth_static_cypara.py +13 -11
  71. pyvale/examples/renderrasterisation/ex_rastercyth_static_pypara.py +13 -11
  72. pyvale/mooseherder/__init__.py +32 -0
  73. pyvale/mooseherder/directorymanager.py +416 -0
  74. pyvale/mooseherder/exodusreader.py +763 -0
  75. pyvale/mooseherder/gmshrunner.py +163 -0
  76. pyvale/mooseherder/inputmodifier.py +236 -0
  77. pyvale/mooseherder/mooseconfig.py +226 -0
  78. pyvale/mooseherder/mooseherd.py +527 -0
  79. pyvale/mooseherder/mooserunner.py +303 -0
  80. pyvale/mooseherder/outputreader.py +22 -0
  81. pyvale/mooseherder/simdata.py +92 -0
  82. pyvale/mooseherder/simrunner.py +31 -0
  83. pyvale/mooseherder/sweepreader.py +356 -0
  84. pyvale/mooseherder/sweeptools.py +76 -0
  85. pyvale/sensorsim/__init__.py +82 -0
  86. pyvale/{camera.py → sensorsim/camera.py} +7 -7
  87. pyvale/{camerasensor.py → sensorsim/camerasensor.py} +7 -7
  88. pyvale/{camerastereo.py → sensorsim/camerastereo.py} +2 -2
  89. pyvale/{cameratools.py → sensorsim/cameratools.py} +4 -4
  90. pyvale/{cython → sensorsim/cython}/rastercyth.c +596 -596
  91. pyvale/sensorsim/cython/rastercyth.cpython-311-darwin.so +0 -0
  92. pyvale/{cython → sensorsim/cython}/rastercyth.py +16 -17
  93. pyvale/{errorcalculator.py → sensorsim/errorcalculator.py} +1 -1
  94. pyvale/{errorintegrator.py → sensorsim/errorintegrator.py} +2 -2
  95. pyvale/{errorrand.py → sensorsim/errorrand.py} +4 -4
  96. pyvale/{errorsyscalib.py → sensorsim/errorsyscalib.py} +2 -2
  97. pyvale/{errorsysdep.py → sensorsim/errorsysdep.py} +2 -2
  98. pyvale/{errorsysfield.py → sensorsim/errorsysfield.py} +8 -8
  99. pyvale/{errorsysindep.py → sensorsim/errorsysindep.py} +3 -3
  100. pyvale/sensorsim/exceptions.py +8 -0
  101. pyvale/{experimentsimulator.py → sensorsim/experimentsimulator.py} +23 -3
  102. pyvale/{field.py → sensorsim/field.py} +1 -1
  103. pyvale/{fieldconverter.py → sensorsim/fieldconverter.py} +72 -19
  104. pyvale/sensorsim/fieldinterp.py +37 -0
  105. pyvale/sensorsim/fieldinterpmesh.py +124 -0
  106. pyvale/sensorsim/fieldinterppoints.py +55 -0
  107. pyvale/{fieldsampler.py → sensorsim/fieldsampler.py} +4 -4
  108. pyvale/{fieldscalar.py → sensorsim/fieldscalar.py} +28 -24
  109. pyvale/{fieldtensor.py → sensorsim/fieldtensor.py} +33 -31
  110. pyvale/{fieldvector.py → sensorsim/fieldvector.py} +33 -31
  111. pyvale/{imagedef2d.py → sensorsim/imagedef2d.py} +9 -5
  112. pyvale/{integratorfactory.py → sensorsim/integratorfactory.py} +6 -6
  113. pyvale/{integratorquadrature.py → sensorsim/integratorquadrature.py} +3 -3
  114. pyvale/{integratorrectangle.py → sensorsim/integratorrectangle.py} +3 -3
  115. pyvale/{integratorspatial.py → sensorsim/integratorspatial.py} +1 -1
  116. pyvale/{rastercy.py → sensorsim/rastercy.py} +5 -5
  117. pyvale/{rasternp.py → sensorsim/rasternp.py} +9 -9
  118. pyvale/{rasteropts.py → sensorsim/rasteropts.py} +1 -1
  119. pyvale/{renderer.py → sensorsim/renderer.py} +1 -1
  120. pyvale/{rendermesh.py → sensorsim/rendermesh.py} +5 -5
  121. pyvale/{renderscene.py → sensorsim/renderscene.py} +2 -2
  122. pyvale/{sensorarray.py → sensorsim/sensorarray.py} +1 -1
  123. pyvale/{sensorarrayfactory.py → sensorsim/sensorarrayfactory.py} +12 -12
  124. pyvale/{sensorarraypoint.py → sensorsim/sensorarraypoint.py} +10 -8
  125. pyvale/{sensordata.py → sensorsim/sensordata.py} +1 -1
  126. pyvale/{sensortools.py → sensorsim/sensortools.py} +2 -20
  127. pyvale/sensorsim/simtools.py +174 -0
  128. pyvale/{visualexpplotter.py → sensorsim/visualexpplotter.py} +3 -3
  129. pyvale/{visualimages.py → sensorsim/visualimages.py} +2 -2
  130. pyvale/{visualsimanimator.py → sensorsim/visualsimanimator.py} +4 -4
  131. pyvale/{visualsimplotter.py → sensorsim/visualsimplotter.py} +5 -5
  132. pyvale/{visualsimsensors.py → sensorsim/visualsimsensors.py} +12 -12
  133. pyvale/{visualtools.py → sensorsim/visualtools.py} +1 -1
  134. pyvale/{visualtraceplotter.py → sensorsim/visualtraceplotter.py} +2 -2
  135. pyvale/simcases/case17.geo +3 -0
  136. pyvale/simcases/case17.i +4 -4
  137. pyvale/simcases/run_1case.py +1 -9
  138. pyvale/simcases/run_all_cases.py +1 -1
  139. pyvale/simcases/run_build_case.py +1 -1
  140. pyvale/simcases/run_example_cases.py +1 -1
  141. pyvale/verif/__init__.py +12 -0
  142. pyvale/{analyticsimdatafactory.py → verif/analyticsimdatafactory.py} +2 -2
  143. pyvale/{analyticsimdatagenerator.py → verif/analyticsimdatagenerator.py} +2 -2
  144. pyvale/verif/psens.py +125 -0
  145. pyvale/verif/psensconst.py +18 -0
  146. pyvale/verif/psensmech.py +227 -0
  147. pyvale/verif/psensmultiphys.py +187 -0
  148. pyvale/verif/psensscalar.py +347 -0
  149. pyvale/verif/psenstensor.py +123 -0
  150. pyvale/verif/psensvector.py +116 -0
  151. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/METADATA +6 -7
  152. pyvale-2025.8.1.dist-info/RECORD +262 -0
  153. pyvale/cython/rastercyth.cpython-311-darwin.so +0 -0
  154. pyvale/dataset.py +0 -415
  155. pyvale/simtools.py +0 -67
  156. pyvale-2025.7.2.dist-info/RECORD +0 -214
  157. /pyvale/{blendercalibrationdata.py → blender/blendercalibrationdata.py} +0 -0
  158. /pyvale/{dicchecks.py → dic/dicchecks.py} +0 -0
  159. /pyvale/{dicspecklegenerator.py → dic/dicspecklegenerator.py} +0 -0
  160. /pyvale/{dicspecklequality.py → dic/dicspecklequality.py} +0 -0
  161. /pyvale/{dicstrainresults.py → dic/dicstrainresults.py} +0 -0
  162. /pyvale/{cameradata.py → sensorsim/cameradata.py} +0 -0
  163. /pyvale/{cameradata2d.py → sensorsim/cameradata2d.py} +0 -0
  164. /pyvale/{errordriftcalc.py → sensorsim/errordriftcalc.py} +0 -0
  165. /pyvale/{fieldtransform.py → sensorsim/fieldtransform.py} +0 -0
  166. /pyvale/{generatorsrandom.py → sensorsim/generatorsrandom.py} +0 -0
  167. /pyvale/{imagetools.py → sensorsim/imagetools.py} +0 -0
  168. /pyvale/{integratortype.py → sensorsim/integratortype.py} +0 -0
  169. /pyvale/{output.py → sensorsim/output.py} +0 -0
  170. /pyvale/{raster.py → sensorsim/raster.py} +0 -0
  171. /pyvale/{sensordescriptor.py → sensorsim/sensordescriptor.py} +0 -0
  172. /pyvale/{visualimagedef.py → sensorsim/visualimagedef.py} +0 -0
  173. /pyvale/{visualopts.py → sensorsim/visualopts.py} +0 -0
  174. /pyvale/{analyticmeshgen.py → verif/analyticmeshgen.py} +0 -0
  175. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/WHEEL +0 -0
  176. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/licenses/LICENSE +0 -0
  177. {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
- `pyvale`: the python validation engine. Used to simulate experimental data from
9
- an input multi-physics simulation by explicitly modelling sensors with realistic
10
- uncertainties. Useful for experimental design, sensor placement optimisation,
11
- testing simulation validation metrics and testing digital shadows/twins.
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
- # NOTE: this simplifies and decouples how the user calls pyvale from the
15
- # underlying project structure: the user should be able to use 'pyvale.'
16
- # and access everything in one layer without multiple import dots
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"]
@@ -6,6 +6,3 @@
6
6
 
7
7
  class BlenderError(Exception):
8
8
  pass
9
-
10
- class VisError(Exception):
11
- pass
@@ -10,17 +10,17 @@ from scipy.spatial.transform import Rotation
10
10
 
11
11
  #TODO: docstrings
12
12
 
13
- class BlenderLightType(Enum):
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 BlenderLightData():
20
+ class LightData():
21
21
  pos_world: np.ndarray
22
22
  rot_world: Rotation
23
23
  energy: int # NOTE: In Watts
24
- type: BlenderLightType = BlenderLightType.POINT
24
+ type: LightType = LightType.POINT
25
25
  shadow_soft_size: float = 1.5
26
26
 
@@ -8,7 +8,7 @@ from dataclasses import dataclass
8
8
  #TODO: docstrings
9
9
 
10
10
  @dataclass(slots=True)
11
- class BlenderMaterialData():
11
+ class MaterialData():
12
12
  # TODO: Add other material properties here
13
13
  roughness: float = 1.0
14
14
  metallic: float = 0.0
@@ -7,8 +7,10 @@
7
7
  from enum import Enum
8
8
  from dataclasses import dataclass
9
9
  from pathlib import Path
10
- from pyvale.cameradata import CameraData
11
- from pyvale.output import Outputs
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
- from pyvale.cameradata import CameraData
10
- from pyvale.blenderlightdata import BlenderLightData
11
- from pyvale.blendertools import BlenderTools
12
- from pyvale.simtools import SimTools
13
- from pyvale.blendermaterialdata import BlenderMaterialData
14
- from pyvale.blenderrenderdata import RenderData, RenderEngine
15
- from pyvale.camerastereo import CameraStereo
16
- from pyvale.rendermesh import RenderMesh
17
- from pyvale.pyvaleexceptions import BlenderError
18
-
19
-
20
- class BlenderScene():
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: BlenderLightData) -> bpy.data.objects:
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 : BlenderLightData
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: BlenderMaterialData | None,
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 : BlenderMaterialData | None
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
- BlenderTools.clear_material_nodes(part)
255
+ Tools.clear_material_nodes(part)
253
256
  if mat_data is None:
254
- mat_data = BlenderMaterialData()
257
+ mat_data = MaterialData()
255
258
  if speckle_path.exists():
256
- BlenderTools.add_image_texture(mat_data=mat_data, image_path=speckle_path)
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
- BlenderTools.add_image_texture(mat_data=mat_data, image_array=speckle_pattern)
260
- BlenderTools.uv_unwrap_part(part, mm_px_resolution, cal)
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
- BlenderTools.deform_single_timestep(part, deformed_nodes)
290
- BlenderTools.set_new_frame(part)
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 = BlenderTools.save_render_as_array(filepath)
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 = BlenderTools.save_render_as_array(filepath)
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
- BlenderTools.deform_single_timestep(part, deformed_nodes)
443
- BlenderTools.set_new_frame(part)
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 = BlenderTools.save_render_as_array(filepath)
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 = BlenderTools.save_render_as_array(filepath)
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
- from pyvale.cameratools import CameraTools
12
- from pyvale.blendermaterialdata import BlenderMaterialData
13
- from pyvale.blenderrenderdata import RenderData, RenderEngine
14
- from pyvale.blendercalibrationdata import CalibrationData
15
- from pyvale.output import Outputs
16
- from pyvale.pyvaleexceptions import BlenderError
17
-
18
- class BlenderTools:
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
- BlenderTools.set_new_frame(part)
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: BlenderMaterialData,
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 *