package edu.stanford.rsl.conrad.phantom;
import java.io.BufferedWriter;
import java.io.FileWriter;
import edu.stanford.rsl.conrad.calibration.CalibrationBead;
public abstract class AbstractCalibrationPhantom extends AnalyticPhantom {
/**
*
*/
private static final long serialVersionUID = -9152956524639810711L;
/**
* cylinder radius
*/
protected double cylRadius = 41.;
/**
* cylinder height
*/
protected double cylHeight = 40.;
/**
* bead radius
*/
protected double beadRadius = 1.5875;
/**
* bead material
*/
protected String matBead = "PWO";
/**
* cylinder material
*/
protected String matCyl = "Plexiglass";
/**
* number of beads
*/
protected int numberOfBeads = 12;
/**
* containing x coordinates
*/
protected double[] beadX;
/**
* containing y coordinates
*/
protected double[] beadY;
/**
* containing z coordinates
*/
protected double[] beadZ;
/**
* method to set 3D coordinates of a CalibrationBead
* @param bead
* @param id
* @see CalibrationBead
*/
public void setBeadCoordinates(CalibrationBead bead, int id) {
bead.setX(beadX[id]);
bead.setY(beadY[id]);
bead.setZ(beadZ[id]);
}
public double getX(int id) {
return beadX[id];
}
public double getY(int id) {
return beadY[id];
}
public double getZ(int id) {
return beadZ[id];
}
public int getNumberOfBeads() {
return numberOfBeads;
}
/**
* method to export the geometry to .scad. Can be further processed to .stl and 3D printed.
*/
public void writeToOpenSCAD() {
try {
configure();
String name = getName().concat(".scad");
BufferedWriter out = new BufferedWriter(new FileWriter(name));
System.out.println("Initiate writing...");
out.write("beadX = [");
for (int i = 0; i < numberOfBeads - 1; i++) {
out.write(beadX[i] + ", ");
}
out.write(beadX[numberOfBeads - 1] + "];\n\n");
out.write("beadY = [");
for (int i = 0; i < numberOfBeads - 1; i++) {
out.write(beadY[i] + ", ");
}
out.write(beadY[numberOfBeads - 1] + "];\n\n");
out.write("beadZ = [");
for (int i = 0; i < numberOfBeads - 1; i++) {
out.write(beadZ[i] + ", ");
}
out.write(beadZ[numberOfBeads - 1] + "];\n\n");
out.write("numberOfBeads = " + numberOfBeads + ";\n\n");
out.write("difference() {\n\n");
out.write("cylinder(h = " + cylHeight + " , r = " + cylRadius
+ " , $fa=1, $fs=0.1, center = true);\n");
out.write("cylinder(h = " + (cylHeight + 1) + " , r = " + 0.8
* cylRadius + " , $fa=1, $fs=0.1, center = true);\n");
out.write("for (i = [0 : 1 : numberOfBeads]) { \n translate([beadX[i], beadY[i], beadZ[i]]) sphere(r = "
+ beadRadius + ", $fa=5, $fs=0.1, center = true);\n}\n}");
out.close();
System.out.println("Writing finished...");
} catch (Exception e) {
e.printStackTrace();
}
}
abstract public void init();
}