x is 19.5. That's not going to change. It doesn't matter which object I'm looking at.

19.5 by 19.5 is the space that a keycap and its switch sit in the center of.

I fiddled around with LibreCAD all day today. One of the features I want doesn't exist in this tool (at least according to the tutorials). I can't copy data from one layer of the diagram onto another. It might be possible to work around the limitation by making a block of the object and then adding that block to the new layer, but I'll abstain from that for now. Other free tools may solve the problem too (freecad?) but I haven't decided to try them yet.

Also I couldn't see how to import multiple dxf files into a single file as separate layers.

I tried another printout using what I thought would help me line up the thumb cluster perfectly, but it caused two different keys to rub instead. I was still working from KLE to Swill to CAD but I ended up redrawing the entire diagram in CAD. There is a way to script data entry (at least in some CADs), that might have been a better option, and it's something I'll look into if I need to adjust for the Kerf value later.

In the mean time, I knew that to do the above I'd need a very clean set of coordinates in terms of X measurement (that's X as in 19.5, not x as in the horizontal axis). This took me back to KLE and forcing it to draw each keyboard row as a complete staggered row, instead of treating the keyboard as 26 separate rows all with weird modifiers.

This is the raw code I started with:

More

[{x:2.25},"F2","F3","F4",{x:9},"F9","F10","F11"],

[{y:-0.75,x:5.5},"F5","F6",{x:4.5},"F7","F8"],

[{y:-0.5},"Esc",{x:0.25},"F1",{x:15},"F12",{x:0.25},"Print\n\n\n\n\n\nScreen"],

[{y:-0.5,x:3.5},"#\n3",{x:10.5},"*\n8"],

[{y:-0.75,x:2.5},"@\n2",{x:12.5},"(\n9"],

[{y:-0.75,x:4.5},"$\n4",{x:8.5},"&\n7"],

[{y:-0.75,x:5.5},"%\n5","^\n6",{x:4.5},"_\n-","^\n6"],

[{y:-0.75,w:1.5},"~\n`","!\n1",{x:1},"F\n\n\n\nUp",{x:10.5},"U\n8\n\n\nUp",{x:1},")\n0",{w:1.5},"+\n="],

[{y:-0.75,x:2.5},"W",{x:12.5},"Y\n9\n\n\nPgUp"],

[{y:-0.75,x:4.5},"P",{x:8.5},"L\n7\n\n\nHome"],

[{y:-0.75,x:5.5},"G",{h:1.5},"L+1",{x:4.5,h:1.5},"BkSpc","J"],

[{y:-0.75,w:1.5},"Tab","Q",{x:1},"S\n\n\n\nDn",{x:10.5},"E\n5\n\n\nDn",{x:1},":\n;",{w:1.5},"|\n\\"],

[{y:-0.75,x:2.5},"R\n\n\n\nLf",{x:12.5},"I\n6\n\n\nRt"],

[{y:-0.75,x:4.5},"T\n\n\n\nRt",{x:8.5},"N\n4\n\n\nLf"],

[{y:-0.75,x:5.5},"D",{x:6.5},"H\n0\n\n\nHome"],

[{y:-0.75,w:1.5},"Caps","A",{x:1},"C",{x:10.5},"<\n2\n\n\n\n\n,",{x:1},"O\n\n\n\nEnd",{w:1.5},"\"\n'"],

[{y:-0.75,x:2.5},"X",{x:3,h:1.5},"Enter",{x:4.5,h:1.5},"Del",{x:3},">\n3\n\n\nPgDn\n\n."],

[{y:-0.75,x:4.5},"V",{x:8.5},"M\n1\n\n\nEnd"],

[{y:-0.75,x:5.5},"B",{x:6.5},"K"],

[{y:-0.75,w:1.5},"L Shift","Z",{x:1},"L Alt",{x:10.5},"R Alt",{x:1},"?\n/",{w:1.5},"R Shift"],

[{y:-0.75,x:2.5},"\nFn 2",{x:12.5},"Menu"],

[{y:-0.75,x:4.5},"\nFn",{x:8.5},"\nFn"],

[{y:-0.5,w:1.5},"L Ctrl","Win",{x:14.5},"Win",{w:1.5},"R Ctrl"],

[{r:30,rx:6.125,ry:4.25,y:1,x:1.75},"","Ctrl\n\n\n\n\n\nF4"],

[{x:0.75,h:2},"BSpc",{h:2},"Del","{\n["],

[{x:2.75},"}\n]"],

[{r:-30,rx:13.35,y:1,x:-3.75},"Alt\n\n\n\n\n\nF4","Scroll/n/n/n/n/n/nLock"],

[{x:-3.75},"Insert",{h:2},"Insert",{h:2},"Enter"],

[{x:-3.75},""]

I've now cleaned that up to fit in 6 rows +3 for thumbs:

