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