diff --git a/Legacy/bonej/pom.xml b/Legacy/bonej/pom.xml index b6917fc8..bd5231d4 100644 --- a/Legacy/bonej/pom.xml +++ b/Legacy/bonej/pom.xml @@ -105,6 +105,18 @@ ${project.version} + + org.bonej + bonej-utilities + ${project.version} + + + + org.bonej + bonej-plugins + ${project.version} + + net.imagej diff --git a/Legacy/bonej/src/main/java/org/bonej/plugins/Connectivity.java b/Legacy/bonej/src/main/java/org/bonej/plugins/Connectivity.java index e63d490f..b630b13c 100644 --- a/Legacy/bonej/src/main/java/org/bonej/plugins/Connectivity.java +++ b/Legacy/bonej/src/main/java/org/bonej/plugins/Connectivity.java @@ -34,7 +34,10 @@ import org.bonej.util.ImageCheck; import org.bonej.util.Multithreader; -import org.bonej.util.ResultInserter; +import org.bonej.utilities.SharedTable; +import org.bonej.wrapperPlugins.BoneJCommand; +import org.scijava.command.Command; +import org.scijava.plugin.Plugin; import ij.IJ; import ij.ImagePlus; @@ -98,7 +101,8 @@ *

* */ -public class Connectivity implements PlugIn { +@Plugin(type = Command.class, menuPath = "Plugins>BoneJ>Connectivity>Connectivity") +public class Connectivity extends BoneJCommand implements PlugIn { private final static int[] EULER_LUT = fillEulerLUT(); @@ -109,8 +113,19 @@ public class Connectivity implements PlugIn { private int height = 0; /** working image depth */ - private int depth = 0; + private int depth = 0; + /** + * Modern scijava Plugin entry point. Calls the Legacy {@link #run(String)} method + */ + @Override + public void run() { + run(""); + } + + /** + * Legacy ImageJ1 plugin + */ @Override public void run(final String arg) { final ImagePlus imp = IJ.getImage(); @@ -132,12 +147,11 @@ public void run(final String arg) { + "particles or enclosed cavities.\n\n" + "Try running Purify prior to Connectivity."); } - final ResultInserter ri = ResultInserter.getInstance(); - ri.setResultInRow(imp, "Euler ch.", sumEuler); - ri.setResultInRow(imp, "Δ(χ)", deltaChi); - ri.setResultInRow(imp, "Connectivity", connectivity); - ri.setResultInRow(imp, "Conn.D (" + imp.getCalibration().getUnit() + "^-3)", connDensity); - ri.updateTable(); + SharedTable.add(imp.getTitle(), "Euler ch.", sumEuler); + SharedTable.add(imp.getTitle(), "Δ(χ)", deltaChi); + SharedTable.add(imp.getTitle(), "Connectivity", connectivity); + SharedTable.add(imp.getTitle(), "Conn.D (" + imp.getCalibration().getUnit() + "^-3)", connDensity); + resultsTable = SharedTable.getTable(); return; } diff --git a/Legacy/bonej/src/main/java/org/bonej/plugins/Moments.java b/Legacy/bonej/src/main/java/org/bonej/plugins/Moments.java index a138cb97..212fda79 100644 --- a/Legacy/bonej/src/main/java/org/bonej/plugins/Moments.java +++ b/Legacy/bonej/src/main/java/org/bonej/plugins/Moments.java @@ -43,10 +43,13 @@ import org.bonej.util.ImageCheck; import org.bonej.util.MatrixUtils; import org.bonej.util.Multithreader; -import org.bonej.util.ResultInserter; import org.bonej.util.ThresholdGuesser; import org.jogamp.vecmath.Color3f; import org.jogamp.vecmath.Point3f; +import org.bonej.utilities.SharedTable; +import org.bonej.wrapperPlugins.BoneJCommand; +import org.scijava.command.Command; +import org.scijava.plugin.Plugin; import Jama.EigenvalueDecomposition; import Jama.Matrix; @@ -71,7 +74,8 @@ * * @author Michael Doube */ -public class Moments implements PlugIn, DialogListener { +@Plugin(type = Command.class, menuPath = "Plugins>BoneJ>Moments of Inertia") +public class Moments extends BoneJCommand implements PlugIn, DialogListener { private boolean fieldUpdated; private Calibration cal; @@ -110,6 +114,14 @@ public boolean dialogItemChanged(final GenericDialog gd, final AWTEvent e) { // conversion coefficient from mm^5 to kg.m² = 1.8*10^-12 // double cc = 1.8*Math.pow(10, -12); + /** + * Modern scijava Plugin entry point. Calls the Legacy {@link #run(String)} method + */ + @Override + public void run() { + run(""); + } + @Override public void run(final String arg) { final ImagePlus imp = IJ.getImage(); @@ -187,33 +199,32 @@ public void run(final String arg) { final double[] moments = (double[]) momentResults[1]; final String units = imp.getCalibration().getUnits(); - final ResultInserter ri = ResultInserter.getInstance(); - ri.setResultInRow(imp, "Xc (" + units + ")", centroid[0]); - ri.setResultInRow(imp, "Yc (" + units + ")", centroid[1]); - ri.setResultInRow(imp, "Zc (" + units + ")", centroid[2]); - ri.setResultInRow(imp, "Vol (" + units + "³)", moments[0]); - ri.setResultInRow(imp, "Mass (g)", moments[1]); - ri.setResultInRow(imp, "Icxx (kg.m²)", moments[2]); - ri.setResultInRow(imp, "Icyy (kg.m²)", moments[3]); - ri.setResultInRow(imp, "Iczz (kg.m²)", moments[4]); - ri.setResultInRow(imp, "Icxy (kg.m²)", moments[5]); - ri.setResultInRow(imp, "Icxz (kg.m²)", moments[6]); - ri.setResultInRow(imp, "Icyz (kg.m²)", moments[7]); - ri.setResultInRow(imp, "I1 (kg.m²)", E.getD().get(2, 2)); - ri.setResultInRow(imp, "I2 (kg.m²)", E.getD().get(1, 1)); - ri.setResultInRow(imp, "I3 (kg.m²)", E.getD().get(0, 0)); + SharedTable.add(imp.getTitle(), "Xc (" + units + ")", centroid[0]); + SharedTable.add(imp.getTitle(), "Yc (" + units + ")", centroid[1]); + SharedTable.add(imp.getTitle(), "Zc (" + units + ")", centroid[2]); + SharedTable.add(imp.getTitle(), "Vol (" + units + "³)", moments[0]); + SharedTable.add(imp.getTitle(), "Mass (g)", moments[1]); + SharedTable.add(imp.getTitle(), "Icxx (kg.m²)", moments[2]); + SharedTable.add(imp.getTitle(), "Icyy (kg.m²)", moments[3]); + SharedTable.add(imp.getTitle(), "Iczz (kg.m²)", moments[4]); + SharedTable.add(imp.getTitle(), "Icxy (kg.m²)", moments[5]); + SharedTable.add(imp.getTitle(), "Icxz (kg.m²)", moments[6]); + SharedTable.add(imp.getTitle(), "Icyz (kg.m²)", moments[7]); + SharedTable.add(imp.getTitle(), "I1 (kg.m²)", E.getD().get(2, 2)); + SharedTable.add(imp.getTitle(), "I2 (kg.m²)", E.getD().get(1, 1)); + SharedTable.add(imp.getTitle(), "I3 (kg.m²)", E.getD().get(0, 0)); if (doVerboseUnitVectors) { - ri.setResultInRow(imp, "vX0", E.getV().get(0, 0)); - ri.setResultInRow(imp, "vY0", E.getV().get(1, 0)); - ri.setResultInRow(imp, "vZ0", E.getV().get(2, 0)); - ri.setResultInRow(imp, "vX1", E.getV().get(0, 1)); - ri.setResultInRow(imp, "vY1", E.getV().get(1, 1)); - ri.setResultInRow(imp, "vZ1", E.getV().get(2, 1)); - ri.setResultInRow(imp, "vX2", E.getV().get(0, 2)); - ri.setResultInRow(imp, "vY2", E.getV().get(1, 2)); - ri.setResultInRow(imp, "vZ2", E.getV().get(2, 2)); + SharedTable.add(imp.getTitle(), "vX0", E.getV().get(0, 0)); + SharedTable.add(imp.getTitle(), "vY0", E.getV().get(1, 0)); + SharedTable.add(imp.getTitle(), "vZ0", E.getV().get(2, 0)); + SharedTable.add(imp.getTitle(), "vX1", E.getV().get(0, 1)); + SharedTable.add(imp.getTitle(), "vY1", E.getV().get(1, 1)); + SharedTable.add(imp.getTitle(), "vZ1", E.getV().get(2, 1)); + SharedTable.add(imp.getTitle(), "vX2", E.getV().get(0, 2)); + SharedTable.add(imp.getTitle(), "vY2", E.getV().get(1, 2)); + SharedTable.add(imp.getTitle(), "vZ2", E.getV().get(2, 2)); } - ri.updateTable(); + resultsTable = SharedTable.getTable(); if (doAlign) alignToPrincipalAxes(imp, E.getV(), centroid, startSlice, endSlice, min, max, doAxes).show(); diff --git a/Legacy/bonej/src/main/java/org/bonej/plugins/ParticleCounter.java b/Legacy/bonej/src/main/java/org/bonej/plugins/ParticleCounter.java index 190a0c2f..029f1a27 100644 --- a/Legacy/bonej/src/main/java/org/bonej/plugins/ParticleCounter.java +++ b/Legacy/bonej/src/main/java/org/bonej/plugins/ParticleCounter.java @@ -40,7 +40,11 @@ import org.bonej.menuWrappers.ThicknessHelper; import org.bonej.util.DialogModifier; import org.bonej.util.ImageCheck; +import org.bonej.utilities.SharedTable; +import org.bonej.wrapperPlugins.BoneJCommand; import org.jogamp.vecmath.Point3f; +import org.scijava.command.Command; +import org.scijava.plugin.Plugin; import Jama.EigenvalueDecomposition; @@ -49,7 +53,6 @@ import ij.gui.DialogListener; import ij.gui.GenericDialog; import ij.measure.Calibration; -import ij.measure.ResultsTable; import ij.plugin.PlugIn; import ij3d.Image3DUniverse; import sc.fiji.analyzeSkeleton.SkeletonResult; @@ -64,9 +67,9 @@ * * @author Michael Doube */ -public class ParticleCounter implements PlugIn, DialogListener { +@Plugin(type = Command.class, menuPath = "Plugins>BoneJ>Analyze>Particle Analyser") +public class ParticleCounter extends BoneJCommand implements PlugIn, DialogListener { - /* (non-Javadoc) * @see ij.gui.DialogListener#dialogItemChanged(ij.gui.GenericDialog, java.awt.AWTEvent) */ @@ -96,6 +99,14 @@ public boolean dialogItemChanged(final GenericDialog gd, final AWTEvent e) { return true; } + /** + * Modern scijava Plugin entry point. Calls the Legacy {@link #run(String)} method + */ + @Override + public void run() { + run(""); + } + /* (non-Javadoc) * @see ij.plugin.PlugIn#run(java.lang.String) */ @@ -292,54 +303,52 @@ public void run(final String arg) { } // Show numerical results - final ResultsTable rt = new ResultsTable(); + SharedTable.reset(); for (int i = 1; i < volumes.length; i++) { if (volumes[i] > 0) { - rt.incrementCounter(); - rt.addLabel(imp.getTitle()); - rt.addValue("ID", i); - rt.addValue("Vol. (" + units + "³)", volumes[i]); - rt.addValue("x Cent (" + units + ")", centroids[i][0]); - rt.addValue("y Cent (" + units + ")", centroids[i][1]); - rt.addValue("z Cent (" + units + ")", centroids[i][2]); + SharedTable.add(imp.getTitle(),"ID", i); + SharedTable.add(imp.getTitle(),"Vol. (" + units + "³)", volumes[i]); + SharedTable.add(imp.getTitle(),"x Cent (" + units + ")", centroids[i][0]); + SharedTable.add(imp.getTitle(),"y Cent (" + units + ")", centroids[i][1]); + SharedTable.add(imp.getTitle(),"z Cent (" + units + ")", centroids[i][2]); if (doAlignedBoxes) { - rt.addValue("Box x (" + units + ")", alignedBoxes[i][0]); - rt.addValue("Box y (" + units + ")", alignedBoxes[i][1]); - rt.addValue("Box z (" + units + ")", alignedBoxes[i][2]); - rt.addValue("Box l0 (" + units + ")", alignedBoxes[i][3]); - rt.addValue("Box l1 (" + units + ")", alignedBoxes[i][4]); - rt.addValue("Box l2 (" + units + ")", alignedBoxes[i][5]); + SharedTable.add(imp.getTitle(),"Box x (" + units + ")", alignedBoxes[i][0]); + SharedTable.add(imp.getTitle(),"Box y (" + units + ")", alignedBoxes[i][1]); + SharedTable.add(imp.getTitle(),"Box z (" + units + ")", alignedBoxes[i][2]); + SharedTable.add(imp.getTitle(),"Box l0 (" + units + ")", alignedBoxes[i][3]); + SharedTable.add(imp.getTitle(),"Box l1 (" + units + ")", alignedBoxes[i][4]); + SharedTable.add(imp.getTitle(),"Box l2 (" + units + ")", alignedBoxes[i][5]); } if (doSurfaceArea) { - rt.addValue("SA (" + units + "²)", surfaceAreas[i]); + SharedTable.add(imp.getTitle(),"SA (" + units + "²)", surfaceAreas[i]); } if (doFeret) { - rt.addValue("Feret (" + units + ")", ferets[i][0]); - rt.addValue("FeretAx (" + units + ")", ferets[i][1]); - rt.addValue("FeretAy (" + units + ")", ferets[i][2]); - rt.addValue("FeretAz (" + units + ")", ferets[i][3]); - rt.addValue("FeretBx (" + units + ")", ferets[i][4]); - rt.addValue("FeretBy (" + units + ")", ferets[i][5]); - rt.addValue("FeretBz (" + units + ")", ferets[i][6]); + SharedTable.add(imp.getTitle(),"Feret (" + units + ")", ferets[i][0]); + SharedTable.add(imp.getTitle(),"FeretAx (" + units + ")", ferets[i][1]); + SharedTable.add(imp.getTitle(),"FeretAy (" + units + ")", ferets[i][2]); + SharedTable.add(imp.getTitle(),"FeretAz (" + units + ")", ferets[i][3]); + SharedTable.add(imp.getTitle(),"FeretBx (" + units + ")", ferets[i][4]); + SharedTable.add(imp.getTitle(),"FeretBy (" + units + ")", ferets[i][5]); + SharedTable.add(imp.getTitle(),"FeretBz (" + units + ")", ferets[i][6]); } if (doSurfaceVolume) { - rt.addValue("Encl. Vol. (" + units + "³)", surfaceVolumes[i]); + SharedTable.add(imp.getTitle(),"Encl. Vol. (" + units + "³)", surfaceVolumes[i]); } if (doMoments) { final EigenvalueDecomposition E = eigens[i]; - rt.addValue("I1", E.getD().get(2, 2)); - rt.addValue("I2", E.getD().get(1, 1)); - rt.addValue("I3", E.getD().get(0, 0)); - rt.addValue("vX", E.getV().get(0, 0)); - rt.addValue("vY", E.getV().get(1, 0)); - rt.addValue("vZ", E.getV().get(2, 0)); + SharedTable.add(imp.getTitle(),"I1", E.getD().get(2, 2)); + SharedTable.add(imp.getTitle(),"I2", E.getD().get(1, 1)); + SharedTable.add(imp.getTitle(),"I3", E.getD().get(0, 0)); + SharedTable.add(imp.getTitle(),"vX", E.getV().get(0, 0)); + SharedTable.add(imp.getTitle(),"vY", E.getV().get(1, 0)); + SharedTable.add(imp.getTitle(),"vZ", E.getV().get(2, 0)); if (doVerboseUnitVectors) { - rt.addValue("vX1", E.getV().get(0, 1)); - rt.addValue("vY1", E.getV().get(1, 1)); - rt.addValue("vZ1", E.getV().get(2, 1)); - rt.addValue("vX2", E.getV().get(0, 2)); - rt.addValue("vY2", E.getV().get(1, 2)); - rt.addValue("vZ2", E.getV().get(2, 2)); + SharedTable.add(imp.getTitle(),"vX1", E.getV().get(0, 1)); + SharedTable.add(imp.getTitle(),"vY1", E.getV().get(1, 1)); + SharedTable.add(imp.getTitle(),"vZ1", E.getV().get(2, 1)); + SharedTable.add(imp.getTitle(),"vX2", E.getV().get(0, 2)); + SharedTable.add(imp.getTitle(),"vY2", E.getV().get(1, 2)); + SharedTable.add(imp.getTitle(),"vZ2", E.getV().get(2, 2)); } } if (doSkeletons) { @@ -353,18 +362,18 @@ public void run(final String arg) { branchesLength = skeletonResults[i].getAverageBranchLength()[0] * nBranches; } - rt.addValue("n Branches", nBranches); - rt.addValue("Branches length ("+units+")", branchesLength); + SharedTable.add(imp.getTitle(),"n Branches", nBranches); + SharedTable.add(imp.getTitle(),"Branches length ("+units+")", branchesLength); } if (doEulerCharacters) { - rt.addValue("Euler (χ)", eulerCharacters[i][0]); - rt.addValue("Holes (β1)", eulerCharacters[i][1]); - rt.addValue("Cavities (β2)", eulerCharacters[i][2]); + SharedTable.add(imp.getTitle(),"Euler (χ)", eulerCharacters[i][0]); + SharedTable.add(imp.getTitle(),"Holes (β1)", eulerCharacters[i][1]); + SharedTable.add(imp.getTitle(),"Cavities (β2)", eulerCharacters[i][2]); } if (doThickness) { - rt.addValue("Thickness (" + units + ")", thick[i][0]); - rt.addValue("SD Thickness (" + units + ")", thick[i][1]); - rt.addValue("Max Thickness (" + units + ")", thick[i][2]); + SharedTable.add(imp.getTitle(),"Thickness (" + units + ")", thick[i][0]); + SharedTable.add(imp.getTitle(),"SD Thickness (" + units + ")", thick[i][1]); + SharedTable.add(imp.getTitle(),"Max Thickness (" + units + ")", thick[i][2]); } if (doEllipsoids) { final double[] rad; @@ -380,25 +389,24 @@ public void run(final String arg) { rad = (double[]) el[1]; unitV = (double[][]) el[2]; } - rt.addValue("Major radius (" + units + ")", rad[0]); - rt.addValue("Int. radius (" + units + ")", rad[1]); - rt.addValue("Minor radius (" + units + ")", rad[2]); + SharedTable.add(imp.getTitle(),"Major radius (" + units + ")", rad[0]); + SharedTable.add(imp.getTitle(),"Int. radius (" + units + ")", rad[1]); + SharedTable.add(imp.getTitle(),"Minor radius (" + units + ")", rad[2]); if (doVerboseUnitVectors) { - rt.addValue("V00", unitV[0][0]); - rt.addValue("V01", unitV[0][1]); - rt.addValue("V02", unitV[0][2]); - rt.addValue("V10", unitV[1][0]); - rt.addValue("V11", unitV[1][1]); - rt.addValue("V12", unitV[1][2]); - rt.addValue("V20", unitV[2][0]); - rt.addValue("V21", unitV[2][1]); - rt.addValue("V22", unitV[2][2]); + SharedTable.add(imp.getTitle(),"V00", unitV[0][0]); + SharedTable.add(imp.getTitle(),"V01", unitV[0][1]); + SharedTable.add(imp.getTitle(),"V02", unitV[0][2]); + SharedTable.add(imp.getTitle(),"V10", unitV[1][0]); + SharedTable.add(imp.getTitle(),"V11", unitV[1][1]); + SharedTable.add(imp.getTitle(),"V12", unitV[1][2]); + SharedTable.add(imp.getTitle(),"V20", unitV[2][0]); + SharedTable.add(imp.getTitle(),"V21", unitV[2][1]); + SharedTable.add(imp.getTitle(),"V22", unitV[2][2]); } } - rt.updateResults(); } } - rt.show("Results"); + resultsTable = SharedTable.getTable(); // Show resulting image stacks if (doParticleImage) { diff --git a/Legacy/bonej/src/main/java/org/bonej/plugins/Purify.java b/Legacy/bonej/src/main/java/org/bonej/plugins/Purify.java index 73ca5227..76e97cbb 100644 --- a/Legacy/bonej/src/main/java/org/bonej/plugins/Purify.java +++ b/Legacy/bonej/src/main/java/org/bonej/plugins/Purify.java @@ -40,7 +40,11 @@ import ij.ImagePlus; import ij.ImageStack; import ij.gui.GenericDialog; -import ij.measure.ResultsTable; + +import org.bonej.utilities.SharedTable; +import org.bonej.wrapperPlugins.BoneJCommand; +import org.scijava.command.Command; +import org.scijava.plugin.Plugin; import ij.plugin.PlugIn; /** @@ -66,8 +70,17 @@ * @author Michael Doube * @version 1.0 */ -public class Purify implements PlugIn { +@Plugin(type = Command.class, menuPath = "Plugins>BoneJ>Purify") +public class Purify extends BoneJCommand implements PlugIn { + /** + * Modern scijava Plugin entry point. Calls the Legacy {@link #run(String)} method + */ + @Override + public void run() { + run(""); + } + @Override public void run(final String arg) { final ImagePlus imp = IJ.getImage(); @@ -108,15 +121,12 @@ public void run(final String arg) { * @param duration time elapsed in purifying. * @param imp the purified image. */ - private static void showResults(final double duration, final ImagePlus imp) + private void showResults(final double duration, final ImagePlus imp) { - final ResultsTable rt = ResultsTable.getResultsTable(); - rt.incrementCounter(); - rt.addLabel(imp.getTitle()); - rt.addValue("Threads", Runtime.getRuntime().availableProcessors()); - rt.addValue("Slices", imp.getImageStackSize()); - rt.addValue("Duration (s)", duration); - rt.show("Results"); + SharedTable.add(imp.getTitle(), "Purify Threads", Runtime.getRuntime().availableProcessors()); + SharedTable.add(imp.getTitle(), "Slices", imp.getImageStackSize()); + SharedTable.add(imp.getTitle(), "Duration (s)", duration); + resultsTable = SharedTable.getTable(); } /** diff --git a/Legacy/bonej/src/main/java/org/bonej/plugins/SliceGeometry.java b/Legacy/bonej/src/main/java/org/bonej/plugins/SliceGeometry.java index da5a8263..fdb0a350 100644 --- a/Legacy/bonej/src/main/java/org/bonej/plugins/SliceGeometry.java +++ b/Legacy/bonej/src/main/java/org/bonej/plugins/SliceGeometry.java @@ -43,8 +43,12 @@ import org.bonej.util.DialogModifier; import org.bonej.util.ImageCheck; import org.bonej.util.ThresholdGuesser; +import org.bonej.utilities.SharedTable; +import org.bonej.wrapperPlugins.BoneJCommand; import org.jogamp.vecmath.Color3f; import org.jogamp.vecmath.Point3f; +import org.scijava.command.Command; +import org.scijava.plugin.Plugin; import customnode.CustomPointMesh; import ij.IJ; @@ -56,7 +60,6 @@ import ij.gui.Roi; import ij.gui.Wand; import ij.measure.Calibration; -import ij.measure.ResultsTable; import ij.plugin.Duplicator; import ij.plugin.PlugIn; import ij.process.ByteProcessor; @@ -73,8 +76,8 @@ * * @author Michael Doube */ - -public class SliceGeometry implements PlugIn, DialogListener { +@Plugin(type = Command.class, menuPath = "Plugins>BoneJ>Slice Geometry") +public class SliceGeometry extends BoneJCommand implements PlugIn, DialogListener { private Calibration cal; private int al; @@ -197,6 +200,14 @@ public boolean dialogItemChanged(final GenericDialog gd, final AWTEvent e) { return true; } + /** + * Modern scijava Plugin entry point. Calls the Legacy {@link #run(String)} method + */ + @Override + public void run() { + run(""); + } + @Override public void run(final String arg) { final ImagePlus imp = IJ.getImage(); @@ -319,43 +330,40 @@ else if (roi.getType() != Roi.RECTANGLE) { // TODO locate centroids of multiple sections in a single plane - final ResultsTable rt = ResultsTable.getResultsTable(); - if (clearResults) rt.reset(); + if (clearResults) SharedTable.reset(); final String title = imp.getTitle(); for (int s = startSlice; s <= endSlice; s++) { - rt.incrementCounter(); - rt.addLabel(title); - rt.addValue("Bone Code", boneID); - rt.addValue("Slice", s); - rt.addValue("CSA (" + units + "²)", cortArea[s]); - rt.addValue("X cent. (" + units + ")", sliceCentroids[0][s]); - rt.addValue("Y cent. (" + units + ")", sliceCentroids[1][s]); - rt.addValue("Density", meanDensity[s]); - rt.addValue("wX cent. (" + units + ")", weightedCentroids[0][s]); - rt.addValue("wY cent. (" + units + ")", weightedCentroids[1][s]); - rt.addValue("Theta (rad)", theta[s]); - rt.addValue("R1 (" + units + ")", maxRadMax[s]); - rt.addValue("R2 (" + units + ")", maxRadMin[s]); - rt.addValue("Imin (" + units + "^4)", Imin[s]); - rt.addValue("Imax (" + units + "^4)", Imax[s]); - rt.addValue("Ipm (" + units + "^4)", Ipm[s]); - rt.addValue("Zmin (" + units + "³)", Zmin[s]); - rt.addValue("Zmax (" + units + "³)", Zmax[s]); - rt.addValue("Zpol (" + units + "³)", Zpol[s]); - rt.addValue("Feret Min (" + units + ")", feretMin[s]); - rt.addValue("Feret Max (" + units + ")", feretMax[s]); - rt.addValue("Feret Angle (rad)", feretAngle[s]); - rt.addValue("Perimeter (" + units + ")", perimeter[s]); + SharedTable.add(title, "Bone Code", boneID); + SharedTable.add(title, "Slice", s); + SharedTable.add(title, "CSA (" + units + "²)", cortArea[s]); + SharedTable.add(title, "X cent. (" + units + ")", sliceCentroids[0][s]); + SharedTable.add(title, "Y cent. (" + units + ")", sliceCentroids[1][s]); + SharedTable.add(title, "Density", meanDensity[s]); + SharedTable.add(title, "wX cent. (" + units + ")", weightedCentroids[0][s]); + SharedTable.add(title, "wY cent. (" + units + ")", weightedCentroids[1][s]); + SharedTable.add(title, "Theta (rad)", theta[s]); + SharedTable.add(title, "R1 (" + units + ")", maxRadMax[s]); + SharedTable.add(title, "R2 (" + units + ")", maxRadMin[s]); + SharedTable.add(title, "Imin (" + units + "^4)", Imin[s]); + SharedTable.add(title, "Imax (" + units + "^4)", Imax[s]); + SharedTable.add(title, "Ipm (" + units + "^4)", Ipm[s]); + SharedTable.add(title, "Zmin (" + units + "³)", Zmin[s]); + SharedTable.add(title, "Zmax (" + units + "³)", Zmax[s]); + SharedTable.add(title, "Zpol (" + units + "³)", Zpol[s]); + SharedTable.add(title, "Feret Min (" + units + ")", feretMin[s]); + SharedTable.add(title, "Feret Max (" + units + ")", feretMax[s]); + SharedTable.add(title, "Feret Angle (rad)", feretAngle[s]); + SharedTable.add(title, "Perimeter (" + units + ")", perimeter[s]); if (doThickness3D) { - rt.addValue("Max Thick 3D (" + units + ")", maxCortThick3D[s]); - rt.addValue("Mean Thick 3D (" + units + ")", meanCortThick3D[s]); - rt.addValue("SD Thick 3D (" + units + ")", stdevCortThick3D[s]); + SharedTable.add(title, "Max Thick 3D (" + units + ")", maxCortThick3D[s]); + SharedTable.add(title, "Mean Thick 3D (" + units + ")", meanCortThick3D[s]); + SharedTable.add(title, "SD Thick 3D (" + units + ")", stdevCortThick3D[s]); } if (doThickness2D) { - rt.addValue("Max Thick 2D (" + units + ")", maxCortThick2D[s]); - rt.addValue("Mean Thick 2D (" + units + ")", meanCortThick2D[s]); - rt.addValue("SD Thick 2D (" + units + ")", stdevCortThick2D[s]); + SharedTable.add(title, "Max Thick 2D (" + units + ")", maxCortThick2D[s]); + SharedTable.add(title, "Mean Thick 2D (" + units + ")", meanCortThick2D[s]); + SharedTable.add(title, "SD Thick 2D (" + units + ")", stdevCortThick2D[s]); } if (!doOriented || orienteer == null) { continue; @@ -364,20 +372,20 @@ else if (roi.getType() != Roi.RECTANGLE) { if (dirs == null) { continue; } - rt.addValue(dirs[0] + " (rad)", orienteer.getOrientation(imp, dirs[0])); - rt.addValue(dirs[2] + " (rad)", orienteer.getOrientation(imp, dirs[2])); - rt.addValue("I" + dirs[0] + dirs[1] + "(" + units + "^4)", I1[s]); - rt.addValue("I" + dirs[2] + dirs[3] + "(" + units + "^4)", I2[s]); - rt.addValue("Z" + dirs[0] + dirs[1] + "(" + units + "³)", Z1[s]); - rt.addValue("Z" + dirs[2] + dirs[3] + "(" + units + "³)", Z2[s]); - rt.addValue("R" + dirs[0] + dirs[1] + "(" + units + ")", maxRad2[s]); - rt.addValue("R" + dirs[2] + dirs[3] + "(" + units + ")", maxRad1[s]); - rt.addValue("D" + dirs[0] + dirs[1] + "(" + units + ")", + SharedTable.add(title, dirs[0] + " (rad)", orienteer.getOrientation(imp, dirs[0])); + SharedTable.add(title, dirs[2] + " (rad)", orienteer.getOrientation(imp, dirs[2])); + SharedTable.add(title, "I" + dirs[0] + dirs[1] + "(" + units + "^4)", I1[s]); + SharedTable.add(title, "I" + dirs[2] + dirs[3] + "(" + units + "^4)", I2[s]); + SharedTable.add(title, "Z" + dirs[0] + dirs[1] + "(" + units + "³)", Z1[s]); + SharedTable.add(title, "Z" + dirs[2] + dirs[3] + "(" + units + "³)", Z2[s]); + SharedTable.add(title, "R" + dirs[0] + dirs[1] + "(" + units + ")", maxRad2[s]); + SharedTable.add(title, "R" + dirs[2] + dirs[3] + "(" + units + ")", maxRad1[s]); + SharedTable.add(title, "D" + dirs[0] + dirs[1] + "(" + units + ")", principalDiameter[s]); - rt.addValue("D" + dirs[2] + dirs[3] + "(" + units + ")", + SharedTable.add(title, "D" + dirs[2] + dirs[3] + "(" + units + ")", secondaryDiameter[s]); } - rt.show("Results"); + resultsTable = SharedTable.getTable(); if (doAxes || doCentroids) { if (!doCopy) { diff --git a/Legacy/bonej/src/main/java/org/bonej/plugins/SphereFitter.java b/Legacy/bonej/src/main/java/org/bonej/plugins/SphereFitter.java index d7247af9..ccf3545c 100644 --- a/Legacy/bonej/src/main/java/org/bonej/plugins/SphereFitter.java +++ b/Legacy/bonej/src/main/java/org/bonej/plugins/SphereFitter.java @@ -39,7 +39,10 @@ import org.bonej.geometry.FitSphere; import org.bonej.util.DialogModifier; import org.bonej.util.ImageCheck; -import org.bonej.util.ResultInserter; +import org.bonej.utilities.SharedTable; +import org.bonej.wrapperPlugins.BoneJCommand; +import org.scijava.command.Command; +import org.scijava.plugin.Plugin; import ij.IJ; import ij.ImagePlus; @@ -61,7 +64,8 @@ * * @author Michael Doube and Angelo Tardugno */ -public class SphereFitter implements PlugIn, DialogListener { +@Plugin(type = Command.class, menuPath = "Plugins>BoneJ>Fit Sphere") +public class SphereFitter extends BoneJCommand implements PlugIn, DialogListener { @Override public boolean dialogItemChanged(final GenericDialog gd, final AWTEvent e) { @@ -80,6 +84,14 @@ public boolean dialogItemChanged(final GenericDialog gd, final AWTEvent e) { return true; } + /** + * Modern scijava Plugin entry point. Calls the Legacy {@link #run(String)} method + */ + @Override + public void run() { + run(""); + } + @Override public void run(final String arg) { final ImagePlus imp = IJ.getImage(); @@ -152,12 +164,11 @@ public void run(final String arg) { } final String units = imp.getCalibration().getUnits(); - final ResultInserter ri = ResultInserter.getInstance(); - ri.setResultInRow(imp, "X centroid (" + units + ")", sphereDim[0]); - ri.setResultInRow(imp, "Y centroid (" + units + ")", sphereDim[1]); - ri.setResultInRow(imp, "Z centroid (" + units + ")", sphereDim[2]); - ri.setResultInRow(imp, "Radius (" + units + ")", sphereDim[3]); - ri.updateTable(); + SharedTable.add(imp.getTitle(), "X centroid (" + units + ")", sphereDim[0]); + SharedTable.add(imp.getTitle(), "Y centroid (" + units + ")", sphereDim[1]); + SharedTable.add(imp.getTitle(), "Z centroid (" + units + ")", sphereDim[2]); + SharedTable.add(imp.getTitle(), "Radius (" + units + ")", sphereDim[3]); + resultsTable = SharedTable.getTable(); if (doCopy) copySphere(imp, padding, cropFactor, sphereDim).show(); if (doInnerCube) copyInnerCube(imp, cropFactor, sphereDim).show(); diff --git a/Legacy/bonej/src/main/resources/plugins.config b/Legacy/bonej/src/main/resources/plugins.config index 3ceb1524..626fdaba 100644 --- a/Legacy/bonej/src/main/resources/plugins.config +++ b/Legacy/bonej/src/main/resources/plugins.config @@ -31,14 +31,6 @@ Plugins>BoneJ>Analyze, "Calibrate SCANCO", org.bonej.plugins.DensityCalibrator("scanco") Plugins>BoneJ>Analyze, "Orientation", org.bonej.plugins.Orienteer -Plugins>BoneJ>Analyze, "Particle Analyser", org.bonej.plugins.ParticleCounter - -Plugins>BoneJ>Connectivity, "Connectivity", org.bonej.plugins.Connectivity - -Plugins>BoneJ, "Fit Sphere", org.bonej.plugins.SphereFitter -Plugins>BoneJ, "Moments of Inertia", org.bonej.plugins.Moments -Plugins>BoneJ, "Purify", org.bonej.plugins.Purify -Plugins>BoneJ, "Slice Geometry", org.bonej.plugins.SliceGeometry Image>Stacks, "Check Voxel Depth", org.bonej.plugins.VoxelDepthChecker Image>Stacks, "Delete Slice Range", org.bonej.plugins.DeleteSliceRange diff --git a/Legacy/util/src/main/java/org/bonej/util/ResultInserter.java b/Legacy/util/src/main/java/org/bonej/util/ResultInserter.java deleted file mode 100644 index 161e4451..00000000 --- a/Legacy/util/src/main/java/org/bonej/util/ResultInserter.java +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * #%L - * Utility classes for BoneJ1 plugins - * %% - * Copyright (C) 2015 - 2026 Michael Doube, BoneJ developers - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ - - -package org.bonej.util; - -import ij.ImagePlus; -import ij.measure.ResultsTable; - -/** - * Receive results from analytic methods and insert them into the Results table - * in a sensible way. - *

- * Each image gets a line; measurements of different types are added to the same - * line; repeat measurements on same image go on a new line. - *

- * - * @author Michael Doube - */ -public final class ResultInserter { - - private static final ResultInserter INSTANCE = new ResultInserter(); - private static ResultsTable rt; - - private ResultInserter() {} - - /** - * Finds the first available space for a result, avoiding lots of empty space - * when measurements of different types are made on the same image - * - * @param imp ImagePlus - * @param colHeading column heading - * @param value value to insert - */ - // TODO use a table other than the system Results table - public void setResultInRow(final ImagePlus imp, final String colHeading, - final double value) - { - final String title = imp.getTitle(); - - // search for the last value that contains the image title - // and contains no value for the heading - for (int row = rt.getCounter()-1; row >= 0; row--) { - if (rt.getLabel(row) == null) { - rt.setLabel(title, row); - } - if (rt.getLabel(row).equals(title)) { - // there could be no column called colHeading - if (!rt.columnExists(rt.getColumnIndex(colHeading))) { - // in which case, just insert the value - rt.setValue(colHeading, row, value); - return; - } // but if there is, it might or might not have data in it - final Double currentValue = rt.getValue(colHeading, row); - if (currentValue.equals(Double.NaN)) { - rt.setValue(colHeading, row, value); - return; - } - // look for another row with the right title - } - } - // we got to the end of the table without finding a space to insert - // the value, so make a new row for it - rt.incrementCounter(); - rt.addLabel(title); - rt.addValue(colHeading, value); - } - - /** - * Show the table - */ - public void updateTable() { - final String table = "Results"; - rt.show(table); - } - - public static ResultInserter getInstance() { - rt = ResultsTable.getResultsTable(); - rt.setNaNEmptyCells(true); - return INSTANCE; - } -}