From 89af799c44e66de5b3edebc443f806892252242f Mon Sep 17 00:00:00 2001 From: acereca Date: Sun, 14 Feb 2021 10:38:18 +0100 Subject: [PATCH] start updating lib to use solidLib.settings --- Makefile | 2 +- docs/_build/doctrees/environment.pickle | Bin 27541 -> 27151 bytes docs/_build/doctrees/solidLib.doctree | Bin 69199 -> 51447 bytes docs/_build/html/_images/bin.png | Bin 7857 -> 7941 bytes docs/_build/html/_images/pill.png | Bin 0 -> 13399 bytes docs/_build/html/_images/rcube.png | Bin 0 -> 15197 bytes docs/_build/html/_images/toolinlay1.png | Bin 18736 -> 18727 bytes docs/_build/html/_images/toolinlay2.png | Bin 17674 -> 17672 bytes .../html/_modules/solidLib/assortment.html | 83 +++++++++--------- .../html/_modules/solidLib/primitives.html | 49 ++++------- docs/_build/html/genindex.html | 6 +- docs/_build/html/objects.inv | Bin 419 -> 408 bytes docs/_build/html/searchindex.js | 2 +- docs/_build/html/solidLib.html | 38 +++----- docs/files/bin.scad | 61 ++++++++++--- docs/files/grid.scad | 5 +- docs/files/grid_inv.scad | 5 +- docs/files/pill.scad | 5 +- docs/files/rcube.scad | 21 +++-- docs/files/rfcube.scad | 32 +++++++ docs/files/round_flat_box.scad | 5 +- docs/files/toolinlay1.scad | 61 ++++++++++--- docs/files/toolinlay2.scad | 61 ++++++++++--- docs/img/bin.png | Bin 7857 -> 7941 bytes docs/img/rcube.png | Bin 6478 -> 15197 bytes docs/img/rfcube.png | Bin 0 -> 6602 bytes docs/img/toolinlay1.png | Bin 18736 -> 18727 bytes docs/img/toolinlay2.png | Bin 17674 -> 17672 bytes solidLib/assortment.py | 83 +++++++++--------- solidLib/primitives.py | 47 +++------- tests.py | 3 +- 31 files changed, 325 insertions(+), 244 deletions(-) create mode 100644 docs/_build/html/_images/pill.png create mode 100644 docs/_build/html/_images/rcube.png create mode 100644 docs/files/rfcube.scad create mode 100644 docs/img/rfcube.png diff --git a/Makefile b/Makefile index 9aaad5d..aed33a0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -GENERATE = bin grid grid_inv pill rcube round_box round_flat_box toolinlay1 toolinlay2 +GENERATE = bin grid grid_inv pill rcube rfcube toolinlay1 toolinlay2 doc_images: $(GENERATE:%=docs/img/%.png) diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 8cf2441c2eb69213ae678e227f02103a764c489a..ffb0cbc1bb90b9b88084edeccedc45cfb74e4f4e 100644 GIT binary patch delta 6073 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 diff --git a/docs/_build/html/_images/bin.png b/docs/_build/html/_images/bin.png index 25bd3a689147ad71cc3b156d6372bf61a39b6581..eeb56cad2cb07bdc251ca95d1d3732b74625afef 100644 GIT binary patch literal 7941 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 IT2rI`2gvu<&j0`b diff --git a/docs/_build/html/_images/pill.png b/docs/_build/html/_images/pill.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5f0f35cd060d109471b218cab210d2a41b5bed GIT binary patch literal 13399 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/_images/toolinlay1.png b/docs/_build/html/_images/toolinlay1.png index fb29c59759d92f7395c8ae0f2199c08f0e2925b8..725bc953487169e3ef6af12a5a06f3e89af32e54 100644 GIT binary patch delta 5369 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 d_%P3fv delta 5366 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 diff --git a/docs/_build/html/_images/toolinlay2.png b/docs/_build/html/_images/toolinlay2.png index c3f69079dbb4f953111e43b46e271b91137f9db7..ea2a40806b97ffd4cb5e419eb0e3df8edd8cb448 100644 GIT binary patch delta 4660 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 SBdOT{z1Vi!ZJ%uB#{M5=XGzBZ delta 4667 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 S-J1;H%VG02+k6`z_WuE316@i0 diff --git a/docs/_build/html/_modules/solidLib/assortment.html b/docs/_build/html/_modules/solidLib/assortment.html index bdf6338..34b73e2 100644 --- a/docs/_build/html/_modules/solidLib/assortment.html +++ b/docs/_build/html/_modules/solidLib/assortment.html @@ -122,8 +122,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 @@ -133,8 +135,6 @@ 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 @@ -149,7 +149,7 @@ 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: @@ -158,25 +158,25 @@ 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 @@ -187,29 +187,28 @@ 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 -
[docs]def bin(x: float, y: float, h: float = 67, segments: int = 36, dim: float = 59): +
[docs]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) @@ -226,8 +225,6 @@ r_tool: float = 7, inset: float = 4, maxh: float = 67, - dim: float = 59, - segments: int = 36 ): """toolinlay1 @@ -244,19 +241,19 @@ 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( @@ -264,14 +261,14 @@ )(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) @@ -284,9 +281,7 @@ inset: float = 4, inset_tool: float = 3, maxh: float = 67, - dim: float = 59, wall: float = 2, - segments: int = 36, ): """toolinlay2 @@ -299,14 +294,11 @@ :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 @@ -315,16 +307,16 @@ 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]]) @@ -348,12 +340,12 @@ [ [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], @@ -361,14 +353,19 @@ ) ) 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) diff --git a/docs/_build/html/_modules/solidLib/primitives.html b/docs/_build/html/_modules/solidLib/primitives.html index 967561b..16f8937 100644 --- a/docs/_build/html/_modules/solidLib/primitives.html +++ b/docs/_build/html/_modules/solidLib/primitives.html @@ -123,35 +123,19 @@ import solid as scad +import solidLib as sl + import numpy as np import logging as log log.basicConfig(level=log.INFO) -
[docs]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) - )
- -
[docs]def rcube(dim: Iterable[float], radius: float, segments: int = 32): +
[docs]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. @@ -164,29 +148,30 @@ 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)
-
[docs]def round_flat_box(x: float, y: float, z: float, r: float, segments: int = 32): + +
[docs]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=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))
[docs]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") @@ -195,9 +180,7 @@ spheres = [] # log.info(ps) for p in ps: - spheres.append( - scad.translate(p)(s) - ) + spheres.append(scad.translate(p)(s)) return scad.hull()(*spheres)
diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index c4661e5..c4e2cd3 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -189,14 +189,12 @@
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 51f11b27cf210db864b321f3302cb35e5ed1579d..541036178cf2f519fe2e816d83e5ae419b298db2 100644 GIT binary patch delta 297 zcmV+^0oMMb1DFGlcz;1o!!Qs<_c?_TY!eZdy#W$Pl~}Mujy-ioICkWjRAk3BxE?1V zj%k`8P}{Jx|NQ5%zlXd<{eYEd`%U9@XF=Qw`WB0t8+)DP{6^&2RFFhIa08B4gGGfd z!n@8XM(;%V1OJON0rhI|1>JrX%zhA^m3{d?{O)|b4cH*#9)IY+4q zio6sDb@Yk*xXg|=?Nv0*9M52tZ$Pl0T715LkQkg@yoikPUS-1&{L-xL^Ftw>_LxQ} vwVhQ@VB4PS;UW_kG=U7NUV=$W%u}jwrGY8N`5PC3O*_#_^%{{cSResVz3Zs zBD@Pm5?aH`U-*Aq##w>J%9KsLq35;i&`(~SU4F3 zEF*0&YAfvF270GCU3Y{BA~e+ymDGLm^Xx?pSk=Q6b0UW#5X>YU_XKVU>7j~4;V-il z7&HnF%#&JaE

