Skip to content
Snippets Groups Projects
Commit db697ded authored by Thomas  MUSSET's avatar Thomas MUSSET
Browse files

updated pom to v2.0.0-a.1, fix classes accordingly to new architecture, added...

updated pom to v2.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore
parent 1fdfa6c9
Branches icy-3.0.0
No related merge requests found
.idea/
/build*
/workspace
setting.xml
release/
target/
.settings/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
icy.log
### IntelliJ IDEA ###
.idea/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.classpath
\ No newline at end of file
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
**/.DS_Store
Icon?
\ No newline at end of file
......@@ -7,15 +7,13 @@
<!-- Inherited Icy Parent POM -->
<parent>
<groupId>org.bioimageanalysis.icy</groupId>
<artifactId>parent-pom-plugin</artifactId>
<version>1.0.3</version>
<artifactId>pom-icy</artifactId>
<version>3.0.0-a.1</version>
</parent>
<!-- Project Information -->
<artifactId>roi-tooltip</artifactId>
<version>1.1.4</version>
<packaging>jar</packaging>
<version>2.0.0-a.1</version>
<name>ROI Tooltip</name>
<description>
......@@ -23,7 +21,7 @@
position and size. - number of interior points and contour points. - perimeter, area, surface area, volume. - min, max, mean
intensity. This plugin is a daemon plugin, that means plugin is automatically loaded when Icy starts.
</description>
<url>http://icy.bioimageanalysis.org/plugin/roi-tooltip/</url>
<url>https://icy.bioimageanalysis.org/plugin/roi-tooltip/</url>
<inceptionYear>2020</inceptionYear>
<organization>
......@@ -57,31 +55,11 @@
</developer>
</developers>
<!-- Project properties -->
<properties>
</properties>
<!-- Project build configuration -->
<build>
</build>
<!-- List of project's dependencies -->
<dependencies>
<!-- The core of Icy -->
<dependency>
<groupId>org.bioimageanalysis.icy</groupId>
<artifactId>icy-kernel</artifactId>
</dependency>
</dependencies>
<!-- Icy Maven repository (to find parent POM) -->
<repositories>
<repository>
<id>icy</id>
<name>Icy's Nexus</name>
<url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
<url>https://nexus-icy.pasteur.cloud/repository/icy/</url>
</repository>
</repositories>
</project>
\ No newline at end of file
/*
* Copyright (c) 2010-2024. Institut Pasteur.
*
* This file is part of Icy.
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <https://www.gnu.org/licenses/>.
*/
package plugins.stef.roi;
import icy.canvas.IcyCanvas;
import icy.canvas.IcyCanvas2D;
import icy.canvas.Layer;
import icy.gui.main.ActiveViewerListener;
import icy.gui.viewer.Viewer;
import icy.gui.viewer.ViewerEvent;
import icy.image.IntensityInfo;
import icy.main.Icy;
import icy.math.MathUtil;
import icy.painter.Overlay;
import icy.plugin.abstract_.Plugin;
import icy.plugin.interface_.PluginDaemon;
import icy.roi.ROI;
import icy.roi.ROI2D;
import icy.roi.ROI3D;
import icy.roi.ROIEvent;
import icy.roi.ROIEvent.ROIEventType;
import icy.roi.ROIListener;
import icy.roi.ROIUtil;
import icy.sequence.Sequence;
import icy.system.thread.SingleProcessor;
import icy.util.GraphicsUtil;
import icy.util.StringUtil;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import org.bioimageanalysis.extension.kernel.roi.descriptor.measure.ROIAreaDescriptor;
import org.bioimageanalysis.extension.kernel.roi.descriptor.measure.ROIPerimeterDescriptor;
import org.bioimageanalysis.extension.kernel.roi.descriptor.measure.ROISurfaceAreaDescriptor;
import org.bioimageanalysis.extension.kernel.roi.descriptor.measure.ROIVolumeDescriptor;
import org.bioimageanalysis.icy.Icy;
import org.bioimageanalysis.icy.common.math.MathUtil;
import org.bioimageanalysis.icy.common.string.StringUtil;
import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin;
import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon;
import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName;
import org.bioimageanalysis.icy.extension.plugin.interface_.PluginDaemon;
import org.bioimageanalysis.icy.gui.GraphicsUtil;
import org.bioimageanalysis.icy.gui.canvas.IcyCanvas;
import org.bioimageanalysis.icy.gui.canvas.IcyCanvas2D;
import org.bioimageanalysis.icy.gui.canvas.Layer;
import org.bioimageanalysis.icy.gui.listener.ActiveViewerListener;
import org.bioimageanalysis.icy.gui.viewer.Viewer;
import org.bioimageanalysis.icy.gui.viewer.ViewerEvent;
import org.bioimageanalysis.icy.model.overlay.Overlay;
import org.bioimageanalysis.icy.model.roi.*;
import org.bioimageanalysis.icy.model.roi.descriptor.IntensityDescriptorInfos;
import org.bioimageanalysis.icy.model.sequence.Sequence;
import org.bioimageanalysis.icy.system.logging.IcyLogger;
import org.bioimageanalysis.icy.system.thread.SingleProcessor;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
......@@ -38,39 +53,40 @@ import java.util.List;
/**
* ROI Tooltip plugin.<br>
* Display a tool tip with extras informations on focused ROI in Canvas2D.
*
* @author Stephane
*
* @author Stephane Dallongeville
*/
public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerListener, ROIListener
{
private class ROICalculator implements Runnable
{
public ROICalculator()
{
@IcyPluginName("ROI Tooltip")
@IcyPluginIcon(path = "/roi-tooltip.png")
public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerListener, ROIListener {
private class ROICalculator implements Runnable {
@Contract(pure = true)
public ROICalculator() {
super();
}
@Override
public void run()
{
public void run() {
final Sequence seq = activeSequence;
final ROI roi = focusedROI;
try
{
if ((seq != null) && (roi != null))
{
intensityInfo = ROIUtil.getIntensityInfo(activeSequence, focusedROI);
try {
if ((seq != null) && (roi != null)) {
//intensityInfo = ROIUtil.getIntensityInfo(activeSequence, focusedROI);
intensityInfo = ROIUtil.computeIntensityDescriptors(focusedROI, activeSequence, true);
points = MathUtil.roundSignificant(roi.getNumberOfPoints(), 2, true);
contourPoints = MathUtil.roundSignificant(roi.getNumberOfContourPoints(), 2, true);
perimeter = ROIUtil.getPerimeter(activeSequence, roi);
area = ROIUtil.getArea(activeSequence, roi);
surfaceArea = ROIUtil.getSurfaceArea(activeSequence, roi);
volume = ROIUtil.getVolume(activeSequence, roi);
//perimeter = ROIUtil.getPerimeter(activeSequence, roi);
perimeter = (Double) ROIUtil.computeDescriptor(ROIPerimeterDescriptor.ID, roi, activeSequence);
//area = ROIUtil.getArea(activeSequence, roi);
area = (Double) ROIUtil.computeDescriptor(ROIAreaDescriptor.ID, roi, activeSequence);
//surfaceArea = ROIUtil.getSurfaceArea(activeSequence, roi);
surfaceArea = (Double) ROIUtil.computeDescriptor(ROISurfaceAreaDescriptor.ID, roi, activeSequence);
//volume = ROIUtil.getVolume(activeSequence, roi);
volume = (Double) ROIUtil.computeDescriptor(ROIVolumeDescriptor.ID, roi, activeSequence);
}
}
catch (Exception e)
{
catch (final Exception e) {
// async process, ROI can change in the meantime
}
......@@ -78,31 +94,25 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
}
}
private class HintOverlay extends Overlay
{
public HintOverlay()
{
private class HintOverlay extends Overlay {
public HintOverlay() {
super("ROI tip", OverlayPriority.TOOLTIP_LOW);
}
private String enlarge(String text, int len)
{
String result = text;
@Contract(pure = true)
private @NotNull String enlarge(final String text, final int len) {
final StringBuilder result = new StringBuilder(text);
while (result.length() < len)
result += ' ';
return result;
result.append(' ');
return result.toString();
}
@Override
public void paint(Graphics2D g, Sequence sequence, IcyCanvas canvas)
{
if (canvas instanceof IcyCanvas2D)
{
final IcyCanvas2D cnv2d = (IcyCanvas2D) canvas;
public void paint(final Graphics2D g, final Sequence sequence, final IcyCanvas canvas) {
if (canvas instanceof final IcyCanvas2D cnv2d) {
ROI roi = sequence.getFocusedROI();
if (roi == null)
{
if (roi == null) {
// search in selected ROI
final ROI2D selectedRoi = sequence.getSelectedROI2D();
......@@ -111,16 +121,16 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
roi = selectedRoi;
}
if (roi != null)
{
if (roi != null) {
roiFocused(roi);
if (roi instanceof ROI2D)
{
if (roi instanceof ROI2D) {
final Rectangle2D bounds = ((ROI2D) roi).getBounds2D();
final List<String> text = new ArrayList<String>();
final String perim = perimeter;
final String surfArea = surfaceArea;
final List<String> text = new ArrayList<>();
//final String perim = perimeter;
final double perim = perimeter;
//final String surfArea = surfaceArea;
final double surfArea = surfaceArea;
// if (processor.isProcessing())
// updatingMark = "*";
......@@ -131,17 +141,19 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
text.add("Position X " + StringUtil.toString(bounds.getX(), 1));
text.add("Size X " + StringUtil.toString(bounds.getWidth(), 1));
text.add("Interior " + StringUtil.toString(points) + " px");
if (!StringUtil.isEmpty(perim))
text.add("Perimeter " + perim);
if (!StringUtil.isEmpty(surfArea))
text.add("Surf. area " + surfArea);
//if (!StringUtil.isEmpty(perim))
if (perim > 0)
text.add("Perimeter " + String.format("%.2f", perim));
//if (!StringUtil.isEmpty(surfArea))
if (surfArea > 0)
text.add("Surf. area " + String.format("%.2f", surfArea));
int maxLength = 0;
for (String t : text)
for (final String t : text)
maxLength = Math.max(maxLength, t.length());
maxLength += 2;
String tooltipText = "";
String tooltipText; // = "";
int ind = 0;
tooltipText = enlarge(text.get(ind++), maxLength);
......@@ -151,23 +163,22 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
tooltipText += enlarge(text.get(ind++), maxLength);
tooltipText += "Contour " + StringUtil.toString(contourPoints) + " px" + "\n";
if (!StringUtil.isEmpty(perim))
{
//if (!StringUtil.isEmpty(perim)) {
if (perim > 0) {
tooltipText += enlarge(text.get(ind++), maxLength);
tooltipText += "Area " + area + "\n";
tooltipText += "Area " + String.format("%.2f", area) + "\n";
}
if (!StringUtil.isEmpty(surfArea))
{
//if (!StringUtil.isEmpty(surfArea)) {
if (surfArea > 0) {
tooltipText += enlarge(text.get(ind++), maxLength);
tooltipText += "Volume " + volume + "\n";
tooltipText += "Volume " + String.format("%.2f", volume) + "\n";
}
if (intensityInfo != null)
{
if (intensityInfo != null) {
tooltipText += "Intensity ";
tooltipText += "min: " + StringUtil.toString(intensityInfo.minIntensity, 1) + " ";
tooltipText += "max: " + StringUtil.toString(intensityInfo.maxIntensity, 1) + " ";
tooltipText += "mean: " + StringUtil.toString(intensityInfo.meanIntensity, 1);
tooltipText += "min: " + StringUtil.toString(intensityInfo.min, 1) + " ";
tooltipText += "max: " + StringUtil.toString(intensityInfo.max, 1) + " ";
tooltipText += "mean: " + StringUtil.toString(intensityInfo.mean, 1);
}
final Graphics2D g2 = (Graphics2D) g.create();
......@@ -194,10 +205,9 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
g2.dispose();
}
else if (roi instanceof ROI3D)
{
else if (roi instanceof ROI3D) {
// not yet supported
IcyLogger.warn(this.getClass(), "ROI3D not supported yet.");
}
}
}
......@@ -214,31 +224,33 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
/**
* ROI calculated infos
*/
IntensityInfo intensityInfo;
//IntensityInfo intensityInfo;
IntensityDescriptorInfos intensityInfo;
double points;
double contourPoints;
String perimeter;
String area;
String surfaceArea;
String volume;
public ROIToolTip()
{
//String perimeter;
double perimeter;
//String area;
double area;
//String surfaceArea;
double surfaceArea;
//String volume;
double volume;
public ROIToolTip() {
super();
overlay = new HintOverlay();
intensityInfo = new IntensityInfo();
intensityInfo = new IntensityDescriptorInfos();
processor = new SingleProcessor(true);
}
void updateInfos()
{
void updateInfos() {
processor.submit(new ROICalculator());
}
@Override
public void init()
{
public void init() {
activeViewer = null;
activeSequence = null;
focusedROI = null;
......@@ -250,24 +262,20 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
}
@Override
public void run()
{
public void run() {
// nothing to do here
}
@Override
public void stop()
{
public void stop() {
Icy.getMainInterface().removeActiveViewerListener(this);
viewerActivated(null);
roiFocused(null);
}
public void sequenceActivated(Sequence sequence)
{
if (activeSequence != sequence)
{
public void sequenceActivated(final Sequence sequence) {
if (activeSequence != sequence) {
if (activeSequence != null)
activeSequence.removeOverlay(overlay);
......@@ -279,10 +287,8 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
}
}
public void roiFocused(ROI roi)
{
if (focusedROI != roi)
{
public void roiFocused(final ROI roi) {
if (focusedROI != roi) {
if (focusedROI != null)
focusedROI.removeListener(this);
......@@ -296,27 +302,22 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
}
@Override
public void roiChanged(ROIEvent event)
{
if (event.getType() == ROIEventType.ROI_CHANGED)
public void roiChanged(final @NotNull ROIEvent event) {
if (event.getType() == ROIEvent.ROIEventType.ROI_CHANGED)
updateInfos();
}
@Override
public void viewerActivated(Viewer viewer)
{
if (activeViewer != viewer)
{
public void viewerActivated(final Viewer viewer) {
if (activeViewer != viewer) {
float alpha = 1f;
if (activeViewer != null)
{
if (activeViewer != null) {
final IcyCanvas canvas = activeViewer.getCanvas();
if (canvas != null)
{
if (canvas != null) {
final Layer layer = canvas.getLayer(overlay);
if (layer != null)
alpha = layer.getAlpha();
alpha = layer.getOpacity();
}
}
......@@ -330,28 +331,24 @@ public class ROIToolTip extends Plugin implements PluginDaemon, ActiveViewerList
sequenceActivated(sequence);
if (activeViewer != null)
{
if (activeViewer != null) {
final IcyCanvas canvas = activeViewer.getCanvas();
if (canvas != null)
{
if (canvas != null) {
final Layer layer = canvas.getLayer(overlay);
if (layer != null)
layer.setAlpha(alpha);
layer.setOpacity(alpha);
}
}
}
}
@Override
public void viewerDeactivated(Viewer viewer)
{
public void viewerDeactivated(final Viewer viewer) {
// nothing here
}
@Override
public void activeViewerChanged(ViewerEvent event)
{
public void activeViewerChanged(final ViewerEvent event) {
// nothing here
}
}
\ No newline at end of file
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment