Polymino to OpenSCAD
Alain Brobecker

This command line tools convert a polymino given in a textfile into an object description for OpenSCAD.
I have added a second program to create Polyminoes with grooves and board on which they can fit.
You can download the sources here and binaries for my computer (m$ window$ 10 PC): PolyminoToOpenSCAD.zip

0. Install

Create a directory in which you extract all files from the .zip file. If you have the same machine as me (m$ window$ 10) you're finsihed for this step since you already have the compiled executable PolyminoToOpenSCAD.exe. Otherwise you'll have to compile the PolyminoToOpenSCAD.c file, which also needs the Read2DObjectLib.c file.
If you don't know how to do that maybe it's better to ask a programmer friend or your IT department.

1. Create your polymino in a textfile

Create a textfile PolyminoToOpenSCAD_Input.txt containing the text below. You can modify some parameters, namely the x/y size of a square with PolyminoSquareSize, the z positions with PolyminoZTop and PolyminoZBottom. Those three variables can be integer or decimal numbers.
Last you can modify the look of the polymino with PolyminoType, namely you can have a simple blocky polymino with values 0,1, angular edges with values 2,3 and rounded edges with values 4,5 (see right picture). An important note, if you use even values 1,3,5 for PolyminoType, the generated object description will use a HG (HalfGap) parameter that is used to create a small (half-) gap toward the inner of the piece, so that two pieces will fit better together.
Then you have the desciption of the polymino between the start2d and end2d tags. This description must be given in a rectangular grid containing . and x and must be without holes (normaly the holes will just disappear if you put some into it).
All the text that is outside the start2d and end2d tags and that is not the 3 aforementioned variables is normally ignored, but I've put // here for comments which was not strictly needed.
Two more remarks: pieces with holes (eg a "O") are not supported and the hole will simply disappear, but pieces made of multiple disconnected polyominoes (eg an "i") are supported.

PolyminoSquareSize=10 //In millimeter
PolyminoZTop=10       //In millimeter
PolyminoZBottom=0     //In millimeter
//  0,1: polymino
//  2,3: polymino with angular edges
//  4,5: ! polymino with rounded edges on top and mess on bottom
//  6,7: polymino with rounded edges everywhere
//  8,9: ! polymino with rounded edges on bottom and mess on top
PolyminoType=3

--------- start2d .=0 x=1
..x..
x.x.x
xxxxx
.xxx.
xx.xx
--------- end2d
       

2. Execute the program

If you click on PolyGo.bat on a m$ window$ 10 machine, it will execute the program on the PolyminoToOpenSCAD_Input.txt file and output a file called PolyminoToOpenSCAD_Output.scad that you can load in OpenSCAD by double clicking on it.

Alternatively you can launch the m$do$ prompt (or the command line of your OS) and invoke the program with PolyminoToOpenSCAD.exe InFile.txt OutFile.scad

3. Resulting file

When you double click on PolyminoToOpenSCAD_Output.scad or copy/paste it from your favorite editor into OpenSCAD, you'll see a text file and after rendering (F5) it will normally look like the picture below.
Depending on the PolyminoType chosen, you'll see some parameters that you can change in OpenSCAD:

Below is a view of the PolyminoToOpenSCAD_Output.scad when PolyminoType was changed to 7. Some statistics are in comments at the end of the file.

