chiark / gitweb /
air-hockey-puck: wip
[reprap-play.git] / treefoil.scad.pl
1 #!/usr/bin/perl -w
2
3 # Use:
4 #   - support X/Y dist 0.5mm
5
6 use strict;
7
8 our $shape = <<'END';
9 xyyZZYYXYxxyzYYZXzzxyXXYXXXZxxxyyXXZyyyzXXzz
10 zxxYYXXZXzzxyXXYZyyzxZZXZZZYzzzxxZZYxxxyZZyy
11 yzzXXZZYZyyzxZZXYxxyzYYZYYYXyyyzzYYXzzzxYYxx
12 END
13 # simple version (unknotted, [0,1,2]^3):
14 # YxxyzYYZXzzxyXXYZyyzxZZX
15 #
16 # New and less symmetric one that also fits in the 2x2x2 box:
17 # YXXyzzYxYXZZxzyxYzyyZXZx
18 # (email 8.9.2022)
19
20 sub o { print @_ or die $!; }
21
22 o <<'END';
23 // -*- autogenerated, do not edit -*-
24
25 module Trace() {
26 END
27
28 my @p = qw(0 0 0);
29
30 $"=',';
31
32 while ($shape =~ s/^\s*(\w)//) {
33     my $ix = index('xyz', (lc $1));
34     my $sign = $1 =~ /[A-Z]/ ? +1 : -1;
35     my @q = @p;
36     $q[$ix] += $sign;
37     o "    TraceEdge([@p],[@q]);\n";
38     @p = @q;
39 }
40
41 die @p unless "@p" eq '0,0,0';
42
43 o "}\n\n";
44
45 while (<DATA>) { o $_ }
46
47 __DATA__
48
49 thick = 6;
50 edgeu = 10;
51 //edgeu = 15;
52
53 // calculated
54
55 octa_long = thick;
56 octa_short = octa_long / (1 + sqrt(2));
57
58 module OctaThing() {
59     hull(){
60         for (r = [[0,0,0], [90,0,0], [0,90,0]]) {
61             rotate(r)
62                 cube([ octa_short,octa_short, octa_long ], center=true);
63         }
64     }
65 }
66
67 module TraceEdge(p,q) {
68     hull(){
69         for (x=[p,q]) {
70             translate(x * edgeu)
71                 OctaThing();
72         }
73     }
74 }
75
76 rotate([0,0,45])
77   Trace();
78
79