# solidLib.primitives — solidLib documentation

# Source code for solidLib.primitives

    from typing import List, Iterable

    import solid as scad

    import solidLib as sl

    import numpy as np
    import logging as log

    log.basicConfig(level=log.INFO)

    def rcube(dim: Iterable[float], radius: float):
        """
        creates a cube with rounded corners

        .. image:: img/rcube.png

        Args:
            dim: cube dimensions to base box on.
            radius: box radius.
            segments: circular object segments
        """

        corners = []
        for dx in [radius, dim[0] - radius]:
            for dy in [radius, dim[1] - radius]:
                for dz in [radius, dim[2] - radius]:
                    corners.append(
                        scad.translate([dx, dy, dz])(
                            (scad.sphere(r=radius, segments=sl.settings.segments))
                        )
                    )

        return scad.hull()(*corners)

    def rfcube(dim: Iterable[float], r: float):
        """creates a round box with radius r and flat top/bottom

        .. image:: img/round_flat_box.png
        """
        box = scad.cube([dim[0] - 2 * r, dim[1] - 2 * r, dim[2] - 2 * r])
        wall = scad.cylinder(r=r, h=2 * r, segments=sl.settings.segments)

        return scad.translate([r, r, 0])(scad.minkowski()(box, wall))

    def pill(ps: List[List[float]], r, segments: int = 36):
        """
        create a pill around given points

        .. image:: img/pill.png
        """
        if len(ps) < 2:
            raise Exception("requires 2 or more points")
        s = scad.sphere(r=r, segments=segments)

        spheres = []
        # log.info(ps)
        for p in ps:
            spheres.append(scad.translate(p)(s))

        return scad.hull()(*spheres)