From 53d6e736a83a6e13fc08a0db147b8adac1c4bd8f Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Wed, 3 Jul 2024 15:15:09 +0200 Subject: [PATCH] updated pom to v3.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 44 +++++++++++++++--- pom.xml | 20 ++++++-- .../java/plugins/adufour/roi/Convexify.java | 42 ++++++++--------- src/main/resources/convexify.png | Bin 0 -> 7421 bytes 4 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 src/main/resources/convexify.png diff --git a/.gitignore b/.gitignore index b2f15ce..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,41 @@ -.idea/ -.settings/ -build/ +/build* +/workspace +setting.xml +release/ target/ -bin/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +icy.log + +### IntelliJ IDEA ### +.idea/ +*.iws *.iml -*.jar +*.ipr + +### Eclipse ### +.apt_generated .classpath +.factorypath .project -export.jardesc -**/.DS_Store \ 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 diff --git a/pom.xml b/pom.xml index 3c8ae15..6f8278b 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,11 @@ <parent> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>pom-icy</artifactId> - <version>2.2.0</version> + <version>3.0.0-a.1</version> </parent> <artifactId>convexify</artifactId> - <version>3.0.0</version> - - <packaging>jar</packaging> + <version>3.0.0-a.1</version> <name>Convexify</name> <description> @@ -21,6 +19,14 @@ </description> <dependencies> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>kernel-extensions</artifactId> + </dependency> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>ezplug</artifactId> + </dependency> <dependency> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>protocols</artifactId> @@ -33,12 +39,16 @@ <groupId>org.bioimageanalysis.icy</groupId> <artifactId>3d-mesh-roi</artifactId> </dependency> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>vecmath</artifactId> + </dependency> </dependencies> <repositories> <repository> <id>icy</id> - <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 diff --git a/src/main/java/plugins/adufour/roi/Convexify.java b/src/main/java/plugins/adufour/roi/Convexify.java index ef15db7..aa48917 100644 --- a/src/main/java/plugins/adufour/roi/Convexify.java +++ b/src/main/java/plugins/adufour/roi/Convexify.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2023. Institut Pasteur. + * Copyright (c) 2010-2024. Institut Pasteur. * * This file is part of Icy. * Icy is free software: you can redistribute it and/or modify @@ -18,12 +18,19 @@ package plugins.adufour.roi; -import icy.roi.ROI; -import icy.roi.ROI2D; -import icy.roi.ROI3D; -import icy.roi.ROIUtil; -import icy.sequence.Sequence; -import icy.type.point.Point3D; +import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DArea; +import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DPolygon; +import org.bioimageanalysis.extension.kernel.roi.roi2d.ROI2DShape; +import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea; +import org.bioimageanalysis.icy.common.geom.point.Point3D; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.model.roi.ROI; +import org.bioimageanalysis.icy.model.roi.ROI2D; +import org.bioimageanalysis.icy.model.roi.ROI3D; +import org.bioimageanalysis.icy.model.roi.ROIUtil; +import org.bioimageanalysis.icy.model.sequence.Sequence; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.tools.roi.ROIBlock; import plugins.adufour.blocks.util.VarList; import plugins.adufour.ezplug.EzPlug; @@ -33,23 +40,18 @@ import plugins.adufour.quickhull.QuickHull2D; import plugins.adufour.quickhull.QuickHull3D; import plugins.adufour.roi.mesh.polygon.ROI3DPolygonalMesh; import plugins.adufour.vars.lang.VarROIArray; -import plugins.kernel.roi.roi2d.ROI2DArea; -import plugins.kernel.roi.roi2d.ROI2DPolygon; -import plugins.kernel.roi.roi2d.ROI2DShape; -import plugins.kernel.roi.roi3d.ROI3DArea; import javax.vecmath.Point3d; import java.awt.geom.Point2D; import java.util.Arrays; import java.util.List; +@IcyPluginName("Convexify") +@IcyPluginIcon(path = "/convexify.png") public class Convexify extends EzPlug implements ROIBlock { private final EzVarSequence input = new EzVarSequence("Input sequence"); - private final EzVarBoolean replace = new EzVarBoolean("Replace existing ROI", false); - private final VarROIArray roiIN = new VarROIArray("List of ROI"); - private final VarROIArray roiOUT = new VarROIArray("List of ROI"); @Override @@ -96,11 +98,11 @@ public class Convexify extends EzPlug implements ROIBlock { * future. * @throws IllegalArgumentException if the specified ROI is not supported */ - public static ROI createConvexROI(final ROI roi) throws IllegalArgumentException { + public static @NotNull ROI createConvexROI(final ROI roi) throws IllegalArgumentException { ROI output = null; try { - if (roi instanceof ROI2D) { + if (roi instanceof final ROI2D roi2d) { final List<Point2D> envelope; if (roi instanceof ROI2DShape) { @@ -118,12 +120,11 @@ public class Convexify extends EzPlug implements ROIBlock { output = new ROI2DPolygon(envelope); // copy position info - final ROI2D roi2d = (ROI2D) roi; ((ROI2D) output).setT(roi2d.getT()); ((ROI2D) output).setZ(roi2d.getZ()); ((ROI2D) output).setC(roi2d.getC()); } - else if (roi instanceof ROI3D) { + else if (roi instanceof final ROI3D roi3d) { final Point3D[] points = ((ROI3D) roi).getBooleanMask(true).getContourPoints(); // convert to vecmath's Point3d @@ -140,7 +141,6 @@ public class Convexify extends EzPlug implements ROIBlock { output = new ROI3DPolygonalMesh(qhull); // copy position info - final ROI3D roi3d = (ROI3D) roi; ((ROI3D) output).setT(roi3d.getT()); ((ROI3D) output).setC(roi3d.getC()); } @@ -162,12 +162,12 @@ public class Convexify extends EzPlug implements ROIBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("Regions of interest", roiIN); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("Regions of interest", roiOUT); } } diff --git a/src/main/resources/convexify.png b/src/main/resources/convexify.png new file mode 100644 index 0000000000000000000000000000000000000000..8b534343c248ab246770930bde041725bc46e0ce GIT binary patch literal 7421 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 literal 0 HcmV?d00001 -- GitLab