ScadPy 0.2.10__tar.gz → 0.2.12__tar.gz

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 (493) hide show
  1. {scadpy-0.2.10 → scadpy-0.2.12}/.gitignore +1 -0
  2. {scadpy-0.2.10 → scadpy-0.2.12}/PKG-INFO +91 -11
  3. {scadpy-0.2.10 → scadpy-0.2.12}/README.md +90 -10
  4. {scadpy-0.2.10 → scadpy-0.2.12}/docs/Makefile +3 -0
  5. {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/badges/coverage.svg +1 -1
  6. {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/badges/interrogate.svg +3 -3
  7. scadpy-0.2.12/docs/_static/examples/bearing_dark.png +0 -0
  8. scadpy-0.2.12/docs/_static/examples/bearing_light.png +0 -0
  9. scadpy-0.2.12/docs/_static/examples/dice_dark.png +0 -0
  10. scadpy-0.2.12/docs/_static/examples/dice_light.png +0 -0
  11. scadpy-0.2.12/docs/_static/examples/extruded_plate_dark.png +0 -0
  12. scadpy-0.2.12/docs/_static/examples/extruded_plate_light.png +0 -0
  13. scadpy-0.2.12/docs/_static/examples/plate_dark.png +0 -0
  14. scadpy-0.2.12/docs/_static/examples/plate_light.png +0 -0
  15. scadpy-0.2.12/docs/_static/examples/storage_box_dark.png +0 -0
  16. scadpy-0.2.12/docs/_static/examples/storage_box_light.png +0 -0
  17. {scadpy-0.2.10 → scadpy-0.2.12}/docs/conf.py +5 -0
  18. {scadpy-0.2.10 → scadpy-0.2.12}/docs/index.rst +9 -4
  19. scadpy-0.2.12/docs/snapshots/d2__index_extruded_plate__dark.md5 +1 -0
  20. scadpy-0.2.12/docs/snapshots/d2__index_extruded_plate__light.md5 +1 -0
  21. scadpy-0.2.12/docs/snapshots/d2__text_example__dark.md5 +1 -0
  22. scadpy-0.2.12/docs/snapshots/d2__text_example__light.md5 +1 -0
  23. {scadpy-0.2.10 → scadpy-0.2.12}/pyproject.toml +1 -1
  24. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/__init__.py +2 -1
  25. scadpy-0.2.12/scadpy/d2/shape/primitives/text.py +192 -0
  26. scadpy-0.2.12/scadpy/utils/__init__.py +7 -0
  27. scadpy-0.2.12/scadpy/utils/available_fonts.py +40 -0
  28. scadpy-0.2.10/docs/_static/examples/bearing_dark.png +0 -0
  29. scadpy-0.2.10/docs/_static/examples/bearing_light.png +0 -0
  30. scadpy-0.2.10/docs/_static/examples/plate_dark.png +0 -0
  31. scadpy-0.2.10/docs/_static/examples/plate_light.png +0 -0
  32. scadpy-0.2.10/docs/snapshots/d2__index_extruded_plate__dark.md5 +0 -1
  33. scadpy-0.2.10/docs/snapshots/d2__index_extruded_plate__light.md5 +0 -1
  34. scadpy-0.2.10/scadpy/utils/__init__.py +0 -6
  35. {scadpy-0.2.10 → scadpy-0.2.12}/.github/workflows/ci.yml +0 -0
  36. {scadpy-0.2.10 → scadpy-0.2.12}/.github/workflows/release.yml +0 -0
  37. {scadpy-0.2.10 → scadpy-0.2.12}/LICENSE.md +0 -0
  38. {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/css/custom.css +0 -0
  39. {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/logo.ico +0 -0
  40. {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/logo.png +0 -0
  41. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/combinations.rst +0 -0
  42. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/topologies.rst +0 -0
  43. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/transformations.rst +0 -0
  44. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/types.rst +0 -0
  45. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/utils.rst +0 -0
  46. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly.rst +0 -0
  47. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component/exporters.rst +0 -0
  48. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component/features.rst +0 -0
  49. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component/utils.rst +0 -0
  50. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component.rst +0 -0
  51. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/part/combinations.rst +0 -0
  52. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/part.rst +0 -0
  53. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core.rst +0 -0
  54. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/combinations.rst +0 -0
  55. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/exporters.rst +0 -0
  56. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/features.rst +0 -0
  57. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/importers.rst +0 -0
  58. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/primitives.rst +0 -0
  59. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/topologies.rst +0 -0
  60. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/transformations.rst +0 -0
  61. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/types.rst +0 -0
  62. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape.rst +0 -0
  63. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2.rst +0 -0
  64. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/combinations.rst +0 -0
  65. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/exporters.rst +0 -0
  66. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/features.rst +0 -0
  67. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/importers.rst +0 -0
  68. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/primitives.rst +0 -0
  69. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/topologies.rst +0 -0
  70. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/transformations.rst +0 -0
  71. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/types.rst +0 -0
  72. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid.rst +0 -0
  73. {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3.rst +0 -0
  74. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_all__dark.md5 +0 -0
  75. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_all__light.md5 +0 -0
  76. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_clamp_proportional__dark.md5 +0 -0
  77. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_clamp_proportional__light.md5 +0 -0
  78. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_concave_asymmetric__dark.md5 +0 -0
  79. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_concave_asymmetric__light.md5 +0 -0
  80. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_convex_only__dark.md5 +0 -0
  81. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_convex_only__light.md5 +0 -0
  82. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_sharp_convex__dark.md5 +0 -0
  83. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_sharp_convex__light.md5 +0 -0
  84. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_shape__dark.md5 +0 -0
  85. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_shape__light.md5 +0 -0
  86. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_solid__dark.md5 +0 -0
  87. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_solid__light.md5 +0 -0
  88. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_shape__dark.md5 +0 -0
  89. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_shape__light.md5 +0 -0
  90. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_solid__dark.md5 +0 -0
  91. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_solid__light.md5 +0 -0
  92. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cone__dark.md5 +0 -0
  93. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cone__light.md5 +0 -0
  94. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape__dark.md5 +0 -0
  95. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape__light.md5 +0 -0
  96. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape_partial__dark.md5 +0 -0
  97. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape_partial__light.md5 +0 -0
  98. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_solid__dark.md5 +0 -0
  99. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_solid__light.md5 +0 -0
  100. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cube__dark.md5 +0 -0
  101. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cube__light.md5 +0 -0
  102. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cuboid__dark.md5 +0 -0
  103. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cuboid__light.md5 +0 -0
  104. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cylinder__dark.md5 +0 -0
  105. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cylinder__light.md5 +0 -0
  106. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_shape__dark.md5 +0 -0
  107. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_shape__light.md5 +0 -0
  108. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_solid__dark.md5 +0 -0
  109. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_solid__light.md5 +0 -0
  110. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape__dark.md5 +0 -0
  111. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape__light.md5 +0 -0
  112. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape_partial__dark.md5 +0 -0
  113. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape_partial__light.md5 +0 -0
  114. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_all__dark.md5 +0 -0
  115. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_all__light.md5 +0 -0
  116. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_clamp_proportional__dark.md5 +0 -0
  117. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_clamp_proportional__light.md5 +0 -0
  118. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_concave_asymmetric__dark.md5 +0 -0
  119. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_concave_asymmetric__light.md5 +0 -0
  120. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_convex_only__dark.md5 +0 -0
  121. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_convex_only__light.md5 +0 -0
  122. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_sharp_convex__dark.md5 +0 -0
  123. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_sharp_convex__light.md5 +0 -0
  124. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape__dark.md5 +0 -0
  125. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape__light.md5 +0 -0
  126. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_partial__dark.md5 +0 -0
  127. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_partial__light.md5 +0 -0
  128. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_shrink__dark.md5 +0 -0
  129. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_shrink__light.md5 +0 -0
  130. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cone__dark.md5 +0 -0
  131. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cone__light.md5 +0 -0
  132. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cylinder__dark.md5 +0 -0
  133. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cylinder__light.md5 +0 -0
  134. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_2d__dark.md5 +0 -0
  135. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_2d__light.md5 +0 -0
  136. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_3d__dark.md5 +0 -0
  137. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_3d__light.md5 +0 -0
  138. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_bearing__dark.md5 +0 -0
  139. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_bearing__light.md5 +0 -0
  140. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_dice__dark.md5 +0 -0
  141. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_dice__light.md5 +0 -0
  142. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_plate__dark.md5 +0 -0
  143. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_plate__light.md5 +0 -0
  144. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_storage_box__dark.md5 +0 -0
  145. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_storage_box__light.md5 +0 -0
  146. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape__dark.md5 +0 -0
  147. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape__light.md5 +0 -0
  148. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape_parts_example__dark.md5 +0 -0
  149. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape_parts_example__light.md5 +0 -0
  150. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid__dark.md5 +0 -0
  151. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid__light.md5 +0 -0
  152. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid_parts_example__dark.md5 +0 -0
  153. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid_parts_example__light.md5 +0 -0
  154. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape__dark.md5 +0 -0
  155. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape__light.md5 +0 -0
  156. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape_diagonal__dark.md5 +0 -0
  157. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape_diagonal__light.md5 +0 -0
  158. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_square__dark.md5 +0 -0
  159. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_square__light.md5 +0 -0
  160. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_tube__dark.md5 +0 -0
  161. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_tube__light.md5 +0 -0
  162. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_diagonal__dark.md5 +0 -0
  163. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_diagonal__light.md5 +0 -0
  164. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_horizontal__dark.md5 +0 -0
  165. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_horizontal__light.md5 +0 -0
  166. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_partial__dark.md5 +0 -0
  167. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_partial__light.md5 +0 -0
  168. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_pivot__dark.md5 +0 -0
  169. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_pivot__light.md5 +0 -0
  170. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__low_resolution_sphere__dark.md5 +0 -0
  171. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__low_resolution_sphere__light.md5 +0 -0
  172. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_dxf_to_shape__dark.md5 +0 -0
  173. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_dxf_to_shape__light.md5 +0 -0
  174. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_shape__dark.md5 +0 -0
  175. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_shape__light.md5 +0 -0
  176. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_solid__dark.md5 +0 -0
  177. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_solid__light.md5 +0 -0
  178. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_shape__dark.md5 +0 -0
  179. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_shape__light.md5 +0 -0
  180. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_solid__dark.md5 +0 -0
  181. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_solid__light.md5 +0 -0
  182. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_shape__dark.md5 +0 -0
  183. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_shape__light.md5 +0 -0
  184. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_solid__dark.md5 +0 -0
  185. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_solid__light.md5 +0 -0
  186. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_svg_to_shape__dark.md5 +0 -0
  187. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_svg_to_shape__light.md5 +0 -0
  188. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_shape__dark.md5 +0 -0
  189. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_shape__light.md5 +0 -0
  190. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_solid__dark.md5 +0 -0
  191. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_solid__light.md5 +0 -0
  192. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__polyhedron__dark.md5 +0 -0
  193. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__polyhedron__light.md5 +0 -0
  194. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_shape__dark.md5 +0 -0
  195. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_shape__light.md5 +0 -0
  196. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_solid__dark.md5 +0 -0
  197. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_solid__light.md5 +0 -0
  198. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_shape__dark.md5 +0 -0
  199. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_shape__light.md5 +0 -0
  200. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_solid__dark.md5 +0 -0
  201. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_solid__light.md5 +0 -0
  202. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape__dark.md5 +0 -0
  203. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape__light.md5 +0 -0
  204. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape_partial__dark.md5 +0 -0
  205. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape_partial__light.md5 +0 -0
  206. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_partial__dark.md5 +0 -0
  207. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_partial__light.md5 +0 -0
  208. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_pivot__dark.md5 +0 -0
  209. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_pivot__light.md5 +0 -0
  210. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_quarter__dark.md5 +0 -0
  211. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_quarter__light.md5 +0 -0
  212. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_three_quarter__dark.md5 +0 -0
  213. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_three_quarter__light.md5 +0 -0
  214. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_shape__dark.md5 +0 -0
  215. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_shape__light.md5 +0 -0
  216. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_solid__dark.md5 +0 -0
  217. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_solid__light.md5 +0 -0
  218. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_auto__dark.md5 +0 -0
  219. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_auto__light.md5 +0 -0
  220. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_exact__dark.md5 +0 -0
  221. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_exact__light.md5 +0 -0
  222. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_freeze__dark.md5 +0 -0
  223. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_freeze__light.md5 +0 -0
  224. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_auto__dark.md5 +0 -0
  225. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_auto__light.md5 +0 -0
  226. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_exact__dark.md5 +0 -0
  227. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_exact__light.md5 +0 -0
  228. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_freeze__dark.md5 +0 -0
  229. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_freeze__light.md5 +0 -0
  230. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_shape__dark.md5 +0 -0
  231. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_shape__light.md5 +0 -0
  232. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_solid__dark.md5 +0 -0
  233. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_solid__light.md5 +0 -0
  234. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_shape__dark.md5 +0 -0
  235. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_shape__light.md5 +0 -0
  236. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_solid__dark.md5 +0 -0
  237. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_solid__light.md5 +0 -0
  238. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape__dark.md5 +0 -0
  239. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape__light.md5 +0 -0
  240. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_negative__dark.md5 +0 -0
  241. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_negative__light.md5 +0 -0
  242. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_partial__dark.md5 +0 -0
  243. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_partial__light.md5 +0 -0
  244. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__sphere__dark.md5 +0 -0
  245. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__sphere__light.md5 +0 -0
  246. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape__dark.md5 +0 -0
  247. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape__light.md5 +0 -0
  248. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape_parts_example__dark.md5 +0 -0
  249. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape_parts_example__light.md5 +0 -0
  250. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid__dark.md5 +0 -0
  251. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid__light.md5 +0 -0
  252. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid_parts_example__dark.md5 +0 -0
  253. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid_parts_example__light.md5 +0 -0
  254. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_shape__dark.md5 +0 -0
  255. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_shape__light.md5 +0 -0
  256. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_solid__dark.md5 +0 -0
  257. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_solid__light.md5 +0 -0
  258. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape__dark.md5 +0 -0
  259. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape__light.md5 +0 -0
  260. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape_parts_example__dark.md5 +0 -0
  261. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape_parts_example__light.md5 +0 -0
  262. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid__dark.md5 +0 -0
  263. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid__light.md5 +0 -0
  264. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid_parts_example__dark.md5 +0 -0
  265. {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid_parts_example__light.md5 +0 -0
  266. {scadpy-0.2.10 → scadpy-0.2.12}/project_bundle.json +0 -0
  267. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/__init__.py +0 -0
  268. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/__init__.py +0 -0
  269. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BEIGE.py +0 -0
  270. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BLACK.py +0 -0
  271. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BLUE.py +0 -0
  272. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BROWN.py +0 -0
  273. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/DARK_GRAY.py +0 -0
  274. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/DEFAULT_COLOR.py +0 -0
  275. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/DEFAULT_OPACITY.py +0 -0
  276. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/GRAY.py +0 -0
  277. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/GREEN.py +0 -0
  278. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/ORANGE.py +0 -0
  279. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/RED.py +0 -0
  280. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/WHITE.py +0 -0
  281. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/YELLOW.py +0 -0
  282. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/__init__.py +0 -0
  283. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/type/__init__.py +0 -0
  284. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/type/color.py +0 -0
  285. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/utils/__init__.py +0 -0
  286. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/utils/get_random_color.py +0 -0
  287. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/__init__.py +0 -0
  288. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/__init__.py +0 -0
  289. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/__init__.py +0 -0
  290. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/concat_assemblies.py +0 -0
  291. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/exclude_assemblies.py +0 -0
  292. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/intersect_assemblies.py +0 -0
  293. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/subtract_assemblies.py +0 -0
  294. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/unify_assemblies.py +0 -0
  295. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/__init__.py +0 -0
  296. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/__init__.py +0 -0
  297. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_directions.py +0 -0
  298. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_edge.py +0 -0
  299. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_vertex.py +0 -0
  300. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/__init__.py +0 -0
  301. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/get_assembly_edge_lengths.py +0 -0
  302. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/get_assembly_edge_midpoints.py +0 -0
  303. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/get_assembly_edge_normals.py +0 -0
  304. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/__init__.py +0 -0
  305. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/get_assembly_face_vertex_angles.py +0 -0
  306. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/get_assembly_face_vertex_normals.py +0 -0
  307. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/get_assembly_face_vertex_to_incoming_directed_edge.py +0 -0
  308. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/get_assembly_face_vertex_to_outgoing_directed_edge.py +0 -0
  309. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/part/__init__.py +0 -0
  310. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/part/get_assembly_part_colors.py +0 -0
  311. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/vertex/__init__.py +0 -0
  312. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/vertex/get_assembly_vertex_coordinates.py +0 -0
  313. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/vertex/get_assembly_vertex_to_part.py +0 -0
  314. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/__init__.py +0 -0
  315. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/color_assembly.py +0 -0
  316. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/mirror_vertex_coordinates.py +0 -0
  317. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/pull_vertex_coordinates.py +0 -0
  318. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/push_vertex_coordinates.py +0 -0
  319. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/resize_vertex_coordinates.py +0 -0
  320. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/rotate_vertex_coordinates.py +0 -0
  321. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/scale_vertex_coordinates.py +0 -0
  322. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/translate_vertex_coordinates.py +0 -0
  323. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/types/__init__.py +0 -0
  324. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/types/assembly.py +0 -0
  325. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/types/topology_filter.py +0 -0
  326. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/__init__.py +0 -0
  327. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/lookup_pairs.py +0 -0
  328. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/resolve_topology_filter.py +0 -0
  329. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/transform_filtered_parts.py +0 -0
  330. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/__init__.py +0 -0
  331. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/exporters/__init__.py +0 -0
  332. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/exporters/map_component_to_html_file.py +0 -0
  333. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/exporters/map_component_to_screen.py +0 -0
  334. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/features/__init__.py +0 -0
  335. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/features/get_component_bounds.py +0 -0
  336. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/utils/__init__.py +0 -0
  337. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/utils/blend_component_colors.py +0 -0
  338. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/utils/get_intersecting_component_index_groups.py +0 -0
  339. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/__init__.py +0 -0
  340. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/__init__.py +0 -0
  341. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/concat_parts.py +0 -0
  342. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/intersect_parts.py +0 -0
  343. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/subtract_parts.py +0 -0
  344. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/unify_parts.py +0 -0
  345. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/types/__init__.py +0 -0
  346. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/types/part.py +0 -0
  347. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/utils/__init__.py +0 -0
  348. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/utils/blend_part_colors.py +0 -0
  349. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/__init__.py +0 -0
  350. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/__init__.py +0 -0
  351. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/__init__.py +0 -0
  352. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/are_shape_parts_intersecting.py +0 -0
  353. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/concat_shape.py +0 -0
  354. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/exclude_shape.py +0 -0
  355. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/intersect_shape.py +0 -0
  356. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/intersect_shape_parts.py +0 -0
  357. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/subtract_shape.py +0 -0
  358. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/subtract_shape_parts.py +0 -0
  359. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/unify_shape.py +0 -0
  360. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/unify_shape_parts.py +0 -0
  361. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/__init__.py +0 -0
  362. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_dxf.py +0 -0
  363. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_dxf_file.py +0 -0
  364. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_html.py +0 -0
  365. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_html_file.py +0 -0
  366. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_screen.py +0 -0
  367. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_svg.py +0 -0
  368. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_svg_file.py +0 -0
  369. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/__init__.py +0 -0
  370. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/get_shape_bounds.py +0 -0
  371. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/get_shape_part_bounds.py +0 -0
  372. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/is_shape_empty.py +0 -0
  373. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/__init__.py +0 -0
  374. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_dxf_to_shape.py +0 -0
  375. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_geometries_to_shape.py +0 -0
  376. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_geometry_to_shape.py +0 -0
  377. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_parts_to_shape.py +0 -0
  378. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_svg_to_shape.py +0 -0
  379. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/circle.py +0 -0
  380. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/polygon.py +0 -0
  381. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/rectangle.py +0 -0
  382. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/square.py +0 -0
  383. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/__init__.py +0 -0
  384. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/__init__.py +0 -0
  385. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_directions.py +0 -0
  386. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_edge.py +0 -0
  387. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_vertex.py +0 -0
  388. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/__init__.py +0 -0
  389. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_lengths.py +0 -0
  390. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_midpoints.py +0 -0
  391. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_normals.py +0 -0
  392. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_to_vertex.py +0 -0
  393. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/ring/__init__.py +0 -0
  394. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/ring/get_shape_ring_to_part.py +0 -0
  395. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/ring/get_shape_ring_types.py +0 -0
  396. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/__init__.py +0 -0
  397. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/are_shape_vertices_convex.py +0 -0
  398. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_part_vertex_coordinates.py +0 -0
  399. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_angles.py +0 -0
  400. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_coordinates.py +0 -0
  401. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_normals.py +0 -0
  402. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_incoming_directed_edge.py +0 -0
  403. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_neighbor_vertex.py +0 -0
  404. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_outgoing_directed_edge.py +0 -0
  405. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_part.py +0 -0
  406. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_ring.py +0 -0
  407. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/__init__.py +0 -0
  408. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/chamfer_shape.py +0 -0
  409. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/color_shape.py +0 -0
  410. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/convexify_shape.py +0 -0
  411. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/fill_shape.py +0 -0
  412. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/fillet_shape.py +0 -0
  413. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/grow_shape.py +0 -0
  414. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/linear_cut_shape.py +0 -0
  415. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/linear_extrude_shape.py +0 -0
  416. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/linear_slice_shape.py +0 -0
  417. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/mirror_shape.py +0 -0
  418. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/pull_shape.py +0 -0
  419. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/push_shape.py +0 -0
  420. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/radial_extrude_shape.py +0 -0
  421. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/radial_slice_shape.py +0 -0
  422. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/recoordinate_shape.py +0 -0
  423. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/resize_shape.py +0 -0
  424. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/rotate_shape.py +0 -0
  425. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/scale_shape.py +0 -0
  426. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/shrink_shape.py +0 -0
  427. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/translate_shape.py +0 -0
  428. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/__init__.py +0 -0
  429. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/shape.py +0 -0
  430. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/utils/__init__.py +0 -0
  431. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/utils/shapely_base_geometry_to_shapely_polygons.py +0 -0
  432. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/utils/__init__.py +0 -0
  433. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/utils/shapely_base_geometry_to_shapely_polygons.py +0 -0
  434. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/utils/__init__.py +0 -0
  435. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/utils/resolve_vector_2d.py +0 -0
  436. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/__init__.py +0 -0
  437. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/__init__.py +0 -0
  438. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/__init__.py +0 -0
  439. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/are_solid_parts_intersecting.py +0 -0
  440. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/concat_solid.py +0 -0
  441. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/exclude_solid.py +0 -0
  442. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/intersect_solid.py +0 -0
  443. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/intersect_solid_parts.py +0 -0
  444. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/subtract_solid.py +0 -0
  445. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/subtract_solid_parts.py +0 -0
  446. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/unify_solid.py +0 -0
  447. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/unify_solid_parts.py +0 -0
  448. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/__init__.py +0 -0
  449. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_html.py +0 -0
  450. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_html_file.py +0 -0
  451. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_screen.py +0 -0
  452. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_stl_file.py +0 -0
  453. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/__init__.py +0 -0
  454. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/get_solid_bounds.py +0 -0
  455. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/get_solid_part_bounds.py +0 -0
  456. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/get_solid_part_colors.py +0 -0
  457. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/is_solid_empty.py +0 -0
  458. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/__init__.py +0 -0
  459. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_geometries_to_solid.py +0 -0
  460. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_geometry_to_solid.py +0 -0
  461. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_parts_to_solid.py +0 -0
  462. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_stl_to_solid.py +0 -0
  463. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/__init__.py +0 -0
  464. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/cone.py +0 -0
  465. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/cuboid.py +0 -0
  466. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/cylinder.py +0 -0
  467. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/polyhedron.py +0 -0
  468. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/sphere.py +0 -0
  469. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/__init__.py +0 -0
  470. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/triangle/__init__.py +0 -0
  471. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/triangle/get_solid_triangle_to_vertex.py +0 -0
  472. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/vertex/__init__.py +0 -0
  473. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/vertex/get_solid_vertex_coordinates.py +0 -0
  474. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/vertex/get_solid_vertex_to_part.py +0 -0
  475. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/__init__.py +0 -0
  476. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/color_solid.py +0 -0
  477. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/convexify_solid.py +0 -0
  478. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/mirror_solid.py +0 -0
  479. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/pull_solid.py +0 -0
  480. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/push_solid.py +0 -0
  481. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/recoordinate_solid.py +0 -0
  482. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/resize_solid.py +0 -0
  483. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/rotate_solid.py +0 -0
  484. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/scale_solid.py +0 -0
  485. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/translate_solid.py +0 -0
  486. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/types/__init__.py +0 -0
  487. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/types/solid.py +0 -0
  488. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/utils/__init__.py +0 -0
  489. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/utils/resolve_vector_3d.py +0 -0
  490. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/resolve_vector.py +0 -0
  491. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/x.py +0 -0
  492. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/y.py +0 -0
  493. {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/z.py +0 -0
@@ -16,6 +16,7 @@ dist/
16
16
 
17
17
  # --- Documentation build ---
18
18
  docs/build/
19
+ docs/_build/
19
20
 
20
21
  # --- Logs and temporary files ---
21
22
  *.log
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ScadPy
3
- Version: 0.2.10
3
+ Version: 0.2.12
4
4
  Summary: Simplified 2D/3D modeling for Python with fluent API and boolean operations
5
5
  Author: m-fabregue
6
6
  License: # MIT License
@@ -96,14 +96,15 @@ Requirements: Python ≥ 3.12.
96
96
 
97
97
  ```python
98
98
  # 2D — chamfered mounting plate
99
- from scadpy import *
99
+ from scadpy import rectangle, circle, text
100
100
  import numpy as np
101
101
 
102
- PLATE_WIDTH = 80
103
- PLATE_HEIGHT = 50
104
- HOLE_RADIUS = 4
105
- HOLE_MARGIN = 10
106
- CHAMFER_SIZE = 8
102
+ PLATE_WIDTH = 80
103
+ PLATE_HEIGHT = 50
104
+ PLATE_THICKNESS = 10
105
+ HOLE_RADIUS = 4
106
+ HOLE_MARGIN = 10
107
+ CHAMFER_SIZE = 8
107
108
 
108
109
  base = rectangle([PLATE_WIDTH, PLATE_HEIGHT])
109
110
  plate = base.chamfer(CHAMFER_SIZE)
@@ -111,7 +112,7 @@ plate = base.chamfer(CHAMFER_SIZE)
111
112
  for position, normal in zip(base.vertex_coordinates, base.vertex_normals):
112
113
  hole_center = position - HOLE_MARGIN * np.sqrt(2) * normal
113
114
  plate -= circle(HOLE_RADIUS).translate(hole_center)
114
-
115
+
115
116
  plate.to_screen()
116
117
  ```
117
118
 
@@ -120,10 +121,25 @@ plate.to_screen()
120
121
  <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/plate_light.png" alt="chamfered mounting plate" width="400">
121
122
  </picture>
122
123
 
124
+ ```python
125
+ # 3D — extruded mounting plate with label (continues from above)
126
+ TEXT_THICKNESS = 2
127
+
128
+ extruded_plate = plate.linear_extrude(PLATE_THICKNESS)
129
+ label = text("ScadPy", size=15).linear_extrude(TEXT_THICKNESS)
130
+ extruded_plate |= label.translate(z(PLATE_THICKNESS))
131
+ extruded_plate.to_screen()
132
+ ```
133
+
134
+ <picture>
135
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/extruded_plate_dark.png">
136
+ <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/extruded_plate_light.png" alt="chamfered mounting plate" width="400">
137
+ </picture>
138
+
123
139
  ```python
124
140
  # 3D — parametric ball bearing
141
+ from scadpy import circle, rectangle, sphere, x, y, GRAY, ORANGE
125
142
  import numpy as np
126
- from scadpy import *
127
143
 
128
144
  BALL_RADIUS = 3
129
145
  RACE_RADIUS = 15
@@ -134,10 +150,11 @@ RACE_THICKNESS = 10
134
150
 
135
151
  groove = circle(BALL_RADIUS + CLEARANCE) | rectangle([BALL_RADIUS, RING_HEIGHT])
136
152
  race = rectangle([RACE_THICKNESS, RING_HEIGHT]) - groove
137
- bearing = race.radial_extrude(axis=y(), pivot=x(RACE_RADIUS))
153
+ bearing = race.radial_extrude(axis=y(), pivot=x(RACE_RADIUS)).color(GRAY)
138
154
 
155
+ ball = sphere(BALL_RADIUS).color(ORANGE)
139
156
  for angle in np.linspace(0, 360, NB_BALLS, endpoint=False):
140
- bearing += sphere(BALL_RADIUS).rotate(angle, axis=y(), pivot=x(RACE_RADIUS))
157
+ bearing += ball.rotate(angle, axis=y(), pivot=x(RACE_RADIUS))
141
158
 
142
159
  bearing.to_screen()
143
160
  ```
@@ -147,6 +164,69 @@ bearing.to_screen()
147
164
  <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/bearing_light.png" alt="parametric ball bearing" width="400">
148
165
  </picture>
149
166
 
167
+ ```python
168
+ # 3D — dice
169
+ from scadpy import cuboid, sphere, x, y, z
170
+
171
+ SIZE = 20
172
+ dice = cuboid(SIZE)
173
+ pip = sphere(SIZE / 12).translate(z(SIZE / 2))
174
+
175
+ one = pip
176
+ two = pip.translate([SIZE / 4, SIZE / 4, 0]) + pip.translate([-SIZE / 4, -SIZE / 4, 0])
177
+ three = one + two
178
+ four = two + two.rotate(90, z())
179
+ five = one + four
180
+ six = four + pip.translate(x(SIZE / 4)) + pip.translate(x(-SIZE / 4))
181
+
182
+ dice -= (
183
+ one
184
+ + two.rotate(90, x())
185
+ + three.rotate(90, y())
186
+ + four.rotate(-90, y())
187
+ + five.rotate(-90, x())
188
+ + six.rotate(-180, x())
189
+ )
190
+
191
+ dice.to_screen()
192
+ ```
193
+
194
+ <picture>
195
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/dice_dark.png">
196
+ <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/dice_light.png" alt="chamfered mounting plate" width="400">
197
+ </picture>
198
+
199
+ ```python
200
+ # 3D — storage box
201
+ from scadpy import square, x, z
202
+
203
+ SIZE_OUTER = 20
204
+ SIZE_INNER = 18
205
+ FILLET = 1
206
+ BASE_HEIGHT = 10
207
+ CUT_HEIGHT = 8
208
+ CAP_HEIGHT_OUTER = 1.5
209
+ CAP_HEIGHT_INNER = 3
210
+ CAP_OFFSET_X = 25
211
+ CUT_OFFSET_Z = 2
212
+
213
+ outer_base = square(SIZE_OUTER).fillet(FILLET).linear_extrude(BASE_HEIGHT)
214
+ inner_cut = square(SIZE_INNER).linear_extrude(CUT_HEIGHT).translate(z(CUT_OFFSET_Z))
215
+ base = outer_base - inner_cut
216
+
217
+ cap_outer = square(SIZE_OUTER).fillet(FILLET).linear_extrude(CAP_HEIGHT_OUTER)
218
+ cap_inner = square(SIZE_INNER).linear_extrude(CAP_HEIGHT_INNER)
219
+ cap = (cap_outer | cap_inner).translate(x(CAP_OFFSET_X))
220
+
221
+ storage_box = base + cap
222
+ storage_box.to_screen()
223
+ ```
224
+
225
+ <picture>
226
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/storage_box_dark.png">
227
+ <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/storage_box_light.png" alt="chamfered mounting plate" width="400">
228
+ </picture>
229
+
150
230
  ## Cheat sheet
151
231
 
152
232
  *Parameters shown in `# comments` are optional, with their default values.*
@@ -24,14 +24,15 @@ Requirements: Python ≥ 3.12.
24
24
 
25
25
  ```python
26
26
  # 2D — chamfered mounting plate
27
- from scadpy import *
27
+ from scadpy import rectangle, circle, text
28
28
  import numpy as np
29
29
 
30
- PLATE_WIDTH = 80
31
- PLATE_HEIGHT = 50
32
- HOLE_RADIUS = 4
33
- HOLE_MARGIN = 10
34
- CHAMFER_SIZE = 8
30
+ PLATE_WIDTH = 80
31
+ PLATE_HEIGHT = 50
32
+ PLATE_THICKNESS = 10
33
+ HOLE_RADIUS = 4
34
+ HOLE_MARGIN = 10
35
+ CHAMFER_SIZE = 8
35
36
 
36
37
  base = rectangle([PLATE_WIDTH, PLATE_HEIGHT])
37
38
  plate = base.chamfer(CHAMFER_SIZE)
@@ -39,7 +40,7 @@ plate = base.chamfer(CHAMFER_SIZE)
39
40
  for position, normal in zip(base.vertex_coordinates, base.vertex_normals):
40
41
  hole_center = position - HOLE_MARGIN * np.sqrt(2) * normal
41
42
  plate -= circle(HOLE_RADIUS).translate(hole_center)
42
-
43
+
43
44
  plate.to_screen()
44
45
  ```
45
46
 
@@ -48,10 +49,25 @@ plate.to_screen()
48
49
  <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/plate_light.png" alt="chamfered mounting plate" width="400">
49
50
  </picture>
50
51
 
52
+ ```python
53
+ # 3D — extruded mounting plate with label (continues from above)
54
+ TEXT_THICKNESS = 2
55
+
56
+ extruded_plate = plate.linear_extrude(PLATE_THICKNESS)
57
+ label = text("ScadPy", size=15).linear_extrude(TEXT_THICKNESS)
58
+ extruded_plate |= label.translate(z(PLATE_THICKNESS))
59
+ extruded_plate.to_screen()
60
+ ```
61
+
62
+ <picture>
63
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/extruded_plate_dark.png">
64
+ <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/extruded_plate_light.png" alt="chamfered mounting plate" width="400">
65
+ </picture>
66
+
51
67
  ```python
52
68
  # 3D — parametric ball bearing
69
+ from scadpy import circle, rectangle, sphere, x, y, GRAY, ORANGE
53
70
  import numpy as np
54
- from scadpy import *
55
71
 
56
72
  BALL_RADIUS = 3
57
73
  RACE_RADIUS = 15
@@ -62,10 +78,11 @@ RACE_THICKNESS = 10
62
78
 
63
79
  groove = circle(BALL_RADIUS + CLEARANCE) | rectangle([BALL_RADIUS, RING_HEIGHT])
64
80
  race = rectangle([RACE_THICKNESS, RING_HEIGHT]) - groove
65
- bearing = race.radial_extrude(axis=y(), pivot=x(RACE_RADIUS))
81
+ bearing = race.radial_extrude(axis=y(), pivot=x(RACE_RADIUS)).color(GRAY)
66
82
 
83
+ ball = sphere(BALL_RADIUS).color(ORANGE)
67
84
  for angle in np.linspace(0, 360, NB_BALLS, endpoint=False):
68
- bearing += sphere(BALL_RADIUS).rotate(angle, axis=y(), pivot=x(RACE_RADIUS))
85
+ bearing += ball.rotate(angle, axis=y(), pivot=x(RACE_RADIUS))
69
86
 
70
87
  bearing.to_screen()
71
88
  ```
@@ -75,6 +92,69 @@ bearing.to_screen()
75
92
  <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/bearing_light.png" alt="parametric ball bearing" width="400">
76
93
  </picture>
77
94
 
95
+ ```python
96
+ # 3D — dice
97
+ from scadpy import cuboid, sphere, x, y, z
98
+
99
+ SIZE = 20
100
+ dice = cuboid(SIZE)
101
+ pip = sphere(SIZE / 12).translate(z(SIZE / 2))
102
+
103
+ one = pip
104
+ two = pip.translate([SIZE / 4, SIZE / 4, 0]) + pip.translate([-SIZE / 4, -SIZE / 4, 0])
105
+ three = one + two
106
+ four = two + two.rotate(90, z())
107
+ five = one + four
108
+ six = four + pip.translate(x(SIZE / 4)) + pip.translate(x(-SIZE / 4))
109
+
110
+ dice -= (
111
+ one
112
+ + two.rotate(90, x())
113
+ + three.rotate(90, y())
114
+ + four.rotate(-90, y())
115
+ + five.rotate(-90, x())
116
+ + six.rotate(-180, x())
117
+ )
118
+
119
+ dice.to_screen()
120
+ ```
121
+
122
+ <picture>
123
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/dice_dark.png">
124
+ <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/dice_light.png" alt="chamfered mounting plate" width="400">
125
+ </picture>
126
+
127
+ ```python
128
+ # 3D — storage box
129
+ from scadpy import square, x, z
130
+
131
+ SIZE_OUTER = 20
132
+ SIZE_INNER = 18
133
+ FILLET = 1
134
+ BASE_HEIGHT = 10
135
+ CUT_HEIGHT = 8
136
+ CAP_HEIGHT_OUTER = 1.5
137
+ CAP_HEIGHT_INNER = 3
138
+ CAP_OFFSET_X = 25
139
+ CUT_OFFSET_Z = 2
140
+
141
+ outer_base = square(SIZE_OUTER).fillet(FILLET).linear_extrude(BASE_HEIGHT)
142
+ inner_cut = square(SIZE_INNER).linear_extrude(CUT_HEIGHT).translate(z(CUT_OFFSET_Z))
143
+ base = outer_base - inner_cut
144
+
145
+ cap_outer = square(SIZE_OUTER).fillet(FILLET).linear_extrude(CAP_HEIGHT_OUTER)
146
+ cap_inner = square(SIZE_INNER).linear_extrude(CAP_HEIGHT_INNER)
147
+ cap = (cap_outer | cap_inner).translate(x(CAP_OFFSET_X))
148
+
149
+ storage_box = base + cap
150
+ storage_box.to_screen()
151
+ ```
152
+
153
+ <picture>
154
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/storage_box_dark.png">
155
+ <img src="https://raw.githubusercontent.com/m-fabregue/scadpy/main/docs/_static/examples/storage_box_light.png" alt="chamfered mounting plate" width="400">
156
+ </picture>
157
+
78
158
  ## Cheat sheet
79
159
 
80
160
  *Parameters shown in `# comments` are optional, with their default values.*
@@ -9,6 +9,9 @@ SPHINXAUTOGEN ?= sphinx-autogen
9
9
  SOURCEDIR = .
10
10
  BUILDDIR = build
11
11
 
12
+ skills:
13
+ @python scripts/build_skills.py
14
+
12
15
  help:
13
16
  @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
17
 
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 93.55%"><title>coverage: 93.55%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#4c1"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">93.55%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">93.55%</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 92.90%"><title>coverage: 92.90%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#4c1"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">92.90%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">92.90%</text></g></svg>
@@ -1,5 +1,5 @@
1
1
  <svg width="140" height="20" viewBox="0 0 140 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
2
- <title>interrogate: 91.5%</title>
2
+ <title>interrogate: 91.6%</title>
3
3
  <g transform="matrix(1,0,0,1,22,0)">
4
4
  <g id="backgrounds" transform="matrix(1.32789,0,0,1,-22.3892,0)">
5
5
  <rect x="0" y="0" width="71" height="20" style="fill:rgb(85,85,85);"/>
@@ -12,8 +12,8 @@
12
12
  <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
13
13
  <text x="590" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="610">interrogate</text>
14
14
  <text x="590" y="140" transform="scale(.1)" textLength="610">interrogate</text>
15
- <text x="1160" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="370" data-interrogate="result">91.5%</text>
16
- <text x="1160" y="140" transform="scale(.1)" textLength="370" data-interrogate="result">91.5%</text>
15
+ <text x="1160" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="370" data-interrogate="result">91.6%</text>
16
+ <text x="1160" y="140" transform="scale(.1)" textLength="370" data-interrogate="result">91.6%</text>
17
17
  </g>
18
18
  <g id="logo-shadow" serif:id="logo shadow" transform="matrix(0.854876,0,0,0.854876,-6.73514,1.732)">
19
19
  <g transform="matrix(0.299012,0,0,0.299012,9.70229,-6.68582)">
@@ -192,3 +192,8 @@ FOREGROUND_DARK = [0.972, 0.972, 0.949, DEFAULT_OPACITY]
192
192
  GHOST_DARK = [1.0, 0.64, 0.2, 0.0]
193
193
  GHOST_LIGHT = [0.85, 0.468, 0.0, 0.0]
194
194
  """
195
+
196
+ # Github light background: [1.0, 1.0, 1.0, DEFAULT_OPACITY]
197
+ # Github dark background: [0.051, 0.067, 0.090, DEFAULT_OPACITY]
198
+ # Furo light background: [0.949, 0.949, 0.949, DEFAULT_OPACITY]
199
+ # Furo dark background: [0.168, 0.168, 0.168, DEFAULT_OPACITY]
@@ -41,12 +41,13 @@ Quick examples
41
41
  .. doctest::
42
42
 
43
43
  >>> # 2D — chamfered mounting plate
44
- >>> from scadpy import circle, cuboid, rectangle, sphere, square, x, y, z, GRAY, ORANGE
44
+ >>> from scadpy import circle, cuboid, rectangle, sphere, square, text
45
+ >>> from scadpy import x, y, z, GRAY, ORANGE
45
46
  >>> import numpy as np
46
47
 
47
48
  >>> PLATE_WIDTH = 80
48
49
  >>> PLATE_HEIGHT = 50
49
- >>> PLATE_THICKESS = 10
50
+ >>> PLATE_THICKNESS = 10
50
51
  >>> HOLE_RADIUS = 4
51
52
  >>> HOLE_MARGIN = 10
52
53
  >>> CHAMFER_SIZE = 8
@@ -66,8 +67,12 @@ Quick examples
66
67
 
67
68
  .. doctest::
68
69
 
69
- >>> # 3D — extrude mounting plate
70
- >>> extruded_plate = plate.linear_extrude(PLATE_THICKESS)
70
+ >>> # 3D — extrude mounting plate with label
71
+ >>> TEXT_THICKNESS = 2
72
+
73
+ >>> extruded_plate = plate.linear_extrude(PLATE_THICKNESS)
74
+ >>> label = text("ScadPy", size=15).linear_extrude(TEXT_THICKNESS)
75
+ >>> extruded_plate |= label.translate(z(PLATE_THICKNESS))
71
76
  >>> extruded_plate.to_screen() # doctest: +SKIP
72
77
 
73
78
  .. render-example::
@@ -0,0 +1 @@
1
+ a7c7139280ac83767d105106bc33a3f4
@@ -0,0 +1 @@
1
+ 71a376f56370c01f428947df022da681
@@ -0,0 +1 @@
1
+ 2345ae8d8a5eac8056f54f0699e5af42
@@ -0,0 +1 @@
1
+ f52da4681c411220cff4b4d248801dd9
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ScadPy"
7
- version = "0.2.10"
7
+ version = "0.2.12"
8
8
  description = "Simplified 2D/3D modeling for Python with fluent API and boolean operations"
9
9
  requires-python = ">= 3.12"
10
10
  authors = [{ name = "m-fabregue" }]
@@ -1,6 +1,7 @@
1
- __all__ = ["circle", "polygon", "rectangle", "square"]
1
+ __all__ = ["circle", "polygon", "rectangle", "square", "text"]
2
2
 
3
3
  from .circle import circle
4
4
  from .polygon import polygon
5
5
  from .rectangle import rectangle
6
6
  from .square import square
7
+ from .text import text
@@ -0,0 +1,192 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ import numpy as np
6
+ from matplotlib import font_manager as fm
7
+ from matplotlib.path import Path
8
+ from matplotlib.textpath import TextPath
9
+ from numpy.typing import NDArray
10
+ from typeguard import typechecked
11
+
12
+ if TYPE_CHECKING:
13
+ from scadpy.d2.shape import Shape
14
+
15
+
16
+ def _quadratic_bezier(
17
+ p0: NDArray[np.float64],
18
+ p1: NDArray[np.float64],
19
+ p2: NDArray[np.float64],
20
+ n: int,
21
+ ) -> NDArray[np.float64]:
22
+ """Sample a quadratic Bézier curve at n equally-spaced parameter values.
23
+
24
+ The start point p0 is not included in the output (it is assumed to already
25
+ be in the caller's point list).
26
+
27
+ Parameters
28
+ ----------
29
+ p0 : NDArray[np.float64]
30
+ Start point (shape (2,)).
31
+ p1 : NDArray[np.float64]
32
+ Control point (shape (2,)).
33
+ p2 : NDArray[np.float64]
34
+ End point (shape (2,)).
35
+ n : int
36
+ Number of output samples (not counting p0).
37
+
38
+ Returns
39
+ -------
40
+ NDArray[np.float64]
41
+ Sampled points of shape (n, 2).
42
+ """
43
+ t = np.linspace(0, 1, n + 1)[1:]
44
+ return np.outer((1 - t) ** 2, p0) + np.outer(2 * (1 - t) * t, p1) + np.outer(t**2, p2)
45
+
46
+
47
+ def _cubic_bezier(
48
+ p0: NDArray[np.float64],
49
+ p1: NDArray[np.float64],
50
+ p2: NDArray[np.float64],
51
+ p3: NDArray[np.float64],
52
+ n: int,
53
+ ) -> NDArray[np.float64]:
54
+ """Sample a cubic Bézier curve at n equally-spaced parameter values.
55
+
56
+ The start point p0 is not included in the output.
57
+
58
+ Parameters
59
+ ----------
60
+ p0 : NDArray[np.float64]
61
+ Start point (shape (2,)).
62
+ p1 : NDArray[np.float64]
63
+ First control point (shape (2,)).
64
+ p2 : NDArray[np.float64]
65
+ Second control point (shape (2,)).
66
+ p3 : NDArray[np.float64]
67
+ End point (shape (2,)).
68
+ n : int
69
+ Number of output samples (not counting p0).
70
+
71
+ Returns
72
+ -------
73
+ NDArray[np.float64]
74
+ Sampled points of shape (n, 2).
75
+ """
76
+ t = np.linspace(0, 1, n + 1)[1:]
77
+ return (
78
+ np.outer((1 - t) ** 3, p0)
79
+ + np.outer(3 * (1 - t) ** 2 * t, p1)
80
+ + np.outer(3 * (1 - t) * t**2, p2)
81
+ + np.outer(t**3, p3)
82
+ )
83
+
84
+
85
+ def _path_to_contours(
86
+ path: Path,
87
+ curve_segments: int,
88
+ ) -> list[NDArray[np.float64]]:
89
+ """Convert a matplotlib Path into a list of closed 2D contours.
90
+
91
+ Each MOVETO/CLOSEPOLY pair produces one contour. Bézier segments
92
+ (CURVE3, CURVE4) are approximated by straight-line sequences.
93
+
94
+ Parameters
95
+ ----------
96
+ path : Path
97
+ Matplotlib path, typically from TextPath.
98
+ curve_segments : int
99
+ Number of line segments used to approximate each Bézier curve.
100
+
101
+ Returns
102
+ -------
103
+ list[NDArray[np.float64]]
104
+ List of contours, each of shape (n_points, 2).
105
+ """
106
+ contours: list[NDArray[np.float64]] = []
107
+ current: list[NDArray[np.float64]] = []
108
+
109
+ for verts, code in path.iter_segments(simplify=False):
110
+ if code == Path.MOVETO:
111
+ if len(current) >= 3:
112
+ contours.append(np.array(current))
113
+ current = [verts]
114
+ elif code == Path.LINETO:
115
+ current.append(verts)
116
+ elif code == Path.CURVE3:
117
+ p0 = np.array(current[-1])
118
+ pts = _quadratic_bezier(p0, verts[:2], verts[2:], curve_segments)
119
+ current.extend(pts)
120
+ elif code == Path.CURVE4:
121
+ p0 = np.array(current[-1])
122
+ pts = _cubic_bezier(p0, verts[:2], verts[2:4], verts[4:], curve_segments)
123
+ current.extend(pts)
124
+ elif code == Path.CLOSEPOLY:
125
+ if len(current) >= 3:
126
+ contours.append(np.array(current))
127
+ current = []
128
+
129
+ if len(current) >= 3:
130
+ contours.append(np.array(current))
131
+
132
+ return contours
133
+
134
+
135
+ @typechecked
136
+ def text(
137
+ content: str,
138
+ font: str | None = None,
139
+ size: float = 10,
140
+ curve_segments: int = 12,
141
+ ) -> Shape:
142
+ """Create a 2D shape from a text string.
143
+
144
+ Each glyph is traced from the font outlines and converted to a polygon.
145
+ Holes (e.g. inside ``o``, ``e``, ``a``) are handled via symmetric
146
+ difference (XOR) across all contours.
147
+
148
+ Parameters
149
+ ----------
150
+ content : str
151
+ The text to render.
152
+ font : str or None
153
+ Font family name (e.g. ``"DejaVu Serif"``). Use :func:`available_fonts`
154
+ to list fonts available on the current system. If ``None``, matplotlib's
155
+ default font (DejaVu Sans, bundled with matplotlib) is used — this is
156
+ guaranteed to work cross-platform.
157
+ size : float
158
+ Font size in units. Default is 10.
159
+ curve_segments : int
160
+ Number of line segments used to approximate each Bézier curve in the
161
+ font outlines. Higher values produce smoother curves. Default is 12.
162
+
163
+ Returns
164
+ -------
165
+ Shape
166
+ A :class:`~scadpy.d2.shape.types.Shape` representing the text outlines.
167
+
168
+ Examples
169
+ --------
170
+ >>> from scadpy import text
171
+
172
+ >>> text("ScadPy", font="DejaVu Sans", size=20) # doctest: +SKIP
173
+
174
+ .. render-example::
175
+ :name: text_example
176
+ :example: text("ScadPy", font="DejaVu Sans", size=20)
177
+ """
178
+ from functools import reduce
179
+
180
+ from scadpy.d2.shape.primitives import polygon
181
+
182
+ props = fm.FontProperties()
183
+ if font is not None:
184
+ props.set_family(font)
185
+ path = TextPath((0, 0), content, size=size, prop=props)
186
+ contours = _path_to_contours(path, curve_segments)
187
+ polygons = [polygon(c) for c in contours]
188
+ result = reduce(lambda a, b: a ^ b, polygons)
189
+ bounds = result.bounds
190
+ cx = (bounds[0] + bounds[2]) / 2
191
+ cy = (bounds[1] + bounds[3]) / 2
192
+ return result.translate([-cx, -cy])
@@ -0,0 +1,7 @@
1
+ __all__ = ["available_fonts", "resolve_vector", "x", "y", "z"]
2
+
3
+ from .available_fonts import available_fonts
4
+ from .resolve_vector import resolve_vector
5
+ from .x import x
6
+ from .y import y
7
+ from .z import z