From a5843853f2dc42b38a1baee3de80e84c7f084b46 Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Thu, 4 Jul 2024 18:23:36 +0200 Subject: [PATCH] updated pom to v4.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 42 +++++++++++++++-- pom.xml | 19 +++----- .../adufour/distancetransforms/Chamfer3.java | 12 +++-- .../adufour/distancetransforms/Chamfer5.java | 13 ++++-- .../ChamferDistanceTransform.java | 43 ++++++++---------- .../distancetransforms/DistanceTransform.java | 9 ++-- .../distancetransforms/ROIToDistanceMap.java | 12 +++-- src/main/resources/distance-transforms.png | Bin 0 -> 10964 bytes 8 files changed, 96 insertions(+), 54 deletions(-) create mode 100644 src/main/resources/distance-transforms.png diff --git a/.gitignore b/.gitignore index 5fe16eb..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,41 @@ -/ROIToDistanceMap/bin/ -*.jar +/build* +/workspace +setting.xml +release/ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +icy.log + +### IntelliJ IDEA ### .idea/ +*.iws *.iml -.settings/ -.project +*.ipr + +### Eclipse ### +.apt_generated .classpath -target/ +.factorypath +.project +.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 fb3ae4d..5cea329 100644 --- a/pom.xml +++ b/pom.xml @@ -8,12 +8,12 @@ <parent> <artifactId>pom-icy</artifactId> <groupId>org.bioimageanalysis.icy</groupId> - <version>2.2.0</version> + <version>3.0.0-a.1</version> </parent> <!-- Project Information --> <artifactId>roi-to-distance-map</artifactId> - <version>4.0.0</version> + <version>4.0.0-a.1</version> <name>ROI to Distance Map</name> <description>Convert ROI to a Distance Map</description> @@ -62,23 +62,19 @@ <dependencies> <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>protocols</artifactId> + <artifactId>ezplug</artifactId> </dependency> - - <!-- The EzPlug library, simplifies writing UI for Icy plugins. --> <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>ezplug</artifactId> + <artifactId>protocols</artifactId> </dependency> - <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>3d-mesh-roi</artifactId> + <artifactId>kernel-extensions</artifactId> </dependency> - <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>icy-bioformats</artifactId> + <artifactId>3d-mesh-roi</artifactId> </dependency> </dependencies> @@ -86,8 +82,7 @@ <repositories> <repository> <id>icy</id> - <name>Icy's Nexus</name> - <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + <url>https://nexus.pasteur.cloud/repository/icy/</url> </repository> </repositories> </project> diff --git a/src/main/java/plugins/adufour/distancetransforms/Chamfer3.java b/src/main/java/plugins/adufour/distancetransforms/Chamfer3.java index 0ca266a..4087f44 100644 --- a/src/main/java/plugins/adufour/distancetransforms/Chamfer3.java +++ b/src/main/java/plugins/adufour/distancetransforms/Chamfer3.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,6 +18,10 @@ package plugins.adufour.distancetransforms; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; + /** * Pseudo-Euclidean distance transform based on a two-pass sweeping algorithm using a 3x3 (in 2D) or * 3x3x3 (in 3D) chamfer mask. <br> @@ -35,9 +39,11 @@ package plugins.adufour.distancetransforms; * * @author Alexandre Dufour */ +@IcyPluginName("Chamfer 3") +@IcyPluginIcon(path = "/distance-transforms.png") public class Chamfer3 extends ChamferDistanceTransform { @Override - public void updateUnsignedChamferDistance2D(final float[] map, final int width, final float planarLateralDistance) { + public void updateUnsignedChamferDistance2D(final float @NotNull [] map, final int width, final float planarLateralDistance) { final double xy2 = planarLateralDistance * planarLateralDistance; final float planarDiagonalDistance = (float) Math.sqrt(xy2 + xy2); @@ -95,7 +101,7 @@ public class Chamfer3 extends ChamferDistanceTransform { } @Override - public void updateUnsignedChamferDistance3D(final float[][] map, final int width, final float planoLateralDistance, final float axioLateralDistance) { + public void updateUnsignedChamferDistance3D(final float @NotNull [] @NotNull [] map, final int width, final float planoLateralDistance, final float axioLateralDistance) { final double xy2 = planoLateralDistance * planoLateralDistance; final double xz2 = axioLateralDistance * axioLateralDistance; final float planoDiagonalDistance = (float) Math.sqrt(xy2 + xy2); diff --git a/src/main/java/plugins/adufour/distancetransforms/Chamfer5.java b/src/main/java/plugins/adufour/distancetransforms/Chamfer5.java index 7682d74..0696d08 100644 --- a/src/main/java/plugins/adufour/distancetransforms/Chamfer5.java +++ b/src/main/java/plugins/adufour/distancetransforms/Chamfer5.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,6 +18,10 @@ package plugins.adufour.distancetransforms; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; + /** * Pseudo-Euclidean distance transform based on a two-pass sweeping algorithm using a 5x5 (in 2D) or * 5x5x5 (in 3D) chamfer mask. <br> @@ -40,9 +44,11 @@ package plugins.adufour.distancetransforms; * * @author Alexandre Dufour */ +@IcyPluginName("Chamfer 5") +@IcyPluginIcon(path = "/distance-transforms.png") public class Chamfer5 extends ChamferDistanceTransform { @Override - public void updateUnsignedChamferDistance2D(final float[] map, final int width, final float lateralDistance) { + public void updateUnsignedChamferDistance2D(final float @NotNull [] map, final int width, final float lateralDistance) { // pre-calculate distances final float a = lateralDistance; final float b = (float) Math.sqrt(a * a + a * a); @@ -121,8 +127,9 @@ public class Chamfer5 extends ChamferDistanceTransform { } } + // TODO: Make this method more simple @Override - public void updateUnsignedChamferDistance3D(final float[][] map, final int width, final float planarLateralDistance, final float axialLateralDistance) { + public void updateUnsignedChamferDistance3D(final float @NotNull [] @NotNull [] map, final int width, final float planarLateralDistance, final float axialLateralDistance) { // 2D distances final float xySq = planarLateralDistance * planarLateralDistance; final float b = (float) Math.sqrt(xySq + xySq); diff --git a/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.java b/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.java index 1ee632d..bbe2ed7 100644 --- a/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.java +++ b/src/main/java/plugins/adufour/distancetransforms/ChamferDistanceTransform.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,21 +18,18 @@ package plugins.adufour.distancetransforms; -import icy.common.Version; -import icy.image.IcyBufferedImage; -import icy.main.Icy; -import icy.roi.ROI; -import icy.roi.ROI2D; -import icy.roi.ROI3D; -import icy.sequence.Sequence; -import icy.sequence.SequenceDataIterator; -import icy.type.DataIteratorUtil; -import icy.type.DataType; -import icy.type.collection.array.Array1DUtil; -import icy.util.OMEUtil; +import org.bioimageanalysis.extension.kernel.roi.roi3d.ROI3DArea; +import org.bioimageanalysis.icy.common.collection.array.Array1DUtil; +import org.bioimageanalysis.icy.common.type.DataIteratorUtil; +import org.bioimageanalysis.icy.common.type.DataType; +import org.bioimageanalysis.icy.model.OMEUtil; +import org.bioimageanalysis.icy.model.image.IcyBufferedImage; +import org.bioimageanalysis.icy.model.roi.ROI; +import org.bioimageanalysis.icy.model.roi.ROI3D; +import org.bioimageanalysis.icy.model.sequence.Sequence; +import org.bioimageanalysis.icy.model.sequence.SequenceDataIterator; +import org.jetbrains.annotations.NotNull; import plugins.adufour.roi.mesh.ROI3DMesh; -import plugins.kernel.roi.roi3d.ROI3DArea; -import plugins.kernel.roi.roi3d.ROI3DStack; import java.util.ArrayList; import java.util.Arrays; @@ -41,12 +38,12 @@ import java.util.concurrent.Future; public abstract class ChamferDistanceTransform extends DistanceTransform { @Override - public Sequence createDistanceMap(final Sequence input, final int channel, final double threshold, final boolean invertMap, final boolean useRealUnits) { + public Sequence createDistanceMap(final @NotNull Sequence input, final int channel, final double threshold, final boolean invertMap, final boolean useRealUnits) { final int width = input.getSizeX(); final int height = input.getSizeY(); final int depth = input.getSizeZ(); final int time = input.getSizeT(); - final DataType type = input.getDataType_(); + final DataType type = input.getDataType(); final int maxDistance = width * height * depth; @@ -92,7 +89,7 @@ public abstract class ChamferDistanceTransform extends DistanceTransform { * @return sequence */ @Override - public Sequence createDistanceMap(final Sequence sequence, final boolean mapOnlySelectedROI, final boolean invertMap, final boolean useRealUnits) throws InterruptedException { + public Sequence createDistanceMap(final @NotNull Sequence sequence, final boolean mapOnlySelectedROI, final boolean invertMap, final boolean useRealUnits) throws InterruptedException { final List<ROI> rois = mapOnlySelectedROI ? sequence.getSelectedROIs() : sequence.getROIs(); String title = "Distance map "; @@ -121,17 +118,17 @@ public abstract class ChamferDistanceTransform extends DistanceTransform { // Fill the ROI with the default distance // Warning: Icy <= 1.8.6 have an issue with the data iterator - final Version patch = new Version(1, 8, 6); + //final Version patch = new Version(1, 8, 6); for (final ROI r : rois) { - if (Icy.version.isLowerOrEqual(patch) && r instanceof ROI3DStack) { - final ROI3DStack<?> stack = (ROI3DStack<?>) r; + /*if (Icy.VERSION.isLowerOrEqual(patch) && r instanceof final ROI3DStack<?> stack) { for (final ROI2D slice : stack) { final SequenceDataIterator iterator = new SequenceDataIterator(output, slice, true); DataIteratorUtil.set(iterator, maxDistance); } } - else if (r instanceof ROI3DMesh) { + else*/ + if (r instanceof ROI3DMesh) { final ROI3D rea = new ROI3DArea(((ROI3D) r).getBooleanMask(true)); rea.setC(((ROI3D) r).getC()); rea.setT(((ROI3D) r).getT()); @@ -150,7 +147,7 @@ public abstract class ChamferDistanceTransform extends DistanceTransform { return output; } - private void updateUnsignedChamferDistance(final Sequence output, final boolean useRealUnits) { + private void updateUnsignedChamferDistance(final @NotNull Sequence output, final boolean useRealUnits) { final int width = output.getSizeX(); final int length = output.getSizeT(); diff --git a/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.java b/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.java index 8a7868d..1cb7080 100644 --- a/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.java +++ b/src/main/java/plugins/adufour/distancetransforms/DistanceTransform.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,14 +18,13 @@ package plugins.adufour.distancetransforms; -import icy.plugin.abstract_.Plugin; -import icy.plugin.interface_.PluginLibrary; -import icy.sequence.Sequence; +import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin; +import org.bioimageanalysis.icy.model.sequence.Sequence; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public abstract class DistanceTransform extends Plugin implements PluginLibrary { +public abstract class DistanceTransform extends Plugin { protected static ExecutorService multiThreadService = Executors.newCachedThreadPool(); /** diff --git a/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java b/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java index 358fe29..172cf7b 100644 --- a/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java +++ b/src/main/java/plugins/adufour/distancetransforms/ROIToDistanceMap.java @@ -18,7 +18,10 @@ package plugins.adufour.distancetransforms; -import icy.sequence.Sequence; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.model.sequence.Sequence; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.lang.Block; import plugins.adufour.blocks.util.VarList; import plugins.adufour.ezplug.EzPlug; @@ -27,6 +30,8 @@ import plugins.adufour.ezplug.EzVarPlugin; import plugins.adufour.ezplug.EzVarSequence; import plugins.adufour.vars.lang.VarSequence; +@IcyPluginName("ROI to Distance Map") +@IcyPluginIcon(path = "/distance-transforms.png") public class ROIToDistanceMap extends EzPlug implements Block { EzVarSequence sequence = new EzVarSequence("Sequence"); @@ -41,7 +46,7 @@ public class ROIToDistanceMap extends EzPlug implements Block { VarSequence map = new VarSequence("Distance map", null); @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("Use ROI from", sequence.getVariable()); inputMap.add("Algorithm", transform.getVariable()); inputMap.add("Invert map", invert.getVariable()); @@ -49,7 +54,7 @@ public class ROIToDistanceMap extends EzPlug implements Block { } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("Distance map", map); } @@ -64,6 +69,7 @@ public class ROIToDistanceMap extends EzPlug implements Block { setTimeDisplay(true); } + @SuppressWarnings("resource") @Override protected void execute() { try { diff --git a/src/main/resources/distance-transforms.png b/src/main/resources/distance-transforms.png new file mode 100644 index 0000000000000000000000000000000000000000..0a94830619320fe2524441b7180769d3196dc1c8 GIT binary patch literal 10964 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 C%;^RI literal 0 HcmV?d00001 -- GitLab