/* * Copyright (C) 2014 Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */ package edu.stanford.rsl.conrad.phantom; import edu.stanford.rsl.conrad.geometry.shapes.compound.CompoundShape; import edu.stanford.rsl.conrad.geometry.transforms.ScaleRotate; import edu.stanford.rsl.conrad.io.STLFileUtil; import edu.stanford.rsl.conrad.io.SelectionCancelledException; import edu.stanford.rsl.conrad.numerics.SimpleMatrix; import edu.stanford.rsl.conrad.physics.PhysicalObject; import edu.stanford.rsl.conrad.physics.materials.Material; import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB; import edu.stanford.rsl.conrad.utils.CONRAD; import edu.stanford.rsl.conrad.utils.FileUtil; import edu.stanford.rsl.jpop.utils.UserUtil; /** * Class to read a single STL mesh from a file and to load it as phantom. Currently only ASCII format is supported. * @author akmaier * */ public class AsciiSTLMeshPhantom extends AnalyticPhantom { protected int debug = 1; /** * */ private static final long serialVersionUID = -7401895160541333397L; String filenameString = null; @Override public String getBibtexCitation() { return CONRAD.CONRADBibtex; } @Override public String getMedlineCitation() { return CONRAD.CONRADMedline; } @Override public String getName() { if (filenameString == null){ return "ASCII STL Mesh Phantom"; } else { return "ASCII STL Mesh Phantom " + filenameString; } } @Override public void configure() { int meshes = 0; try { while(true) { // Only an exception breaks the loop // select file filenameString = FileUtil.myFileChoose(".stl", false); // read mesh from file CompoundShape mesh = STLFileUtil.readSTLMesh(filenameString); // select material Object materialString = UserUtil.chooseObject("Please select a material: ", "Material Selection", MaterialsDB.getMaterials(), "water"); Material material = MaterialsDB.getMaterial(materialString.toString()); // determine scaling double scaling = UserUtil.queryDouble("Enter scaling:", 1); // apply scaling mesh.applyTransform(new ScaleRotate(SimpleMatrix.I_3.multipliedBy(scaling))); // wrap information to a physical object PhysicalObject po = new PhysicalObject(); po.setMaterial(material); po.setNameString(filenameString); po.setShape(mesh); // add object to scene add(po); meshes++; } } catch (SelectionCancelledException e) { // User clicked on "cancel" // Do not print stack trace if (debug > 0 && 0 == meshes) { System.err.println("No STL files have been selected"); } } catch (Exception e) { e.printStackTrace(); } } }