ScadPy 0.1.0__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.
Files changed (236) hide show
  1. scadpy/__init__.py +5 -0
  2. scadpy/color/__init__.py +3 -0
  3. scadpy/color/constants/BEIGE.py +3 -0
  4. scadpy/color/constants/BLACK.py +3 -0
  5. scadpy/color/constants/BLUE.py +3 -0
  6. scadpy/color/constants/BROWN.py +3 -0
  7. scadpy/color/constants/DARK_GRAY.py +3 -0
  8. scadpy/color/constants/DEFAULT_COLOR.py +3 -0
  9. scadpy/color/constants/DEFAULT_OPACITY.py +1 -0
  10. scadpy/color/constants/GRAY.py +3 -0
  11. scadpy/color/constants/GREEN.py +3 -0
  12. scadpy/color/constants/ORANGE.py +3 -0
  13. scadpy/color/constants/RED.py +3 -0
  14. scadpy/color/constants/WHITE.py +3 -0
  15. scadpy/color/constants/YELLOW.py +3 -0
  16. scadpy/color/constants/__init__.py +29 -0
  17. scadpy/color/type/__init__.py +3 -0
  18. scadpy/color/type/color.py +3 -0
  19. scadpy/color/utils/__init__.py +3 -0
  20. scadpy/color/utils/get_random_color.py +36 -0
  21. scadpy/core/__init__.py +3 -0
  22. scadpy/core/assembly/__init__.py +5 -0
  23. scadpy/core/assembly/combinations/__init__.py +13 -0
  24. scadpy/core/assembly/combinations/concat_assemblies.py +50 -0
  25. scadpy/core/assembly/combinations/exclude_assemblies.py +135 -0
  26. scadpy/core/assembly/combinations/intersect_assemblies.py +128 -0
  27. scadpy/core/assembly/combinations/subtract_assemblies.py +151 -0
  28. scadpy/core/assembly/combinations/unify_assemblies.py +59 -0
  29. scadpy/core/assembly/topologies/__init__.py +41 -0
  30. scadpy/core/assembly/topologies/directed_edge/__init__.py +9 -0
  31. scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_directions.py +70 -0
  32. scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_edge.py +49 -0
  33. scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_vertex.py +54 -0
  34. scadpy/core/assembly/topologies/edge/__init__.py +9 -0
  35. scadpy/core/assembly/topologies/edge/get_assembly_edge_lengths.py +46 -0
  36. scadpy/core/assembly/topologies/edge/get_assembly_edge_midpoints.py +51 -0
  37. scadpy/core/assembly/topologies/edge/get_assembly_edge_normals.py +67 -0
  38. scadpy/core/assembly/topologies/face_corner/__init__.py +13 -0
  39. scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_angles.py +72 -0
  40. scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_normals.py +103 -0
  41. scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_to_incoming_directed_edge.py +65 -0
  42. scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_to_outgoing_directed_edge.py +65 -0
  43. scadpy/core/assembly/topologies/face_corner/get_assembly_face_directed_edge_to_corner.py +79 -0
  44. scadpy/core/assembly/topologies/part/__init__.py +5 -0
  45. scadpy/core/assembly/topologies/part/get_assembly_part_colors.py +55 -0
  46. scadpy/core/assembly/topologies/vertex/__init__.py +7 -0
  47. scadpy/core/assembly/topologies/vertex/get_assembly_vertex_coordinates.py +70 -0
  48. scadpy/core/assembly/topologies/vertex/get_assembly_vertex_to_part.py +62 -0
  49. scadpy/core/assembly/transformations/__init__.py +19 -0
  50. scadpy/core/assembly/transformations/color_assembly.py +24 -0
  51. scadpy/core/assembly/transformations/mirror_vertex_coordinates.py +68 -0
  52. scadpy/core/assembly/transformations/pull_vertex_coordinates.py +64 -0
  53. scadpy/core/assembly/transformations/push_vertex_coordinates.py +64 -0
  54. scadpy/core/assembly/transformations/resize_vertex_coordinates.py +121 -0
  55. scadpy/core/assembly/transformations/rotate_vertex_coordinates.py +73 -0
  56. scadpy/core/assembly/transformations/scale_vertex_coordinates.py +76 -0
  57. scadpy/core/assembly/transformations/translate_vertex_coordinates.py +70 -0
  58. scadpy/core/assembly/types/__init__.py +7 -0
  59. scadpy/core/assembly/types/assembly.py +14 -0
  60. scadpy/core/assembly/types/topology_filter.py +6 -0
  61. scadpy/core/assembly/utils/__init__.py +9 -0
  62. scadpy/core/assembly/utils/lookup_pairs.py +56 -0
  63. scadpy/core/assembly/utils/resolve_topology_filter.py +84 -0
  64. scadpy/core/assembly/utils/transform_filtered_parts.py +55 -0
  65. scadpy/core/component/__init__.py +3 -0
  66. scadpy/core/component/exporters/__init__.py +7 -0
  67. scadpy/core/component/exporters/map_component_to_html_file.py +47 -0
  68. scadpy/core/component/exporters/map_component_to_screen.py +63 -0
  69. scadpy/core/component/features/__init__.py +5 -0
  70. scadpy/core/component/features/get_component_bounds.py +38 -0
  71. scadpy/core/component/utils/__init__.py +9 -0
  72. scadpy/core/component/utils/blend_component_colors.py +77 -0
  73. scadpy/core/component/utils/get_intersecting_component_index_groups.py +108 -0
  74. scadpy/core/part/__init__.py +3 -0
  75. scadpy/core/part/combinations/__init__.py +11 -0
  76. scadpy/core/part/combinations/concat_parts.py +48 -0
  77. scadpy/core/part/combinations/intersect_parts.py +147 -0
  78. scadpy/core/part/combinations/subtract_parts.py +94 -0
  79. scadpy/core/part/combinations/unify_parts.py +143 -0
  80. scadpy/core/part/types/__init__.py +5 -0
  81. scadpy/core/part/types/part.py +34 -0
  82. scadpy/core/part/utils/__init__.py +5 -0
  83. scadpy/core/part/utils/blend_part_colors.py +32 -0
  84. scadpy/d2/__init__.py +2 -0
  85. scadpy/d2/shape/__init__.py +9 -0
  86. scadpy/d2/shape/combinations/__init__.py +21 -0
  87. scadpy/d2/shape/combinations/are_shape_parts_intersecting.py +49 -0
  88. scadpy/d2/shape/combinations/concat_shape.py +48 -0
  89. scadpy/d2/shape/combinations/exclude_shape.py +71 -0
  90. scadpy/d2/shape/combinations/intersect_shape.py +64 -0
  91. scadpy/d2/shape/combinations/intersect_shape_parts.py +71 -0
  92. scadpy/d2/shape/combinations/subtract_shape.py +72 -0
  93. scadpy/d2/shape/combinations/subtract_shape_parts.py +66 -0
  94. scadpy/d2/shape/combinations/unify_shape.py +51 -0
  95. scadpy/d2/shape/combinations/unify_shape_parts.py +74 -0
  96. scadpy/d2/shape/exporters/__init__.py +17 -0
  97. scadpy/d2/shape/exporters/map_shape_to_dxf.py +43 -0
  98. scadpy/d2/shape/exporters/map_shape_to_dxf_file.py +38 -0
  99. scadpy/d2/shape/exporters/map_shape_to_html.py +117 -0
  100. scadpy/d2/shape/exporters/map_shape_to_html_file.py +58 -0
  101. scadpy/d2/shape/exporters/map_shape_to_screen.py +51 -0
  102. scadpy/d2/shape/exporters/map_shape_to_svg.py +40 -0
  103. scadpy/d2/shape/exporters/map_shape_to_svg_file.py +38 -0
  104. scadpy/d2/shape/features/__init__.py +9 -0
  105. scadpy/d2/shape/features/get_shape_bounds.py +40 -0
  106. scadpy/d2/shape/features/get_shape_part_bounds.py +37 -0
  107. scadpy/d2/shape/features/is_shape_empty.py +38 -0
  108. scadpy/d2/shape/importers/__init__.py +13 -0
  109. scadpy/d2/shape/importers/map_dxf_to_shape.py +55 -0
  110. scadpy/d2/shape/importers/map_geometries_to_shape.py +45 -0
  111. scadpy/d2/shape/importers/map_geometry_to_shape.py +43 -0
  112. scadpy/d2/shape/importers/map_parts_to_shape.py +62 -0
  113. scadpy/d2/shape/importers/map_svg_to_shape.py +55 -0
  114. scadpy/d2/shape/primitives/__init__.py +6 -0
  115. scadpy/d2/shape/primitives/circle.py +68 -0
  116. scadpy/d2/shape/primitives/polygon.py +86 -0
  117. scadpy/d2/shape/primitives/rectangle.py +85 -0
  118. scadpy/d2/shape/primitives/square.py +57 -0
  119. scadpy/d2/shape/topologies/__init__.py +53 -0
  120. scadpy/d2/shape/topologies/corner/__init__.py +15 -0
  121. scadpy/d2/shape/topologies/corner/are_shape_corners_convex.py +75 -0
  122. scadpy/d2/shape/topologies/corner/get_shape_corner_angles.py +58 -0
  123. scadpy/d2/shape/topologies/corner/get_shape_corner_normals.py +82 -0
  124. scadpy/d2/shape/topologies/corner/get_shape_corner_to_incoming_directed_edge.py +39 -0
  125. scadpy/d2/shape/topologies/corner/get_shape_corner_to_outgoing_directed_edge.py +39 -0
  126. scadpy/d2/shape/topologies/corner/get_shape_corner_to_vertex.py +65 -0
  127. scadpy/d2/shape/topologies/directed_edge/__init__.py +11 -0
  128. scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_directions.py +44 -0
  129. scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_corner.py +41 -0
  130. scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_edge.py +51 -0
  131. scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_vertex.py +63 -0
  132. scadpy/d2/shape/topologies/edge/__init__.py +11 -0
  133. scadpy/d2/shape/topologies/edge/get_shape_edge_lengths.py +43 -0
  134. scadpy/d2/shape/topologies/edge/get_shape_edge_midpoints.py +46 -0
  135. scadpy/d2/shape/topologies/edge/get_shape_edge_normals.py +40 -0
  136. scadpy/d2/shape/topologies/edge/get_shape_edge_to_vertex.py +71 -0
  137. scadpy/d2/shape/topologies/ring/__init__.py +7 -0
  138. scadpy/d2/shape/topologies/ring/get_shape_ring_to_part.py +46 -0
  139. scadpy/d2/shape/topologies/ring/get_shape_ring_types.py +46 -0
  140. scadpy/d2/shape/topologies/vertex/__init__.py +11 -0
  141. scadpy/d2/shape/topologies/vertex/get_shape_part_vertex_coordinates.py +62 -0
  142. scadpy/d2/shape/topologies/vertex/get_shape_vertex_coordinates.py +44 -0
  143. scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_part.py +42 -0
  144. scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_ring.py +63 -0
  145. scadpy/d2/shape/transformations/__init__.py +43 -0
  146. scadpy/d2/shape/transformations/chamfer_shape.py +259 -0
  147. scadpy/d2/shape/transformations/color_shape.py +46 -0
  148. scadpy/d2/shape/transformations/convexify_shape.py +79 -0
  149. scadpy/d2/shape/transformations/fill_shape.py +68 -0
  150. scadpy/d2/shape/transformations/fillet_shape.py +289 -0
  151. scadpy/d2/shape/transformations/grow_shape.py +82 -0
  152. scadpy/d2/shape/transformations/linear_cut_shape.py +116 -0
  153. scadpy/d2/shape/transformations/linear_extrude_shape.py +60 -0
  154. scadpy/d2/shape/transformations/linear_slice_shape.py +144 -0
  155. scadpy/d2/shape/transformations/mirror_shape.py +53 -0
  156. scadpy/d2/shape/transformations/pull_shape.py +67 -0
  157. scadpy/d2/shape/transformations/push_shape.py +67 -0
  158. scadpy/d2/shape/transformations/radial_extrude_shape.py +285 -0
  159. scadpy/d2/shape/transformations/radial_slice_shape.py +132 -0
  160. scadpy/d2/shape/transformations/recoordinate_shape.py +82 -0
  161. scadpy/d2/shape/transformations/resize_shape.py +91 -0
  162. scadpy/d2/shape/transformations/rotate_shape.py +63 -0
  163. scadpy/d2/shape/transformations/scale_shape.py +58 -0
  164. scadpy/d2/shape/transformations/shrink_shape.py +69 -0
  165. scadpy/d2/shape/transformations/translate_shape.py +54 -0
  166. scadpy/d2/shape/types/__init__.py +3 -0
  167. scadpy/d2/shape/types/shape.py +792 -0
  168. scadpy/d2/shape/types/utils/__init__.py +5 -0
  169. scadpy/d2/shape/types/utils/shapely_base_geometry_to_shapely_polygons.py +25 -0
  170. scadpy/d2/shape/utils/__init__.py +5 -0
  171. scadpy/d2/shape/utils/shapely_base_geometry_to_shapely_polygons.py +55 -0
  172. scadpy/d2/utils/__init__.py +3 -0
  173. scadpy/d2/utils/resolve_vector_2d.py +50 -0
  174. scadpy/d3/__init__.py +2 -0
  175. scadpy/d3/solid/__init__.py +8 -0
  176. scadpy/d3/solid/combinations/__init__.py +21 -0
  177. scadpy/d3/solid/combinations/are_solid_parts_intersecting.py +51 -0
  178. scadpy/d3/solid/combinations/concat_solid.py +48 -0
  179. scadpy/d3/solid/combinations/exclude_solid.py +71 -0
  180. scadpy/d3/solid/combinations/intersect_solid.py +64 -0
  181. scadpy/d3/solid/combinations/intersect_solid_parts.py +73 -0
  182. scadpy/d3/solid/combinations/subtract_solid.py +72 -0
  183. scadpy/d3/solid/combinations/subtract_solid_parts.py +68 -0
  184. scadpy/d3/solid/combinations/unify_solid.py +51 -0
  185. scadpy/d3/solid/combinations/unify_solid_parts.py +73 -0
  186. scadpy/d3/solid/exporters/__init__.py +11 -0
  187. scadpy/d3/solid/exporters/map_solid_to_html.py +318 -0
  188. scadpy/d3/solid/exporters/map_solid_to_html_file.py +58 -0
  189. scadpy/d3/solid/exporters/map_solid_to_screen.py +51 -0
  190. scadpy/d3/solid/exporters/map_solid_to_stl_file.py +48 -0
  191. scadpy/d3/solid/features/__init__.py +11 -0
  192. scadpy/d3/solid/features/get_solid_bounds.py +37 -0
  193. scadpy/d3/solid/features/get_solid_part_bounds.py +37 -0
  194. scadpy/d3/solid/features/get_solid_part_colors.py +39 -0
  195. scadpy/d3/solid/features/is_solid_empty.py +36 -0
  196. scadpy/d3/solid/importers/__init__.py +11 -0
  197. scadpy/d3/solid/importers/map_geometries_to_solid.py +42 -0
  198. scadpy/d3/solid/importers/map_geometry_to_solid.py +42 -0
  199. scadpy/d3/solid/importers/map_parts_to_solid.py +66 -0
  200. scadpy/d3/solid/importers/map_stl_to_solid.py +37 -0
  201. scadpy/d3/solid/primitives/__init__.py +7 -0
  202. scadpy/d3/solid/primitives/cone.py +70 -0
  203. scadpy/d3/solid/primitives/cuboid.py +75 -0
  204. scadpy/d3/solid/primitives/cylinder.py +73 -0
  205. scadpy/d3/solid/primitives/polyhedron.py +60 -0
  206. scadpy/d3/solid/primitives/sphere.py +58 -0
  207. scadpy/d3/solid/topologies/__init__.py +8 -0
  208. scadpy/d3/solid/topologies/triangle/__init__.py +5 -0
  209. scadpy/d3/solid/topologies/triangle/get_solid_triangle_to_vertex.py +49 -0
  210. scadpy/d3/solid/topologies/vertex/__init__.py +7 -0
  211. scadpy/d3/solid/topologies/vertex/get_solid_vertex_coordinates.py +39 -0
  212. scadpy/d3/solid/topologies/vertex/get_solid_vertex_to_part.py +37 -0
  213. scadpy/d3/solid/transformations/__init__.py +23 -0
  214. scadpy/d3/solid/transformations/color_solid.py +46 -0
  215. scadpy/d3/solid/transformations/convexify_solid.py +64 -0
  216. scadpy/d3/solid/transformations/mirror_solid.py +53 -0
  217. scadpy/d3/solid/transformations/pull_solid.py +67 -0
  218. scadpy/d3/solid/transformations/push_solid.py +67 -0
  219. scadpy/d3/solid/transformations/recoordinate_solid.py +68 -0
  220. scadpy/d3/solid/transformations/resize_solid.py +92 -0
  221. scadpy/d3/solid/transformations/rotate_solid.py +93 -0
  222. scadpy/d3/solid/transformations/scale_solid.py +58 -0
  223. scadpy/d3/solid/transformations/translate_solid.py +54 -0
  224. scadpy/d3/solid/types/__init__.py +3 -0
  225. scadpy/d3/solid/types/solid.py +448 -0
  226. scadpy/d3/utils/__init__.py +3 -0
  227. scadpy/d3/utils/resolve_vector_3d.py +50 -0
  228. scadpy/utils/__init__.py +6 -0
  229. scadpy/utils/resolve_vector.py +64 -0
  230. scadpy/utils/x.py +38 -0
  231. scadpy/utils/y.py +38 -0
  232. scadpy/utils/z.py +38 -0
  233. scadpy-0.1.0.dist-info/METADATA +282 -0
  234. scadpy-0.1.0.dist-info/RECORD +236 -0
  235. scadpy-0.1.0.dist-info/WHEEL +4 -0
  236. scadpy-0.1.0.dist-info/licenses/LICENSE.md +43 -0
