2Validation for Context geometry operations.
4Provides comprehensive validation for all geometry creation methods,
5ensuring parameters are valid before reaching C++ code.
8from typing
import List, Union, Any, Optional
9from .core
import validate_input, coerce_to_vec3, coerce_to_vec2, validate_positive_value
10from .datatypes
import (validate_rgb_color, validate_vec3, validate_vec2,
11 validate_spherical_coord)
12from .exceptions
import ValidationError, create_validation_error
16 """Validate geometry center is a valid vec3."""
17 validate_vec3(center, param_name, function_name)
21 """Validate 2D size is a valid vec2 with positive values."""
22 validate_vec2(size, param_name, function_name)
24 if hasattr(size,
'x')
and hasattr(size,
'y'):
26 raise create_validation_error(
27 f
"Size x-component must be positive, got {size.x}",
28 param_name=f
"{param_name}.x",
29 function_name=function_name,
30 expected_type=
"positive number",
32 suggestion=
"Size dimensions must be greater than 0."
36 raise create_validation_error(
37 f
"Size y-component must be positive, got {size.y}",
38 param_name=f
"{param_name}.y",
39 function_name=function_name,
40 expected_type=
"positive number",
42 suggestion=
"Size dimensions must be greater than 0."
47 """Validate 3D size is a valid vec3 with positive values."""
48 validate_vec3(size, param_name, function_name)
50 if hasattr(size,
'x')
and hasattr(size,
'y')
and hasattr(size,
'z'):
52 raise create_validation_error(
53 f
"Size x-component must be positive, got {size.x}",
54 param_name=f
"{param_name}.x",
55 function_name=function_name,
56 expected_type=
"positive number",
58 suggestion=
"Size dimensions must be greater than 0."
62 raise create_validation_error(
63 f
"Size y-component must be positive, got {size.y}",
64 param_name=f
"{param_name}.y",
65 function_name=function_name,
66 expected_type=
"positive number",
68 suggestion=
"Size dimensions must be greater than 0."
72 raise create_validation_error(
73 f
"Size z-component must be positive, got {size.z}",
74 param_name=f
"{param_name}.z",
75 function_name=function_name,
76 expected_type=
"positive number",
78 suggestion=
"Size dimensions must be greater than 0."
82def validate_tube_nodes(nodes: List[Any], param_name: str =
"nodes", function_name: str =
None):
83 """Validate tube nodes list."""
84 if not isinstance(nodes, list):
85 raise create_validation_error(
86 f
"Parameter must be a list of vec3 positions",
87 param_name=param_name,
88 function_name=function_name,
89 expected_type=
"list of vec3",
91 suggestion=
"Provide a list of vec3 objects representing tube node positions."
95 raise create_validation_error(
96 f
"Parameter must contain at least 2 nodes for tube creation, got {len(nodes)}",
97 param_name=param_name,
98 function_name=function_name,
99 expected_type=
"list with >= 2 elements",
101 suggestion=
"Tubes require at least 2 nodes to define a path."
104 for i, node
in enumerate(nodes):
105 validate_vec3(node, f
"{param_name}[{i}]", function_name)
109 param_name: str =
"radii", function_name: str =
None):
110 """Validate tube radii specification."""
111 if isinstance(radii, (int, float)):
112 validate_positive_value(radii, param_name, function_name)
113 elif isinstance(radii, list):
114 if len(radii) != nodes_count:
115 raise create_validation_error(
116 f
"Radii list must have same length as nodes ({nodes_count}), got {len(radii)} radii",
117 param_name=param_name,
118 function_name=function_name,
119 expected_type=f
"list with {nodes_count} elements",
121 suggestion=
"Provide one radius value per node, or use a single radius for all nodes."
124 for i, radius
in enumerate(radii):
125 validate_positive_value(radius, f
"{param_name}[{i}]", function_name)
127 raise create_validation_error(
128 f
"Parameter must be a positive number or list of positive numbers",
129 param_name=param_name,
130 function_name=function_name,
131 expected_type=
"positive number or list of positive numbers",
133 suggestion=
"Use a single positive radius or a list of positive radii (one per node)."
138 """Validate ndivs parameter for geometry subdivision."""
139 if not isinstance(ndivs, int):
140 raise create_validation_error(
141 f
"Parameter must be an integer",
142 param_name=param_name,
143 function_name=function_name,
144 expected_type=
"integer",
146 suggestion=
"Use an integer value for subdivision count."
149 if ndivs < min_value:
150 raise create_validation_error(
151 f
"Parameter must be >= {min_value}, got {ndivs}",
152 param_name=param_name,
153 function_name=function_name,
154 expected_type=f
"integer >= {min_value}",
156 suggestion=f
"Use at least {min_value} subdivisions for valid geometry."
160 raise create_validation_error(
161 f
"Parameter {ndivs} is very large and may cause performance issues",
162 param_name=param_name,
163 function_name=function_name,
164 expected_type=
"integer <= 1000",
166 suggestion=
"Consider using fewer subdivisions (typically < 100) for better performance."
173 """Decorator for addPatch method validation."""
174 return validate_input(
176 'center': validate_geometry_center,
177 'size': validate_geometry_size2d,
178 'rotation': validate_spherical_coord,
179 'color': validate_rgb_color
182 'center': coerce_to_vec3,
183 'size': coerce_to_vec2
189 """Decorator for addTriangle method validation."""
190 return validate_input(
195 'color': validate_rgb_color
198 'vertex0':
lambda v, **kw: coerce_to_vec3(v,
'vertex0'),
199 'vertex1':
lambda v, **kw: coerce_to_vec3(v,
'vertex1'),
200 'vertex2':
lambda v, **kw: coerce_to_vec3(v,
'vertex2')
206 """Decorator for addSphere method validation."""
207 def validate_sphere_specific(radius, param_name="radius", function_name=None):
208 validate_positive_value(radius, param_name, function_name)
210 return validate_input(
212 'center': validate_geometry_center,
213 'radius': validate_sphere_specific,
214 'color': validate_rgb_color,
215 'ndivs': validate_ndivs_parameter
218 'center': coerce_to_vec3
224 """Decorator for addTube method validation."""
225 def validate_tube_wrapper(self, nodes=None, radii=None, ndivs=6, colors=None, **kwargs):
227 if nodes
is not None:
230 if radii
is not None and nodes
is not None:
232 elif radii
is not None:
234 if isinstance(radii, (int, float)):
235 validate_positive_value(radii,
"radii", func.__name__)
239 if colors
is not None:
240 if isinstance(colors, list):
241 for i, color
in enumerate(colors):
242 validate_rgb_color(color, f
"colors[{i}]", func.__name__)
244 validate_rgb_color(colors,
"colors", func.__name__)
246 return func(self, nodes, radii, ndivs, colors, **kwargs)
248 return validate_tube_wrapper
252 """Decorator for addBox method validation."""
253 return validate_input(
255 'center': validate_geometry_center,
256 'size': validate_geometry_size3d,
257 'rotation': validate_spherical_coord,
258 'color': validate_rgb_color
261 'center': coerce_to_vec3
267 """Decorator for addDisk method validation."""
268 def validate_disk_specific(radius, param_name="radius", function_name=None):
269 validate_positive_value(radius, param_name, function_name)
271 return validate_input(
273 'center': validate_geometry_center,
274 'size': validate_disk_specific,
275 'rotation': validate_spherical_coord,
276 'color': validate_rgb_color,
277 'ndivs': validate_ndivs_parameter
280 'center': coerce_to_vec3
286 """Decorator for addCone method validation."""
287 def validate_cone_specific(radius, param_name="radius", function_name=None):
288 validate_positive_value(radius, param_name, function_name)
290 def validate_height(height, param_name="height", function_name=None):
291 validate_positive_value(height, param_name, function_name)
293 return validate_input(
295 'center': validate_geometry_center,
296 'radius': validate_cone_specific,
297 'height': validate_height,
298 'rotation': validate_spherical_coord,
299 'color': validate_rgb_color,
300 'ndivs': validate_ndivs_parameter
303 'center': coerce_to_vec3
validate_geometry_center(Any center, str param_name="center", str function_name=None)
Validate geometry center is a valid vec3.
validate_sphere_params(func)
Decorator for addSphere method validation.
validate_tube_radii(Union[float, List[float]] radii, int nodes_count, str param_name="radii", str function_name=None)
Validate tube radii specification.
validate_tube_params(func)
Decorator for addTube method validation.
validate_box_params(func)
Decorator for addBox method validation.
validate_triangle_params(func)
Decorator for addTriangle method validation.
validate_disk_params(func)
Decorator for addDisk method validation.
validate_geometry_size3d(Any size, str param_name="size", str function_name=None)
Validate 3D size is a valid vec3 with positive values.
validate_geometry_size2d(Any size, str param_name="size", str function_name=None)
Validate 2D size is a valid vec2 with positive values.
validate_patch_params(func)
Decorator for addPatch method validation.
validate_ndivs_parameter(Any ndivs, str param_name="ndivs", str function_name=None, int min_value=3)
Validate ndivs parameter for geometry subdivision.
validate_tube_nodes(List[Any] nodes, str param_name="nodes", str function_name=None)
Validate tube nodes list.
validate_cone_params(func)
Decorator for addCone method validation.