chiark / gitweb /
d158ab2fb815d6870b8c2b2950c19d9c14eab8b8
[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
52 // calculated
53
54 octa_long = thick;
55 octa_short = octa_long / (1 + sqrt(2));
56
57 module OctaThing() {
58     hull(){
59         for (r = [[0,0,0], [90,0,0], [0,90,0]]) {
60             rotate(r)
61                 cube([ octa_short,octa_short, octa_long ], center=true);
62         }
63     }
64 }
65
66 module TraceEdge(p,q) {
67     hull(){
68         for (x=[p,q]) {
69             translate(x * edgeu)
70                 OctaThing();
71         }
72     }
73 }
74
75 rotate([0,0,45])
76   rotate([0,90,0])
77   Trace();
78
79