2D, 3D, let’s explore molecular geometry

It should go without saying that I am a fan of incorporating digital fabrication tools into chemistry instruction. A while back, Scott McIndoe and his colleagues published a paper in the Journal of Chemical Education on using laser cut models to teach molecular geometry. At first, it seems counter-intuitive to use a 2D design process to teach 3D topics. On top of that, if you have access to a laser cutter, you probably have access to a 3D printer, so why not just use the 3D printer?

3D printing is great for rapid prototyping; however, when you want to scale up production – say, for example, you want models for a classroom of 100 students – then 3D printing is not a great solution. Laser cutting is one of the fastest, easy-access digital fabrication tools available, and build times can be drastically reduced if a laser-cutter solution is available.

Then again, one needs access to a laser cutter. And that is something I (sadly) do not have at present.

So I took Scott’s design and adapted it to 3D printing. Yes, his paper provides some STLs to print, but if you want to create different sizes, then you have to do some scaling. I wanted a parametric approach, so I resorted to OpenSCAD to recreate his design. The code is below, in case you are interested.

Why would you want to use this? I don’t know, perhaps you want to make super thin molecules or super small molecules. All I know is, now you can.

/*
Origin: @mcindoe
Reference: https://pubs.acs.org/doi/10.1021/acs.jchemed.8b00553
*/

ca_d = 12; // diameter of central atom
ca_g = 5;  // length of the gap in the central atom
oa_d = 10; // diameter of the outer atom
bond_w = 5; // width of the bond
bond_l = 25; // length of the bond
th = 0.2+3*0.35; // piece thickness (my printer is set to 0.2 mm first layer and 0.35 subsequent layers)
allowance = 0.05; // adjust gap size for tighter/looser fit, YMMV
\$fn = 25; // Keeps round parts round

/*
n is the number of bonds (1, 2 or 3).  Setting tet to true will force a 109.5 degree bond angle.  NOTE: you shouldn't call this function, use makepiece
*/
module makebonds(n,tet=false) {
for(i =[1:n]) {
rot = tet?125.25+(i-1)*109.5:i*360/(n+1);
rotate(rot,[0,0,1])
translate([bond_l,0,0])
union(){
circle(d=oa_d);
translate([-bond_l,-bond_w/2,0])square([bond_l,bond_w]);
}
}
}

/*
n is the number of bonds (1-3).  Setting tet to true will force a 109.5 degree bond angle
*/
module makepiece(n,tet=false) {
rot = (tet && (n==1))?70.5:0;
linear_extrude(th)difference(){
union(){
circle(d=ca_d);
makebonds(n,tet);
}
rotate(rot,[0,0,1])translate([ca_d/2-ca_g,-(th+allowance)/2,0])square([ca_g,th+allowance]);
}
}

// Example usage
for(i=[ [-10,-20,0], [10,20,0] ]){
translate(i){
makepiece(3);
translate([40,0,0])makepiece(1);
translate([-40,0,0])makepiece(2);
}
}



Volume measurements on 3D objects

When creating objects for 3D printing, I find I often want to know the volume. In one particular instance, I am making what is called a low pressure drop static mixer and would like to know what volume of a channel is with the mixer installed. Turns out that the problem is easy to solve, so long as you know the right tricks.