start updating lib to use solidLib.settings
This commit is contained in:
+40
-43
@@ -1,8 +1,10 @@
|
||||
import numpy as np
|
||||
import solid as scad
|
||||
from . import primitives as slp
|
||||
import solidLib as sl
|
||||
|
||||
from typing import Union, Iterable
|
||||
|
||||
# import .primitives as slp
|
||||
|
||||
|
||||
@@ -12,8 +14,6 @@ def grid(
|
||||
w: float = 3,
|
||||
h: float = 1.5,
|
||||
fillet: bool = False,
|
||||
dim: float = 59,
|
||||
segments: int = 36,
|
||||
):
|
||||
"""generate a grid of (flattened) triangles with or without fillet
|
||||
|
||||
@@ -28,7 +28,7 @@ def grid(
|
||||
out = scad.polygon([[0, 0], [w / 2, 0], [w / 2 - h, h], [0, h]])
|
||||
else:
|
||||
out = scad.polygon([[0, 0], [w / 2, 0], [0, h]])
|
||||
out = scad.linear_extrude(dim)(out)
|
||||
out = scad.linear_extrude(sl.settings.raster)(out)
|
||||
out = scad.rotate([90, 0, 90])(out)
|
||||
|
||||
if fillet:
|
||||
@@ -37,25 +37,25 @@ def grid(
|
||||
scallop = slp.pill(
|
||||
[
|
||||
[0, 0, 0],
|
||||
[dim - 2 * h - (w - 2 * h), 0, 0],
|
||||
[dsl.settings.raster - 2 * h - (w - 2 * h), 0, 0],
|
||||
# [0,0,h], [dim - 2 * h - (w - 2 * h),0,h]
|
||||
],
|
||||
h,
|
||||
segments=segments,
|
||||
segments=sl.settings.segments,
|
||||
)
|
||||
scallop += scad.rotate((0, -90, 0))(scallop) + scad.translate([dim - w, 0, 0])(
|
||||
scallop += scad.rotate((0, -90, 0))(scallop) + scad.translate([sl.settings.raster - w, 0, 0])(
|
||||
scad.rotate([0, -90, 0])(scallop)
|
||||
)
|
||||
scallop = scad.translate((w / 2, w / 2, h))(scallop)
|
||||
out -= scallop
|
||||
|
||||
out += scad.translate((0, dim, 0))(scad.rotate((0, 0, -90))(out))
|
||||
out += scad.translate((dim, dim, 0))(scad.rotate((0, 0, 180))(out))
|
||||
out += scad.translate((0, sl.settings.raster, 0))(scad.rotate((0, 0, -90))(out))
|
||||
out += scad.translate((sl.settings.raster, sl.settings.raster, 0))(scad.rotate((0, 0, 180))(out))
|
||||
|
||||
result = out
|
||||
for dx in range(x_dim):
|
||||
for dy in range(y):
|
||||
result += scad.translate((dim * dx, dim * dy, 0))(out)
|
||||
result += scad.translate((sl.settings.raster * dx, sl.settings.raster * dy, 0))(out)
|
||||
|
||||
return result
|
||||
|
||||
@@ -66,29 +66,28 @@ def grid_inv(
|
||||
w: float = 3,
|
||||
h: float = 1.5,
|
||||
fillet: bool = False,
|
||||
dim: float = 59,
|
||||
segments: int = 36,
|
||||
):
|
||||
g = grid(x, y, w, h, fillet, dim, segments)
|
||||
return scad.cube([x * dim, y * dim, h]) - g
|
||||
g = grid(x, y, w, h, fillet, sl.settings.raster, sl.settings.segments)
|
||||
return scad.cube([x * sl.settings.raster, y * sl.settings.raster, h]) - g
|
||||
|
||||
|
||||
def bin(x: float, y: float, h: float = 67, segments: int = 36, dim: float = 59):
|
||||
def bin(x: float, y: float, h: float = 67):
|
||||
"""
|
||||
standardized container
|
||||
|
||||
.. image:: img/bin.png
|
||||
"""
|
||||
|
||||
class dims:
|
||||
wall = 2
|
||||
r_in = 2
|
||||
r_out = r_in + wall
|
||||
|
||||
bulk = slp.round_flat_box(dim * x, dim * y, h, dims.r_out)
|
||||
hole = slp.round_box(dim * x - dims.wall * 2, dim * y - dims.wall * 2, h, dims.r_in)
|
||||
bulk = slp.rfcube([sl.settings.raster * x, sl.settings.raster * y, h], sl.settings.raster.r_out)
|
||||
hole = slp.rcube([sl.settings.raster * x - dims.wall * 2, sl.settings.raster * y - dims.wall * 2, h], dims.r_in)
|
||||
hole = scad.translate([dims.wall, dims.wall, dims.wall])(hole)
|
||||
|
||||
wall_o = scad.cylinder(r=dims.r_out, h=dims.r_out, segments=segments)
|
||||
wall_o = scad.cylinder(r=dims.r_out, h=dims.r_out, segments=sl.settings.segments)
|
||||
|
||||
g = grid(x, y)
|
||||
|
||||
@@ -105,8 +104,6 @@ def toolinlay1(
|
||||
r_tool: float = 7,
|
||||
inset: float = 4,
|
||||
maxh: float = 67,
|
||||
dim: float = 59,
|
||||
segments: int = 36
|
||||
):
|
||||
"""toolinlay1
|
||||
|
||||
@@ -123,19 +120,19 @@ def toolinlay1(
|
||||
r_in = 2
|
||||
tool_ins = 3
|
||||
|
||||
base = slp.round_flat_box(x * dim, y * dim, height + inset, r_in + wall)
|
||||
base = slp.rfcube([x * sl.settings.raster, y * sl.settings.raster, height + inset], r_in + wall)
|
||||
|
||||
toolindent = 0.1
|
||||
toolindent_w = 2
|
||||
toolbase_l = dim * x - 2 * wall - 2 * r_tool
|
||||
toolbase_l = sl.settings.raster * x - 2 * wall - 2 * r_tool
|
||||
toolbase_t = scad.cube([toolbase_l * (1 - toolindent), 0.001, tool_ins])
|
||||
toolbase_b = scad.translate([toolbase_l * (1 - toolindent), 0, 0])(
|
||||
scad.cube([toolbase_l * toolindent - toolindent_w, 0.001, tool_ins])
|
||||
)
|
||||
toolcutout = scad.minkowski()(
|
||||
toolbase_t, scad.sphere(r=r_tool, segments=segments)
|
||||
toolbase_t, scad.sphere(r=r_tool, segments=sl.settings.segments)
|
||||
) + scad.minkowski()(
|
||||
toolbase_b, scad.sphere(r=r_tool + toolindent_w, segments=segments)
|
||||
toolbase_b, scad.sphere(r=r_tool + toolindent_w, segments=sl.settings.segments)
|
||||
)
|
||||
|
||||
toolcutout = scad.translate(
|
||||
@@ -143,14 +140,14 @@ def toolinlay1(
|
||||
)(toolcutout)
|
||||
|
||||
toolcutouts = []
|
||||
for i in range((dim * y - 3 * wall) // (r_tool * 2 + 2 * toolindent_w)):
|
||||
for i in range((sl.settings.raster * y - 3 * wall) // (r_tool * 2 + 2 * toolindent_w)):
|
||||
toolcutouts.append(
|
||||
scad.translate([0, i * (2 * r_tool + 2 * toolindent_w + 1.4), 0])(
|
||||
scad.color("yellow")(toolcutout)
|
||||
)
|
||||
)
|
||||
|
||||
lower = bin(2, 3, h=maxh - height, dim=dim)
|
||||
lower = bin(2, 3, h=maxh - height, dim=sl.settings.raster)
|
||||
lower = scad.color("red", 0.5)(lower)
|
||||
base = scad.translate([0, 0, maxh - height - inset])(base)
|
||||
|
||||
@@ -163,9 +160,7 @@ def toolinlay2(
|
||||
inset: float = 4,
|
||||
inset_tool: float = 3,
|
||||
maxh: float = 67,
|
||||
dim: float = 59,
|
||||
wall: float = 2,
|
||||
segments: int = 36,
|
||||
):
|
||||
"""toolinlay2
|
||||
|
||||
@@ -178,14 +173,11 @@ def toolinlay2(
|
||||
:param inset: depth of toolinlay inset
|
||||
:param inset_tool: depth of additional toolspace inset
|
||||
:param maxh: system height restriction
|
||||
:param dim: system raster dimension
|
||||
:param segments: circular object segments
|
||||
"""
|
||||
x_dim = 2
|
||||
y_dim = 3
|
||||
x_dim = 3
|
||||
r_in = 2
|
||||
|
||||
base = slp.round_flat_box(x_dim * dim, y_dim * dim, height + inset, r_in + wall)
|
||||
base = slp.rfcube([x_dim * sl.settings.raster, y_dim * sl.settings.raster, height + inset], r_in + wall)
|
||||
|
||||
toolindent = 0.1
|
||||
toolindent_w = 2
|
||||
@@ -194,16 +186,16 @@ def toolinlay2(
|
||||
tool_rs = []
|
||||
if not isinstance(r_tool, list):
|
||||
tool_rs = [r_tool] * (
|
||||
(dim * x_dim - 3 * wall) // (r_tool * 2 + 2 * toolindent_w) - 1
|
||||
(sl.settings.raster * x_dim - 3 * wall) // (r_tool * 2 + 2 * toolindent_w) - 1
|
||||
)
|
||||
else:
|
||||
tool_rs = r_tool
|
||||
|
||||
toolbase_l = dim * y_dim - 2 * wall - 2 * np.max(tool_rs)
|
||||
toolbase_l = sl.settings.raster * y_dim - 2 * wall - 2 * np.max(tool_rs)
|
||||
for i, r in enumerate(tool_rs):
|
||||
toolbase_t = scad.cube([0.001, toolbase_l * (1 - toolindent), inset_tool])
|
||||
# toolbase_b = scad.translate([0, toolbase_l * (1 - toolindent), 0])(
|
||||
# scad.cube([0.001, toolbase_l * toolindent - toolindent_w, tool_ins])
|
||||
# scad.cube([0.001, toolbase_l * toolindent - toolindent_w, tool_ins])
|
||||
# )
|
||||
toolcutout = slp.pill(
|
||||
np.array([[0, 0, 0], [0, toolbase_l, 0], [0, toolbase_l, 10], [0, 0, 10]])
|
||||
@@ -227,12 +219,12 @@ def toolinlay2(
|
||||
[
|
||||
[0, 0, 0],
|
||||
[0, toolindent * toolbase_l, 0],
|
||||
[dim * x_dim - 2 * wall - 2 * 9, 0, 0],
|
||||
[dim * x_dim - 2 * wall - 2 * 9, toolindent * toolbase_l, 0],
|
||||
[sl.settings.raster * x_dim - 2 * wall - 2 * 9, 0, 0],
|
||||
[sl.settings.raster * x_dim - 2 * wall - 2 * 9, toolindent * toolbase_l, 0],
|
||||
[0, 0, 10],
|
||||
[0, toolindent * toolbase_l, 10],
|
||||
[dim * x_dim - 2 * wall - 2 * 9, 0, 10],
|
||||
[dim * x_dim - 2 * wall - 2 * 9, toolindent * toolbase_l, 10],
|
||||
[sl.settings.raster * x_dim - 2 * wall - 2 * 9, 0, 10],
|
||||
[sl.settings.raster * x_dim - 2 * wall - 2 * 9, toolindent * toolbase_l, 10],
|
||||
]
|
||||
)
|
||||
+ [9 + wall, 9 + wall, maxh - inset_tool],
|
||||
@@ -240,14 +232,19 @@ def toolinlay2(
|
||||
)
|
||||
)
|
||||
toolcutouts.append(
|
||||
scad.translate((wall * 2,wall * 2,0))(
|
||||
slp.round_flat_box(
|
||||
toolindent * toolbase_l + 2 * 9, toolindent * toolbase_l + 2 * 9 - wall, 100, 9-wall, segments=segments
|
||||
scad.translate((wall * 2, wall * 2, 0))(
|
||||
slp.rfcube(
|
||||
[
|
||||
toolindent * toolbase_l + 2 * 9,
|
||||
toolindent * toolbase_l + 2 * 9 - wall,
|
||||
100,
|
||||
],
|
||||
9 - wall,
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
lower = bin(2, 3, h=maxh - height, dim=dim)
|
||||
lower = bin(2, 3, h=maxh - height, dim=sl.settings.raster)
|
||||
lower = scad.color("red", 0.5)(lower)
|
||||
base = scad.translate([0, 0, maxh - height - inset])(base)
|
||||
|
||||
|
||||
+14
-33
@@ -9,30 +9,12 @@ import logging as log
|
||||
|
||||
log.basicConfig(level=log.INFO)
|
||||
|
||||
def round_box(x_dim: float, y_dim: float, z_dim: float, radius: float, segments: int = 32):
|
||||
"""
|
||||
creates a round box with radius r
|
||||
|
||||
Args:
|
||||
x_dim (float): .
|
||||
|
||||
Important:
|
||||
deprecated
|
||||
|
||||
.. image:: img/round_box.png
|
||||
"""
|
||||
box = scad.cube([x_dim - 2 * radius, y_dim - 2 * radius, z_dim - 2 * radius])
|
||||
wall = scad.sphere(r=radius, segments=segments)
|
||||
|
||||
return scad.translate([radius, radius, radius])(
|
||||
scad.minkowski()(box, wall)
|
||||
)
|
||||
|
||||
def rcube(dim: Iterable[float], radius: float, segments: int = 32):
|
||||
def rcube(dim: Iterable[float], radius: float):
|
||||
"""
|
||||
creates a cube with rounded corners
|
||||
|
||||
.. image:: img/round_box.png
|
||||
.. image:: img/rcube.png
|
||||
|
||||
Args:
|
||||
dim: cube dimensions to base box on.
|
||||
@@ -45,29 +27,30 @@ def rcube(dim: Iterable[float], radius: float, segments: int = 32):
|
||||
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)
|
||||
))
|
||||
scad.translate([dx, dy, dz])(
|
||||
(scad.sphere(r=radius, segments=sl.settings.segments))
|
||||
)
|
||||
)
|
||||
|
||||
return scad.hull()(*corners)
|
||||
|
||||
def round_flat_box(x: float, y: float, z: float, r: float, segments: int = 32):
|
||||
|
||||
def rfcube(dim: Iterable[float], r: float):
|
||||
"""creates a round box with radius r and flat top/bottom
|
||||
|
||||
.. image:: img/round_flat_box.png
|
||||
.. image:: img/round_flat_box.png
|
||||
"""
|
||||
box = scad.cube([x - 2 * r, y - 2 * r, z- 2 * r])
|
||||
wall = scad.cylinder(r=r, h=2*r, segments=sl.settings.segments)
|
||||
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)
|
||||
)
|
||||
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")
|
||||
@@ -76,8 +59,6 @@ def pill(ps: List[List[float]], r, segments: int = 36):
|
||||
spheres = []
|
||||
# log.info(ps)
|
||||
for p in ps:
|
||||
spheres.append(
|
||||
scad.translate(p)(s)
|
||||
)
|
||||
spheres.append(scad.translate(p)(s))
|
||||
|
||||
return scad.hull()(*spheres)
|
||||
|
||||
Reference in New Issue
Block a user