scadpy/utils/x.py ADDED
@@ -0,0 +1,38 @@
1
+ import numpy as np
2
+ from numpy.typing import NDArray
3
+ from typeguard import typechecked
4
+
5
+
6
+ @typechecked
7
+ def x(n: float) -> NDArray[np.float64]:
8
+ """
9
+ Creates a 3D vector along the X-axis.
10
+
11
+ Parameters
12
+ ----------
13
+ n : float
14
+ The value of the X component. The Y and Z components are set to 0.
15
+
16
+ Returns
17
+ -------
18
+ NDArray[np.float64]
19
+ A NumPy array of shape (3,) representing the vector `[n, 0, 0]`.
20
+
21
+ Notes
22
+ -----
23
+ - The resulting array always has 3 elements.
24
+ - The dtype of the array is `np.float64`.
25
+
26
+ Examples
27
+ --------
28
+ >>> from scadpy import x
29
+ >>> x(5)
30
+ array([5., 0., 0.])
31
+
32
+ >>> x(-2.3)
33
+ array([-2.3, 0. , 0. ])
34
+
35
+ >>> x(0)
36
+ array([0., 0., 0.])
37
+ """
38
+ return np.array([n, np.nan, np.nan], dtype=np.float64)
scadpy/utils/y.py ADDED
@@ -0,0 +1,38 @@
1
+ import numpy as np
2
+ from numpy.typing import NDArray
3
+ from typeguard import typechecked
4
+
5
+
6
+ @typechecked
7
+ def y(n: float) -> NDArray[np.float64]:
8
+ """
9
+ Creates a 3D vector along the Y-axis.
10
+
11
+ Parameters
12
+ ----------
13
+ n : float
14
+ The value of the Y component. The X and Z components are set to 0.
15
+
16
+ Returns
17
+ -------
18
+ NDArray[np.float64]
19
+ A NumPy array of shape (3,) representing the vector `[0, n, 0]`.
20
+
21
+ Notes
22
+ -----
23
+ - The resulting array always has 3 elements.
24
+ - The dtype of the array is `np.float64`.
25
+
26
+ Examples
27
+ --------
28
+ >>> from scadpy import y
29
+ >>> y(5)
30
+ array([0., 5., 0.])
31
+
32
+ >>> y(-2.3)
33
+ array([ 0. , -2.3, 0. ])
34
+
35
+ >>> y(0)
36
+ array([0., 0., 0.])
37
+ """
38
+ return np.array([np.nan, n, np.nan], dtype=np.float64)
scadpy/utils/z.py ADDED
@@ -0,0 +1,38 @@
1
+ import numpy as np
2
+ from numpy.typing import NDArray
3
+ from typeguard import typechecked
4
+
5
+
6
+ @typechecked
7
+ def z(n: float) -> NDArray[np.float64]:
8
+ """
9
+ Creates a 3D vector along the Z-axis.
10
+
11
+ Parameters
12
+ ----------
13
+ n : float
14
+ The value of the Z component. The X and Y components are set to 0.
15
+
16
+ Returns
17
+ -------
18
+ NDArray[np.float64]
19
+ A NumPy array of shape (3,) representing the vector `[0, 0, n]`.
20
+
21
+ Notes
22
+ -----
23
+ - The resulting array always has 3 elements.
24
+ - The dtype of the array is `np.float64`.
25
+
26
+ Examples
27
+ --------
28
+ >>> from scadpy import z
29
+ >>> z(5)
30
+ array([0., 0., 5.])
31
+
32
+ >>> z(-2.3)
33
+ array([ 0. , 0. , -2.3])
34
+
35
+ >>> z(0)
36
+ array([0., 0., 0.])
37
+ """
38
+ return np.array([np.nan, np.nan, n], dtype=np.float64)
@@ -0,0 +1,282 @@
1
+ Metadata-Version: 2.4
2
+ Name: ScadPy
3
+ Version: 0.1.0
4
+ Summary: Simplified 2D/3D modeling for Python with fluent API and boolean operations
5
+ Author: m-fabregue
6
+ License: # MIT License
7
+
8
+ Copyright (c) 2026 m-fabregue
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ ---
29
+
30
+ ## Third-party dependencies
31
+
32
+ ScadPy depends on the following third-party libraries, each distributed under
33
+ their own terms:
34
+
35
+ | Package | License |
36
+ |---------|---------|
37
+ | [trimesh](https://github.com/mikedh/trimesh) | MIT |
38
+ | [Shapely](https://github.com/shapely/shapely) | BSD 3-Clause |
39
+ | [typeguard](https://github.com/agronholm/typeguard) | MIT |
40
+ | [IPython](https://github.com/ipython/ipython) | BSD 3-Clause |
41
+ | [PySide6](https://doc.qt.io/qtforpython) | LGPL v3 |
42
+ | [triangle](https://github.com/drufat/triangle) | See note below |
43
+
44
+ **Note on `triangle`:** The `triangle` package wraps Jonathan Shewchuk's
45
+ Triangle library, which restricts commercial use without written permission
46
+ from the author. Users intending commercial applications should review
47
+ [Triangle's license](https://www.cs.cmu.edu/~quake/triangle.html) and
48
+ consider replacing the `triangle` dependency accordingly.
49
+ License-File: LICENSE.md
50
+ Keywords: 2d,3d,modeling,python,scad,shape,solid
51
+ Classifier: Development Status :: 3 - Alpha
52
+ Requires-Python: >=3.12
53
+ Requires-Dist: ipython~=8.30
54
+ Requires-Dist: matplotlib~=3.10
55
+ Requires-Dist: pyside6~=6.10
56
+ Requires-Dist: triangle==20250106
57
+ Requires-Dist: trimesh[easy]~=4.10
58
+ Requires-Dist: typeguard~=4.4
59
+ Provides-Extra: dev
60
+ Requires-Dist: coverage; extra == 'dev'
61
+ Requires-Dist: furo; extra == 'dev'
62
+ Requires-Dist: genbadge[coverage]; extra == 'dev'
63
+ Requires-Dist: interrogate; extra == 'dev'
64
+ Requires-Dist: numpydoc; extra == 'dev'
65
+ Requires-Dist: sphinx; extra == 'dev'
66
+ Requires-Dist: sphinx-autodoc-typehints; extra == 'dev'
67
+ Requires-Dist: sphinx-pyproject; extra == 'dev'
68
+ Description-Content-Type: text/markdown
69
+
70
+ # ScadPy
71
+
72
+ ![test coverage](docs/_static/badges/coverage.svg)
73
+ ![doc coverage](docs/_static/badges/interrogate.svg)
74
+
75
+ **Programmatic CAD in Pure Python.**
76
+
77
+ ScadPy provides a fluent, type-safe API for 2D and 3D parametric modeling,
78
+ built on [Shapely](https://shapely.readthedocs.io) and
79
+ [trimesh](https://trimesh.org).
80
+ Write designs with the conciseness of OpenSCAD and the full power of Python.
81
+
82
+ ## Installation
83
+
84
+ ```bash
85
+ pip install scadpy
86
+ ```
87
+
88
+ Requirements: Python ≥ 3.12.
89
+
90
+ ## Quick examples
91
+
92
+ ```python
93
+ # 2D — chamfered mounting plate
94
+ from scadpy import *
95
+ import numpy as np
96
+
97
+ PLATE_WIDTH = 80
98
+ PLATE_HEIGHT = 50
99
+ HOLE_RADIUS = 4
100
+ HOLE_MARGIN = 10
101
+ CHAMFER_SIZE = 8
102
+
103
+ base = rectangle([PLATE_WIDTH, PLATE_HEIGHT])
104
+ plate = base.chamfer(CHAMFER_SIZE)
105
+ corner_coordinates = base.vertex_coordinates[base.corner_to_vertex[:, 1]]
106
+
107
+ for position, normal in zip(corner_coordinates, base.corner_normals):
108
+ hole_center = position - HOLE_MARGIN * np.sqrt(2) * normal
109
+ plate -= circle(HOLE_RADIUS).translate(hole_center)
110
+ ```
111
+
112
+ ```python
113
+ # 3D — parametric ball bearing
114
+ import numpy as np
115
+ from scadpy import *
116
+
117
+ BALL_RADIUS = 3
118
+ RACE_RADIUS = 15
119
+ NB_BALLS = 11
120
+ CLEARANCE = 0.1
121
+ RING_HEIGHT = 7
122
+ RACE_THICKNESS = 10
123
+
124
+ groove = circle(BALL_RADIUS + CLEARANCE) | rectangle([BALL_RADIUS, RING_HEIGHT])
125
+ race = rectangle([RACE_THICKNESS, RING_HEIGHT]) - groove
126
+ race = race.radial_extrude(axis=y(1), pivot=x(RACE_RADIUS))
127
+
128
+ balls = Solid()
129
+ for angle in np.linspace(0, 360, NB_BALLS, endpoint=False):
130
+ balls += sphere(BALL_RADIUS).rotate(angle, axis=y(1), pivot=x(RACE_RADIUS))
131
+
132
+ bearing = race + balls
133
+ ```
134
+
135
+ ## Cheat sheet
136
+
137
+ *Parameters shown in `# comments` are optional, with their default values.*
138
+
139
+ **2D — Shape**
140
+
141
+ ```python
142
+ from scadpy import *
143
+
144
+ # primitives
145
+ circle(radius=3) # segment_count=64
146
+ polygon(points=[(-2, -2), (2, -2), (0, 2)])
147
+ rectangle(size=[6, 3])
148
+ Shape.from_dxf("file.dxf")
149
+ Shape.from_svg("file.svg")
150
+ square(size=4)
151
+
152
+ # boolean operations
153
+ s = square(size=4); c = circle(radius=3)
154
+ s | c # union
155
+ s - c # difference
156
+ s & c # intersection
157
+ s ^ c # symmetric difference
158
+ s + c # concat (no merge)
159
+
160
+ # transforms
161
+ s.chamfer(size=0.8) # corner_filter=None, epsilon=1e-8
162
+ s.color(color=RED)
163
+ s.convexify() # part_filter=None
164
+ s.fill() # part_filter=None
165
+ s.fillet(size=0.8) # corner_filter=None, segment_count=32, epsilon=1e-8
166
+ s.grow(distance=0.5) # part_filter=None
167
+ s.linear_cut(axis=x(1)) # pivot=0
168
+ s.linear_slice(thickness=2, direction=x(1)) # pivot=0, part_filter=None
169
+ s.mirror(normal=[1, 0]) # pivot=0
170
+ s.pull(distance=1.0) # pivot=0, vertex_filter=None
171
+ s.push(distance=1.0) # pivot=0, vertex_filter=None
172
+ s.radial_slice(start=0, end=180) # pivot=0, part_filter=None
173
+ s.resize(size=[6, None]) # auto=False, pivot=None, vertex_filter=None
174
+ s.rotate(angle=30) # pivot=0, vertex_filter=None
175
+ s.scale(scale=[2, 0.5]) # pivot=0, vertex_filter=None
176
+ s.shrink(distance=0.5) # part_filter=None
177
+ s.translate(translation=[2, 1]) # vertex_filter=None
178
+
179
+ # topology — coordinates & attributes
180
+ s.are_corners_convex # (n_corners,) — convexity mask
181
+ s.corner_angles # (n_corners,) — interior angles (°)
182
+ s.corner_normals # (n_corners, 2) — outward unit normals
183
+ s.directed_edge_directions # (2*n_edges, 2)
184
+ s.edge_lengths # (n_edges,)
185
+ s.edge_midpoints # (n_edges, 2)
186
+ s.edge_normals # (n_edges, 2)
187
+ s.ring_types # (n_rings,) — "exterior"|"interior"
188
+ s.vertex_coordinates # (n_vertices, 2)
189
+
190
+ # topology — bridges (*_to_*)
191
+ s.corner_to_incoming_directed_edge # corner → directed_edge
192
+ s.corner_to_outgoing_directed_edge # corner → directed_edge
193
+ s.corner_to_vertex # corner → [prev, curr, next]
194
+ s.directed_edge_to_corner # directed_edge → [source, target]
195
+ s.directed_edge_to_edge # directed_edge → edge
196
+ s.directed_edge_to_vertex # directed_edge → [start, end]
197
+ s.edge_to_vertex # edge → [start, end]
198
+ s.ring_to_part # ring → part
199
+ s.vertex_to_part # vertex → part
200
+ s.vertex_to_ring # vertex → ring
201
+
202
+ # extrusions → Solid
203
+ s.linear_extrude(height=3)
204
+ s.radial_extrude(axis=y(1), pivot=x(5)) # start=0, end=360, segment_count=64
205
+
206
+ # export
207
+ s.to_dxf_file("output.dxf")
208
+ s.to_html_file("output.html")
209
+ s.to_screen()
210
+ s.to_svg_file("output.svg")
211
+ ```
212
+
213
+ **3D — Solid**
214
+
215
+ ```python
216
+ from scadpy import *
217
+
218
+ # primitives
219
+ cone(radius=2, height=4) # section_count=32
220
+ cuboid(size=[4, 3, 2])
221
+ cylinder(radius=2, height=4) # section_count=32
222
+ polyhedron(vertices=vertices, faces=faces)
223
+ sphere(radius=3) # subdivision_count=4
224
+ Solid.from_stl("model.stl")
225
+
226
+ # boolean operations
227
+ a = cuboid(size=[4, 3, 2]); b = sphere(radius=2)
228
+ a | b # union
229
+ a - b # difference
230
+ a & b # intersection
231
+ a ^ b # symmetric difference
232
+ a + b # concat (no merge)
233
+
234
+ # transforms
235
+ a.color(color=RED)
236
+ a.convexify() # part_filter=None
237
+ a.mirror(normal=[1, 0, 0]) # pivot=0
238
+ a.pull(distance=1.0) # pivot=0, vertex_filter=None
239
+ a.push(distance=1.0) # pivot=0, vertex_filter=None
240
+ a.resize(size=[6, None, None]) # auto=False, pivot=None, vertex_filter=None
241
+ a.rotate(angle=30, axis=z(1)) # pivot=0, vertex_filter=None
242
+ a.scale(scale=[2, 1, 0.5]) # pivot=0, vertex_filter=None
243
+ a.translate(translation=[1, 0, 0]) # vertex_filter=None
244
+
245
+ # topology — coordinates & bridges (*_to_*)
246
+ a.triangle_to_vertex # triangle → [v0, v1, v2]
247
+ a.vertex_coordinates # (n_vertices, 3)
248
+ a.vertex_to_part # vertex → part
249
+
250
+ # export
251
+ a.to_html_file("output.html")
252
+ a.to_screen()
253
+ a.to_stl_file("output.stl")
254
+ ```
255
+
256
+ ## Roadmap
257
+
258
+ - Improve documentation
259
+ - Richer topology for Shape and Solid
260
+ - Richer transformations for Shape and Solid
261
+ - Chamfer and fillet on Solid
262
+ - New assembly types: `PointCloud2d`, `Wire2d`, `PointCloud3d`, `Wire3d`
263
+ - Better error messages
264
+ - More import/export formats
265
+
266
+ ## Development
267
+
268
+ ```bash
269
+ # Create and activate venv
270
+ python3 -m venv .venv
271
+ source .venv/bin/activate
272
+
273
+ # Install with dev dependencies
274
+ pip install -e .[dev]
275
+
276
+ # Run doctests & generate documentation
277
+ cd docs && make doctest && make html
278
+ ```
279
+
280
+ ## License
281
+
282
+ See [LICENSE.md](LICENSE.md).
@@ -0,0 +1,236 @@
1
+ scadpy/__init__.py,sha256=S3rpD-p5bX8ijJ5FqpZ1xPG0YeBRdIysnywNouipulU,168
2
+ scadpy/color/__init__.py,sha256=VIw4RycaeifYwodFocahMGjTtbW9K_9vIXDfjQMNH6U,66
3
+ scadpy/color/constants/BEIGE.py,sha256=2LabfIuyPGZ8ePeg61Tt02NGdDNSgPKxnApkzRfHsC8,112
4
+ scadpy/color/constants/BLACK.py,sha256=I_0crqd1jcDfm0Iqy-zDyfRpBsmsX7_6FfxCWOR2nWE,112
5
+ scadpy/color/constants/BLUE.py,sha256=TI3ywBxUkZXD7MFEVKKyck8TIW1Pdjn3BUvIhdXMjF4,108
6
+ scadpy/color/constants/BROWN.py,sha256=bB9lsUnnzVMsPJSS1sWlENorHbL8KVpI1m8PnB_35mw,112
7
+ scadpy/color/constants/DARK_GRAY.py,sha256=3LJyIKt1Gt2ON2KmheOu15v1ppy7Y7NANZwc9tSj4rY,116
8
+ scadpy/color/constants/DEFAULT_COLOR.py,sha256=E-6Zek22BozPU9OTMiziuqY4UD4WHUOovJ1ZRog49Ik,67
9
+ scadpy/color/constants/DEFAULT_OPACITY.py,sha256=FIdn3dDE8rGAf_-zqnJYhskwsWk0OfKgP-D-ERrn8hE,20
10
+ scadpy/color/constants/GRAY.py,sha256=yGrhEXoV-0dnK0n4Y-ZLYsN7ffsB3jD0ksxqFax7zto,108
11
+ scadpy/color/constants/GREEN.py,sha256=RqNY3Mip81cPvccc2xN7GaiJ4xImuo01zqn-gj4NwX4,109
12
+ scadpy/color/constants/ORANGE.py,sha256=ZY-YgD9exM88JsreFJE-E6j7RV_Z_LGtCF9RG-lJ4-c,111
13
+ scadpy/color/constants/RED.py,sha256=htoD6nvyiDukmRQKF_Z18L0itRhkL4MuKpulhkQyJqk,107
14
+ scadpy/color/constants/WHITE.py,sha256=WL5YFMp6K5_ZJOnd3FOU_QBvOVNmKcwPf-PKfWQb09M,112
15
+ scadpy/color/constants/YELLOW.py,sha256=Vl913MKEKTBGmToikRxMX7QEiUZWcA1ymyF3kkcQwNY,112
16
+ scadpy/color/constants/__init__.py,sha256=zrV0dQ8DVDkOF2hRMGT1sNGQrz6Yt4qWwdp3bqNDMdY,569
17
+ scadpy/color/type/__init__.py,sha256=iOb77plistC4RzOl_nTfhziE9JxkqonWW7i9tp4U8iU,46
18
+ scadpy/color/type/color.py,sha256=Nz0_8K87_eevxZenchUDdyNH0dyhnZRlUcnBU6u3FaU,62
19
+ scadpy/color/utils/__init__.py,sha256=UpIeWA9aG2hIe3zHJJ7PPEFpGare7iyCaARJqyhPyJw,79
20
+ scadpy/color/utils/get_random_color.py,sha256=L5fcjAI9X7YaVlZ-vLhSPszldyD1o4HRcTe77UhWMZE,996
21
+ scadpy/core/__init__.py,sha256=Z2BeNjjy_InYkNNTcEgsZu9VriyLCIcJh1PPyT0N9M0,111
22
+ scadpy/core/assembly/__init__.py,sha256=u0xj8A8o9YVkOxBVnM3sH6L951w21WB_Q_PZ6mrEYEU,197
23
+ scadpy/core/assembly/combinations/__init__.py,sha256=_WpRwUreTmYxLD4HanPoqZa0y5r-EsFSwyWVZz1zuic,400
24
+ scadpy/core/assembly/combinations/concat_assemblies.py,sha256=O9iQyZzuMAfLqNME3Qti_2iQNjAUKfdds0JjL85H80g,1476
25
+ scadpy/core/assembly/combinations/exclude_assemblies.py,sha256=Toa3R6aJ0mDwIZKfYZwml2nKqv9zpUzU_0yjA35sYak,5088
26
+ scadpy/core/assembly/combinations/intersect_assemblies.py,sha256=CZgYPn9ZOK6-jkXhh-TstnaDEiC-47JCmbfLwH9WvQg,4868
27
+ scadpy/core/assembly/combinations/subtract_assemblies.py,sha256=XE53RjShFMjUfESXcVvW0TJoDUVDgSnjFmeR3u8sk-c,5420
28
+ scadpy/core/assembly/combinations/unify_assemblies.py,sha256=nY7kzxfvtWmlLmBsSsXD2OdlucGJHt_qAHrnOcTG70k,1778
29
+ scadpy/core/assembly/topologies/__init__.py,sha256=viKuCKa7PPu8Xcag1TtjseKhrEdzhtZ8XclpKZMyTws,1279
30
+ scadpy/core/assembly/topologies/directed_edge/__init__.py,sha256=vsYhBdsp-C5vM-gaamVphh1iOVpr4DBz73eZyssl5A4,405
31
+ scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_directions.py,sha256=UgVbNVeEOEpqNmsIt8fPK9SFCmC5JvQi-IDxl4XvfCo,2228
32
+ scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_edge.py,sha256=Vr1p03lZJe-KpIBAdKZd7yKxseWHHiM_ul1mo9OeIHI,1257
33
+ scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_vertex.py,sha256=-nphci_ZlOfJv5baVFgLoPEJ3hn-ql-gAg6Rs2e83f4,1549
34
+ scadpy/core/assembly/topologies/edge/__init__.py,sha256=8ol0k0VMO68e5gUsqqmBz_jszR-7_TESEww-kkKB3_8,315
35
+ scadpy/core/assembly/topologies/edge/get_assembly_edge_lengths.py,sha256=W1tFKWI3szzhedzmFUJQ00PNEqUZ2F1cmgmM_9Ojvh8,1401
36
+ scadpy/core/assembly/topologies/edge/get_assembly_edge_midpoints.py,sha256=4ONtij0b0jS8p-mtP5cRnAtsQpnmlQASQBFp3gmepeQ,1535
37
+ scadpy/core/assembly/topologies/edge/get_assembly_edge_normals.py,sha256=43fug7ag73zaUAwbcWHIuKkHRhvFzq7zghy_-YBFTBg,2278
38
+ scadpy/core/assembly/topologies/face_corner/__init__.py,sha256=poMXz-dQSmiLFLjB9XFbDZpySqqqaAurpD3zZTGPpew,742
39
+ scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_angles.py,sha256=WKxkdKu71VdCpyR0iA5GxMDc_DQGa05naU-tS_c1y2Y,2344
40
+ scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_normals.py,sha256=EObqrfsUQw6agYu-lYAB22yPdEx9x_Ie11mQ7D5D9lM,3747
41
+ scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_to_incoming_directed_edge.py,sha256=jIOIZGEWRL7U9QkFy_-WsNvdikqtQo84vDJWOucYJpo,1990
42
+ scadpy/core/assembly/topologies/face_corner/get_assembly_face_corner_to_outgoing_directed_edge.py,sha256=AvLZ77JmO4v0O7M2MXtPSpVU3zsxKzaP8Rwk6bVKGss,1990
43
+ scadpy/core/assembly/topologies/face_corner/get_assembly_face_directed_edge_to_corner.py,sha256=cvWOvDx8m7nYW1BMtKwEI8GFYPQjgTtEFyMt8YQ3Bjw,3145
44
+ scadpy/core/assembly/topologies/part/__init__.py,sha256=XDZKNyeHbt8keEWcW-97ZHtbGlQ9g15dOSD6VzNz5fY,110
45
+ scadpy/core/assembly/topologies/part/get_assembly_part_colors.py,sha256=yUkE1Vw-Xjpb7qCa0PI7MbeKbBIWTv0Qtnj8A6rgrVk,1517
46
+ scadpy/core/assembly/topologies/vertex/__init__.py,sha256=J6aMFxozxmMwBSjD1JZcVAOhQTyvcjBjDs-1ummchxk,235
47
+ scadpy/core/assembly/topologies/vertex/get_assembly_vertex_coordinates.py,sha256=VBGQrfVP8dPMDxdk1R9OmU_heASUh9ue4J5dxAVU3ac,2124
48
+ scadpy/core/assembly/topologies/vertex/get_assembly_vertex_to_part.py,sha256=URTNjT5jhwCv6MTtQzfwVG44E9tojXPi5UqEm0zSqCk,1914
49
+ scadpy/core/assembly/transformations/__init__.py,sha256=AWGp3GLeK5LKQ8bl2zyJgs-L7J0PNBqgxzMrbL6Bh8s,760
50
+ scadpy/core/assembly/transformations/color_assembly.py,sha256=mKsEqf-C0l_3hJT6__Wukg71VXl4n2cmXVIyd4KYHmU,606
51
+ scadpy/core/assembly/transformations/mirror_vertex_coordinates.py,sha256=A3-4N69Lv00tBZzIdQPyU9rd_MfIFPAoNdSW_YUXQAw,2190
52
+ scadpy/core/assembly/transformations/pull_vertex_coordinates.py,sha256=gXaig_WuUdalLXfTcrYSHLmC91Xp0Y2snEiaAUKP2hw,2157
53
+ scadpy/core/assembly/transformations/push_vertex_coordinates.py,sha256=Xtzs0mAoC3RzigTozTq8YwjN4B3v8QTpAIoJmZlXHpQ,2121
54
+ scadpy/core/assembly/transformations/resize_vertex_coordinates.py,sha256=w1IkbFnjl87XRDrDFScm60E0YqBrCEtLthqqSuEGNo0,4297
55
+ scadpy/core/assembly/transformations/rotate_vertex_coordinates.py,sha256=h7YOtHj2Hd9AiTzgdk47fofKYjwKHlNkgvgFFHv7SBY,2378
56
+ scadpy/core/assembly/transformations/scale_vertex_coordinates.py,sha256=KM8-_iNxC2_lPZmq69clqGTil4oTZGo2yfpMqC8Xe0I,2654
57
+ scadpy/core/assembly/transformations/translate_vertex_coordinates.py,sha256=550PssRE8LXOL2sT15T4cqLf8zmYMPaTmEkuNLkPap4,2223
58
+ scadpy/core/assembly/types/__init__.py,sha256=o5F5d6SXULwTspOWNxbgKn6QcRlUQ2c2RzZRtESDBxc,128
59
+ scadpy/core/assembly/types/assembly.py,sha256=sci4q354lgrB4tOMd9kmhjicMPqPA11TSAjAI-Isu2c,400
60
+ scadpy/core/assembly/types/topology_filter.py,sha256=RrpkdR8hLW21i4315gM29ETrhcR8vzW_hsz9pAXgSn8,169
61
+ scadpy/core/assembly/utils/__init__.py,sha256=f85LZ6bQe-iOxTgTmvY4Qi2y6qyGU8fD9TMfW2mTDAk,261
62
+ scadpy/core/assembly/utils/lookup_pairs.py,sha256=Rb385VHhxxPsDTmTnUBXOGYjAjQ8VOO4V_7MmxSE_Yg,1676
63
+ scadpy/core/assembly/utils/resolve_topology_filter.py,sha256=4KD2F2J4pRE2aHI07Nc4hJI6_OsYtsPhXc83Xj_3oEY,2504
64
+ scadpy/core/assembly/utils/transform_filtered_parts.py,sha256=6_txZl0FLzgNnR3LmZDQGyPJPkHUOrc_k2Kd6Yja0p0,1731
65
+ scadpy/core/component/__init__.py,sha256=Nb6HdYlAYRjHEIkO5O8e4necyzWmoYhFTQmqIQoy0gw,112
66
+ scadpy/core/component/exporters/__init__.py,sha256=JnNoDsowKKpuHLRM2kYqFLtggkWT4Bz632wXMt62Ywg,208
67
+ scadpy/core/component/exporters/map_component_to_html_file.py,sha256=_o_dzQR5Ms6CPfh_mZYBwtoxhaza9wmYtL-tOOCQC38,1333
68
+ scadpy/core/component/exporters/map_component_to_screen.py,sha256=fdm0srpgoGbJgmXx1vO7OXRx4FS-OZdr0sQRbBIPqLU,1679
69
+ scadpy/core/component/features/__init__.py,sha256=ZHb4kioHu0supWjjuKmhGwyCHDhiaIieQWJyswkwuPQ,98
70
+ scadpy/core/component/features/get_component_bounds.py,sha256=zfLqT8B_daUm66nf6K6EkNfeEmqV9eCCqClgyLjCNE0,1155
71
+ scadpy/core/component/utils/__init__.py,sha256=eXx4PKS5RBuuHijhYvh8g1wK_LoGcnLOK0qxTp9cOuA,253
72
+ scadpy/core/component/utils/blend_component_colors.py,sha256=naGcaBIE_-zLYvIHC9UiFQ926YQ7TTzSUlazLh26uxs,2474
73
+ scadpy/core/component/utils/get_intersecting_component_index_groups.py,sha256=f2oSgupU59QaE6BCefe6e2Wc0Ly2JP2yhKaXZYuEUEU,3652
74
+ scadpy/core/part/__init__.py,sha256=TzCjslcrnpvAAL478u0Sob4pvb1id3I8z2g8-0-0CqU,112
75
+ scadpy/core/part/combinations/__init__.py,sha256=tynJAbeUwJtxKdM4yXl_qWuKK6AiYEri82pW0a4WtqI,263
76
+ scadpy/core/part/combinations/concat_parts.py,sha256=P4suSxRA3tew6UrvBc-E-1-Fi-zwXzc5-AS3RPQR0C8,1324
77
+ scadpy/core/part/combinations/intersect_parts.py,sha256=O0_Kv8KR7NIhpIb-jBttACL_6McILoRId7rC9h3OoP4,5433
78
+ scadpy/core/part/combinations/subtract_parts.py,sha256=eYEncicSz3b3rbh1r4o7AXDXCEgTN_gZmuBuNBYnzNc,3498
79
+ scadpy/core/part/combinations/unify_parts.py,sha256=x0FRXF_SPdNmOGMmoxrLwhmTOqtQT11l-SAGJMxZteI,5177
80
+ scadpy/core/part/types/__init__.py,sha256=Xfjhw9m3zYoYTV3nraiygPDeRruarxXy1_PZl0xwvuo,50
81
+ scadpy/core/part/types/part.py,sha256=_XsBqOwO-Zm9lZfG1cdmmmCRlaRdInLBee9BlClhCJE,803
82
+ scadpy/core/part/utils/__init__.py,sha256=kuTgxDd64XCfyPgVOEbysviJVXWEeKp1jl1zqDCHWbU,89
83
+ scadpy/core/part/utils/blend_part_colors.py,sha256=c95kjtZnbjmlAjZbEuIhpBHDvyJC3oY3pSn4M5E-0h0,811
84
+ scadpy/d2/__init__.py,sha256=st99IfSVLiYLReE8Y6woh65BPkl12mcc_dnP1Lrge1c,70
85
+ scadpy/d2/shape/__init__.py,sha256=JWOYe5bTksKiXB9v6UXEpca0I_jmZr5yBTb3vrBelBE,353
86
+ scadpy/d2/shape/combinations/__init__.py,sha256=NAnoCMhI6ii6JOdTQJi4X_SkANH1Ox9b0tejiDT6G5A,675
87
+ scadpy/d2/shape/combinations/are_shape_parts_intersecting.py,sha256=55CFYn0OxBV6qvpuToEUqcKB2XyQdQFD67QilcZ8G0M,1134
88
+ scadpy/d2/shape/combinations/concat_shape.py,sha256=VBiV0PFpEMZLjziOA5GcoY4fM0Gsssh9EfZhNiNe-ag,1283
89
+ scadpy/d2/shape/combinations/exclude_shape.py,sha256=3XAZw_CxMvMqWO7xVrLwMpbdTKnZfDDMd5_qwCJASB0,2123
90
+ scadpy/d2/shape/combinations/intersect_shape.py,sha256=KuPuJ1P2QOQv8ifx0p87gJgfTfkPzPk2pBd_ytkhbt4,1769
91
+ scadpy/d2/shape/combinations/intersect_shape_parts.py,sha256=SM60IjXMLNuniXuylxMvP_hzLAUeporjrM3OitMG7U4,2510
92
+ scadpy/d2/shape/combinations/subtract_shape.py,sha256=I3cO32mOFE0_PqR5sPXBiaLDaVNhmaSqvOkvtGH97ys,2144
93
+ scadpy/d2/shape/combinations/subtract_shape_parts.py,sha256=6oNbIRD9thb2UxOCpHk8aTAiDNAgbc4WKSaFHXIhZwA,2194
94
+ scadpy/d2/shape/combinations/unify_shape.py,sha256=EVNXUmGWVtYzY0DcpRq2PIHyVfdlzU6UpRYQjInoelM,1403
95
+ scadpy/d2/shape/combinations/unify_shape_parts.py,sha256=hBzfsUI1TJP_0ws6kz3TAMeaB2AvL6eZ0ES8s5mrTRk,2406
96
+ scadpy/d2/shape/exporters/__init__.py,sha256=ZXkgyxHL8kcryKVTyyjjY_Vj4ojeCk-j2-7PH0VKBI4,572
97
+ scadpy/d2/shape/exporters/map_shape_to_dxf.py,sha256=IJ6Zn-tMsSIAKU3aeiuGAyEe7FYdLw_qimQZv30ccVs,974
98
+ scadpy/d2/shape/exporters/map_shape_to_dxf_file.py,sha256=UxAZZV8jq6AKvJ9DZwDhNdUlZWFl_eqcQoPev0jMThk,832
99
+ scadpy/d2/shape/exporters/map_shape_to_html.py,sha256=slAi01Q70xdE9eYwFvOhf7W2agUTCUYM_nwCLqzKYzw,3497
100
+ scadpy/d2/shape/exporters/map_shape_to_html_file.py,sha256=yUMgKsJOZ5HgMWTx1oDvRjgr59XKNsBq4SHKCGNnAss,1512
101
+ scadpy/d2/shape/exporters/map_shape_to_screen.py,sha256=5MyJxNJKZy-LvPES2OYZxvmNEOhaUMrwqYlx4llFOv0,1297
102
+ scadpy/d2/shape/exporters/map_shape_to_svg.py,sha256=O7YXGTsmmM7GkOQJzcXXBEtUMOtbUaUf58Ct7ZMyjhE,919
103
+ scadpy/d2/shape/exporters/map_shape_to_svg_file.py,sha256=XWl2eiyhdjv5FazOypsmCXsxYjUWjpATIWXzUunNEjU,833
104
+ scadpy/d2/shape/features/__init__.py,sha256=92Il5zyBnbSkcZ8mFizEIzBfz1uQmmuhRCN-VEu4LOY,237
105
+ scadpy/d2/shape/features/get_shape_bounds.py,sha256=koordjhuSEwMVCIwCxTaNxXcWazKbhTYNXL492TkJJ0,954
106
+ scadpy/d2/shape/features/get_shape_part_bounds.py,sha256=EgTlp6W3qrw5ETAAQHhkZkFRPvayThzMSMp6Rq_DJvI,988
107
+ scadpy/d2/shape/features/is_shape_empty.py,sha256=NsrZx3T7JPXkC7glNWT4EteQqAK3mf1CCMcJhgJwY_s,788
108
+ scadpy/d2/shape/importers/__init__.py,sha256=5qjcgirT1Fv4MFjuJoZ1vko8NI4P8PeE7zeBb6o8OHE,412
109
+ scadpy/d2/shape/importers/map_dxf_to_shape.py,sha256=MjbFtn-B85dD_oJc_M55jl0VTGf4mFLPl9fMRx4qhZA,1727
110
+ scadpy/d2/shape/importers/map_geometries_to_shape.py,sha256=1rSbKmG352z_fkLoUCMdm3JwT_LxSvgCYBs8hde5sb4,1191
111
+ scadpy/d2/shape/importers/map_geometry_to_shape.py,sha256=SDADtEYwdjx0Kop1UH0Ar39KgKqDz4lFlTTfhXXdkyg,1067
112
+ scadpy/d2/shape/importers/map_parts_to_shape.py,sha256=DbKL8cMVLIAm7XkaRtvLtkP3vSFroF7eNvFz1BlNxc0,1992
113
+ scadpy/d2/shape/importers/map_svg_to_shape.py,sha256=cFTXkLmeyVzXB3I_AGJjH7SLLlEYZabxxIQPzrLUc-8,1702
114
+ scadpy/d2/shape/primitives/__init__.py,sha256=QflmybbDax7_XOHbkUrmhiOcBwVzGmm_FdvIVX4UJ_c,172
115
+ scadpy/d2/shape/primitives/circle.py,sha256=RVLjtucUnInzba2iJsCgdNHXLjZ-hDlpfE2C1Aq3RPw,1921
116
+ scadpy/d2/shape/primitives/polygon.py,sha256=4QR-DjQFTvdAbOw9V39OMaXjswf7RqrN2dGONcEcb5o,2713
117
+ scadpy/d2/shape/primitives/rectangle.py,sha256=b9EKUxt2ApWhuZ_6cfE2b1pCwdd4-KTbhFjFpP4VSnA,2305
118
+ scadpy/d2/shape/primitives/square.py,sha256=u5f9cZiJQ4PmNS4ft3AxERiKmEDfqxOj-P3juq86nqc,1332
119
+ scadpy/d2/shape/topologies/__init__.py,sha256=KiG9Jzy0uA1i3JOdLKQIB830FaC0I2jN0E7boRVrWPE,1528
120
+ scadpy/d2/shape/topologies/corner/__init__.py,sha256=6amLE67L4Me1FC611Xe2IPkuve1E9BhxpAYzX1W2eFU,696
121
+ scadpy/d2/shape/topologies/corner/are_shape_corners_convex.py,sha256=J0Usv4Jt_73wq-V4UTn2DX6OgrteXiO02hWZKb-x3xA,2253
122
+ scadpy/d2/shape/topologies/corner/get_shape_corner_angles.py,sha256=f-Y5z-5c9TFVHIS9DFb_TU1IWSvzW-o-4sgjd0ikAKM,1744
123
+ scadpy/d2/shape/topologies/corner/get_shape_corner_normals.py,sha256=UrVnoe1RgUkfYybmBvG4puqXzwj_ZlL51fvQQPr7peg,2701
124
+ scadpy/d2/shape/topologies/corner/get_shape_corner_to_incoming_directed_edge.py,sha256=Q-XcdwGK_bnubjW61j-fDE2aG0Lpyb7DAQWXg7dr9xQ,1140
125
+ scadpy/d2/shape/topologies/corner/get_shape_corner_to_outgoing_directed_edge.py,sha256=u8c0nhF0QCywpJgvdlLCmKZbqrCsWkOnCSU_TOhzooE,1140
126
+ scadpy/d2/shape/topologies/corner/get_shape_corner_to_vertex.py,sha256=otTOaXqomk2-n2nUUPFGHBbG-2uAW_btxf7SdKbMBvU,2045
127
+ scadpy/d2/shape/topologies/directed_edge/__init__.py,sha256=mvJRyGlq0XEWxlZYqSenaAk48zWSdFNNPsfhHTocMdU,500
128
+ scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_directions.py,sha256=mVtwM37b4w8SD92xo8KohXKkJdFdoZpoSVQvCYUinAg,1209
129
+ scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_corner.py,sha256=P0oLLsHPD5CpgaXZvUR0zdYsPcG51Vkecrr2z3_ynxQ,1176
130
+ scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_edge.py,sha256=fTaI-kLwCmiHDNGGIKsixPQUEXapklulwK7W0PLOfws,1481
131
+ scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_vertex.py,sha256=oYoOY2MTk84r5CQn_kFRLPRUAO7d8oB_awKZmYQ0__w,1696
132
+ scadpy/d2/shape/topologies/edge/__init__.py,sha256=PwtMeEs5ysoMegd_KRzxb1zB6wfT2wcHIrPaZR9HWX8,383
133
+ scadpy/d2/shape/topologies/edge/get_shape_edge_lengths.py,sha256=Ctk3ZDeECfqy7p_gWoOJQBYx6ffAphsboGleN2cgtCo,974
134
+ scadpy/d2/shape/topologies/edge/get_shape_edge_midpoints.py,sha256=Lj_AlFbsbQbwXP5nY9zZDb43z4_n7KtjZuv5WQxq7Yc,1082
135
+ scadpy/d2/shape/topologies/edge/get_shape_edge_normals.py,sha256=C-T6p2mACLx3W7yq0rBAO4f0Ydc4tW0oPo5BjHAj3-A,1005
136
+ scadpy/d2/shape/topologies/edge/get_shape_edge_to_vertex.py,sha256=0pNf9pj_aNF5R0hiJ2P7ctuXPssz2jGPhZkea21fxEc,2121
137
+ scadpy/d2/shape/topologies/ring/__init__.py,sha256=QVH_Yc5v5IX-154gQnPxZQvrdCutRyBubeP1btMFJ7c,187
138
+ scadpy/d2/shape/topologies/ring/get_shape_ring_to_part.py,sha256=w4mmdA8gc5PkCYPU4npR6e2I-pET3O4wlSZjpbsBiCE,1185
139
+ scadpy/d2/shape/topologies/ring/get_shape_ring_types.py,sha256=9kXeyb3erHJN92QMWPuJ3iBwM-3kN1utMvNzZh_Tils,1289
140
+ scadpy/d2/shape/topologies/vertex/__init__.py,sha256=KsS45b-T1EmiQ6v0vFm8bkyBC9jb00TIFnsreyIQbPo,434
141
+ scadpy/d2/shape/topologies/vertex/get_shape_part_vertex_coordinates.py,sha256=slyP1m2V8qkwi6VSjdC499_X5qsCKJhYSxEIo_-eR4c,1810
142
+ scadpy/d2/shape/topologies/vertex/get_shape_vertex_coordinates.py,sha256=wVhMrGUNdgCeEkLPoHXNgbjj1TONFZywhJ3PHrz9fms,1168
143
+ scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_part.py,sha256=Yiv7tRob85glm5OB8ulF-3OJaygW9hszbgdPkVZBEgM,1148
144
+ scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_ring.py,sha256=bs8TS-uS8IZBPIOtghPl1GrNpxOaqc2hVyAkkyQLX-Y,1809
145
+ scadpy/d2/shape/transformations/__init__.py,sha256=Wzfyo08i79pErOoAZ4e7ObdPL0O3kJNQvtP0pgcGbPo,1300
146
+ scadpy/d2/shape/transformations/chamfer_shape.py,sha256=VRVs4qdOgny7GwMzOqmU87svP6JNUEeGKuk9aHBke8Y,9532
147
+ scadpy/d2/shape/transformations/color_shape.py,sha256=w8utzqeV3lEVFWPAqGcmlfwZ0gBLklT0C1osJYQJ-20,1080
148
+ scadpy/d2/shape/transformations/convexify_shape.py,sha256=kGpgAbWK9-AVujzue4r_H2VJ0z6boodWTxfSfcTpnAU,2480
149
+ scadpy/d2/shape/transformations/fill_shape.py,sha256=N4ttXv_FmgC3eXgzS3ue4pDEY5bJ3Qyb72XUu38z3is,1977
150
+ scadpy/d2/shape/transformations/fillet_shape.py,sha256=jLoqhK8NR8kgI2zivKNJ48GmySrDDTQyjQgeIZHdW6E,10833
151
+ scadpy/d2/shape/transformations/grow_shape.py,sha256=e1dCHO3d2jDLuuvt4fTeVG1iuyVYDpST5P0PZQHACgI,2312
152
+ scadpy/d2/shape/transformations/linear_cut_shape.py,sha256=PhuukVMDn4rh_eBz9OQGft5zBi53P3er5u847tAMVpk,3415
153
+ scadpy/d2/shape/transformations/linear_extrude_shape.py,sha256=Vh66fmR9sGadlg3fP9VpnI8Iq0r85TlmXDpo1ErDO9Q,1596
154
+ scadpy/d2/shape/transformations/linear_slice_shape.py,sha256=yQp1tsTIsZvJE2FYVxiMN-AJOmHC74VCqxiTty-tOL4,4559
155
+ scadpy/d2/shape/transformations/mirror_shape.py,sha256=28879tUmnoL5qGr96WlAabVhE8uvd5Q7-xzNDl_BsI8,1519
156
+ scadpy/d2/shape/transformations/pull_shape.py,sha256=bLthR-Kdj9FxWfkXtUtSZAqgmA-O9jQbPCLhRyqVfgQ,2178
157
+ scadpy/d2/shape/transformations/push_shape.py,sha256=eqkAMOkBaoJMG7ElawNiuf17EryXHZP0ee0oedhyfjc,2174
158
+ scadpy/d2/shape/transformations/radial_extrude_shape.py,sha256=fNkEJYpyl3F08j1aaG5I-DnPNGSDLXGoUbjmgh7uwGA,8968
159
+ scadpy/d2/shape/transformations/radial_slice_shape.py,sha256=FkUwFCTY_Q_sj49yM_aSy44w2KT2oRvo6C-SaWN7b_c,3931
160
+ scadpy/d2/shape/transformations/recoordinate_shape.py,sha256=Po_9RAbvmvKxXkS9VIkf37nXnj5eVUMznk_nxF_8HXo,2448
161
+ scadpy/d2/shape/transformations/resize_shape.py,sha256=5oVvvgsdpKRBpiRAHPF9bUlnxXFjUDSP4-y1DiMJGSU,3073
162
+ scadpy/d2/shape/transformations/rotate_shape.py,sha256=aClye1iMu8y1TNOVXpmTZeR4EJDbrgmaQ_qRkYXxKFU,1914
163
+ scadpy/d2/shape/transformations/scale_shape.py,sha256=jMlJQiQV8122KZu2e-YTJtOOL3nz74L6drV3G-ANgnk,1846
164
+ scadpy/d2/shape/transformations/shrink_shape.py,sha256=cPv18R67xFXDCJJwV3Y-IQB2Fwr6H00SU_9xX-Irpbg,1946
165
+ scadpy/d2/shape/transformations/translate_shape.py,sha256=XMRg91pcS3MzTiYlX3M5Js9y3ov0l37fIyScPDsZXlk,1620
166
+ scadpy/d2/shape/types/__init__.py,sha256=kJVYFyLBcqKfmugnGnCeO0RUy8bAR02vwlJdvxUFrTA,46
167
+ scadpy/d2/shape/types/shape.py,sha256=n_LM08ut4OSbuaKcXdhHlzIp2_gNKJZ5oLtkk8aiXWY,23549
168
+ scadpy/d2/shape/types/utils/__init__.py,sha256=V2E8PkQhF1ugu8IreoTexvcDQgwozd1cuL5f2KPm9Tk,163
169
+ scadpy/d2/shape/types/utils/shapely_base_geometry_to_shapely_polygons.py,sha256=_K1dVBYsQnKQR2qYjBiPDU470w5fFZLomfrF84hmhgs,744
170
+ scadpy/d2/shape/utils/__init__.py,sha256=V2E8PkQhF1ugu8IreoTexvcDQgwozd1cuL5f2KPm9Tk,163
171
+ scadpy/d2/shape/utils/shapely_base_geometry_to_shapely_polygons.py,sha256=x9nX1jY1wzm_f0syVFOJV7QsUWGFMscaohXPYDwOKjs,1485
172
+ scadpy/d2/utils/__init__.py,sha256=p23jxTEirI58TVNSS9TLQSq3OvW3XuqwKOCGUdk6qrg,82
173
+ scadpy/d2/utils/resolve_vector_2d.py,sha256=cMMIBem7V8DLtlj02mJF-aznI4G9hpYusBzDVLLXl5s,1440
174
+ scadpy/d3/__init__.py,sha256=0wQd7DNZhgArVOLbSyyrtVbnJnQLqMnPilYpYVHH7Ng,70
175
+ scadpy/d3/solid/__init__.py,sha256=BR4d99FQ1QCMhCkJOTpt95NXMBsuRsRb7aFZlJv34sE,318
176
+ scadpy/d3/solid/combinations/__init__.py,sha256=pxsDj2Ul24uG5o__F38WG0fX-KXLHG7Gi7NboS_Cvow,675
177
+ scadpy/d3/solid/combinations/are_solid_parts_intersecting.py,sha256=JK1P4A8BwydfCSC57MtfjxfXinl243KoLaR1Qd-aYvk,1310
178
+ scadpy/d3/solid/combinations/concat_solid.py,sha256=WD72VyKhssvugTeXLFOwxoFLUdE58Ml4dGU2Jd89GcI,1303
179
+ scadpy/d3/solid/combinations/exclude_solid.py,sha256=-KS5RsBuRyDggayng6TbowavPOmJf-S06CQpa7iXclk,2150
180
+ scadpy/d3/solid/combinations/intersect_solid.py,sha256=1iIcsVaXHQ_j0rVillYFOS58mCeAXy7-B-lg4dsxfkM,1791
181
+ scadpy/d3/solid/combinations/intersect_solid_parts.py,sha256=eV52m9gXZgKAcUD9AELijBTkJg-_EWUsgo07pMdXv14,2567
182
+ scadpy/d3/solid/combinations/subtract_solid.py,sha256=8a80KgNbx5s5yPt9N02hgaEjfa3o0yGRYQ9K-t_NLBs,2144
183
+ scadpy/d3/solid/combinations/subtract_solid_parts.py,sha256=j0yVkzsZIgiDrec9wpusgbdXdy-Xu5dRnBKggB-ljxc,2379
184
+ scadpy/d3/solid/combinations/unify_solid.py,sha256=BBC5r4LHY_PUsqOimWPq_vYi24t8eg6Q0wJTmplKux4,1402
185
+ scadpy/d3/solid/combinations/unify_solid_parts.py,sha256=Q-xPqEvj_uGEtCM2BE33Gvki93D-oeVnqRdsCz-ln34,2489
186
+ scadpy/d3/solid/exporters/__init__.py,sha256=xb4hITyp3gh1ffnG_s7b4_6ZnAbMtWJ8g1DjpZ2OurY,344
187
+ scadpy/d3/solid/exporters/map_solid_to_html.py,sha256=Oe0hbt8Cp4tbsdsab5D7glsSD36ipeUHOK21pEgAXio,12498
188
+ scadpy/d3/solid/exporters/map_solid_to_html_file.py,sha256=798EIO9gXNWT_tHc2tyXyNar6SGRkevdUDVN54zMyGs,1512
189
+ scadpy/d3/solid/exporters/map_solid_to_screen.py,sha256=8hN8OhOb-fYf_z3jek_vhfGQ_5BDUJbuiQYa9XIiGhg,1297
190
+ scadpy/d3/solid/exporters/map_solid_to_stl_file.py,sha256=9oMBipLf1KWpid9j4_eLwPAJnA85Jl9ZjBeihlTDIIM,1172
191
+ scadpy/d3/solid/features/__init__.py,sha256=2pQ2bi3nGob7Aq44VzP-HP3KNse8TyHPFCCz0qkVYEI,323
192
+ scadpy/d3/solid/features/get_solid_bounds.py,sha256=5P1rW-bh9w7Vhvq1WGZ_BreC51jrDfnu1f2Iw-pvwFo,854
193
+ scadpy/d3/solid/features/get_solid_part_bounds.py,sha256=hRjwios1WzitHmpCQrcGpEf3qHHFD-Ms3zn1F1-LGfA,943
194
+ scadpy/d3/solid/features/get_solid_part_colors.py,sha256=aOSKvbeHxl51IF_Gayr6sph1OI7o95k37FJlvSgF77s,888
195
+ scadpy/d3/solid/features/is_solid_empty.py,sha256=zpRgnvRu4pOdOK3aQO9JjBVBQinCNTfgnfaa82WSHIM,693
196
+ scadpy/d3/solid/importers/__init__.py,sha256=n4wE3oi6UxMMF19fqMu_kyzo7p8XiWqDUx6KEYIefJs,341
197
+ scadpy/d3/solid/importers/map_geometries_to_solid.py,sha256=THdFLF-NRavLOtoi3KkoVIS7faA3e6Nq58aXSf6MorE,1056
198
+ scadpy/d3/solid/importers/map_geometry_to_solid.py,sha256=FJZ9CUKtlvWlfbyRFkFCRYaELDb95fzRtLrQH9-Yn1s,1001
199
+ scadpy/d3/solid/importers/map_parts_to_solid.py,sha256=LUYWlTgbjpEdCwo_ZRfUk3C1rFYxmyUBFTzVK_AxaEk,1914
200
+ scadpy/d3/solid/importers/map_stl_to_solid.py,sha256=_zFcJQA1quZKzdDFl0F602fvjTskac40ObXvPpJbSJ4,802
201
+ scadpy/d3/solid/primitives/__init__.py,sha256=1nFbJFPrETNwynYRHQSO8M2N5206QQIiDlkhp_87y3c,209
202
+ scadpy/d3/solid/primitives/cone.py,sha256=AfQAbrHao19sZFMofwNigrY3Dg4tAOLW9hrxPy_XihQ,2122
203
+ scadpy/d3/solid/primitives/cuboid.py,sha256=UNRVLugJo0qxg_XvlOPz_61clX8X4sG_dYr-IOePUIw,2029
204
+ scadpy/d3/solid/primitives/cylinder.py,sha256=pF-FK-CxaBBii31ZeXH31_Ny3adkjh_gwmIzL5B6f8s,2372
205
+ scadpy/d3/solid/primitives/polyhedron.py,sha256=SXtFETKwwPHrqWTFf-wFumJslA_i6sOfMIWmPe8otwA,1846
206
+ scadpy/d3/solid/primitives/sphere.py,sha256=NMboK4URYRpb2LUdOlQ26elGrW4Rh53QSEp_Vo6DRNk,1579
207
+ scadpy/d3/solid/topologies/__init__.py,sha256=qv3JwYooCrzEhc3M0VCCSR2VoCumi_rkMMzpm7FXIKw,245
208
+ scadpy/d3/solid/topologies/triangle/__init__.py,sha256=Q7EpykA_HD49RlvGUlCDXwqkMXNyLlwI2iG0tB9oO9k,122
209
+ scadpy/d3/solid/topologies/triangle/get_solid_triangle_to_vertex.py,sha256=ZLVUAMBSC2YMw-VyBxv5HmczLVJpXNhT2ypKj5afaDA,1285
210
+ scadpy/d3/solid/topologies/vertex/__init__.py,sha256=nZwGYYBq_JQB_MuZ08IvHsMDes4GJVHLBcszX02as_Y,217
211
+ scadpy/d3/solid/topologies/vertex/get_solid_vertex_coordinates.py,sha256=pnY618N95zUWmBLd32tYwNpUOGWKYrNbt9Cg4TKe1d8,940
212
+ scadpy/d3/solid/topologies/vertex/get_solid_vertex_to_part.py,sha256=A1zgcufB6XNlcXwpd0YxLblkYa_8oi4JbYIK7PD_PhA,936
213
+ scadpy/d3/solid/transformations/__init__.py,sha256=GnnG-uPX5JWHjJf9Kc7qL4DdVe-ZTW-MftlseGYRnCI,623
214
+ scadpy/d3/solid/transformations/color_solid.py,sha256=5bZ7FxFgmh4O0g_g-mnlknXkiJmlFfedWsPubms6A78,1080
215
+ scadpy/d3/solid/transformations/convexify_solid.py,sha256=8mL0U7KmuFuRSQSVcu07y_8Y2QsKb1mK4p_WldCMEb4,1932
216
+ scadpy/d3/solid/transformations/mirror_solid.py,sha256=oVgGMM1ioR4eAE2n0Dgfer2PF4wQH6I9QlfGppE_9JI,1535
217
+ scadpy/d3/solid/transformations/pull_solid.py,sha256=IhZGe142IvDkHfGe_vnd_4fnVBrj0OCqvESv_xbyVgs,2177
218
+ scadpy/d3/solid/transformations/push_solid.py,sha256=mitcet2AkgIpccviEB9_x0JAEHOxYE1EUasVCk1y0Es,2173
219
+ scadpy/d3/solid/transformations/recoordinate_solid.py,sha256=pUzBSGaKKozw8pnM3QvpSUxrqOryNlRlHa0CQzmwOBY,1977
220
+ scadpy/d3/solid/transformations/resize_solid.py,sha256=g5DEteJySUKH8ZR5wbcga-b-w9r_gPdy4pcTMNQa0lE,3117
221
+ scadpy/d3/solid/transformations/rotate_solid.py,sha256=vmxWhybNmCCmxmiHxvNw0DeN3-R29sGbCfWy31q3ta0,2948
222
+ scadpy/d3/solid/transformations/scale_solid.py,sha256=hnzc4AykK9b4oGFv6vTqzuIVGy1T2Zolti-eZUzEXCE,1852
223
+ scadpy/d3/solid/transformations/translate_solid.py,sha256=ZEmnzij5PuuNzvLRQkxBEn9HioS6ROWvkPEOCM1Gc9U,1626
224
+ scadpy/d3/solid/types/__init__.py,sha256=8JcKr-9K3uR7_PUBMVqDWC752ZxBwGqOChhgBLLDSY4,46
225
+ scadpy/d3/solid/types/solid.py,sha256=C72lzUD0fHtfbWRjhAKnI-L-oHFonbJThcPeGOH37Tg,13613
226
+ scadpy/d3/utils/__init__.py,sha256=veDz3eh8KyKVtQ7yKaWskxhvg4iZYkKx47gU9z4ZV3I,82
227
+ scadpy/d3/utils/resolve_vector_3d.py,sha256=SHkFSbqvPrJ4U-iRnv1_UAVvAuDWBgzg19xOHdh7Iy8,1434
228
+ scadpy/utils/__init__.py,sha256=yhtvwjbn-YAQDfoLmyYRUeCJxi7KxTagMs4yYhJGDDM,139
229
+ scadpy/utils/resolve_vector.py,sha256=1Cm52cdUr8p8907vR1I55fRyvT8iYcpMMAmxYVugUXI,1894
230
+ scadpy/utils/x.py,sha256=2qmFkDvYf8quWNTe3TE850ydm4zjQkj7SGcTro6uWoI,794
231
+ scadpy/utils/y.py,sha256=2Ik32MRByk5LtFhRLqWyxB5PsXf7S3dgCmSre0_R8_Q,794
232
+ scadpy/utils/z.py,sha256=bJbkZA7vlMtVvgHNaScSe9ovEiSgDCCQlDNtq2DyiBA,794
233
+ scadpy-0.1.0.dist-info/METADATA,sha256=QfsEEMTO1AILY8tVdWf_xFRVPyJMuZzZQlsywjkMrNY,9770
234
+ scadpy-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
235
+ scadpy-0.1.0.dist-info/licenses/LICENSE.md,sha256=r9ef9LtIVhmhc1DArDlIsYJ2507wsvTDHsAGqkXIsdA,1963
236
+ scadpy-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any