solidLib.assortment module¶

-solidLib.assortment.bin(x: float, y: float, h: float = 67, segments: int = 36, dim: float = 59)[source]¶
+solidLib.assortment.bin(x: float, y: float, h: float = 67)[source]¶

standardized container

_images/bin.png
-solidLib.assortment.grid(x_dim: int, y: int, w: float = 3, h: float = 1.5, fillet: bool = False, dim: float = 59, segments: int = 36)[source]¶
+solidLib.assortment.grid(x_dim: int, y: int, w: float = 3, h: float = 1.5, fillet: bool = False)[source]¶

generate a grid of (flattened) triangles with or without fillet

the generated grid is x by y in size with a gridspace of size dim, the triangles used for the base structure is given by their height and width

@@ -165,12 +165,12 @@ the triangles used for the base structure is given by their height and width

-solidLib.assortment.grid_inv(x: float, y: float, w: float = 3, h: float = 1.5, fillet: bool = False, dim: float = 59, segments: int = 36)[source]¶
+solidLib.assortment.grid_inv(x: float, y: float, w: float = 3, h: float = 1.5, fillet: bool = False)[source]¶
-solidLib.assortment.toolinlay1(height: float, *args, r_tool: float = 7, inset: float = 4, maxh: float = 67, dim: float = 59, segments: int = 36)[source]¶
+solidLib.assortment.toolinlay1(height: float, *args, r_tool: float = 7, inset: float = 4, maxh: float = 67)[source]¶