ER=1;
$fn=40;
HG=0.05;
//PolyminoType=7
//PolyminoSquareSize=10
//PolyminoZTop=10
//PolyminoZBottom=0
polyhedron(
points=[[20+ER+HG,50-ER-HG,0+HG],[20+ER+HG,50-ER-HG,10-HG],[20+HG,50-ER-HG,0+ER+HG],[20+HG,50-ER-HG,10-ER-HG],[20+ER+HG,50-HG,0+ER+HG],[20+ER+HG,50-HG,10-ER-HG],[30-ER-HG,50-ER-HG,0+HG],[30-ER-HG,50-ER-HG,10-HG],[30-ER-HG,50-HG,0+ER+HG],[30-ER-HG,50-HG,10-ER-HG],[30-HG,50-ER-HG,0+ER+HG],[30-HG,50-ER-HG,10-ER-HG],[30-ER-HG,30-ER-HG,0+HG],[30-ER-HG,30-ER-HG,10-HG],[30-HG,30-HG,0+ER+HG],[30-HG,30-HG,10-ER-HG],[40+ER+HG,30-ER-HG,0+HG],[40+ER+HG,30-ER-HG,10-HG],[40+HG,30-HG,0+ER+HG],[40+HG,30-HG,10-ER-HG],[40+ER+HG,40-ER-HG,0+HG],[40+ER+HG,40-ER-HG,10-HG],[40+HG,40-ER-HG,0+ER+HG],[40+HG,40-ER-HG,10-ER-HG],[40+ER+HG,40-HG,0+ER+HG],[40+ER+HG,40-HG,10-ER-HG],[50-ER-HG,40-ER-HG,0+HG],[50-ER-HG,40-ER-HG,10-HG],[50-ER-HG,40-HG,0+ER+HG],[50-ER-HG,40-HG,10-ER-HG],[50-HG,40-ER-HG,0+ER+HG],[50-HG,40-ER-HG,10-ER-HG],[50-ER-HG,20+ER+HG,0+HG],[50-ER-HG,20+ER+HG,10-HG],[50-HG,20+ER+HG,0+ER+HG],[50-HG,20+ER+HG,10-ER-HG],[50-ER-HG,20+HG,0+ER+HG],[50-ER-HG,20+HG,10-ER-HG],[40-ER-HG,20+ER+HG,0+HG],[40-ER-HG,20+ER+HG,10-HG],[40-HG,20+HG,0+ER+HG],[40-HG,20+HG,10-ER-HG],[40-ER-HG,10-ER-HG,0+HG],[40-ER-HG,10-ER-HG,10-HG],[40-HG,10-HG,0+ER+HG],[40-HG,10-HG,10-ER-HG],[50-ER-HG,10-ER-HG,0+HG],[50-ER-HG,10-ER-HG,10-HG],[50-ER-HG,10-HG,0+ER+HG],[50-ER-HG,10-HG,10-ER-HG],[50-HG,10-ER-HG,0+ER+HG],[50-HG,10-ER-HG,10-ER-HG],[50-ER-HG,0+ER+HG,0+HG],[50-ER-HG,0+ER+HG,10-HG],[50-HG,0+ER+HG,0+ER+HG],[50-HG,0+ER+HG,10-ER-HG],[50-ER-HG,0+HG,0+ER+HG],[50-ER-HG,0+HG,10-ER-HG],[30+ER+HG,0+ER+HG,0+HG],[30+ER+HG,0+ER+HG,10-HG],[30+ER+HG,0+HG,0+ER+HG],[30+ER+HG,0+HG,10-ER-HG],[30+HG,0+ER+HG,0+ER+HG],[30+HG,0+ER+HG,10-ER-HG],[30+ER+HG,10+ER+HG,0+HG],[30+ER+HG,10+ER+HG,10-HG],[30+HG,10+HG,0+ER+HG],[30+HG,10+HG,10-ER-HG],[20-ER-HG,10+ER+HG,0+HG],[20-ER-HG,10+ER+HG,10-HG],[20-HG,10+HG,0+ER+HG],[20-HG,10+HG,10-ER-HG],[20-ER-HG,0+ER+HG,0+HG],[20-ER-HG,0+ER+HG,10-HG],[20-HG,0+ER+HG,0+ER+HG],[20-HG,0+ER+HG,10-ER-HG],[20-ER-HG,0+HG,0+ER+HG],[20-ER-HG,0+HG,10-ER-HG],[0+ER+HG,0+ER+HG,0+HG],[0+ER+HG,0+ER+HG,10-HG],[0+ER+HG,0+HG,0+ER+HG],[0+ER+HG,0+HG,10-ER-HG],[0+HG,0+ER+HG,0+ER+HG],[0+HG,0+ER+HG,10-ER-HG],[0+ER+HG,10-ER-HG,0+HG],[0+ER+HG,10-ER-HG,10-HG],[0+HG,10-ER-HG,0+ER+HG],[0+HG,10-ER-HG,10-ER-HG],[0+ER+HG,10-HG,0+ER+HG],[0+ER+HG,10-HG,10-ER-HG],[10+ER+HG,10-ER-HG,0+HG],[10+ER+HG,10-ER-HG,10-HG],[10+HG,10-HG,0+ER+HG],[10+HG,10-HG,10-ER-HG],[10+ER+HG,20+ER+HG,0+HG],[10+ER+HG,20+ER+HG,10-HG],[10+HG,20+HG,0+ER+HG],[10+HG,20+HG,10-ER-HG],[0+ER+HG,20+ER+HG,0+HG],[0+ER+HG,20+ER+HG,10-HG],[0+ER+HG,20+HG,0+ER+HG],[0+ER+HG,20+HG,10-ER-HG],[0+HG,20+ER+HG,0+ER+HG],[0+HG,20+ER+HG,10-ER-HG],[0+ER+HG,40-ER-HG,0+HG],[0+ER+HG,40-ER-HG,10-HG],[0+HG,40-ER-HG,0+ER+HG],[0+HG,40-ER-HG,10-ER-HG],[0+ER+HG,40-HG,0+ER+HG],[0+ER+HG,40-HG,10-ER-HG],[10-ER-HG,40-ER-HG,0+HG],[10-ER-HG,40-ER-HG,10-HG],[10-ER-HG,40-HG,0+ER+HG],[10-ER-HG,40-HG,10-ER-HG],[10-HG,40-ER-HG,0+ER+HG],[10-HG,40-ER-HG,10-ER-HG],[10-ER-HG,30-ER-HG,0+HG],[10-ER-HG,30-ER-HG,10-HG],[10-HG,30-HG,0+ER+HG],[10-HG,30-HG,10-ER-HG],[20+ER+HG,30-ER-HG,0+HG],[20+ER+HG,30-ER-HG,10-HG],[20+HG,30-HG,0+ER+HG],[20+HG,30-HG,10-ER-HG]],
faces=[[120,116,110,104,98,94,90,84,78,72,68,64,58,52,46,42,38,32,26,20,16,12,6,0],[1,7,13,17,21,27,33,39,43,47,53,59,65,69,73,79,85,91,95,99,105,111,117,121],[4,2,0],[1,3,5],[2,4,5,3],[10,8,6],[7,9,11],[8,10,11,9],[24,22,20],[21,23,25],[22,24,25,23],[30,28,26],[27,29,31],[28,30,31,29],[36,34,32],[33,35,37],[34,36,37,35],[50,48,46],[47,49,51],[48,50,51,49],[56,54,52],[53,55,57],[54,56,57,55],[62,60,58],[59,61,63],[60,62,63,61],[76,74,72],[73,75,77],[74,76,77,75],[82,80,78],[79,81,83],[80,82,83,81],[88,86,84],[85,87,89],[86,88,89,87],[102,100,98],[99,101,103],[100,102,103,101],[108,106,104],[105,107,109],[106,108,109,107],[114,112,110],[111,113,115],[112,114,115,113],[0,6,8,4],[5,9,7,1],[4,8,9,5],[6,12,14,10],[11,15,13,7],[10,14,15,11],[12,16,18,14],[15,19,17,13],[14,18,19,15],[16,20,22,18],[19,23,21,17],[18,22,23,19],[20,26,28,24],[25,29,27,21],[24,28,29,25],[26,32,34,30],[31,35,33,27],[30,34,35,31],[32,38,40,36],[37,41,39,33],[36,40,41,37],[38,42,44,40],[41,45,43,39],[40,44,45,41],[42,46,48,44],[45,49,47,43],[44,48,49,45],[46,52,54,50],[51,55,53,47],[50,54,55,51],[52,58,60,56],[57,61,59,53],[56,60,61,57],[58,64,66,62],[63,67,65,59],[62,66,67,63],[64,68,70,66],[67,71,69,65],[66,70,71,67],[68,72,74,70],[71,75,73,69],[70,74,75,71],[72,78,80,76],[77,81,79,73],[76,80,81,77],[78,84,86,82],[83,87,85,79],[82,86,87,83],[84,90,92,88],[89,93,91,85],[88,92,93,89],[90,94,96,92],[93,97,95,91],[92,96,97,93],[94,98,100,96],[97,101,99,95],[96,100,101,97],[98,104,106,102],[103,107,105,99],[102,106,107,103],[104,110,112,108],[109,113,111,105],[108,112,113,109],[110,116,118,114],[115,119,117,111],[114,118,119,115],[116,120,122,118],[119,123,121,117],[118,122,123,119],[120,0,2,122],[123,3,1,121],[122,2,3,123]]);
translate([20+ER+HG,50-ER-HG,0+ER+HG]) sphere(ER); translate([20+ER+HG,50-ER-HG,10-ER-HG]) sphere(ER);
translate([20+ER+HG,50-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([20+ER+HG,50-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(30-20-ER-HG-ER-HG,ER,ER);
translate([20+ER+HG,50-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(30-20-ER-HG-ER-HG,ER,ER);
translate([30-ER-HG,50-ER-HG,0+ER+HG]) sphere(ER); translate([30-ER-HG,50-ER-HG,10-ER-HG]) sphere(ER);
translate([30-ER-HG,50-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([30-ER-HG,30-ER-HG,0+ER+HG]) rotate([-90,0,0]) cylinder(50-30-ER-HG+ER+HG,ER,ER);
translate([30-ER-HG,30-ER-HG,10-ER-HG]) rotate([-90,0,0]) cylinder(50-30-ER-HG+ER+HG,ER,ER);
translate([30-ER-HG,30-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(40-30+ER+HG+ER+HG,ER,ER);
translate([30-ER-HG,30-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(40-30+ER+HG+ER+HG,ER,ER);
translate([40+ER+HG,30-ER-HG,0+ER+HG]) rotate([-90,0,0]) cylinder(40-30+ER+HG-ER-HG,ER,ER);
translate([40+ER+HG,30-ER-HG,10-ER-HG]) rotate([-90,0,0]) cylinder(40-30+ER+HG-ER-HG,ER,ER);
translate([40+ER+HG,40-ER-HG,0+ER+HG]) sphere(ER); translate([40+ER+HG,40-ER-HG,10-ER-HG]) sphere(ER);
translate([40+ER+HG,40-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([40+ER+HG,40-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(50-40-ER-HG-ER-HG,ER,ER);
translate([40+ER+HG,40-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(50-40-ER-HG-ER-HG,ER,ER);
translate([50-ER-HG,40-ER-HG,0+ER+HG]) sphere(ER); translate([50-ER-HG,40-ER-HG,10-ER-HG]) sphere(ER);
translate([50-ER-HG,40-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([50-ER-HG,20+ER+HG,0+ER+HG]) rotate([-90,0,0]) cylinder(40-20-ER-HG-ER-HG,ER,ER);
translate([50-ER-HG,20+ER+HG,10-ER-HG]) rotate([-90,0,0]) cylinder(40-20-ER-HG-ER-HG,ER,ER);
translate([50-ER-HG,20+ER+HG,0+ER+HG]) sphere(ER); translate([50-ER-HG,20+ER+HG,10-ER-HG]) sphere(ER);
translate([50-ER-HG,20+ER+HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([40-ER-HG,20+ER+HG,0+ER+HG]) rotate([0,90,0]) cylinder(50-40-ER-HG+ER+HG,ER,ER);
translate([40-ER-HG,20+ER+HG,10-ER-HG]) rotate([0,90,0]) cylinder(50-40-ER-HG+ER+HG,ER,ER);
translate([40-ER-HG,10-ER-HG,0+ER+HG]) rotate([-90,0,0]) cylinder(20-10+ER+HG+ER+HG,ER,ER);
translate([40-ER-HG,10-ER-HG,10-ER-HG]) rotate([-90,0,0]) cylinder(20-10+ER+HG+ER+HG,ER,ER);
translate([40-ER-HG,10-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(50-40+ER+HG-ER-HG,ER,ER);
translate([40-ER-HG,10-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(50-40+ER+HG-ER-HG,ER,ER);
translate([50-ER-HG,10-ER-HG,0+ER+HG]) sphere(ER); translate([50-ER-HG,10-ER-HG,10-ER-HG]) sphere(ER);
translate([50-ER-HG,10-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([50-ER-HG,0+ER+HG,0+ER+HG]) rotate([-90,0,0]) cylinder(10-0-ER-HG-ER-HG,ER,ER);
translate([50-ER-HG,0+ER+HG,10-ER-HG]) rotate([-90,0,0]) cylinder(10-0-ER-HG-ER-HG,ER,ER);
translate([50-ER-HG,0+ER+HG,0+ER+HG]) sphere(ER); translate([50-ER-HG,0+ER+HG,10-ER-HG]) sphere(ER);
translate([50-ER-HG,0+ER+HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([30+ER+HG,0+ER+HG,0+ER+HG]) rotate([0,90,0]) cylinder(50-30-ER-HG-ER-HG,ER,ER);
translate([30+ER+HG,0+ER+HG,10-ER-HG]) rotate([0,90,0]) cylinder(50-30-ER-HG-ER-HG,ER,ER);
translate([30+ER+HG,0+ER+HG,0+ER+HG]) sphere(ER); translate([30+ER+HG,0+ER+HG,10-ER-HG]) sphere(ER);
translate([30+ER+HG,0+ER+HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([30+ER+HG,0+ER+HG,0+ER+HG]) rotate([-90,0,0]) cylinder(10-0-ER-HG+ER+HG,ER,ER);
translate([30+ER+HG,0+ER+HG,10-ER-HG]) rotate([-90,0,0]) cylinder(10-0-ER-HG+ER+HG,ER,ER);
translate([20-ER-HG,10+ER+HG,0+ER+HG]) rotate([0,90,0]) cylinder(30-20+ER+HG+ER+HG,ER,ER);
translate([20-ER-HG,10+ER+HG,10-ER-HG]) rotate([0,90,0]) cylinder(30-20+ER+HG+ER+HG,ER,ER);
translate([20-ER-HG,0+ER+HG,0+ER+HG]) rotate([-90,0,0]) cylinder(10-0+ER+HG-ER-HG,ER,ER);
translate([20-ER-HG,0+ER+HG,10-ER-HG]) rotate([-90,0,0]) cylinder(10-0+ER+HG-ER-HG,ER,ER);
translate([20-ER-HG,0+ER+HG,0+ER+HG]) sphere(ER); translate([20-ER-HG,0+ER+HG,10-ER-HG]) sphere(ER);
translate([20-ER-HG,0+ER+HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([0+ER+HG,0+ER+HG,0+ER+HG]) rotate([0,90,0]) cylinder(20-0-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,0+ER+HG,10-ER-HG]) rotate([0,90,0]) cylinder(20-0-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,0+ER+HG,0+ER+HG]) sphere(ER); translate([0+ER+HG,0+ER+HG,10-ER-HG]) sphere(ER);
translate([0+ER+HG,0+ER+HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([0+ER+HG,0+ER+HG,0+ER+HG]) rotate([-90,0,0]) cylinder(10-0-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,0+ER+HG,10-ER-HG]) rotate([-90,0,0]) cylinder(10-0-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,10-ER-HG,0+ER+HG]) sphere(ER); translate([0+ER+HG,10-ER-HG,10-ER-HG]) sphere(ER);
translate([0+ER+HG,10-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([0+ER+HG,10-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(10-0-ER-HG+ER+HG,ER,ER);
translate([0+ER+HG,10-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(10-0-ER-HG+ER+HG,ER,ER);
translate([10+ER+HG,10-ER-HG,0+ER+HG]) rotate([-90,0,0]) cylinder(20-10+ER+HG+ER+HG,ER,ER);
translate([10+ER+HG,10-ER-HG,10-ER-HG]) rotate([-90,0,0]) cylinder(20-10+ER+HG+ER+HG,ER,ER);
translate([0+ER+HG,20+ER+HG,0+ER+HG]) rotate([0,90,0]) cylinder(10-0+ER+HG-ER-HG,ER,ER);
translate([0+ER+HG,20+ER+HG,10-ER-HG]) rotate([0,90,0]) cylinder(10-0+ER+HG-ER-HG,ER,ER);
translate([0+ER+HG,20+ER+HG,0+ER+HG]) sphere(ER); translate([0+ER+HG,20+ER+HG,10-ER-HG]) sphere(ER);
translate([0+ER+HG,20+ER+HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([0+ER+HG,20+ER+HG,0+ER+HG]) rotate([-90,0,0]) cylinder(40-20-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,20+ER+HG,10-ER-HG]) rotate([-90,0,0]) cylinder(40-20-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,40-ER-HG,0+ER+HG]) sphere(ER); translate([0+ER+HG,40-ER-HG,10-ER-HG]) sphere(ER);
translate([0+ER+HG,40-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([0+ER+HG,40-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(10-0-ER-HG-ER-HG,ER,ER);
translate([0+ER+HG,40-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(10-0-ER-HG-ER-HG,ER,ER);
translate([10-ER-HG,40-ER-HG,0+ER+HG]) sphere(ER); translate([10-ER-HG,40-ER-HG,10-ER-HG]) sphere(ER);
translate([10-ER-HG,40-ER-HG,0+ER+HG]) cylinder(10-0-2*ER-2*HG,ER,ER);
translate([10-ER-HG,30-ER-HG,0+ER+HG]) rotate([-90,0,0]) cylinder(40-30-ER-HG+ER+HG,ER,ER);
translate([10-ER-HG,30-ER-HG,10-ER-HG]) rotate([-90,0,0]) cylinder(40-30-ER-HG+ER+HG,ER,ER);
translate([10-ER-HG,30-ER-HG,0+ER+HG]) rotate([0,90,0]) cylinder(20-10+ER+HG+ER+HG,ER,ER);
translate([10-ER-HG,30-ER-HG,10-ER-HG]) rotate([0,90,0]) cylinder(20-10+ER+HG+ER+HG,ER,ER);
translate([20+ER+HG,30-ER-HG,0+ER+HG]) rotate([-90,0,0]) cylinder(50-30+ER+HG-ER-HG,ER,ER);
translate([20+ER+HG,30-ER-HG,10-ER-HG]) rotate([-90,0,0]) cylinder(50-30+ER+HG-ER-HG,ER,ER);
//NbSpheres=28
//NbCylinders=48
//NbPoints=124
//NbFaces=116

4. Choosing ER to have an octogon

Also available as EdgeRadiusForARegularOctogon.pdf

5. Creating polyminoes with grooves and board for it
The "TwoSidedPiecesWithGrooves" folder contains two more programs to create rectangular waffle board and polyminoes such as the ones below:

You need to create a text file containing the sizes (for rectangular board and polyminoes) and a text file for the pentamino you want. The sizes were separated because it will be easier if you want to modify them for a whole set of board+polyminoes.

Sizes.txt

HG=0.05; //HalfGap
SIZE=15;
EDGE=3;
IBH=3; //InBetweenHeight
TBH=3; //TopBottomHeight
BOARDX=3;
BOARDY=4;
BOARDFLOOR=2;
    
Polymino.txt

--------- start2d .=0 x=1
.xx
xx.
.x.
--------- end2d
Then under the command line prompt you can invocate:
MakeBoardForTwoSidedPolyominoes.exe Sizes.txt >Board.scad to create the board
MakeTwoSidedPolyominoWithGrooves Sizes.txt Polymino.txt >Polymino.scad to create left polymino
MakeTwoSidedPolyominoWithGrooves Sizes.txt Polymino.txt S >Polymino.scad to create right smooth polymino