# Convert ball-stick model to STL from the command line

I regularly have 3D models that consist of a Boolean union of balls and cylinders (molecule models, star maps, mathematical designs), that I then want to convert to a STL model for printing at Shapeways. But I don't know how to easily do that! I already have the model as a series of floating point numbers (four for each ball, and seven for each cylinder), so I don't want to have to go into a graphical interface to click/drag points. Instead I want to convert my lists of floating point numbers to STL from the command line.

I thought this would be a trivial thing, but I cannot find what is the best tool for this. All I need, I think, is a pointer to what tools are most appropriate (although more detailed help will be appreciated :-)) I thought that "gmsh" might be good for this, but it is not immediately clear to me how to use it for that.

I would like the software for this to be "free", in the sense that it does not cost money. Also, I am not a Windows user, so I would like to be able to run this under Linux or macOS.

• Being naive, I asked this on the graphics design stackexchange, and was told to take it here. – Freek Wiedijk Dec 2 '19 at 11:16
• Maybe probably perhaps OpenSCAD could use those points of yours. – towe Dec 2 '19 at 11:47
• That was the answer on the graphics design stackexchange: graphicdesign.stackexchange.com/questions/131653/… – Freek Wiedijk Dec 2 '19 at 14:12
• I appreciate the upvote on the GD SE. If you find it acceptable, please click the check mark on that SE. Kevin Reid provided a good answer here and should also receive an upvote and an acceptance. I see no need to post my previously created answer here, especially as you've linked to it via the comment. – fred_dot_u Dec 2 '19 at 21:05

I would suggest using OpenSCAD for this. OpenSCAD does not natively support reading data files that aren't 3D/2D models or images, but you can write a simple program to generate OpenSCAD code.

I would suggest first writing an OpenSCAD file that implements your chosen type of "ball" and "stick", perhaps like:

module ball(x, y, z) {
translate([x, y, z])
sphere(d=10, $$fn=60); } module stick(x, y, z, length, rx, ry, rz) { translate([x, y, z]) rotate([rx, ry, rz]) cylinder(d=5, length=length,$$fn=60, center=true);
}

Then, take your data file — let's suppose it's a CSV —

ball,0,0,0
ball,100,0,0
stick,50,0,0,100,0,90,0

and convert it into OpenSCAD by adding the appropriate syntax (this could even be done using a basic find-and-replace tool):