pyvale 2025.4.1__py3-none-any.whl → 2025.5.1__py3-none-any.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 (126) hide show
  1. pyvale/__init__.py +18 -3
  2. pyvale/analyticmeshgen.py +1 -0
  3. pyvale/analyticsimdatafactory.py +18 -13
  4. pyvale/analyticsimdatagenerator.py +105 -72
  5. pyvale/blendercalibrationdata.py +15 -0
  6. pyvale/blenderlightdata.py +26 -0
  7. pyvale/blendermaterialdata.py +15 -0
  8. pyvale/blenderrenderdata.py +30 -0
  9. pyvale/blenderscene.py +488 -0
  10. pyvale/blendertools.py +420 -0
  11. pyvale/camera.py +6 -5
  12. pyvale/cameradata.py +25 -7
  13. pyvale/cameradata2d.py +6 -4
  14. pyvale/camerastereo.py +217 -0
  15. pyvale/cameratools.py +206 -11
  16. pyvale/cython/rastercyth.py +6 -2
  17. pyvale/data/cal_target.tiff +0 -0
  18. pyvale/dataset.py +73 -14
  19. pyvale/errorcalculator.py +8 -10
  20. pyvale/errordriftcalc.py +10 -9
  21. pyvale/errorintegrator.py +19 -21
  22. pyvale/errorrand.py +33 -39
  23. pyvale/errorsyscalib.py +134 -0
  24. pyvale/errorsysdep.py +19 -22
  25. pyvale/errorsysfield.py +49 -41
  26. pyvale/errorsysindep.py +79 -175
  27. pyvale/examples/basics/ex1_1_basicscalars_therm2d.py +131 -0
  28. pyvale/examples/basics/ex1_2_sensormodel_therm2d.py +158 -0
  29. pyvale/examples/basics/ex1_3_customsens_therm3d.py +216 -0
  30. pyvale/examples/basics/ex1_4_basicerrors_therm3d.py +153 -0
  31. pyvale/examples/basics/ex1_5_fielderrs_therm3d.py +168 -0
  32. pyvale/examples/basics/ex1_6_caliberrs_therm2d.py +133 -0
  33. pyvale/examples/basics/ex1_7_spatavg_therm2d.py +123 -0
  34. pyvale/examples/basics/ex2_1_basicvectors_disp2d.py +112 -0
  35. pyvale/examples/basics/ex2_2_vectorsens_disp2d.py +111 -0
  36. pyvale/examples/basics/ex2_3_sensangle_disp2d.py +139 -0
  37. pyvale/examples/basics/ex2_4_chainfielderrs_disp2d.py +196 -0
  38. pyvale/examples/basics/ex2_5_vectorfields3d_disp3d.py +109 -0
  39. pyvale/examples/basics/ex3_1_basictensors_strain2d.py +114 -0
  40. pyvale/examples/basics/ex3_2_tensorsens2d_strain2d.py +111 -0
  41. pyvale/examples/basics/ex3_3_tensorsens3d_strain3d.py +182 -0
  42. pyvale/examples/basics/ex4_1_expsim2d_thermmech2d.py +171 -0
  43. pyvale/examples/basics/ex4_2_expsim3d_thermmech3d.py +252 -0
  44. pyvale/examples/{analyticdatagen → genanalyticdata}/ex1_1_scalarvisualisation.py +6 -9
  45. pyvale/examples/{analyticdatagen → genanalyticdata}/ex1_2_scalarcasebuild.py +8 -11
  46. pyvale/examples/{analyticdatagen → genanalyticdata}/ex2_1_analyticsensors.py +9 -12
  47. pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +8 -15
  48. pyvale/examples/renderblender/ex1_1_blenderscene.py +121 -0
  49. pyvale/examples/renderblender/ex1_2_blenderdeformed.py +119 -0
  50. pyvale/examples/renderblender/ex2_1_stereoscene.py +128 -0
  51. pyvale/examples/renderblender/ex2_2_stereodeformed.py +131 -0
  52. pyvale/examples/renderblender/ex3_1_blendercalibration.py +120 -0
  53. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastenp.py +3 -2
  54. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_oneframe.py +2 -2
  55. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_static_cypara.py +3 -8
  56. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_static_pypara.py +6 -7
  57. pyvale/examples/{ex1_4_thermal2d.py → visualisation/ex1_1_plot_traces.py} +32 -16
  58. pyvale/examples/{features/ex_animation_tools_3dmonoblock.py → visualisation/ex2_1_animate_sim.py} +37 -31
  59. pyvale/experimentsimulator.py +107 -30
  60. pyvale/field.py +2 -9
  61. pyvale/fieldconverter.py +98 -22
  62. pyvale/fieldsampler.py +2 -2
  63. pyvale/fieldscalar.py +10 -10
  64. pyvale/fieldtensor.py +15 -17
  65. pyvale/fieldtransform.py +7 -2
  66. pyvale/fieldvector.py +6 -7
  67. pyvale/generatorsrandom.py +25 -47
  68. pyvale/imagedef2d.py +6 -2
  69. pyvale/integratorfactory.py +2 -2
  70. pyvale/integratorquadrature.py +50 -24
  71. pyvale/integratorrectangle.py +85 -7
  72. pyvale/integratorspatial.py +4 -4
  73. pyvale/integratortype.py +3 -3
  74. pyvale/output.py +17 -0
  75. pyvale/pyvaleexceptions.py +11 -0
  76. pyvale/raster.py +6 -5
  77. pyvale/rastercy.py +6 -4
  78. pyvale/rasternp.py +6 -4
  79. pyvale/rendermesh.py +6 -2
  80. pyvale/sensorarray.py +2 -2
  81. pyvale/sensorarrayfactory.py +52 -65
  82. pyvale/sensorarraypoint.py +29 -30
  83. pyvale/sensordata.py +2 -2
  84. pyvale/sensordescriptor.py +138 -25
  85. pyvale/sensortools.py +3 -3
  86. pyvale/simtools.py +67 -0
  87. pyvale/visualexpplotter.py +99 -57
  88. pyvale/visualimagedef.py +11 -7
  89. pyvale/visualimages.py +6 -4
  90. pyvale/visualopts.py +372 -58
  91. pyvale/visualsimanimator.py +42 -13
  92. pyvale/visualsimsensors.py +318 -0
  93. pyvale/visualtools.py +69 -13
  94. pyvale/visualtraceplotter.py +52 -165
  95. {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/METADATA +17 -14
  96. pyvale-2025.5.1.dist-info/RECORD +172 -0
  97. {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/WHEEL +1 -1
  98. pyvale/examples/analyticdatagen/__init__.py +0 -5
  99. pyvale/examples/ex1_1_thermal2d.py +0 -86
  100. pyvale/examples/ex1_2_thermal2d.py +0 -108
  101. pyvale/examples/ex1_3_thermal2d.py +0 -110
  102. pyvale/examples/ex1_5_thermal2d.py +0 -102
  103. pyvale/examples/ex2_1_thermal3d .py +0 -84
  104. pyvale/examples/ex2_2_thermal3d.py +0 -51
  105. pyvale/examples/ex2_3_thermal3d.py +0 -106
  106. pyvale/examples/ex3_1_displacement2d.py +0 -44
  107. pyvale/examples/ex3_2_displacement2d.py +0 -76
  108. pyvale/examples/ex3_3_displacement2d.py +0 -101
  109. pyvale/examples/ex3_4_displacement2d.py +0 -102
  110. pyvale/examples/ex4_1_strain2d.py +0 -54
  111. pyvale/examples/ex4_2_strain2d.py +0 -76
  112. pyvale/examples/ex4_3_strain2d.py +0 -97
  113. pyvale/examples/ex5_1_multiphysics2d.py +0 -75
  114. pyvale/examples/ex6_1_multiphysics2d_expsim.py +0 -115
  115. pyvale/examples/ex6_2_multiphysics3d_expsim.py +0 -160
  116. pyvale/examples/features/__init__.py +0 -5
  117. pyvale/examples/features/ex_area_avg.py +0 -89
  118. pyvale/examples/features/ex_calibration_error.py +0 -108
  119. pyvale/examples/features/ex_chain_field_errs.py +0 -141
  120. pyvale/examples/features/ex_field_errs.py +0 -78
  121. pyvale/examples/features/ex_sensor_single_angle_batch.py +0 -110
  122. pyvale/optimcheckfuncs.py +0 -153
  123. pyvale/visualsimplotter.py +0 -182
  124. pyvale-2025.4.1.dist-info/RECORD +0 -163
  125. {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/licenses/LICENSE +0 -0
  126. {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/top_level.txt +0 -0
@@ -1,17 +1,16 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
6
 
7
7
  from typing import Callable
8
8
  import numpy as np
9
9
  from pyvale.field import IField
10
10
  from pyvale.integratorspatial import (IIntegratorSpatial,
11
- create_int_pt_array)
11
+ create_int_pt_array)
12
12
  from pyvale.sensordata import SensorData
13
13
 
14
- #TODO: Docstrings
15
14
 
16
15
  class Quadrature2D(IIntegratorSpatial):
17
16
  """Gaussian quadrature numerical integrator for spatial averaging in 2D.
@@ -23,7 +22,7 @@ class Quadrature2D(IIntegratorSpatial):
23
22
  Implements the `IIntegratorSpatial` interface allowing for interoperability
24
23
  of different spatial integration algorithms for modelling sensor averaging.
25
24
  """
26
- __slots__ = ("_field","_area","_n_gauss_pts","_gauss_pt_offsets"
25
+ __slots__ = ("_field","_area","_gauss_pts_num","_gauss_pt_offsets"
27
26
  ,"_gauss_weight_func","_gauss_pts","_averages","_sens_data")
28
27
 
29
28
  def __init__(self,
@@ -31,8 +30,7 @@ class Quadrature2D(IIntegratorSpatial):
31
30
  sens_data: SensorData,
32
31
  gauss_pt_offsets: np.ndarray,
33
32
  gauss_weight_func: Callable) -> None:
34
- """Initiliaser for the 2D Gaussian quadrature numerical integrator.
35
-
33
+ """
36
34
  Parameters
37
35
  ----------
38
36
  field : IField
@@ -57,7 +55,7 @@ class Quadrature2D(IIntegratorSpatial):
57
55
  self._area = self._sens_data.spatial_dims[0] * \
58
56
  self._sens_data.spatial_dims[1]
59
57
 
60
- self._n_gauss_pts = gauss_pt_offsets.shape[0]
58
+ self._gauss_pts_num = gauss_pt_offsets.shape[0]
61
59
  self._gauss_pt_offsets = gauss_pt_offsets
62
60
  self._gauss_weight_func = gauss_weight_func
63
61
 
@@ -66,43 +64,61 @@ class Quadrature2D(IIntegratorSpatial):
66
64
  self._averages = None
67
65
 
68
66
  def calc_integrals(self, sens_data: SensorData | None = None) -> np.ndarray:
69
- """_summary_
67
+ """Calculates the numerical integrals for each sensor based on the
68
+ specified sensor data and numerical integration options (i.e. geometry
69
+ and integration points).
70
70
 
71
71
  Parameters
72
72
  ----------
73
73
  sens_data : SensorData | None, optional
74
- _description_, by default None
74
+ Specifies the sensor parameters used to calculate the averages, by
75
+ default None. Is a sensor data object is passed a reference to that
76
+ object is stored by this class and used in later calculations. If
77
+ None then it uses the SensorData object stored by this class.
78
+ Defaults to None.
75
79
 
76
80
  Returns
77
81
  -------
78
82
  np.ndarray
79
- _description_
83
+ Array of virtual sensor integrals with shape=(n_sensors,n_comps,
84
+ n_timsteps). Note this is consistent with pyvales measurement array.
80
85
  """
81
86
  self._averages = self.calc_averages(sens_data)
82
87
  return self._area*self.get_averages()
83
88
 
84
89
  def get_integrals(self) -> np.ndarray:
85
- """_summary_
90
+ """Gets the most recent calculation of the spatial averages for all
91
+ sensors in the sensor array without performing any new interpolation. If
92
+ the averages have not been calculated they are first calculated and then
93
+ returned.
86
94
 
87
95
  Returns
88
96
  -------
89
97
  np.ndarray
90
- _description_
98
+ Array of virtual sensor averages with shape=(n_sensors,n_comps,
99
+ n_timsteps). Note this is consistent with pyvales measurement array.
91
100
  """
92
101
  return self._area*self.get_averages()
93
102
 
94
103
  def calc_averages(self, sens_data: SensorData | None = None) -> np.ndarray:
95
- """_summary_
104
+ """Calculates the spatial averages for each sensor based on the
105
+ specified sensor data and numerical integration options (i.e. geometry
106
+ and integration points).
96
107
 
97
108
  Parameters
98
109
  ----------
99
110
  sens_data : SensorData | None, optional
100
- _description_, by default None
111
+ Specifies the sensor parameters used to calculate the averages, by
112
+ default None. Is a sensor data object is passed a reference to that
113
+ object is stored by this class and used in later calculations. If
114
+ None then it uses the SensorData object stored by this class.
115
+ Defaults to None.
101
116
 
102
117
  Returns
103
118
  -------
104
119
  np.ndarray
105
- _description_
120
+ Array of virtual sensor averages with shape=(n_sensors,n_comps,
121
+ n_timsteps). Note this is consistent with pyvales measurement array.
106
122
  """
107
123
  if sens_data is not None:
108
124
  self._sens_data = sens_data
@@ -121,7 +137,7 @@ class Quadrature2D(IIntegratorSpatial):
121
137
  gauss_vals.shape[2])
122
138
 
123
139
  # shape=(n_gauss_pts,n_sens,n_comps,n_timesteps)
124
- gauss_vals = gauss_vals.reshape((self._n_gauss_pts,)+meas_shape,
140
+ gauss_vals = gauss_vals.reshape((self._gauss_pts_num,)+meas_shape,
125
141
  order='F')
126
142
 
127
143
  # shape=(n_gauss_pts,n_sens,n_comps,n_timesteps)
@@ -138,12 +154,16 @@ class Quadrature2D(IIntegratorSpatial):
138
154
  return self._averages
139
155
 
140
156
  def get_averages(self) -> np.ndarray:
141
- """_summary_
157
+ """Gets the most recent calculation of the spatial averages for all
158
+ sensors in the sensor array without performing any new interpolation. If
159
+ the averages have not been calculated they are first calculated and then
160
+ returned.
142
161
 
143
162
  Returns
144
163
  -------
145
164
  np.ndarray
146
- _description_
165
+ Array of virtual sensor averages with shape=(n_sensors,n_comps,
166
+ n_timsteps). Note this is consistent with pyvales measurement array.
147
167
  """
148
168
  if self._averages is None:
149
169
  self._averages = self.calc_averages()
@@ -159,29 +179,35 @@ def create_gauss_weights_2d_4pts(meas_shape: tuple[int,int,int]) -> np.ndarray:
159
179
  Parameters
160
180
  ----------
161
181
  meas_shape : tuple[int,int,int]
162
- _description_
182
+ Shape of the measurement array, shape=(n_sensors,n_field_comps,
183
+ n_time_steps).
163
184
 
164
185
  Returns
165
186
  -------
166
187
  np.ndarray
167
- _description_
188
+ Array of gaussian quadrature weights with shape = (n_gauss_pts,n_sensors
189
+ ,n_field_comps,n_time_steps).
168
190
  """
169
191
  #shape=(4,)+meas_shape
170
192
  return np.ones((4,)+meas_shape)
171
193
 
172
194
 
173
195
  def create_gauss_weights_2d_9pts(meas_shape: tuple[int,int,int]) -> np.ndarray:
174
- """_summary_
196
+ """Helper function that creates an array of weights for gaussian quadrature
197
+ integration. This function provides the weights for 2D integrator with 9
198
+ integration points.
175
199
 
176
200
  Parameters
177
201
  ----------
178
202
  meas_shape : tuple[int,int,int]
179
- _description_
203
+ Shape of the measurement array, shape=(n_sensors,n_field_comps,
204
+ n_time_steps).
180
205
 
181
206
  Returns
182
207
  -------
183
208
  np.ndarray
184
- _description_
209
+ Array of gaussian quadrature weights with shape = (n_gauss_pts,n_sensors
210
+ ,n_field_comps,n_time_steps).
185
211
  """
186
212
  # shape=(9,)+meas_shape
187
213
  gauss_weights = np.vstack((25/81 * np.ones((4,)+meas_shape),
@@ -1,8 +1,8 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
6
 
7
7
  import numpy as np
8
8
  from pyvale.field import IField
@@ -10,13 +10,19 @@ from pyvale.integratorspatial import (IIntegratorSpatial,
10
10
  create_int_pt_array)
11
11
  from pyvale.sensordata import SensorData
12
12
 
13
-
14
- #TODO: Docstrings
15
-
16
13
  #NOTE: code below is very similar to quadrature integrator should be able to
17
14
  # refactor into injected classes/functions
18
15
 
19
16
  class Rectangle2D(IIntegratorSpatial):
17
+ """Rectangular numerical integrator for spatial averaging in 2D. Used to
18
+ model spatial averaging of sensors over a rectangular area which is
19
+ specified in the SensorData object. Handles sampling of the physical field
20
+ at the integration points and averages them back to a single value per
21
+ sensor location as specified in the SensorData object.
22
+
23
+ Implements the `IIntegratorSpatial` interface allowing for interoperability
24
+ of different spatial integration algorithms for modelling sensor averaging.
25
+ """
20
26
  __slots__ = ("_field","sens_data","_area","_area_int","_n_int_pts",
21
27
  "_int_pt_offsets","_int_pts","_averages")
22
28
 
@@ -24,7 +30,20 @@ class Rectangle2D(IIntegratorSpatial):
24
30
  field: IField,
25
31
  sens_data: SensorData,
26
32
  int_pt_offsets: np.ndarray) -> None:
27
-
33
+ """
34
+ Parameters
35
+ ----------
36
+ field : IField
37
+ A physical field interface that will be sampled at the integration
38
+ points and averaged back to single value per sensor.
39
+ sens_data : SensorData
40
+ Parameters of the sensor array including the sensor locations,
41
+ sampling times, type of spatial integrator and its dimensions. See
42
+ the `SensorData` dataclass for more details.
43
+ int_pt_offsets : np.ndarray
44
+ Offsets from the central location of the integration area with
45
+ shape=(n_gauss_pts,coord[X,Y,Z])
46
+ """
28
47
  self._field = field
29
48
  self._sens_data = sens_data
30
49
 
@@ -41,15 +60,63 @@ class Rectangle2D(IIntegratorSpatial):
41
60
 
42
61
 
43
62
  def calc_integrals(self, sens_data: SensorData | None = None) -> np.ndarray:
63
+ """Calculates the numerical integrals for each sensor based on the
64
+ specified sensor data and numerical integration options (i.e. geometry
65
+ and integration points).
66
+
67
+ Parameters
68
+ ----------
69
+ sens_data : SensorData | None, optional
70
+ Specifies the sensor parameters used to calculate the averages, by
71
+ default None. Is a sensor data object is passed a reference to that
72
+ object is stored by this class and used in later calculations. If
73
+ None then it uses the SensorData object stored by this class.
74
+ Defaults to None.
75
+
76
+ Returns
77
+ -------
78
+ np.ndarray
79
+ Array of virtual sensor integrals with shape=(n_sensors,n_comps,
80
+ n_timsteps). Note this is consistent with pyvales measurement array.
81
+ """
44
82
  self._averages = self.calc_averages(sens_data)
45
83
  return self._area*self.get_averages()
46
84
 
47
85
 
48
86
  def get_integrals(self) -> np.ndarray:
87
+ """Gets the most recent calculation of the spatial averages for all
88
+ sensors in the sensor array without performing any new interpolation. If
89
+ the averages have not been calculated they are first calculated and then
90
+ returned.
91
+
92
+ Returns
93
+ -------
94
+ np.ndarray
95
+ Array of virtual sensor averages with shape=(n_sensors,n_comps,
96
+ n_timsteps). Note this is consistent with pyvales measurement array.
97
+ """
49
98
  return self._area*self.get_averages()
50
99
 
51
100
  def calc_averages(self, sens_data: SensorData | None = None) -> np.ndarray:
52
-
101
+ """Calculates the spatial averages for each sensor based on the
102
+ specified sensor data and numerical integration options (i.e. geometry
103
+ and integration points).
104
+
105
+ Parameters
106
+ ----------
107
+ sens_data : SensorData | None, optional
108
+ Specifies the sensor parameters used to calculate the averages, by
109
+ default None. Is a sensor data object is passed a reference to that
110
+ object is stored by this class and used in later calculations. If
111
+ None then it uses the SensorData object stored by this class.
112
+ Defaults to None.
113
+
114
+ Returns
115
+ -------
116
+ np.ndarray
117
+ Array of virtual sensor averages with shape=(n_sensors,n_comps,
118
+ n_timsteps). Note this is consistent with pyvales measurement array.
119
+ """
53
120
  if sens_data is not None:
54
121
  self._sens_data = sens_data
55
122
 
@@ -78,6 +145,17 @@ class Rectangle2D(IIntegratorSpatial):
78
145
 
79
146
 
80
147
  def get_averages(self) -> np.ndarray:
148
+ """Gets the most recent calculation of the spatial averages for all
149
+ sensors in the sensor array without performing any new interpolation. If
150
+ the averages have not been calculated they are first calculated and then
151
+ returned.
152
+
153
+ Returns
154
+ -------
155
+ np.ndarray
156
+ Array of virtual sensor averages with shape=(n_sensors,n_comps,
157
+ n_timsteps). Note this is consistent with pyvales measurement array.
158
+ """
81
159
  if self._averages is None:
82
160
  self._averages = self.calc_averages()
83
161
 
@@ -1,8 +1,8 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
6
 
7
7
  from abc import ABC, abstractmethod
8
8
  import numpy as np
@@ -71,7 +71,7 @@ class IIntegratorSpatial(ABC):
71
71
  Array of simulated sensor measurements. shape=(num_sensors,
72
72
  num_field_components,num_time_steps).
73
73
  """
74
- pass
74
+
75
75
 
76
76
  @abstractmethod
77
77
  def get_averages(self) -> np.ndarray:
@@ -85,5 +85,5 @@ class IIntegratorSpatial(ABC):
85
85
  Array of simulated sensor measurements. shape=(num_sensors,
86
86
  num_field_components,num_time_steps).
87
87
  """
88
- pass
88
+
89
89
 
pyvale/integratortype.py CHANGED
@@ -1,8 +1,8 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
6
 
7
7
  import enum
8
8
 
@@ -24,7 +24,7 @@ class EIntSpatialType(enum.Enum):
24
24
  Gaussian quadrature 2D integrator over 4 points.
25
25
 
26
26
  QUAD9PT
27
- Gaussia quadrature 2D integrator over 9 points.
27
+ Gaussian quadrature 2D integrator over 9 points.
28
28
  """
29
29
 
30
30
  RECT1PT = enum.auto()
pyvale/output.py ADDED
@@ -0,0 +1,17 @@
1
+ # ==============================================================================
2
+ # pyvale: the python validation engine
3
+ # License: MIT
4
+ # Copyright (C) 2025 The Computer Aided Validation Team
5
+ # ==============================================================================
6
+ from dataclasses import dataclass
7
+ from pathlib import Path
8
+
9
+ """
10
+ NOTE: this module is a feature under developement.
11
+ """
12
+
13
+ # TODO: remove this? but check blender tests
14
+
15
+ @dataclass(slots=True)
16
+ class Outputs():
17
+ base_dir = Path.home()
@@ -0,0 +1,11 @@
1
+ # ==============================================================================
2
+ # pyvale: the python validation engine
3
+ # License: MIT
4
+ # Copyright (C) 2025 The Computer Aided Validation Team
5
+ # ==============================================================================
6
+
7
+ class BlenderError(Exception):
8
+ pass
9
+
10
+ class VisError(Exception):
11
+ pass
pyvale/raster.py CHANGED
@@ -1,15 +1,16 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
+
7
+ """
8
+ NOTE: this module is a feature under developement.
9
+ """
6
10
 
7
11
  from abc import ABC, abstractmethod
8
12
  import numpy as np
9
13
 
10
- # NOTE: This module is a feature under developement.
11
-
12
-
13
14
  # NOTE:
14
15
  # - Need to render a single frame static/deformed
15
16
  # - Need to render all frames static/deformed
pyvale/rastercy.py CHANGED
@@ -1,8 +1,12 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
+
7
+ """
8
+ NOTE: this module is a feature under developement.
9
+ """
6
10
 
7
11
  from pathlib import Path
8
12
  from multiprocessing.pool import Pool
@@ -11,8 +15,6 @@ from pyvale.cameradata import CameraData
11
15
  from pyvale.rendermesh import RenderMeshData
12
16
  import pyvale.cython.rastercyth as rastercyth
13
17
 
14
- # NOTE: This module is a feature under developement.
15
-
16
18
  class RasterCY:
17
19
  @staticmethod
18
20
  def raster_static_mesh(cam_data: CameraData,
pyvale/rasternp.py CHANGED
@@ -1,8 +1,12 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
+
7
+ """
8
+ NOTE: this module is a feature under developement.
9
+ """
6
10
 
7
11
  from pathlib import Path
8
12
  from multiprocessing.pool import Pool
@@ -13,8 +17,6 @@ from pyvale.cameratools import CameraTools
13
17
  from pyvale.rendermesh import RenderMeshData
14
18
  import pyvale.cython.rastercyth as rastercyth
15
19
 
16
- # NOTE: This module is a feature under developement.
17
-
18
20
  class RasterNP:
19
21
  @staticmethod
20
22
  def world_to_raster_coords(cam_data: CameraData,
pyvale/rendermesh.py CHANGED
@@ -1,8 +1,12 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
+
7
+ """
8
+ NOTE: this module is a feature under developement.
9
+ """
6
10
 
7
11
  from enum import Enum
8
12
  from dataclasses import dataclass, field
pyvale/sensorarray.py CHANGED
@@ -1,8 +1,8 @@
1
- # ================================================================================
1
+ # ==============================================================================
2
2
  # pyvale: the python validation engine
3
3
  # License: MIT
4
4
  # Copyright (C) 2025 The Computer Aided Validation Team
5
- # ================================================================================
5
+ # ==============================================================================
6
6
 
7
7
  from abc import ABC, abstractmethod
8
8
  import numpy as np