package vnt;
import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.measure.*;
import ij.util.Tools;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color.*;
import ij.plugin.filter.*;
import ij.plugin.filter.PlugInFilter;
import java.io.*;
import ij.io.*;
import java.util.*;
import java.text.*;
import java.lang.String.*;
import java.lang.Math.*;
public class Create_Settings extends VascularNetworkToolkit implements PlugInFilter {
private int versionMain = 0;
private int versionSub = 1;
public int setup(String arg, ImagePlus ip) {
if (arg.equals("about")) {
showAbout("Create Settings"," * Creates a settings.txt file in the folder of the active image. The file is used by other VNT plugins. (Copyright 2006. Michael Miller mdm162@truman.edu)");
return DONE; }
boolean processImage = getFileInformation(ip);
if (!processImage) {
IJ.error("Must have a file path. Please save this image to a local folder.");
return DONE; }
return DOES_ALL+NO_CHANGES; }
public void run(ImageProcessor bp){
double measured = distanceInPixels;
double known = distanceInUnits;
double aspectRatio = imageAspectRatio;
int lightingCutoff = lightingCorrectionCutoff;
int lightingOrder = lightingCorrectionPolynomialOrder;
int maxMeshArea = maximumAreaToIgnoreMesh;
String unit = distanceUnitName;
boolean polynomialLightingCorrection = performPolynomialLightingCorrection;
boolean lightingCorrectionEyeCandy = generateLightingCorrectionSurfaceEyeCandy;
boolean eyeCandy = performEyeCandy;
boolean originalImage = generateEyeCandyWithOriginalImage;
boolean highlowSegmentation = useHighLowSegmentation;
boolean tempImageFiles = keepTemporaryImageFiles;
boolean graphTextFiles = keepGraphTextFiles;
boolean debugText = displayDebugText;
boolean animation = animatedDisplay;
boolean advancedSettings = false;
String scale = "<no scale>";
int digits = 2;
if (known > 0) {
scale = IJ.d2s(measured/known,digits)+" pixels/"+unit;
}
if (imageCalibration != null) {
if (imageCalibration.scaled()) {
measured = distanceInPixels;
known = distanceInUnits;
aspectRatio = imageAspectRatio;
unit = distanceUnitName;
scale = IJ.d2s(measured/known,digits)+" pixels/"+unit;
}
}
Roi roi = imp.getRoi();
if (roi!=null && (roi instanceof Line)) {
measured = ((Line)roi).getRawLength();
known = 0.0;
}
SetSettingsDialog introDialog = new SetSettingsDialog("VNT Settings Editor", scale);
introDialog.addMessage("The following settings will be saved in the folder of the active image.");
introDialog.addNumericField("Distance in Pixels:", measured, digits, 8, null);
introDialog.addNumericField("Known Distance:", known, 2, 8, null);
introDialog.addNumericField("Pixel Aspect Ratio:", aspectRatio, 1, 8, null);
introDialog.addStringField("Unit of Length:", unit);
introDialog.addMessage("Scale: "+"12345.789 pixels per centimeter");
introDialog.addCheckbox("Perform Lighting Correction", polynomialLightingCorrection);
introDialog.addCheckbox("Generate Evaluation Image 'Eye Candy'", eyeCandy);
introDialog.addCheckbox("Use High/Low Segmentation? (No means FindEdges Segmentation)", highlowSegmentation);
introDialog.addCheckbox("Keep Temporary Image Files", tempImageFiles);
introDialog.addCheckbox("Keep Graph Text Files", graphTextFiles);
introDialog.addCheckbox("Display Advanced Settings", advancedSettings);
introDialog.showDialog();
if (introDialog.wasCanceled()) {
IJ.error("Cancel detected. No settings will be saved.");
return;
}
measured = introDialog.getNextNumber();
known = introDialog.getNextNumber();
aspectRatio = introDialog.getNextNumber();
unit = introDialog.getNextString();
if (unit.equals("um"))
unit = IJ.micronSymbol+"m";
else if (unit.equals("A"))
unit = ""+IJ.angstromSymbol;
polynomialLightingCorrection = introDialog.getNextBoolean();
eyeCandy = introDialog.getNextBoolean();
highlowSegmentation = introDialog.getNextBoolean();
tempImageFiles = introDialog.getNextBoolean();
graphTextFiles = introDialog.getNextBoolean();
advancedSettings = introDialog.getNextBoolean();
if (measured<=0.0 || known <= 0.0 || unit.startsWith("pixel") || unit.startsWith("Pixel") || unit.equals("")) {
measured = 0.0;
known = 1.0;
aspectRatio = 1.0;
unit = "pixel";
}
if (polynomialLightingCorrection || eyeCandy || advancedSettings || !highlowSegmentation) {
GenericDialog advancedDialog = new GenericDialog("VNT Advanced Settings Editor");
advancedDialog.addMessage("Based on your inputs, there are a few more parameters:");
if (polynomialLightingCorrection) {
advancedDialog.addMessage("Lighting Correction Settings:");
advancedDialog.addNumericField("Lighting Correction Black Pixel Cutoff (-1 will use histogram):", lightingCutoff, 0, 8, null);
advancedDialog.addNumericField("Lighting Correction Polynomial Surface Order:", lightingOrder, 0, 8, null);
}
if (polynomialLightingCorrection && eyeCandy) {
advancedDialog.addMessage("Lighting Correction Eye Candy:");
advancedDialog.addCheckbox("Generate Lighting Correction '3D'PolynomSurface Image 'Eye Candy'", lightingCorrectionEyeCandy);
}
if (eyeCandy) {
advancedDialog.addMessage("Eye Candy Settings:");
advancedDialog.addCheckbox("Add original Image to 'Eye Candy'", originalImage);
}
if (!highlowSegmentation) {
advancedDialog.addMessage("FindEdges Variance Segmentation Settings:");
advancedDialog.addNumericField("Maximum Area to Fill Meshes in Pixels:", maxMeshArea, 0, 8, null);
}
if (advancedSettings) {
advancedDialog.addMessage("The following are 'advanced' features:");
advancedDialog.addCheckbox("Display VNT Java Code Debug Text In Console", debugText);
advancedDialog.addCheckbox("Animate Displays (if on, relatively very slow but very visual!)", animation);
}
advancedDialog.showDialog();
if (advancedDialog.wasCanceled()) {
IJ.error("Cancel detected. No settings will be saved.");
return;
}
if (polynomialLightingCorrection) {
lightingCutoff = (int)advancedDialog.getNextNumber();
lightingOrder = (int)advancedDialog.getNextNumber();
}
if (polynomialLightingCorrection && eyeCandy) {
lightingCorrectionEyeCandy = advancedDialog.getNextBoolean();
}
if (eyeCandy) {
originalImage = advancedDialog.getNextBoolean();
}
if (!highlowSegmentation) {
maxMeshArea = (int)advancedDialog.getNextNumber();
}
if (advancedSettings) {
debugText = advancedDialog.getNextBoolean();
animation = advancedDialog.getNextBoolean();
}
}
Date rightNow = new Date();
DateFormat dfFullDate = DateFormat.getDateInstance(DateFormat.FULL);
DateFormat dfFullTime = DateFormat.getTimeInstance(DateFormat.FULL);
String myDate = dfFullDate.format(rightNow);
String myTime = dfFullTime.format(rightNow);
FileOutputStream out = null; PrintStream p = null; try{
String pathName = directory + "settings.txt";
out = new FileOutputStream(pathName);
p = new PrintStream( out );
p.println("; =====================================");
p.println("; =Vascular Network Toolkit for ImageJ=");
p.println("; = Settings File for Local Directory =");
p.println("; =====================================");
p.println("; * Copyright (C) 2005-2006 - (see VNT's readme.txt for more information)");
p.println("; Package by: Michael Miller, Truman State University");
p.println("; This file was generated by Create_Settings.java v"+versionMain+"."+versionSub+": " + myTime + " on " + myDate + ".");
p.println("; Visit the VNT webpage at: http://www2.truman.edu/~mdm162/vnt/");
p.println("LengthUnitName = " + unit);
p.println("DistanceInPixels = " + measured);
p.println("DistanceInUnits = " + known);
p.println("AspectRatio = " + aspectRatio);
p.print("PerformPolynomialLightingCorrection = ");
if (polynomialLightingCorrection)
p.println("true");
else
p.println("false");
p.println("LightingCorrectionBlackCutoff = " + lightingCutoff);
p.println("LightingCorrectionPolynomialOrder = " + lightingOrder);
p.print("GenerateLightingCorrectionSurfaceEyeCandy = ");
if (lightingCorrectionEyeCandy)
p.println("true");
else
p.println("false");
p.print("GenerateEyeCandy = ");
if (eyeCandy)
p.println("true");
else
p.println("false");
p.print("GenerateEyeCandyWithOriginalImage = ");
if (originalImage)
p.println("true");
else
p.println("false");
p.print("UseHighLowSegmentation = ");
if (highlowSegmentation)
p.println("true");
else
p.println("false");
p.println("MaxMeshAreaIgnore = " + maxMeshArea);
p.print("KeepTemporaryImageFiles = ");
if (tempImageFiles)
p.println("true");
else
p.println("false");
p.print("KeepGraphTextFiles = ");
if (graphTextFiles)
p.println("true");
else
p.println("false");
p.print("DisplayJavaCodeDebugConsoleText = ");
if (debugText)
p.println("true");
else
p.println("false");
p.print("PerformAnimatedRendering = ");
if (animation)
p.println("true");
else
p.println("false");
p.println("");
p.flush();
out.flush();
p.close();
out.close();
} catch (Exception e) {
System.out.println("Create_Settings.java -- Unexpected error writing to file settings.txt");
try {
if (p != null)
p.close();
if (out != null)
out.close();
} catch (Exception error) {
}
}
}
}
class SetSettingsDialog extends GenericDialog {
static final String NO_SCALE = "<invalid scale!>";
String initialScale;
public SetSettingsDialog(String title, String scale) {
super(title);
initialScale = scale;
}
protected void setup() {
if (IJ.isJava2())
initialScale += " ";
setScale(initialScale);
}
public void textValueChanged(TextEvent e) {
Double d = getValue(((TextField)numberField.elementAt(0)).getText());
if (d==null)
{setScale(NO_SCALE); return;}
double measured = d.doubleValue();
d = getValue(((TextField)numberField.elementAt(1)).getText());
if (d==null)
{setScale(NO_SCALE); return;}
double known = d.doubleValue();
String theScale;
String unit = ((TextField)stringField.elementAt(0)).getText();
boolean noScale = measured<=0||known<=0||unit.startsWith("pixel")||unit.startsWith("Pixel")||unit.equals("");
if (noScale)
theScale = NO_SCALE;
else {
double scale = measured/known;
int digits = Tools.getDecimalPlaces(scale, scale);
theScale = IJ.d2s(scale,digits)+" pixels/"+unit;
}
setScale(theScale);
}
void setScale(String theScale) {
((Label)theLabel).setText("Scale: "+theScale);
}
}