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.
- {scadpy-0.2.10 → scadpy-0.2.12}/.gitignore +1 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/PKG-INFO +91 -11
- {scadpy-0.2.10 → scadpy-0.2.12}/README.md +90 -10
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/Makefile +3 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/badges/coverage.svg +1 -1
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/badges/interrogate.svg +3 -3
- scadpy-0.2.12/docs/_static/examples/bearing_dark.png +0 -0
- scadpy-0.2.12/docs/_static/examples/bearing_light.png +0 -0
- scadpy-0.2.12/docs/_static/examples/dice_dark.png +0 -0
- scadpy-0.2.12/docs/_static/examples/dice_light.png +0 -0
- scadpy-0.2.12/docs/_static/examples/extruded_plate_dark.png +0 -0
- scadpy-0.2.12/docs/_static/examples/extruded_plate_light.png +0 -0
- scadpy-0.2.12/docs/_static/examples/plate_dark.png +0 -0
- scadpy-0.2.12/docs/_static/examples/plate_light.png +0 -0
- scadpy-0.2.12/docs/_static/examples/storage_box_dark.png +0 -0
- scadpy-0.2.12/docs/_static/examples/storage_box_light.png +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/conf.py +5 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/index.rst +9 -4
- scadpy-0.2.12/docs/snapshots/d2__index_extruded_plate__dark.md5 +1 -0
- scadpy-0.2.12/docs/snapshots/d2__index_extruded_plate__light.md5 +1 -0
- scadpy-0.2.12/docs/snapshots/d2__text_example__dark.md5 +1 -0
- scadpy-0.2.12/docs/snapshots/d2__text_example__light.md5 +1 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/pyproject.toml +1 -1
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/__init__.py +2 -1
- scadpy-0.2.12/scadpy/d2/shape/primitives/text.py +192 -0
- scadpy-0.2.12/scadpy/utils/__init__.py +7 -0
- scadpy-0.2.12/scadpy/utils/available_fonts.py +40 -0
- scadpy-0.2.10/docs/_static/examples/bearing_dark.png +0 -0
- scadpy-0.2.10/docs/_static/examples/bearing_light.png +0 -0
- scadpy-0.2.10/docs/_static/examples/plate_dark.png +0 -0
- scadpy-0.2.10/docs/_static/examples/plate_light.png +0 -0
- scadpy-0.2.10/docs/snapshots/d2__index_extruded_plate__dark.md5 +0 -1
- scadpy-0.2.10/docs/snapshots/d2__index_extruded_plate__light.md5 +0 -1
- scadpy-0.2.10/scadpy/utils/__init__.py +0 -6
- {scadpy-0.2.10 → scadpy-0.2.12}/.github/workflows/ci.yml +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/.github/workflows/release.yml +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/LICENSE.md +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/css/custom.css +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/logo.ico +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/_static/logo.png +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/combinations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/topologies.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/transformations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/types.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly/utils.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/assembly.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component/exporters.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component/features.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component/utils.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/component.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/part/combinations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core/part.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/core.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/combinations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/exporters.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/features.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/importers.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/primitives.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/topologies.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/transformations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape/types.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2/shape.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d2.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/combinations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/exporters.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/features.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/importers.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/primitives.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/topologies.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/transformations.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid/types.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3/solid.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/scadpy/d3.rst +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_all__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_all__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_clamp_proportional__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_clamp_proportional__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_concave_asymmetric__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_concave_asymmetric__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_convex_only__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_convex_only__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_sharp_convex__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__chamfer_shape_sharp_convex__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__color_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__concat_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cone__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cone__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__convexify_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cube__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cube__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cuboid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cuboid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cylinder__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__cylinder__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__exclude_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fill_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_all__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_all__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_clamp_proportional__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_clamp_proportional__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_concave_asymmetric__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_concave_asymmetric__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_convex_only__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_convex_only__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_sharp_convex__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__fillet_shape_sharp_convex__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_shrink__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__grow_shape_shrink__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cone__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cone__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cylinder__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__hexagonal_cylinder__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_2d__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_2d__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_3d__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_3d__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_bearing__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_bearing__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_dice__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_dice__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_plate__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_plate__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_storage_box__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__index_storage_box__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape_parts_example__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_shape_parts_example__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid_parts_example__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__intersect_solid_parts_example__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape_diagonal__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_cut_shape_diagonal__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_square__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_square__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_tube__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_extrude_shape_tube__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_diagonal__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_diagonal__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_horizontal__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_horizontal__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_pivot__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__linear_slice_shape_pivot__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__low_resolution_sphere__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__low_resolution_sphere__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_dxf_to_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_dxf_to_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometries_to_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_geometry_to_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_parts_to_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_svg_to_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__map_svg_to_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__mirror_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__polyhedron__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__polyhedron__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__pull_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__push_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_extrude_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_pivot__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_pivot__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_quarter__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_quarter__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_three_quarter__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__radial_slice_shape_three_quarter__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__recoordinate_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_auto__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_auto__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_exact__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_exact__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_freeze__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_shape_freeze__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_auto__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_auto__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_exact__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_exact__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_freeze__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__resize_solid_freeze__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__rotate_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__scale_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_negative__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_negative__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_partial__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__shrink_shape_partial__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__sphere__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__sphere__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape_parts_example__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_shape_parts_example__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid_parts_example__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__subtract_solid_parts_example__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__translate_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape_parts_example__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_shape_parts_example__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid_parts_example__dark.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/docs/snapshots/d2__unify_solid_parts_example__light.md5 +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/project_bundle.json +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BEIGE.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BLACK.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BLUE.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/BROWN.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/DARK_GRAY.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/DEFAULT_COLOR.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/DEFAULT_OPACITY.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/GRAY.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/GREEN.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/ORANGE.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/RED.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/WHITE.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/YELLOW.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/constants/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/type/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/type/color.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/color/utils/get_random_color.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/concat_assemblies.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/exclude_assemblies.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/intersect_assemblies.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/subtract_assemblies.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/combinations/unify_assemblies.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_directions.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_edge.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/directed_edge/get_assembly_directed_edge_to_vertex.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/get_assembly_edge_lengths.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/get_assembly_edge_midpoints.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/edge/get_assembly_edge_normals.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/get_assembly_face_vertex_angles.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/face_vertex/get_assembly_face_vertex_normals.py +0 -0
- {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
- {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
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/part/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/part/get_assembly_part_colors.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/vertex/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/vertex/get_assembly_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/topologies/vertex/get_assembly_vertex_to_part.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/color_assembly.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/mirror_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/pull_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/push_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/resize_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/rotate_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/scale_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/transformations/translate_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/types/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/types/assembly.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/types/topology_filter.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/lookup_pairs.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/resolve_topology_filter.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/assembly/utils/transform_filtered_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/exporters/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/exporters/map_component_to_html_file.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/exporters/map_component_to_screen.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/features/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/features/get_component_bounds.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/utils/blend_component_colors.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/component/utils/get_intersecting_component_index_groups.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/concat_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/intersect_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/subtract_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/combinations/unify_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/types/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/types/part.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/core/part/utils/blend_part_colors.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/are_shape_parts_intersecting.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/concat_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/exclude_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/intersect_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/intersect_shape_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/subtract_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/subtract_shape_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/unify_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/combinations/unify_shape_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_dxf.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_dxf_file.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_html.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_html_file.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_screen.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_svg.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/exporters/map_shape_to_svg_file.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/get_shape_bounds.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/get_shape_part_bounds.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/features/is_shape_empty.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_dxf_to_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_geometries_to_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_geometry_to_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_parts_to_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/importers/map_svg_to_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/circle.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/polygon.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/rectangle.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/primitives/square.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_directions.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_edge.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/directed_edge/get_shape_directed_edge_to_vertex.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_lengths.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_midpoints.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_normals.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/edge/get_shape_edge_to_vertex.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/ring/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/ring/get_shape_ring_to_part.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/ring/get_shape_ring_types.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/are_shape_vertices_convex.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_part_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_angles.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_normals.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_incoming_directed_edge.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_neighbor_vertex.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_outgoing_directed_edge.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_part.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/topologies/vertex/get_shape_vertex_to_ring.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/chamfer_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/color_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/convexify_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/fill_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/fillet_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/grow_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/linear_cut_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/linear_extrude_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/linear_slice_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/mirror_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/pull_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/push_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/radial_extrude_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/radial_slice_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/recoordinate_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/resize_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/rotate_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/scale_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/shrink_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/transformations/translate_shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/shape.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/types/utils/shapely_base_geometry_to_shapely_polygons.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/shape/utils/shapely_base_geometry_to_shapely_polygons.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d2/utils/resolve_vector_2d.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/are_solid_parts_intersecting.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/concat_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/exclude_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/intersect_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/intersect_solid_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/subtract_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/subtract_solid_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/unify_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/combinations/unify_solid_parts.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_html.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_html_file.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_screen.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/exporters/map_solid_to_stl_file.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/get_solid_bounds.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/get_solid_part_bounds.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/get_solid_part_colors.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/features/is_solid_empty.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_geometries_to_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_geometry_to_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_parts_to_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/importers/map_stl_to_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/cone.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/cuboid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/cylinder.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/polyhedron.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/primitives/sphere.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/triangle/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/triangle/get_solid_triangle_to_vertex.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/vertex/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/vertex/get_solid_vertex_coordinates.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/topologies/vertex/get_solid_vertex_to_part.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/color_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/convexify_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/mirror_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/pull_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/push_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/recoordinate_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/resize_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/rotate_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/scale_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/transformations/translate_solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/types/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/solid/types/solid.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/utils/__init__.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/d3/utils/resolve_vector_3d.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/resolve_vector.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/x.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/y.py +0 -0
- {scadpy-0.2.10 → scadpy-0.2.12}/scadpy/utils/z.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ScadPy
|
|
3
|
-
Version: 0.2.
|
|
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
|
|
103
|
-
PLATE_HEIGHT
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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 +=
|
|
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
|
|
31
|
-
PLATE_HEIGHT
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 +=
|
|
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.*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage:
|
|
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.
|
|
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.
|
|
16
|
-
<text x="1160" y="140" transform="scale(.1)" textLength="370" data-interrogate="result">91.
|
|
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)">
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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,
|
|
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
|
-
>>>
|
|
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
|
-
>>>
|
|
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.
|
|
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])
|