chiark / gitweb /
fb46feae727a6f45eb83b9ab23f69175006e49aa
[reprap-play.git] / treefoil.scad.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 our $shape = <<'END';
6 xyyZZYYXYxxyzYYZXzzxyXXYXXXZxxxyyXXZyyyzXXzz
7 zxxYYXXZXzzxyXXYZyyzxZZXZZZYzzzxxZZYxxxyZZyy
8 yzzXXZZYZyyzxZZXYxxyzYYZYYYXyyyzzYYXzzzxYYxx
9 END
10
11 sub o { print @_ or die $!; }
12
13 o <<'END';
14 // -*- autogenerated, do not edit -*-
15
16 module Trace() {
17 END
18
19 my @p = qw(0 0 0);
20
21 $"=',';
22
23 while ($shape =~ s/^\s*(\w)//) {
24     my $ix = index('xyz', (lc $1));
25     my $sign = $1 =~ /[A-Z]/ ? +1 : -1;
26     my @q = @p;
27     $q[$ix] += $sign;
28     o "    TraceEdge([@p],[@q]);\n";
29     @p = @q;
30 }
31
32 die @p unless "@p" eq '0,0,0';
33
34 o "}\n\n";
35
36 while (<DATA>) { o $_ }
37
38 __DATA__
39
40 thick = 7;
41 edgeu = 10;
42
43 // calculated
44
45 octa_long = thick;
46 octa_short = octa_long / (1 + sqrt(2));
47
48 module OctaThing() {
49     hull(){
50         for (r = [[0,0,0], [90,0,0], [0,90,0]]) {
51             rotate(r)
52                 cube([ octa_short,octa_short, octa_long ], center=true);
53         }
54     }
55 }
56
57 module TraceEdge(p,q) {
58     hull(){
59         for (x=[p,q]) {
60             translate(x * edgeu)
61                 OctaThing();
62         }
63     }
64 }
65
66 Trace();
67
68