Compare commits

...

2 Commits

134 changed files with 572 additions and 4912785 deletions

View File

@ -0,0 +1,29 @@
name: deploy demo to Hetzner
on:
push:
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: install tools
run: |
sudo apt-get update
sudo apt-get install -y openscad prusa-slicer build-essential
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs >rustup.sh
sh rustup.sh -y
- name: render models
run: |
cd renderer && cargo run
./render.sh
- uses: actions/upload-artifact@v3
with:
name: bakjes
path: |
stl/**
bakje/**
grid/**
overwrite: true

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

30
gf_sewing_spools.scad Normal file
View File

@ -0,0 +1,30 @@
include <gridfinity.scad>
module gf_sewing_spools() {
difference() {
gf_bakje([2, 2, 4], mode=GF_BAKJE_MODE_PARFILL, fill_dis=6);
for(i = [-1,0,+1])
translate([-(62+2+12)/2, i*24, 11+6])
rotate([0, 90]) {
cylinder(h = 62, d = 24);
translate([0, 0, 62+2])
cylinder(h = 12, d = 24);
}
for(i = [-1,+1])
translate([0, i*12, 19])
scale([1, 9, 12])
rotate([45, 0]) {
cube([100, 1, 1], center=true);
}
}
%for(i = [-1,0,+1])
translate([-(62+2+12)/2+1, i*24, 11+6])
rotate([0, 90]) {
cylinder(h = 60, d = 20);
translate([0, 0, 62+2])
cylinder(h = 11, d = 20);
}
}
gf_sewing_spools();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

34
gridfinity.json Normal file
View File

@ -0,0 +1,34 @@
{
"fileFormatVersion": "1",
"parameterSets": {
"New set 1": {
"$fn": "50",
"CLEARANCE": "0.25",
"CORNER_RADIUS": "4",
"DEPTH": "2",
"FILL_DEPTH": "10",
"HIEGHT": "3",
"MODE": "3",
"NESTING_DEPTH": "0",
"RENDER_GF_BASE": "true",
"RESTING_RIM_WIDTH": "2.3999999999999999",
"SLOT": "42",
"WIDTH": "3"
},
"New set 2": {
"$fn": "50",
"CLEARANCE": "0.25",
"CORNER_RADIUS": "4",
"DEPTH": "1",
"FILL_DEPTH": "12",
"HIEGHT": "3",
"MODE": "1",
"NESTING_DEPTH": "5",
"RENDER_GF_BASE": "true",
"RESTING_RIM_WIDTH": "2.3999999999999999",
"SLOT": "42",
"WALL_THIKNESS": "1",
"WIDTH": "1"
}
}
}

View File

@ -1,63 +1,266 @@
$fn=50;
HIEGHT = 1;
RENDER_GF_BAKJE = false;
RENDER_GF_GRID = false;
MODE = 0; // [0:default,1:deep,2:filled,3:partial filled]
WIDTH = 2;
DEPTH = 2;
HIEGHT = 3;
FILL_DEPTH = 0.0;
SLOT = 42;
NESTING_DEPTH = 5;
RESTING_RIM_WIDTH = 2.4;
CORNER_RADIUS = 4;
CLEARANCE = 0.25;
WALL_THIKNESS = 1;
module square_rounded(size1, size2, r1, r2, h) {
if (is_num(size1)) {
size1 = [size1, size1];
size2 = [size2, size2];
square_rounded(size1, size2, r1, r2, h);
}
else
{
union() {
difference() {
translate([0, 0, h/2]) {
cube([size1-r1*2, size2, h], center=true);
cube([size2, size1-r1*2, h], center=true);
cube([size1[0]-r1*2, size2[1], h], center=true);
cube([size2[0], size1[1]-r1*2, h], center=true);
}
for(r=[0, 90, 180, -90])
rotate([0, 0, r])
translate([-size2/2, size1/2, 0])
for(r=[
[ 0, size1[0], size1[1]],
[ 90, size1[1], size1[0]],
[180, size1[0], size1[1]],
[-90, size1[1], size1[0]]
])
rotate([0, 0, r[0]])
translate([-r[1]/2, r[2]/2, 0])
rotate([-45, 0, 0])
cube([size2, 100, 2*h]);
cube([r[1], 2*h, 2*h]);
}
for(r=[0, 90, 180, -90])
rotate([0, 0, r])
translate([size1/2-r1, size1/2-r1])
for(r=[
[ 0, size1[0], size1[1]],
[ 90, size1[1], size1[0]],
[180, size1[0], size1[1]],
[-90, size1[1], size1[0]]
])
rotate([0, 0, r[0]])
translate([r[1]/2-r1, r[2]/2-r1])
cylinder(h=h, r1=r1, r2=r2);
}
}
}
module gf_bottom() {
union() {
square_rounded(size1=35.6, size2=37.2, r1=0.8, r2=1.6, h=0.8);
l3_r = CORNER_RADIUS;
l3_h = NESTING_DEPTH;
l1_cut = RESTING_RIM_WIDTH;
l1_r = l3_r-l1_cut;
l0_cut = l1_cut+0.8;
l0_r = l3_r-l0_cut;
square_rounded(
size1=SLOT-2*l0_cut, size2=SLOT-2*l1_cut,
r1=l0_r, r2=l1_r,
h=0.8+0.001);
translate([0, 0, 0.8])
square_rounded(size1=37.2, size2=37.2, r1=1.6, r2=1.6, h=1.8);
translate([0, 0, 2.6])
square_rounded(size1=37.2, size2=41.5, r1=1.6, r2=3.75, h=2.15);
square_rounded(
size1=SLOT-2*l1_cut, size2=SLOT-2*l1_cut,
r1=l1_r, r2=l1_r,
h=l3_h-l1_cut-0.8+0.001);
translate([0, 0, l3_h-l1_cut])
square_rounded(
size1=SLOT-2*l1_cut, size2=SLOT,
r1=l1_r, r2=l3_r,
h=l1_cut+0.001);
}
}
module gf_socker_cut() {
t = 0.25;
a = sin(45)*t;
b = a*tan(22.5);
c = t/sin(45);
echo(a+b);
translate([0, 0, -a])
module gf_grid_cut(size=[1,1]) {
a = CLEARANCE*sin(45);
b = CLEARANCE*tan(22.5);
c = CLEARANCE/sin(45);
union() {
square_rounded(size1=35.6+a*2, size2=37.2+2*t, r1=0.8+a, r2=1.6+t, h=0.8+b);
translate([0, 0, 0.8+b])
square_rounded(size1=37.2+2*t, size2=37.2+2*t, r1=1.6+t, r2=1.6+t, h=1.8);
translate([0, 0, 2.6+b])
square_rounded(size1=37.2+2*t, size2=41.5+2*c, r1=1.6+t, r2=3.75+c, h=2.15+a-b-0.001);
l3_r = CORNER_RADIUS;
l3_h = NESTING_DEPTH-a;
l1_cut = RESTING_RIM_WIDTH-CLEARANCE;
l1_r = l3_r-l1_cut;
square_rounded(
size1=[size[0]*SLOT-2*l1_cut, size[1]*SLOT-2*l1_cut],
size2=[size[0]*SLOT-2*l1_cut, size[1]*SLOT-2*l1_cut],
r1=l1_r, r2=l1_r,
h=l3_h-l1_cut+0.001);
translate([0, 0, l3_h-l1_cut])
square_rounded(
size1=[size[0]*SLOT-2*l1_cut, size[1]*SLOT-2*l1_cut],
size2=[size[0]*SLOT, size[1]*SLOT],
r1=l1_r, r2=l3_r,
h=l1_cut+0.001);
translate([0, 0, l3_h+a/2])
cube([size[0]*SLOT, size[1]*SLOT, a], center=true);
}
}
// gf_bottom();
// gf_socker_cut();
module gf_bakje_inside_cut(size, fill=0) {
connecting_fillet = RESTING_RIM_WIDTH-WALL_THIKNESS-2*CLEARANCE;
inside_radius = CORNER_RADIUS-CLEARANCE-WALL_THIKNESS;
union() {
// bottom shapes
translate([0, 0, size[2]*7])
gf_grid_cut(size);
// connecting fillet
translate([0, 0, size[2]*7+0.001])
rotate([180, 0, 0])
square_rounded(
size1=[
SLOT*size[0]-2*RESTING_RIM_WIDTH+2*CLEARANCE,
SLOT*size[1]-2*RESTING_RIM_WIDTH+2*CLEARANCE
],
size2=[
SLOT*size[0]-2*WALL_THIKNESS-2*CLEARANCE,
SLOT*size[1]-2*WALL_THIKNESS-2*CLEARANCE
],
r1=CORNER_RADIUS-RESTING_RIM_WIDTH+CLEARANCE, r2=inside_radius,
h=connecting_fillet+0.002);
// main fill
translate([
-SLOT*size[0]/2+CORNER_RADIUS,
-SLOT*size[1]/2+CORNER_RADIUS,
NESTING_DEPTH+WALL_THIKNESS+fill])
linear_extrude(size[2]*7-NESTING_DEPTH-WALL_THIKNESS-fill-connecting_fillet+0.001)
minkowski() {
square([
SLOT*size[0]-2*CLEARANCE-inside_radius*2-2*WALL_THIKNESS,
SLOT*size[1]-2*CLEARANCE-inside_radius*2-2*WALL_THIKNESS]);
circle(r=inside_radius);
}
}
}
module gf_bakje_deep_cut() {
a = WALL_THIKNESS*sin(45);
b = WALL_THIKNESS*tan(22.5);
c = WALL_THIKNESS/sin(45);
union() {
l3_r = CORNER_RADIUS;
l3_h = NESTING_DEPTH+c;
l1_cut = RESTING_RIM_WIDTH+WALL_THIKNESS;
l1_r = l3_r-l1_cut;
l1_hd = l3_h-l1_cut-WALL_THIKNESS;
translate([0, 0, l3_h-l1_cut+0.001])
rotate([180,0,0])
linear_extrude(height = l1_hd, scale = 1-(2*l1_hd/(SLOT-2*l1_cut)))
translate(-[SLOT/2-l1_cut-l1_r, SLOT/2-l1_cut-l1_r])
minkowski() {
square([SLOT-2*l1_cut-2*l1_r, SLOT-2*l1_cut-2*l1_r]);
circle(r=l1_r);
}
translate([0, 0, l3_h-l1_cut])
square_rounded(
size1=SLOT-2*l1_cut,
size2=SLOT,
r1=l1_r, r2=l3_r,
h=l1_cut+0.001);
translate([0, 0, l3_h+a/2])
cube([SLOT, SLOT, a+0.001], center=true);
}
}
GF_BAKJE_MODE_DEFALT=0;
GF_BAKJE_MODE_DEEP=1;
GF_BAKJE_MODE_FILLED=2;
GF_BAKJE_MODE_PARFILL=3;
module gf_bakje(size=[1,1,4], mode=GF_BAKJE_MODE_DEFALT, fill_dis=0) {
intersection() {
difference() {
union() {
difference() {
union() {
// bottom shapes
translate(-[size[0]-1,size[1]-1]*SLOT/2)
for (x = [0:size[0]-1])
for (y = [0:size[1]-1])
translate([x*SLOT, y*SLOT])
gf_bottom();
translate([0, 0, 4.75])
square_rounded(size1=41.5, size2=41.5, r1=3.75, r2=3.75, h=HIEGHT*7+4.4-4.75);
// main fill
translate([
-SLOT*size[0]/2+CORNER_RADIUS,
-SLOT*size[1]/2+CORNER_RADIUS,
NESTING_DEPTH])
linear_extrude(size[2]*7-CLEARANCE)
minkowski() {
radius = CORNER_RADIUS-CLEARANCE;
square([SLOT*size[0]-2*CLEARANCE-radius*2, SLOT*size[1]-2*CLEARANCE-radius*2]);
circle(r=radius);
}
translate([0, 0, HIEGHT*7+4.4])
gf_socker_cut();
}
fill = (mode==GF_BAKJE_MODE_PARFILL)
? fill_dis
: ((mode==GF_BAKJE_MODE_FILLED)
? 10
: 0);
gf_bakje_inside_cut(size, fill);
if (mode == GF_BAKJE_MODE_DEEP) {
intersection() {
translate(-[size[0]-1,size[1]-1]*21)
for (x = [0:size[0]-1])
for (y = [0:size[1]-1])
translate([x*42, y*42])
gf_bakje_deep_cut();
square_rounded(
size1 = [SLOT*size[0]-2*CLEARANCE-2*WALL_THIKNESS, SLOT*size[1]-2*CLEARANCE-2*WALL_THIKNESS],
size2 = [SLOT*size[0]-2*CLEARANCE-2*WALL_THIKNESS, SLOT*size[1]-2*CLEARANCE-2*WALL_THIKNESS],
r1 = CORNER_RADIUS-CLEARANCE-WALL_THIKNESS, r2 = CORNER_RADIUS-CLEARANCE-WALL_THIKNESS,
h = NESTING_DEPTH+WALL_THIKNESS);
}
}
}
}
}
square_rounded(
size1 = [SLOT*size[0]-2*CLEARANCE, SLOT*size[1]-2*CLEARANCE],
size2 = [SLOT*size[0]-2*CLEARANCE, SLOT*size[1]-2*CLEARANCE],
r1 = CORNER_RADIUS-CLEARANCE, r2 = CORNER_RADIUS-CLEARANCE,
h = size[2]*7+NESTING_DEPTH);
}
}
module gf_grid(size) {
difference() {
// block
translate([
-SLOT*size[0]/2+CORNER_RADIUS,
-SLOT*size[1]/2+CORNER_RADIUS,
0])
linear_extrude(NESTING_DEPTH-0.001)
minkowski() {
radius = CORNER_RADIUS-CLEARANCE;
square([SLOT*size[0]-2*CLEARANCE-radius*2, SLOT*size[1]-2*CLEARANCE-radius*2]);
circle(r=radius);
}
// cut
translate(-[size[0]-1,size[1]-1]*SLOT/2)
for (x = [0:size[0]-1])
for (y = [0:size[1]-1])
translate([x*SLOT, y*SLOT])
gf_grid_cut();
}
}
if (RENDER_GF_BAKJE) {
// projection(true)
// rotate([0, 90, 0])
gf_bakje([WIDTH, DEPTH, HIEGHT], mode=MODE, fill_dis=FILL_DEPTH);
}
if (RENDER_GF_GRID) {
// projection(true)
// rotate([0, 90, 0])
gf_grid([WIDTH, DEPTH]);
}

View File

@ -19,72 +19,17 @@ function slice(){
}
function renderBakjes(){
for part in bakje grid ;
do
for x in {1..4}
do
for y in {1..4}
do
echo "$0: render $part ${x}x${y}"
${OPENSCAD} -o stl/"${part}-${x}x${y}.stl" \
-D "RENDER=\"${part}\"" \
-D WIDTH=${x} \
-D DEPTH=${y} \
"bakje.scad" || exit 1
max=$(echo -e "$x\n$y" | sort --numeric-sort --reverse | head --lines 1)
min=$(echo -e "$x\n$y" | sort --numeric-sort | head --lines 1)
if [ "$max" == "$min" ]
then
if [ "${x}" == "1" ]
then
dubs=(1 2 4 6 9 12 16)
elif [ "${x}" == "2" ]
then
dubs=(1 2 4)
else
dubs=(1)
fi
elif [ "${min}" == "1" ]
then
if [ "${max}" == "2" ]
then
dubs=(1 2 4 6 8)
elif [ "${max}" == "3" ]
then
dubs=(1 2 3 4)
elif [ "${max}" == "4" ]
then
dubs=(1 2 4)
fi
elif [ "${min}" == "2" ]
then
dubs=(1 2)
else
dubs=(1)
fi
for dub in ${dubs[*]}
do
echo "$0: slice $dub dublicates of $part ${x}x${y}"
slice ${part} ${x}x${y} ${dub}
done
done
done
done
# bakje bobbin
echo "$0: render bakje bobbin"
${OPENSCAD} -o "stl/bakje-bobbin-2x2.stl" \
-D WIDTH=${x} \
-D DEPTH=${y} \
"bakje_bobbin.scad" || exit 1
slice "bakje" "bobbin-2x2" 1
echo "$0: render bakje sewing_spools"
${OPENSCAD} -o "stl/bakje-gf_sewing_spools-2x2x4.stl" \
"gf_sewing_spools.scad" || exit 1
rm bakje/gf_sewing_spools-2x2x4/*
slice "bakje" "gf_sewing_spools-2x2x4" 1
slice "bakje" "gf_sewing_spools-2x2x4" 2
slice "bakje" "gf_sewing_spools-2x2x4" 4
}
mkdir -p stl bakje grid koffer
rm stl/*
rm -r bakje/* grid/*
# rm stl/*
# rm -r bakje/* grid/*
renderBakjes

16
renderer/Cargo.lock generated Normal file
View File

@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "renderer"
version = "0.1.0"
dependencies = [
"task_queue",
]
[[package]]
name = "task_queue"
version = "0.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc3565d761dd0dfe646e88991f89ea6d16c82268dcfd5d4c284d31a3b37bb63a"

7
renderer/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "renderer"
version = "0.1.0"
edition = "2021"
[dependencies]
task_queue = "0.0.7"

Some files were not shown because too many files have changed in this diff Show More