creates a tooltray for alex container bins (2x3)

_images/toolinlay1.png
@@ -185,7 +185,7 @@ the triangles used for the base structure is given by their height and width

-solidLib.assortment.toolinlay2(height: float, r_tool: Union[float, Iterable[float]] = 7, inset: float = 4, inset_tool: float = 3, maxh: float = 67, dim: float = 59, wall: float = 2, segments: int = 36)[source]¶
+solidLib.assortment.toolinlay2(height: float, r_tool: Union[float, Iterable[float]] = 7, inset: float = 4, inset_tool: float = 3, maxh: float = 67, wall: float = 2)[source]¶

creates a tooltray for alex container bins (2x3)

_images/toolinlay2.png
@@ -196,8 +196,6 @@ the triangles used for the base structure is given by their height and width

  • inset – depth of toolinlay inset

  • inset_tool – depth of additional toolspace inset

  • maxh – system height restriction

  • -
  • dim – system raster dimension

  • -
  • segments – circular object segments

  • @@ -210,13 +208,14 @@ the triangles used for the base structure is given by their height and width

    solidLib.primitives.pill(ps: List[List[float]], r, segments: int = 36)[source]¶

    create a pill around given points

    +_images/pill.png
    -solidLib.primitives.rcube(dim: Iterable[float], radius: float, segments: int = 32)[source]¶
    +solidLib.primitives.rcube(dim: Iterable[float], radius: float)[source]¶

    creates a cube with rounded corners

    -_images/round_box.png +_images/rcube.png
    Parameters
      @@ -229,25 +228,8 @@ the triangles used for the base structure is given by their height and width

    -
    -solidLib.primitives.round_box(x_dim: float, y_dim: float, z_dim: float, radius: float, segments: int = 32)[source]¶
    -

    creates a round box with radius r

    -
    -
    Parameters
    -

    x_dim (float) –

    .

    -

    -
    -
    -
    -

    Important

    -

    deprecated

    -
    -_images/round_box.png -
    - -
    -
    -solidLib.primitives.round_flat_box(x: float, y: float, z: float, r: float, segments: int = 32)[source]¶
    +
    +solidLib.primitives.rfcube(dim: Iterable[float], r: float)[source]¶

    creates a round box with radius r and flat top/bottom

    _images/round_flat_box.png
    diff --git a/docs/files/bin.scad b/docs/files/bin.scad index 5926714..d35fdbb 100644 --- a/docs/files/bin.scad +++ b/docs/files/bin.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 union() { @@ -10,10 +10,30 @@ union() { } } translate(v = [2, 2, 2]) { - translate(v = [2, 2, 2]) { - minkowski() { - cube(size = [51, 51, 63]); - sphere($fn = 32, r = 2); + hull() { + translate(v = [2, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 2, 65]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 53, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 53, 65]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 2, 65]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 53, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 53, 65]) { + sphere($fn = 36, r = 2); } } } @@ -474,10 +494,30 @@ union() { } } translate(v = [2, 2, 2]) { - translate(v = [2, 2, 2]) { - minkowski() { - cube(size = [51, 51, 63]); - sphere($fn = 32, r = 2); + hull() { + translate(v = [2, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 2, 65]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 53, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 53, 65]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 2, 65]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 53, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [53, 53, 65]) { + sphere($fn = 36, r = 2); } } } @@ -495,8 +535,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/grid.scad b/docs/files/grid.scad index 95ea72a..c0ebcb8 100644 --- a/docs/files/grid.scad +++ b/docs/files/grid.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 union() { @@ -277,8 +277,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/grid_inv.scad b/docs/files/grid_inv.scad index 73304fb..f468764 100644 --- a/docs/files/grid_inv.scad +++ b/docs/files/grid_inv.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 difference() { @@ -280,8 +280,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/pill.scad b/docs/files/pill.scad index 5f1ba6a..a4dea1c 100644 --- a/docs/files/pill.scad +++ b/docs/files/pill.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 hull() { @@ -21,8 +21,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/rcube.scad b/docs/files/rcube.scad index be73512..9a859d6 100644 --- a/docs/files/rcube.scad +++ b/docs/files/rcube.scad @@ -1,30 +1,30 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 hull() { translate(v = [0.2500000000, 0.2500000000, 0.2500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.2500000000, 0.2500000000, 0.7500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.2500000000, 0.7500000000, 0.2500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.2500000000, 0.7500000000, 0.7500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.7500000000, 0.2500000000, 0.2500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.7500000000, 0.2500000000, 0.7500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.7500000000, 0.7500000000, 0.2500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } translate(v = [0.7500000000, 0.7500000000, 0.7500000000]) { - sphere(r = 0.2500000000); + sphere($fn = 36, r = 0.2500000000); } } /*********************************************** @@ -39,8 +39,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/rfcube.scad b/docs/files/rfcube.scad new file mode 100644 index 0000000..bb47c36 --- /dev/null +++ b/docs/files/rfcube.scad @@ -0,0 +1,32 @@ +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 + + +translate(v = [0.2500000000, 0.2500000000, 0]) { + minkowski() { + cube(size = [0.5000000000, 0.5000000000, 0.5000000000]); + cylinder($fn = 36, h = 0.5000000000, r = 0.2500000000); + } +} +/*********************************************** +********* SolidPython code: ********** +************************************************ + +# import solidLib as sl +import solidLib.primitives as slp +import solidLib.assortment as sla +import solid as s + + +s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") +s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") + +s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") +s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") +s.scad_render_to_file(sla.grid_inv(2,3), "docs/files/grid_inv.scad") + +s.scad_render_to_file(sla.toolinlay1(15), "docs/files/toolinlay1.scad") +s.scad_render_to_file(sla.toolinlay2(15), "docs/files/toolinlay2.scad") + + +************************************************/ diff --git a/docs/files/round_flat_box.scad b/docs/files/round_flat_box.scad index b2b5613..e342fb2 100644 --- a/docs/files/round_flat_box.scad +++ b/docs/files/round_flat_box.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:21:44 translate(v = [0.2500000000, 0.2500000000, 0]) { @@ -19,8 +19,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/round_flat_box.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/toolinlay1.scad b/docs/files/toolinlay1.scad index 8f9029a..c7be763 100644 --- a/docs/files/toolinlay1.scad +++ b/docs/files/toolinlay1.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 difference() { @@ -20,10 +20,30 @@ difference() { } } translate(v = [2, 2, 2]) { - translate(v = [2, 2, 2]) { - minkowski() { - cube(size = [110, 169, 48]); - sphere($fn = 32, r = 2); + hull() { + translate(v = [2, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 50]) { + sphere($fn = 36, r = 2); } } } @@ -1624,10 +1644,30 @@ difference() { } } translate(v = [2, 2, 2]) { - translate(v = [2, 2, 2]) { - minkowski() { - cube(size = [110, 169, 48]); - sphere($fn = 32, r = 2); + hull() { + translate(v = [2, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 50]) { + sphere($fn = 36, r = 2); } } } @@ -1809,8 +1849,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/files/toolinlay2.scad b/docs/files/toolinlay2.scad index ea9b959..5dc39ee 100644 --- a/docs/files/toolinlay2.scad +++ b/docs/files/toolinlay2.scad @@ -1,4 +1,4 @@ -// Generated by SolidPython 1.0.5 on 2021-02-12 20:02:04 +// Generated by SolidPython 1.0.5 on 2021-02-14 10:24:57 difference() { @@ -20,10 +20,30 @@ difference() { } } translate(v = [2, 2, 2]) { - translate(v = [2, 2, 2]) { - minkowski() { - cube(size = [110, 169, 48]); - sphere($fn = 32, r = 2); + hull() { + translate(v = [2, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 50]) { + sphere($fn = 36, r = 2); } } } @@ -1624,10 +1644,30 @@ difference() { } } translate(v = [2, 2, 2]) { - translate(v = [2, 2, 2]) { - minkowski() { - cube(size = [110, 169, 48]); - sphere($fn = 32, r = 2); + hull() { + translate(v = [2, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [2, 171, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 2, 50]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 2]) { + sphere($fn = 36, r = 2); + } + translate(v = [112, 171, 50]) { + sphere($fn = 36, r = 2); } } } @@ -1771,8 +1811,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad") diff --git a/docs/img/bin.png b/docs/img/bin.png index 25bd3a689147ad71cc3b156d6372bf61a39b6581..eeb56cad2cb07bdc251ca95d1d3732b74625afef 100644 GIT binary patch literal 7941 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 IT2rI`2gvu<&j0`b diff --git a/docs/img/rcube.png b/docs/img/rcube.png index 33edacbc676b89960d7703625adfa439aa43da97..42997478b9920388f553923e53cd8d1f6d32f0dc 100644 GIT binary patch literal 15197 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 literal 6478 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 QKks0Rjk9%;rC-ed02EbX;{X5v literal 0 HcmV?d00001 diff --git a/docs/img/toolinlay1.png b/docs/img/toolinlay1.png index fb29c59759d92f7395c8ae0f2199c08f0e2925b8..725bc953487169e3ef6af12a5a06f3e89af32e54 100644 GIT binary patch delta 5369 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 d_%P3fv delta 5366 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 diff --git a/docs/img/toolinlay2.png b/docs/img/toolinlay2.png index c3f69079dbb4f953111e43b46e271b91137f9db7..ea2a40806b97ffd4cb5e419eb0e3df8edd8cb448 100644 GIT binary patch delta 4660 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 SBdOT{z1Vi!ZJ%uB#{M5=XGzBZ delta 4667 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 S-J1;H%VG02+k6`z_WuE316@i0 diff --git a/solidLib/assortment.py b/solidLib/assortment.py index d4e5428..9a664c7 100644 --- a/solidLib/assortment.py +++ b/solidLib/assortment.py @@ -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) diff --git a/solidLib/primitives.py b/solidLib/primitives.py index a2c3a53..2637b89 100644 --- a/solidLib/primitives.py +++ b/solidLib/primitives.py @@ -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) diff --git a/tests.py b/tests.py index 69950d1..9eca9dd 100644 --- a/tests.py +++ b/tests.py @@ -6,8 +6,7 @@ import solid as s s.scad_render_to_file(slp.pill([[0,0,0],[1, 1, 1]], .25), "./docs/files/pill.scad") s.scad_render_to_file(slp.rcube([1, 1, 1], .25), "./docs/files/rcube.scad") -s.scad_render_to_file(slp.round_box(1, 1, 1, .25), "./docs/files/round_box.scad") -s.scad_render_to_file(slp.round_flat_box(1, 1, 1, .25), "./docs/files/round_flat_box.scad") +s.scad_render_to_file(slp.rfcube([1, 1, 1], .25), "./docs/files/rfcube.scad") s.scad_render_to_file(sla.bin(1, 1), "./docs/files/bin.scad") s.scad_render_to_file(sla.grid(2,3), "docs/files/grid.scad")