More

[{y:0.75},"Esc",{x:0.25},"F1",{y:-0.75},"F2","F3","F4",{x:0.25,y:0.25},"F5","F6",{y:-0.25}],

[{y:1.25,w:1.5},"~\n`","!\n1",{y:-0.75},"@\n2",{y:-0.25},"#\n3",{y:0.5},"$\n4",{y:0.25},"%\n5","^\n6",{y:0.25}],

[{w:1.5},"Tab","Q",{y:-0.75},"W",{y:-0.25},"F\n\n\n\nUp",{y:0.5},"P",{y:0.25},"G",{h:1.5},"L+1",{y:0.25}],

[{w:1.5},"Caps","A",{y:-0.75},"R\n\n\n\nLf",{y:-0.25},"S\n\n\n\nDn",{y:0.5},"T\n\n\n\nRt",{y:0.25},"D",{h:1.5,y:0.5},"Enter",{y:-0.25}],

[{w:1.5},"L Shift","Z",{y:-0.75},"X",{y:-0.25},"C",{y:0.5},"V",{y:0.25},"B",{y:0.25}],

[{w:1.5},"L Ctrl","Win",{y:-0.75},"\nFn 2",{y:-0.25},"L Alt",{y:0.5},"\nFn",{y:0.25}],

[{r:30,rx:7.125,ry:6},"","Ctrl\n\n\n\n\n\nF4"],

[{x:-1,h:2},"BSpc",{h:2},"Del","{\n["],

[{x:1},"}\n]"]

And that might make more sense to readers without the key labels in it:

More

[{y:0.75},"",{x:0.25},"",{y:-0.75},"","","",{x:0.25,y:0.25},"","",{y:-0.25}],

[{y:1.25,w:1.5},"`","",{y:-0.75},"",{y:-0.25},"",{y:0.5},"",{y:0.25},"","",{y:0.25}],

[{w:1.5},"","",{y:-0.75},"",{y:-0.25},"",{y:0.5},"",{y:0.25},"",{h:1.5},"",{y:0.25}],

[{w:1.5},"","",{y:-0.75},"",{y:-0.25},"",{y:0.5},"",{y:0.25},"",{h:1.5,y:0.5},"",{y:-0.25}],

[{w:1.5},"","",{y:-0.75},"",{y:-0.25},"",{y:0.5},"",{y:0.25},"",{y:0.25}],

[{w:1.5},"","",{y:-0.75},"",{y:-0.25},"",{y:0.5},"",{y:0.25}],

[{r:30,rx:7.125,ry:6},"",""],

[{x:-1,h:2},"",{h:2},"",""],

[{x:1},""]

The reason that I put in that effort is that I could then take those 6+3 rows, chuck them into Excel and split them out into X and Y coordinates for each key. Trying to do that with 26 separate 'rows' was melting my brain. Also, in this process I've managed to fix the thumb clusters to only use rx and ry instead of also using x and y for placement of the 1st key. As far as I can tell, rx and ry are 'rotated block start point', which can be thought of as 'absolute point' rather than being relative to the previous row.

That gave me an idea. One of the things that makes the translation confusing is the 'next row' numbers are assumed automatically by KLE and I was having to put them back in manually in excel. If I use absolute references for each row, that won't be a problem. However, before I went down that path, I tested how they work in the builder. I chucked my simplified row code into Swill's tool and it came out in straight rows instead of being staggered. This might explain some odd behaviour I'd seen previously. I think his tool is only looking for x and y values at the start of the line, then ignoring all remaining changes - because it is expecting row stagger, not column stagger. I know he's rebuilding the tool at present, so hopefully that will be fixed/improved in time to others from having to repeat my manual efforts.

On the plus side, I no longer feel that I'm relying upon his tool to do the whole drawing task for me. I have at least some of the necessary skills now. That could come in handy later on down the line when I consider PCBs. In fact the only thing I'm uncomfortable with CADwise at this point is allowing for the kerf value.

The next point of confusion was that KLE uses Y upside down. Positive numbers move down the page and negative numbers go up. I therefore needed to flip the numbers around to save myself some confusion and to stick to the positive quadrant of the grid in CAD.

Here's the result:

The thumb keys fit now - Going to the trouble of drawing it all out in CAD meant that I could move the thumb section with the outlines of keys visible. Actually I used sqaures of 19.5 to do this bit, virtually the same thing anyway. Once I finished the drawing and fixed errors I printed and tested the key placement again. All good. In fact I could potentially bring the thumb keys another mm in, but I'll skip that for now. The flaw with this placement is that there doesn't appear to be enough material left in the triangular gap between certain keys to make the cut without it snapping the top layer during the cutting process. If I'm right I'll deliberately shift the cuts a bit and have that middle piece as something I can glue in after assembly. Otherwise there'll just be a hole there to catch dirt etc.