chiark / gitweb /
quacks-ingredients: wip counts
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 16 Feb 2020 21:04:31 +0000 (21:04 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 16 Feb 2020 21:04:31 +0000 (21:04 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
quacks-ingredients-counts
quacks-ingredients-counts.scad [new file with mode: 0644]
quacks-ingredients-update-levels
quacks-ingredients.scad

index 0affe2efe4eee8892bd45228c0fbaa23c969cd29..870970a9c718d296b1aca93b2a98ac8780ae34b1 100755 (executable)
@@ -1,6 +1,9 @@
 #!/usr/bin/perl -w
 
+use strict;
+
 use Data::Dumper;
+use POSIX;
 
 $_=<DATA>; chomp or die;
 our @names = split /\t/, $_;
@@ -10,12 +13,47 @@ our %count;
 foreach my $nspots (qw(1 2 3 4)) {
     $_=<DATA>; chomp or die;
     my @l = split /\t/, $_;
-    foreach my $i (0..$#names) { $count{$names[$i]}{$nspots} = $l[$i] // 0; }
+    foreach my $i (0..$#names) { $count{$names[$i]}{$nspots} = $l[$i] || 0; }
 }
 
 $_ = Dumper(\%count);
 s{^}{// }mg;
-print or die $!;
+
+our $name;
+
+sub wrtoplevel () {
+    print "module $name(){ ////toplevel\n";
+    my $cs = $count{$name};
+    my $total = 0; $total += $_ foreach values %$cs;
+    my $rowsz = ceil(sqrt($total));
+    my $nrows = ceil($total / $rowsz);
+    my $ix = 0;
+    print "// total=$total, rowsz=$rowsz, nrows=$nrows\n";
+    foreach my $ndots (sort keys %$cs) {
+       my $c = $cs->{$ndots};
+       print <<END;
+  union(){
+    \$ndots = $ndots;
+END
+       while ($c--) {
+           my $xy = sprintf "[ %5.1f, %5.1f ]",
+               $ix / $nrows - 0.5 * $rowsz,
+               $ix % $nrows - 0.5 * $nrows;
+           print "    translate(token_pitch * $xy) Token_L();\n";
+           $ix++;
+       }
+       print <<END;
+  };
+END
+    }
+    print "}\n";
+}
+
+foreach $name (sort keys %count) {
+    wrtoplevel();
+}
+
+STDOUT->error and die $!;
 
 __DATA__
 White  Green   Blue    Red     Yellow  Purple  Black   Orange
diff --git a/quacks-ingredients-counts.scad b/quacks-ingredients-counts.scad
new file mode 100644 (file)
index 0000000..97503e3
--- /dev/null
@@ -0,0 +1,339 @@
+// autogenerated - do not edit
+//  update script is quacks-ingredients-updates-levels
+//  source is quacks-ingredients-counts
+module Black(){ ////toplevel
+// total=18, rowsz=5, nrows=4
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -2.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -2.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -2.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -1.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -1.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -1.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -1.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -0.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -0.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -0.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [   0.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   0.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   0.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [   0.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [   1.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   1.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   1.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [   1.8,  -1.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+  };
+}
+module Blue(){ ////toplevel
+// total=34, rowsz=6, nrows=6
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -3.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -2.8,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -2.7,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -2.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -2.3,   1.0 ]) Token_L();
+    translate(token_pitch * [  -2.2,   2.0 ]) Token_L();
+    translate(token_pitch * [  -2.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -1.8,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -1.7,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -1.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -1.3,   1.0 ]) Token_L();
+    translate(token_pitch * [  -1.2,   2.0 ]) Token_L();
+    translate(token_pitch * [  -1.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -0.8,  -2.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+    translate(token_pitch * [  -0.7,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -0.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -0.3,   1.0 ]) Token_L();
+    translate(token_pitch * [  -0.2,   2.0 ]) Token_L();
+    translate(token_pitch * [   0.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [   0.2,  -2.0 ]) Token_L();
+    translate(token_pitch * [   0.3,  -1.0 ]) Token_L();
+    translate(token_pitch * [   0.5,   0.0 ]) Token_L();
+    translate(token_pitch * [   0.7,   1.0 ]) Token_L();
+    translate(token_pitch * [   0.8,   2.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+    translate(token_pitch * [   1.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [   1.2,  -2.0 ]) Token_L();
+    translate(token_pitch * [   1.3,  -1.0 ]) Token_L();
+    translate(token_pitch * [   1.5,   0.0 ]) Token_L();
+    translate(token_pitch * [   1.7,   1.0 ]) Token_L();
+    translate(token_pitch * [   1.8,   2.0 ]) Token_L();
+    translate(token_pitch * [   2.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [   2.2,  -2.0 ]) Token_L();
+    translate(token_pitch * [   2.3,  -1.0 ]) Token_L();
+    translate(token_pitch * [   2.5,   0.0 ]) Token_L();
+  };
+}
+module Green(){ ////toplevel
+// total=38, rowsz=7, nrows=6
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -3.5,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -3.3,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -3.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -3.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -2.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -2.7,   2.0 ]) Token_L();
+    translate(token_pitch * [  -2.5,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -2.3,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -2.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -2.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -1.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -1.7,   2.0 ]) Token_L();
+    translate(token_pitch * [  -1.5,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -1.3,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -1.2,  -1.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+    translate(token_pitch * [  -1.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -0.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -0.7,   2.0 ]) Token_L();
+    translate(token_pitch * [  -0.5,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -0.3,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -0.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [   0.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   0.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   0.3,   2.0 ]) Token_L();
+    translate(token_pitch * [   0.5,  -3.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+    translate(token_pitch * [   0.7,  -2.0 ]) Token_L();
+    translate(token_pitch * [   0.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [   1.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   1.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   1.3,   2.0 ]) Token_L();
+    translate(token_pitch * [   1.5,  -3.0 ]) Token_L();
+    translate(token_pitch * [   1.7,  -2.0 ]) Token_L();
+    translate(token_pitch * [   1.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [   2.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   2.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   2.3,   2.0 ]) Token_L();
+    translate(token_pitch * [   2.5,  -3.0 ]) Token_L();
+    translate(token_pitch * [   2.7,  -2.0 ]) Token_L();
+  };
+}
+module Orange(){ ////toplevel
+// total=20, rowsz=5, nrows=4
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -2.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -2.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -2.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -1.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -1.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -1.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -1.0,   0.0 ]) Token_L();
+    translate(token_pitch * [  -0.8,   1.0 ]) Token_L();
+    translate(token_pitch * [  -0.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -0.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [   0.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   0.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   0.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [   0.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [   1.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   1.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   1.5,  -2.0 ]) Token_L();
+    translate(token_pitch * [   1.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [   2.0,   0.0 ]) Token_L();
+    translate(token_pitch * [   2.2,   1.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+  };
+}
+module Purple(){ ////toplevel
+// total=15, rowsz=4, nrows=4
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -2.0,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -1.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -1.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -1.2,   1.0 ]) Token_L();
+    translate(token_pitch * [  -1.0,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -0.8,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -0.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -0.2,   1.0 ]) Token_L();
+    translate(token_pitch * [   0.0,  -2.0 ]) Token_L();
+    translate(token_pitch * [   0.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [   0.5,   0.0 ]) Token_L();
+    translate(token_pitch * [   0.8,   1.0 ]) Token_L();
+    translate(token_pitch * [   1.0,  -2.0 ]) Token_L();
+    translate(token_pitch * [   1.2,  -1.0 ]) Token_L();
+    translate(token_pitch * [   1.5,   0.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+  };
+}
+module Red(){ ////toplevel
+// total=30, rowsz=6, nrows=5
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -3.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [  -2.8,  -1.5 ]) Token_L();
+    translate(token_pitch * [  -2.6,  -0.5 ]) Token_L();
+    translate(token_pitch * [  -2.4,   0.5 ]) Token_L();
+    translate(token_pitch * [  -2.2,   1.5 ]) Token_L();
+    translate(token_pitch * [  -2.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [  -1.8,  -1.5 ]) Token_L();
+    translate(token_pitch * [  -1.6,  -0.5 ]) Token_L();
+    translate(token_pitch * [  -1.4,   0.5 ]) Token_L();
+    translate(token_pitch * [  -1.2,   1.5 ]) Token_L();
+    translate(token_pitch * [  -1.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [  -0.8,  -1.5 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+    translate(token_pitch * [  -0.6,  -0.5 ]) Token_L();
+    translate(token_pitch * [  -0.4,   0.5 ]) Token_L();
+    translate(token_pitch * [  -0.2,   1.5 ]) Token_L();
+    translate(token_pitch * [   0.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [   0.2,  -1.5 ]) Token_L();
+    translate(token_pitch * [   0.4,  -0.5 ]) Token_L();
+    translate(token_pitch * [   0.6,   0.5 ]) Token_L();
+    translate(token_pitch * [   0.8,   1.5 ]) Token_L();
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+    translate(token_pitch * [   1.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [   1.2,  -1.5 ]) Token_L();
+    translate(token_pitch * [   1.4,  -0.5 ]) Token_L();
+    translate(token_pitch * [   1.6,   0.5 ]) Token_L();
+    translate(token_pitch * [   1.8,   1.5 ]) Token_L();
+    translate(token_pitch * [   2.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [   2.2,  -1.5 ]) Token_L();
+    translate(token_pitch * [   2.4,  -0.5 ]) Token_L();
+    translate(token_pitch * [   2.6,   0.5 ]) Token_L();
+    translate(token_pitch * [   2.8,   1.5 ]) Token_L();
+  };
+}
+module White(){ ////toplevel
+// total=32, rowsz=6, nrows=6
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -3.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -2.8,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -2.7,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -2.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -2.3,   1.0 ]) Token_L();
+    translate(token_pitch * [  -2.2,   2.0 ]) Token_L();
+    translate(token_pitch * [  -2.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -1.8,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -1.7,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -1.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -1.3,   1.0 ]) Token_L();
+    translate(token_pitch * [  -1.2,   2.0 ]) Token_L();
+    translate(token_pitch * [  -1.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [  -0.8,  -2.0 ]) Token_L();
+    translate(token_pitch * [  -0.7,  -1.0 ]) Token_L();
+    translate(token_pitch * [  -0.5,   0.0 ]) Token_L();
+    translate(token_pitch * [  -0.3,   1.0 ]) Token_L();
+    translate(token_pitch * [  -0.2,   2.0 ]) Token_L();
+    translate(token_pitch * [   0.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [   0.2,  -2.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+    translate(token_pitch * [   0.3,  -1.0 ]) Token_L();
+    translate(token_pitch * [   0.5,   0.0 ]) Token_L();
+    translate(token_pitch * [   0.7,   1.0 ]) Token_L();
+    translate(token_pitch * [   0.8,   2.0 ]) Token_L();
+    translate(token_pitch * [   1.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [   1.2,  -2.0 ]) Token_L();
+    translate(token_pitch * [   1.3,  -1.0 ]) Token_L();
+    translate(token_pitch * [   1.5,   0.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 3;
+    translate(token_pitch * [   1.7,   1.0 ]) Token_L();
+    translate(token_pitch * [   1.8,   2.0 ]) Token_L();
+    translate(token_pitch * [   2.0,  -3.0 ]) Token_L();
+    translate(token_pitch * [   2.2,  -2.0 ]) Token_L();
+  };
+  union(){
+    $ndots = 4;
+  };
+}
+module Yellow(){ ////toplevel
+// total=29, rowsz=6, nrows=5
+  union(){
+    $ndots = 1;
+    translate(token_pitch * [  -3.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [  -2.8,  -1.5 ]) Token_L();
+    translate(token_pitch * [  -2.6,  -0.5 ]) Token_L();
+    translate(token_pitch * [  -2.4,   0.5 ]) Token_L();
+    translate(token_pitch * [  -2.2,   1.5 ]) Token_L();
+    translate(token_pitch * [  -2.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [  -1.8,  -1.5 ]) Token_L();
+    translate(token_pitch * [  -1.6,  -0.5 ]) Token_L();
+    translate(token_pitch * [  -1.4,   0.5 ]) Token_L();
+    translate(token_pitch * [  -1.2,   1.5 ]) Token_L();
+    translate(token_pitch * [  -1.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [  -0.8,  -1.5 ]) Token_L();
+    translate(token_pitch * [  -0.6,  -0.5 ]) Token_L();
+  };
+  union(){
+    $ndots = 2;
+    translate(token_pitch * [  -0.4,   0.5 ]) Token_L();
+    translate(token_pitch * [  -0.2,   1.5 ]) Token_L();
+    translate(token_pitch * [   0.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [   0.2,  -1.5 ]) Token_L();
+    translate(token_pitch * [   0.4,  -0.5 ]) Token_L();
+    translate(token_pitch * [   0.6,   0.5 ]) Token_L();
+  };
+  union(){
+    $ndots = 3;
+  };
+  union(){
+    $ndots = 4;
+    translate(token_pitch * [   0.8,   1.5 ]) Token_L();
+    translate(token_pitch * [   1.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [   1.2,  -1.5 ]) Token_L();
+    translate(token_pitch * [   1.4,  -0.5 ]) Token_L();
+    translate(token_pitch * [   1.6,   0.5 ]) Token_L();
+    translate(token_pitch * [   1.8,   1.5 ]) Token_L();
+    translate(token_pitch * [   2.0,  -2.5 ]) Token_L();
+    translate(token_pitch * [   2.2,  -1.5 ]) Token_L();
+    translate(token_pitch * [   2.4,  -0.5 ]) Token_L();
+    translate(token_pitch * [   2.6,   0.5 ]) Token_L();
+  };
+}
index a4c886c75c985aa1f1e1284f18f36d8a4aae09e3..6ce8c4641a58607e21a8b3532065c7c87f39f52f 100755 (executable)
@@ -12,3 +12,13 @@ include <quacks-ingredients.scad>
 END
        mv -f $f.tmp $f
 done
+
+f=quacks-ingredients-counts.scad
+cat >$f.tmp <<END
+// autogenerated - do not edit
+//  update script is quacks-ingredients-updates-levels
+//  source is quacks-ingredients-counts
+END
+
+./quacks-ingredients-counts >>$f.tmp
+mv -f $f.tmp $f
index 33ba5fb4b28b6b8e7506998793bc4393ccee10df..57bc7a5e9d5744d523f600080c16c59a1f233e66 100644 (file)
@@ -124,4 +124,7 @@ module Tests_L() { ////toplevel
   Tests() Token_L();
 }
 
+//// toplevels-from:
+include <quacks-ingredients-counts.scad>
+
 //Demo();