|
SpecifyROI |
|
package ij.plugin;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.util.Tools;
/**
* This plugin implements the Edit/Selection/Specify command.<p>
* Enhancing the original plugin created by Jeffrey Kuhn, this one takes,
* in addition to width and height and the option to have an oval ROI from
* the original program, x & y coordinates, slice number, and the option to have
* the x & y coordinates centered or in default top left corner of ROI.
* The original creator is Jeffrey Kuhn, The University of Texas at Austin,
* jkuhn@ccwf.cc.utexas.edu
*
* @author Anthony Padua
* @author Duke University Medical Center, Department of Radiology
* @author padua001@mc.duke.edu
*
*/
public class SpecifyROI implements PlugIn, DialogListener {
int iX;
int iY;
int iXROI;
int iYROI;
int iSlice;
int iWidth;
int iHeight;
boolean bAbort;
ImagePlus imp;
static boolean oval;
static boolean centered;
Vector fields, checkboxes;
int stackSize;
public void run(String arg) {
imp = IJ.getImage();
stackSize = imp!=null?imp.getStackSize():0;
Roi roi = imp.getRoi();
Rectangle r = roi!=null?roi.getBounds():imp.getProcessor().getRoi();
iWidth = r.width;
iHeight = r.height;
iXROI = r.x;
iYROI = r.y;
if (roi==null) {
iWidth /= 2;
iHeight /= 2;
iXROI += iWidth/2;
iYROI += iHeight/2;
}
iSlice = imp.getCurrentSlice();
showDialog();
}
/**
* Creates a dialog box, allowing the user to enter the requested
* width, height, x & y coordinates, slice number for a Region Of Interest,
* option for oval, and option for whether x & y coordinates to be centered.
*/
void showDialog() {
Roi roi = imp.getRoi();
boolean rectOrOval = roi!=null && (roi.getType()==Roi.RECTANGLE||roi.getType()==Roi.OVAL);
if (roi==null || !rectOrOval)
drawRoi();
GenericDialog gd = new GenericDialog("Specify");
gd.addNumericField("Width:", iWidth, 0);
gd.addNumericField("Height:", iHeight, 0);
gd.addNumericField("X Coordinate:", iXROI, 0);
gd.addNumericField("Y Coordinate:", iYROI, 0);
if (stackSize>1)
gd.addNumericField("Slice:", iSlice, 0);
gd.addCheckbox("Oval", oval);
gd.addCheckbox("Centered",centered);
fields = gd.getNumericFields();
gd.addDialogListener(this);
gd.showDialog();
if (gd.wasCanceled()) {
if (roi==null)
imp.killRoi();
else if (!rectOrOval)
imp.setRoi(roi);
}
}
void drawRoi() {
if (centered) {
iX = iXROI - (iWidth/2);
iY = iYROI - (iHeight/2);
} else {
iX = iXROI;
iY = iYROI;
}
if (oval)
imp.setRoi(new OvalRoi(iX, iY, iWidth, iHeight,imp));
else
imp.setRoi(iX, iY, iWidth, iHeight);
}
public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) {
iWidth = (int) gd.getNextNumber();
iHeight = (int) gd.getNextNumber();
iXROI = (int) gd.getNextNumber();
iYROI = (int) gd.getNextNumber();
if (stackSize>1)
iSlice = (int) gd.getNextNumber();
oval = gd.getNextBoolean();
centered = gd.getNextBoolean();
if (gd.invalidNumber())
return false;
else {
if (stackSize>1 && iSlice>0 && iSlice<=stackSize)
imp.setSlice(iSlice);
drawRoi();
return true;
}
}
}
|
SpecifyROI |
|