Hi,
I made a tool that takes a board's gerber files to semi-automatically generate a 3D-printable model and a KiCAD PCB template for a pogo pin test fixture. You can download a Makefile project template from
github or use the online version at
pogojig.jaseg.net.
The tool works by first exporting the gerbers into an
Inkscape SVG template for you to manually draw pogo pin locations and test fixture cutouts into. From that SVG the tool then generates a 3D model for the PCB holder with holes and indents in all the right places, and a KiCAD PCB with the outline for a backing PCB going below the plastic PCB holder with pads for soldering the pogo pins already in the right locations. You can directly print the 3D model, and you could either directly have the KiCAD PCB manufactured if you just want to solder wires directly to the pogo pins and use the backing PCB only as a mechanical mount, or you could add your own connectors and traces to the backing PCB. I've attached a render of a generated plastic jig and PCB to this post.
Since the intermediate step is just an
Inkscape SVG there is also an
empty template if you want to start with something other than gerbers such as a screenshot from your PCB tool or even a scan or photo of a physical PCB. In that case you just have to make sure everything is to scale and there is no distortion.
Do you think you might use pogo pin test fixtures even as a hobbyist now that this mostly automated tool is available?
I'd love to hear your thoughts and comments and I'm open to suggestions.
Not having any luck with it unfortunately. Trying to load a gerber file just gives an endless loading screen (even after leaving it for an hour) and the SVG page gives an unspecified file error after accepting the upload. I'm relatively inexperienced with this type of stuff though.
Created the files with Ultiboard, exported as Gerber RS-274X and SVG.
Cheers for creating this nonetheless. Does it store any uploaded files once its finished processing?
Thanks for your report.
The gerber-to-SVG tool at
https://pogojig.jaseg.net/static/pogospace/index.html works fine for me. Is your browser maybe blocking Javascript? You can check the browser console for error messages from the gerber renderer itself.
The issue with your SVG upload seems to be that the renderer was unable to find board outline and pogo pin objects. If you can't get it to work feel free to email me the gerbers or SVG and I can try to reproduce your issue. DM me for my email.
As for storing files, the gerbers and SVG are not even uploaded to the server since the rendering is done 100% client-side in JavaScript. They are stored in your browser's site data though, so you can still see your past uploads the next time you open the site. If you upload an SVG file that is stored until an error occurs or processing is finished. The generated downloads (renders and 3D files) are stored for up to I think 48 hours, and are then automatically deleted. They are tied to your session, so nobody else can see them.
The system is keeping error logs for debugging, but those don't contain any identifiable information. Here's the processing log from yesterday's uploads:
-- Logs begin at Sat 2019-06-01 01:02:26 UTC. --
Nov 09 23:50:55 wendelstein.jaseg.net python3[125951]: INFO:root:Processing render job 15 session 4038a26b-2c1b-49ce-8624-40c520b354b9 from ###.###.###.### submitted 2019-11-09 23:50:54
Nov 09 23:50:55 wendelstein.jaseg.net sudo[247631]: root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 4038a26b-2c1b-49ce-8624-40c520b354b9
Nov 09 23:50:55 wendelstein.jaseg.net sudo[247631]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 09 23:50:55 wendelstein.jaseg.net python3[125951]: Spawning container pogojig-b967afd906c03c86 on /var/lib/machines/pogojig/.#machine.1c7b569fd9e51a23.
Nov 09 23:50:55 wendelstein.jaseg.net python3[125951]: Press ^] three times within 1s to kill container.
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Sat Nov 9 23:50:56 UTC 2019
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Cleaning up previous output
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Sat Nov 9 23:50:56 UTC 2019
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Rendering
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: make: Entering directory '/mnt/sources'
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: support/inkscape_svg_filter_layers.py input.svg src/input.preprocessed.svg --only --name "Test Points" "Mounting Holes" "Grip Slots" "Outline"
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxf
Nov 09 23:51:01 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:51:01.901: Attempting to store changes into `/root/.local/share/recently-used.xbel', but failed: Failed to create file ?/root/.local/share/recently-used.xbel.J914A0?: No such file or directory
Nov 09 23:51:01 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:51:01.902: Attempting to set the permissions of `/root/.local/share/recently-used.xbel', but failed: No such file or directory
Nov 09 23:51:02 wendelstein.jaseg.net python3[125951]: mkdir -p out
Nov 09 23:51:02 wendelstein.jaseg.net python3[125951]: openscad -o out/jig.stl src/jig.scad
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: group(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){group(){multmatrix([[1,0,0,0],[0 (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,1 (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){linear_extrude(height=15,ce (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){linear_extrude (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){linear_extrude(height=9.2,center (53272 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,- (53272 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache hit: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: Current top level object is empty.
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: make: *** [Makefile:21: out/jig.stl] Error 1
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: make: Leaving directory '/mnt/sources'
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: Container pogojig-b967afd906c03c86 failed with error code 2.
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: INFO:root:Finishied processing render job 15
Nov 09 23:51:16 wendelstein.jaseg.net python3[125951]: INFO:root:Processing render job 16 session 4038a26b-2c1b-49ce-8624-40c520b354b9 from ###.###.###.### submitted 2019-11-09 23:51:16
Nov 09 23:51:16 wendelstein.jaseg.net sudo[247657]: root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 4038a26b-2c1b-49ce-8624-40c520b354b9
Nov 09 23:51:16 wendelstein.jaseg.net sudo[247657]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 09 23:51:16 wendelstein.jaseg.net python3[125951]: Spawning container pogojig-a0b04b967942a28b on /var/lib/machines/pogojig/.#machine.749dbbb866706ff3.
Nov 09 23:51:16 wendelstein.jaseg.net python3[125951]: Press ^] three times within 1s to kill container.
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Sat Nov 9 23:51:17 UTC 2019
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Cleaning up previous output
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Sat Nov 9 23:51:17 UTC 2019
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Rendering
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: make: Entering directory '/mnt/sources'
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: support/inkscape_svg_filter_layers.py input.svg src/input.preprocessed.svg --only --name "Test Points" "Mounting Holes" "Grip Slots" "Outline"
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxf
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: Traceback (most recent call last):
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: File "support/inkscape_exporter.py", line 52, in <module>
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: effect.ExportEffect.check_document_units(args.infile)
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: File "/mnt/sources/support/pogojig/inkscape/effect.py", line 273, in check_document_units
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: 'Height of SVG document is not an absolute measure. See '
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: ValueError: Height of SVG document is not an absolute measure. See https://github.com/Feuermurmel/openscad-template/wiki/Absolute-Measurements
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: make: *** [Makefile:13: src/input.preprocessed.dxf] Error 1
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: make: Leaving directory '/mnt/sources'
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: Container pogojig-a0b04b967942a28b failed with error code 2.
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: INFO:root:Finishied processing render job 16
Nov 09 23:54:06 wendelstein.jaseg.net python3[125951]: INFO:root:Processing render job 17 session 0e9a5b1d-3645-49eb-aa5a-1ddb31d703c3 from ###.###.###.### submitted 2019-11-09 23:54:06
Nov 09 23:54:06 wendelstein.jaseg.net sudo[247680]: root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 0e9a5b1d-3645-49eb-aa5a-1ddb31d703c3
Nov 09 23:54:06 wendelstein.jaseg.net sudo[247680]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 09 23:54:06 wendelstein.jaseg.net python3[125951]: Spawning container pogojig-b3c9160f97499afe on /var/lib/machines/pogojig/.#machine.d2e67dd1f756c03f.
Nov 09 23:54:06 wendelstein.jaseg.net python3[125951]: Press ^] three times within 1s to kill container.
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Sat Nov 9 23:54:07 UTC 2019
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Cleaning up previous output
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Sat Nov 9 23:54:07 UTC 2019
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Rendering
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: make: Entering directory '/mnt/sources'
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: support/inkscape_svg_filter_layers.py input.svg src/input.preprocessed.svg --only --name "Test Points" "Mounting Holes" "Grip Slots" "Outline"
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxf
Nov 09 23:54:11 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:54:11.637: Attempting to store changes into `/root/.local/share/recently-used.xbel', but failed: Failed to create file ?/root/.local/share/recently-used.xbel.P45AB0?: No such file or directory
Nov 09 23:54:11 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:54:11.639: Attempting to set the permissions of `/root/.local/share/recently-used.xbel', but failed: No such file or directory
Nov 09 23:54:12 wendelstein.jaseg.net python3[125951]: mkdir -p out
Nov 09 23:54:12 wendelstein.jaseg.net python3[125951]: openscad -o out/jig.stl src/jig.scad
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: group(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){group(){multmatrix([[1,0,0,0],[0 (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,1 (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){linear_extrude(height=15,ce (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){linear_extrude (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){linear_extrude(height=9.2,center (53272 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,- (53272 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache hit: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: Current top level object is empty.
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: make: *** [Makefile:21: out/jig.stl] Error 1
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: make: Leaving directory '/mnt/sources'
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: Container pogojig-b3c9160f97499afe failed with error code 2.
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: INFO:root:Finishied processing render job 17
I do get "413 Request Entity Too Large" on https://pogojig.jaseg.net/upload/svg when uploading my SVG file (approx 1 MByte in size)
This should be fixed now. Uploads up to 10MB are accepted. If you want to process larger files you can run the script on your own machine
I get it to pass now
I also do get the STL file, but without any holes in it ?
I'm not sure I did everything correct in inkscape (first time I have used it), I moved 3 pads to the "test points" layer, and deleted all layers except the outline and the testpoints (I'm not sure if I'm supposed to do that ?)
In inkscape it looks like this:
From your explanation it sounds like you're doing everything right. You can compare with my test SVG file in the attachment if that helps. If you can't get it to work you can mail me your SVG and I can take a look.
From your explanation it sounds like you're doing everything right. You can compare with my test SVG file in the attachment if that helps. If you can't get it to work you can mail me your SVG and I can take a look.
That worked fine, jig shown below
I'm not sure I see your email address on the website ?
(I sent you a PM with a link to the file on dropbox)
Javascript is enabled in the browser, though its possible some of the other security setup gets in the way. I tried a couple browsers to see.
In chrome the console says
stack-layers.js:52 Uncaught TypeError: Cannot read property 'id' of undefined
at t.exports (stack-layers.js:52)
at index.js:45
at Array.map (<anonymous>)
at t.exports (index.js:44)
at index.js:53
at n (index.js:21)
at r (index.js:18)
at f (index.js:22)
at l (index.js:28)
at index.js:43
In firefox it says
TypeError: b is undefined 2.2860b24d78cee11b8d5e.worker.js:8:23981
exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
x https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
map self-hosted:291
exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
n https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
r https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
f https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
l https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
e https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
d https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
apply self-hosted:2018
o https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:8
<anonymous> self-hosted:1017
apply self-hosted:2018
emit https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:8
I https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
run https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:1
p https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:1
I messaged you about email so I can pass on the board I'm testing out with this. Thanks!