From c4e9281264f0ef1067e6bda5cc132f5e8f1b5171 Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Sun, 7 Jul 2024 00:48:58 +0200 Subject: [PATCH] updated pom to v2.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 41 +++- StackRotation.jar | Bin 4275 -> 0 bytes export.jardesc | 16 -- pom.xml | 52 +---- .../spop/rotation3D/StackRotation.class | Bin 4632 -> 0 bytes .../spop/rotation3D/StackRotation.java | 209 +++++++++--------- src/main/resources/stack-rotation.png | Bin 0 -> 5004 bytes 7 files changed, 148 insertions(+), 170 deletions(-) delete mode 100644 StackRotation.jar delete mode 100644 export.jardesc delete mode 100644 src/main/java/plugins/spop/rotation3D/StackRotation.class create mode 100644 src/main/resources/stack-rotation.png diff --git a/.gitignore b/.gitignore index 3d47f98..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,41 @@ -.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 diff --git a/StackRotation.jar b/StackRotation.jar deleted file mode 100644 index a18d426e7d854c66773851fa79c5c553782d1ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4275 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 diff --git a/export.jardesc b/export.jardesc deleted file mode 100644 index 7f140a2..0000000 --- a/export.jardesc +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?> -<jardesc> - <jar path="Stack Rotation/StackRotation.jar"/> - <options buildIfNeeded="true" compress="true" descriptionLocation="/Stack Rotation/export.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="true" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/> - <storedRefactorings deprecationInfo="true" structuralOnly="false"/> - <selectedProjects/> - <manifest generateManifest="true" manifestLocation="/Icy-Updater/META-INF/MANIFEST.MF" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true"> - <sealing sealJar="false"> - <packagesToSeal/> - <packagesToUnSeal/> - </sealing> - </manifest> - <selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false"> - <javaElement handleIdentifier="=Stack Rotation/src"/> - </selectedElements> -</jardesc> diff --git a/pom.xml b/pom.xml index 0f93d48..b3da942 100644 --- a/pom.xml +++ b/pom.xml @@ -6,20 +6,17 @@ <!-- Inherited Icy Parent POM --> <parent> - <artifactId>pom-icy</artifactId> + <artifactId>pom-icy</artifactId> <groupId>org.bioimageanalysis.icy</groupId> - <version>2.0.0</version> - </parent> + <version>3.0.0-a.1</version> + </parent> <!-- Project Information --> <artifactId>stack-rotation</artifactId> - <version>1.2.1</version> - - <packaging>jar</packaging> + <version>2.0.0-a.1</version> <name>Stack Rotation</name> - <description>Rotate the 3D stack from Front view to Right view or from Front view to Top view. </description> - <url></url> + <description>Rotate the 3D stack from Front view to Right view or from Front view to Top view.</description> <inceptionYear>2020</inceptionYear> <organization> @@ -53,55 +50,22 @@ </developer> </developers> - <!-- Project properties --> - <properties> - - </properties> - - <profiles> - <profile> - <id>icy-plugin</id> - <activation> - <activeByDefault>true</activeByDefault> - </activation> - </profile> - </profiles> - - <!-- List of project's dependencies --> <dependencies> - <!-- The core of Icy --> <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>icy-kernel</artifactId> - <version>${icy-kernel.version}</version> - </dependency> - - <dependency> - <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>blockvars</artifactId> - <version>${blockvars.version}</version> + <artifactId>ezplug</artifactId> </dependency> - - <!-- The EzPlug library, simplifies writing UI for Icy plugins. --> <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>ezplug</artifactId> - <version>${ezplug.version}</version> + <artifactId>protocols</artifactId> </dependency> - - <dependency> - <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>icy-bioformats</artifactId> - <version>${icy-bioformats.version}</version> - </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 diff --git a/src/main/java/plugins/spop/rotation3D/StackRotation.class b/src/main/java/plugins/spop/rotation3D/StackRotation.class deleted file mode 100644 index 68074344ee33ae06c785a18f06198858479a547b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4632 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 diff --git a/src/main/java/plugins/spop/rotation3D/StackRotation.java b/src/main/java/plugins/spop/rotation3D/StackRotation.java index 95aa806..2bf56eb 100644 --- a/src/main/java/plugins/spop/rotation3D/StackRotation.java +++ b/src/main/java/plugins/spop/rotation3D/StackRotation.java @@ -1,168 +1,163 @@ +/* + * 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.spop.rotation3D; -import icy.image.IcyBufferedImage; -import icy.sequence.Sequence; -import icy.type.collection.array.Array1DUtil; -import icy.util.OMEUtil; +import org.bioimageanalysis.icy.common.collection.array.Array1DUtil; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.model.OMEUtil; +import org.bioimageanalysis.icy.model.image.IcyBufferedImage; +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; import plugins.adufour.ezplug.EzVarSequence; import plugins.adufour.ezplug.EzVarText; -public class StackRotation extends EzPlug implements Block -{ - - EzVarSequence input = new EzVarSequence("Input"); - EzVarText type = new EzVarText("Type", new String[] { "FrontToRight", "FrontToTop" }, false); +@IcyPluginName("Stack Rotation") +@IcyPluginIcon(path = "/stack-rotation.png") +public class StackRotation extends EzPlug implements Block { + EzVarSequence input = new EzVarSequence("Input"); + EzVarText type = new EzVarText("Type", new String[]{"FrontToRight", "FrontToTop"}, false); // VarSequence output = new VarSequence("Output", false); - + EzVarSequence output = new EzVarSequence("Output"); - + @Override - public void initialize() - { - // TODO Auto-generated method stub + public void initialize() { super.addEzComponent(input); super.addEzComponent(type); // super.addOutput(output); super.setTimeDisplay(true); - + } - + @Override - public void execute() - { - - Sequence sequence = input.getValue(true); + public void execute() { + final Sequence sequence = input.getValue(true); Sequence seq_out = new Sequence(OMEUtil.createOMEXMLMetadata(sequence.getOMEXMLMetadata())); - if (type.getValue().equalsIgnoreCase("FrontToRight")) - { + if (type.getValue().equalsIgnoreCase("FrontToRight")) { seq_out = FrontToRight(sequence); seq_out.setName("FrontToRight"); } - if (type.getValue().equalsIgnoreCase("FrontToTop")) - { + if (type.getValue().equalsIgnoreCase("FrontToTop")) { seq_out = FrontToTop(sequence); seq_out.setName("FrontToTop"); - + } - + if (getUI() != null) addSequence(seq_out); output.setValue(seq_out); - } - - public static Sequence FrontToRight(Sequence sequence) - { - - int z = 0; - - Sequence seq = new Sequence(); - - int dim_x = sequence.getSizeX(); - int dim_y = sequence.getSizeY(); - int dim_z = sequence.getSizeZ(); - int dim_t = sequence.getSizeT(); - int dim_c = sequence.getSizeC(); - double[][] tab = new double[dim_z][dim_x * dim_y]; - double[][][] tab_r = new double[dim_c][dim_x][dim_y * dim_z]; - - for (int t = 0; t < dim_t; t++) - { - for (int c = 0; c < dim_c; c++) - { - for (z = 0; z < dim_z; z++) - { + + public static @NotNull Sequence FrontToRight(final @NotNull Sequence sequence) { + int z; // = 0; + + final Sequence seq = new Sequence(); + + final int dim_x = sequence.getSizeX(); + final int dim_y = sequence.getSizeY(); + final int dim_z = sequence.getSizeZ(); + final int dim_t = sequence.getSizeT(); + final int dim_c = sequence.getSizeC(); + final double[][] tab = new double[dim_z][dim_x * dim_y]; + final double[][][] tab_r = new double[dim_c][dim_x][dim_y * dim_z]; + + for (int t = 0; t < dim_t; t++) { + for (int c = 0; c < dim_c; c++) { + for (z = 0; z < dim_z; z++) { tab[z] = Array1DUtil.arrayToDoubleArray(sequence.getDataXY(t, z, c), false); } for (z = 0; z < dim_z; z++) for (int y = 0; y < dim_y; y++) - for (int x = 0; x < dim_x; x++) - { + for (int x = 0; x < dim_x; x++) { tab_r[c][x][y * dim_z + z] = tab[z][y * dim_x + x]; } } - - for (z = 0; z < dim_x; z++) - { - IcyBufferedImage Icy = new IcyBufferedImage(dim_z, dim_y, dim_c, sequence.getDataType()); + + for (z = 0; z < dim_x; z++) { + final IcyBufferedImage Icy = new IcyBufferedImage(dim_z, dim_y, dim_c, sequence.getDataType()); for (int c = 0; c < dim_c; c++) Icy.setDataXY(c, tab_r[c][z]); seq.setImage(t, z, Icy); } } - + System.gc(); return seq; - } - - public static Sequence FrontToTop(Sequence sequence) - { - - int z = 0; - - Sequence seq = new Sequence(); - - int dim_x = sequence.getSizeX(); - int dim_y = sequence.getSizeY(); - int dim_z = sequence.getSizeZ(); - int dim_t = sequence.getSizeT(); - int dim_c = sequence.getSizeC(); - double[][] tab = new double[dim_z][dim_x * dim_y]; - double[][][] tab_r = new double[dim_c][dim_y][dim_x * dim_z]; - - for (int t = 0; t < dim_t; t++) - { - for (int c = 0; c < dim_c; c++) - { - for (z = 0; z < dim_z; z++) - { + + public static @NotNull Sequence FrontToTop(final @NotNull Sequence sequence) { + int z; // = 0; + + final Sequence seq = new Sequence(); + + final int dim_x = sequence.getSizeX(); + final int dim_y = sequence.getSizeY(); + final int dim_z = sequence.getSizeZ(); + final int dim_t = sequence.getSizeT(); + final int dim_c = sequence.getSizeC(); + final double[][] tab = new double[dim_z][dim_x * dim_y]; + final double[][][] tab_r = new double[dim_c][dim_y][dim_x * dim_z]; + + for (int t = 0; t < dim_t; t++) { + for (int c = 0; c < dim_c; c++) { + for (z = 0; z < dim_z; z++) { tab[z] = Array1DUtil.arrayToDoubleArray(sequence.getDataXY(t, z, c), false); } for (z = 0; z < dim_z; z++) for (int y = 0; y < dim_y; y++) - for (int x = 0; x < dim_x; x++) - { - tab_r[c][y][z * dim_x + x] = tab[z][y * dim_x + x]; - } + if (dim_x >= 0) System.arraycopy( + tab[z], + y * dim_x, // + 0, + tab_r[c][y], + z * dim_x, // + 0, + dim_x); } - - for (z = 0; z < dim_y; z++) - { - IcyBufferedImage Icy = new IcyBufferedImage(dim_x, dim_z, dim_c, sequence.getDataType()); + + for (z = 0; z < dim_y; z++) { + final IcyBufferedImage Icy = new IcyBufferedImage(dim_x, dim_z, dim_c, sequence.getDataType()); for (int c = 0; c < dim_c; c++) Icy.setDataXY(c, tab_r[c][z]); seq.setImage(t, z, Icy); } } - + System.gc(); - + return seq; - + } - - public void clean() - { + + @Override + public void clean() { } - + @Override - public void declareInput(VarList inputMap) - { - // TODO Auto-generated method stub - inputMap.add(input.getVariable()); - inputMap.add(type.getVariable()); - + public void declareInput(final @NotNull VarList inputMap) { + inputMap.add("input", input.getVariable()); + inputMap.add("type", type.getVariable()); } - + @Override - public void declareOutput(VarList outputMap) - { - // TODO Auto-generated method stub - outputMap.add(output.getVariable()); - + public void declareOutput(final @NotNull VarList outputMap) { + outputMap.add("output", output.getVariable()); } - } diff --git a/src/main/resources/stack-rotation.png b/src/main/resources/stack-rotation.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cc1e6b51e3d791f92dbed0c81e0e91cde0085f GIT binary patch literal 5004 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 WUG7~4Va%ie0000<MNUMnLSTXstEPYe literal 0 HcmV?d00001 -- GitLab