3D design software
I know nothing about design but I often design make my own research equipment. I have been preparing to expand my experimental possibilities by using 3D printing:
- Make my experiments more reliable (quality of construction)
- Increase experimental throughput (replication)
- Share designs for my equipment so others can use and improve (open source / open access)
Parametric design made with OpenSCAD
I found that OpenSCAD has great potential as a tool for designing objects for research.
Selecting a suitable 3D design program turned out to be harder than I expected because the main candidates I identified after discussions with designers turned out to have restrictive and expensive research licensing. This pretty much excluded the major commercial 3D softwares from further consideration:
- Cost to our project (research based on proprietary software should use appropriately licensed product)
- Cost to other researchers (any researcher wanting to take our design and alter it in any way will also need an appropriately licensed product)
I found a solution in the book Open Source Lab by Joshua Pearce: OpenSCAD:
- GPL2 license
- Simple human-readable script files describe the design (easy to share and work collaboratively)
- Easy to make parametric designs (adaptable designs configurable in key dimensions)
- Can read some common file formats (possibly negating problem 2 above)
I found the program very easy to use and was able to draw my earlier microcosm design from scratch within about an hour, and then a bit more work to make the design parametric.
Only the height parameter was changed to make the 2 images shown above. The design adjusts the height of the main cylinder and the position of pipe holes in the side, but the flange thickness is not changed.
Here is the code used to make the design shown in the image:
chamber_internal_radius=10;
chamber_height=25;
chamber_wall_thickness=2;
tripod_offset=45;
chamber_external_radius=chamber_internal_radius+chamber_wall_thickness;
flange_radius=chamber_external_radius+4;
flange_hole_distance = (flange_radius – chamber_external_radius)/2;
fn_resolution=100; //quality vs render time
module screw_holes(n_holes=4, radius=flange_radius-flange_hole_distance) {
for ( i = [0 : n_holes] ){
rotate( [0, 0, i * (360/n_holes)]) {
translate([radius,0,-2]) cylinder(h=5, r1=1, r2=1, $fn=fn_resolution);
} } }
module flange(thick=1,hole=0,n_screw_holes=0,radius=flange_radius) {
difference(){
difference(){
cylinder(h=thick, r1=radius, r2=radius, $fn=fn_resolution);
translate([0,0,-thick]) cylinder(h=thick*3, r1=hole, r2=hole, $fn=fn_resolution);
}
screw_holes(n_screw_holes);
} }
module chamber_in_out_holes() {
offset=20;
h_in=chamber_height/-4;
h_out=3*chamber_height/-4;
rotate([0,90,offset]){
translate([h_in,0,10]) {
cylinder(h=chamber_external_radius,r1=1, r2=1, $fn=fn_resolution);
} }
rotate([0,90,offset+90]){
translate([h_out,0,10]) {
cylinder(h=chamber_external_radius,r1=1, r2=1, $fn=fn_resolution);
} } }
module tripod() {
difference() {
for ( i = [0 : 3] ){
rotate( [0, 0, tripod_offset + (i * 120)]) {
translate([flange_radius,0,0]) cylinder(h=1, r1=5, r2=5, $fn=fn_resolution);
} }
translate([0,0,-0.5]) flange(thick=2);
} }
module tripod_holes() {
for ( i = [0 : 3] ){
rotate( [0, 0, tripod_offset + (i * 120)]) {
translate([flange_radius+2,0,0]) {
translate([0,0,-2]) cylinder(h=5, r1=1, r2=1, $fn=fn_resolution);
} } } }
module shell() {
tripod();
flange(n_screw_holes=4);
translate([0, 0, chamber_height]) flange(n_screw_holes=4);
cylinder(h=chamber_height, r1=chamber_external_radius,
r2=chamber_external_radius, $fn=fn_resolution);
}
module chamber() {
difference(){
shell();
translate([0,0,-2]){
cylinder(h=chamber_height+10, r1=chamber_internal_radius,
r2=chamber_internal_radius, $fn=fn_resolution);
} } }
/// Draw the object using functions defined above
// 1. Chamber with holes for air pipes
difference() {
difference() {
chamber();
chamber_in_out_holes();
}
tripod_holes();
}
// 2. transparent top
translate([0, 0, chamber_height+10]) %flange(thick=0.1,hole=0,n_screw_holes=4);
// 3. Clamp to screw down onto transparent top
translate([0, 0, chamber_height+20]) flange(hole=chamber_internal_radius,n_screw_holes=4);
// 4. Clamp for bottom to hold sample on.
translate([0, 0, -10]) flange(hole=chamber_internal_radius,n_screw_holes=4);