From 9a2d5e060cdff7590d173fbab271e18ef1ea4d5c Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Tue, 2 Jul 2024 14:05:46 +0200 Subject: [PATCH] updated pom to v2.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 45 ++++++++++++++---- pom.xml | 14 ++++-- .../block/AbstractMicroscopeBlock.java | 15 +++--- .../micromanager/block/MicroscopyBlocks.java | 10 ++-- .../block/capture/MicroscopeGetMetadata.java | 18 +++---- .../capture/MicroscopeSetTaggedImage.java | 14 +++--- .../block/capture/MicroscopeSnapChannels.java | 20 ++++---- .../block/capture/MicroscopeSnapImage.java | 16 +++---- .../micromanager/block/lang/VarChannels.java | 4 +- .../block/lang/VarChannelsEditor.java | 5 +- .../micromanager/block/lang/VarMMGroup.java | 6 +-- .../micromanager/block/lang/VarMMPreset.java | 9 ++-- .../block/lang/VarMultiStagePosition.java | 9 +++- .../block/setting/MicroscopeChannels.java | 6 ++- .../block/setting/MicroscopeGetBinning.java | 11 +++-- .../block/setting/MicroscopeGetExposure.java | 11 +++-- .../block/setting/MicroscopePositions.java | 9 +++- .../block/setting/MicroscopeSetBinning.java | 11 +++-- .../block/setting/MicroscopeSetConfig.java | 9 +++- .../block/setting/MicroscopeSetExposure.java | 11 +++-- .../block/setting/MicroscopeSetShutter.java | 11 +++-- .../block/stage/MicroscopeGetStageXYZ.java | 13 +++-- .../stage/MicroscopeSetStagePosition.java | 8 +++- .../block/stage/MicroscopeSetStageXY.java | 11 +++-- .../block/stage/MicroscopeSetStageZ.java | 11 +++-- .../block/tool/TaggedImageToIcyImage.java | 22 ++++----- src/main/resources/mm_blocks.png | Bin 0 -> 17218 bytes 27 files changed, 215 insertions(+), 114 deletions(-) create mode 100644 src/main/resources/mm_blocks.png diff --git a/.gitignore b/.gitignore index d4c3a6c..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +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 -*.eml -*.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 1ac5ed6..2c74297 100644 --- a/pom.xml +++ b/pom.xml @@ -7,11 +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>micromanager-block</artifactId> - <version>2.0.0</version> + <version>2.0.0-a.1</version> <name>Micro-Manager Block</name> <description> @@ -21,19 +21,23 @@ <dependencies> <dependency> <groupId>org.bioimageanalysis.icy</groupId> - <artifactId>micromanager</artifactId> + <artifactId>ezplug</artifactId> </dependency> - <dependency> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>protocols</artifactId> </dependency> + + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>micromanager</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/stef/micromanager/block/AbstractMicroscopeBlock.java b/src/main/java/plugins/stef/micromanager/block/AbstractMicroscopeBlock.java index 24ba799..1988b78 100644 --- a/src/main/java/plugins/stef/micromanager/block/AbstractMicroscopeBlock.java +++ b/src/main/java/plugins/stef/micromanager/block/AbstractMicroscopeBlock.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,18 +18,19 @@ package plugins.stef.micromanager.block; -import icy.gui.dialog.MessageDialog; -import icy.plugin.abstract_.Plugin; -import icy.plugin.interface_.PluginBundled; -import icy.plugin.interface_.PluginLibrary; import mmcorej.CMMCore; +import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin; +import org.bioimageanalysis.icy.extension.plugin.interface_.PluginBundled; +import org.bioimageanalysis.icy.extension.plugin.interface_.PluginLibrary; +import org.bioimageanalysis.icy.gui.dialog.MessageDialog; +import org.jetbrains.annotations.Nullable; import org.micromanager.utils.ReportingUtils; import plugins.adufour.blocks.lang.Block; import plugins.tprovoost.Microscopy.MicroManager.MicroManager; import plugins.tprovoost.Microscopy.MicroManagerForIcy.MicromanagerPlugin; /** - * @author Stephane + * @author Stephane Dallongeville */ public abstract class AbstractMicroscopeBlock extends Plugin implements Block, PluginLibrary, PluginBundled { public AbstractMicroscopeBlock() { @@ -46,7 +47,7 @@ public abstract class AbstractMicroscopeBlock extends Plugin implements Block, P return MicroscopyBlocks.class.getName(); } - public static CMMCore getMMCore(final boolean throwException) { + public static @Nullable CMMCore getMMCore(final boolean throwException) { try { return MicroManager.getCore(); } diff --git a/src/main/java/plugins/stef/micromanager/block/MicroscopyBlocks.java b/src/main/java/plugins/stef/micromanager/block/MicroscopyBlocks.java index a61fa17..7d7d331 100644 --- a/src/main/java/plugins/stef/micromanager/block/MicroscopyBlocks.java +++ b/src/main/java/plugins/stef/micromanager/block/MicroscopyBlocks.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,9 +18,13 @@ package plugins.stef.micromanager.block; -import icy.plugin.abstract_.Plugin; -import icy.plugin.interface_.PluginLibrary; +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_.PluginLibrary; +@IcyPluginName("Microscopy Blocks") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopyBlocks extends Plugin implements PluginLibrary { public MicroscopyBlocks() { super(); diff --git a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeGetMetadata.java b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeGetMetadata.java index bd0f6c2..1c89110 100644 --- a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeGetMetadata.java +++ b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeGetMetadata.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,9 @@ package plugins.stef.micromanager.block.capture; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import org.json.JSONObject; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.Var; @@ -28,8 +31,10 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; /** * Retrieve global acquisition metadata and last acquired image metadata (Micro-Manager) * - * @author Stephane + * @author Stephane Dallongeville */ +@IcyPluginName("Get Micro-Manager Metadata") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeGetMetadata extends AbstractMicroscopeBlock { VarInteger channel = new VarInteger("Channel", 0); Var<JSONObject> metadata = new Var<>("Image metadata", JSONObject.class); @@ -42,18 +47,13 @@ public class MicroscopeGetMetadata extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("channel", channel); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("imageMetadata", metadata); outputMap.add("acqMetadata", acqMetadata); } - - @Override - public String getName() { - return "Get Micro-Manager Metadata"; - } } diff --git a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSetTaggedImage.java b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSetTaggedImage.java index a6b9882..25a3c1f 100644 --- a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSetTaggedImage.java +++ b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSetTaggedImage.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 @@ -19,6 +19,9 @@ package plugins.stef.micromanager.block.capture; import mmcorej.TaggedImage; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarArray; import plugins.adufour.vars.lang.VarInteger; @@ -32,6 +35,8 @@ import plugins.tprovoost.Microscopy.MicroManager.tools.MMUtils; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Tagged Image(s)") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetTaggedImage extends AbstractMicroscopeBlock { VarArray<TaggedImage> taggedImages = new VarArray<>("Tagged image(s)", TaggedImage[].class, new TaggedImage[0]); VarSequence seq = new VarSequence("Sequence", null); @@ -66,7 +71,7 @@ public class MicroscopeSetTaggedImage extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("taggedImage", taggedImages); inputMap.add("seq", seq); inputMap.add("t", posT); @@ -81,9 +86,4 @@ public class MicroscopeSetTaggedImage extends AbstractMicroscopeBlock { public void declareOutput(final VarList outputMap) { // } - - @Override - public String getName() { - return "Set Tagged Image(s)"; - } } diff --git a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapChannels.java b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapChannels.java index 05c7845..062fb61 100644 --- a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapChannels.java +++ b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapChannels.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 @@ -21,11 +21,14 @@ package plugins.stef.micromanager.block.capture; import java.util.ArrayList; import java.util.List; +import org.bioimageanalysis.icy.common.string.StringUtil; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import org.json.JSONObject; import org.micromanager.utils.ChannelSpec; import org.micromanager.utils.MDUtils; -import icy.util.StringUtil; import mmcorej.TaggedImage; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarArray; @@ -41,8 +44,10 @@ import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; * Snap multi channel image (Micro-Manager) * Class in standby until an EzPlug fix * - * @author Stephane + * @author Stephane Dallongeville */ +@IcyPluginName("Snap Channel(s)") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSnapChannels extends AbstractMicroscopeBlock { VarObject trigger; VarMMGroup group; @@ -130,19 +135,14 @@ public class MicroscopeSnapChannels extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("group", group); inputMap.add("channels", channels); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("out", out); } - - @Override - public String getName() { - return "Snap Channel(s)"; - } } diff --git a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapImage.java b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapImage.java index 7105ac8..1e47dd9 100644 --- a/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapImage.java +++ b/src/main/java/plugins/stef/micromanager/block/capture/MicroscopeSnapImage.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 @@ -19,6 +19,9 @@ package plugins.stef.micromanager.block.capture; import mmcorej.TaggedImage; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarArray; import plugins.adufour.vars.lang.VarObject; @@ -33,6 +36,8 @@ import java.util.List; * * @author Stephane Dallongeville */ +@IcyPluginName("Snap Image") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSnapImage extends AbstractMicroscopeBlock { VarArray<TaggedImage> out = new VarArray<>("Tagged image(s)", TaggedImage[].class, new TaggedImage[0]); VarObject trigger = new VarObject("Trigger", null); @@ -52,17 +57,12 @@ public class MicroscopeSnapImage extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("out", out); } - - @Override - public String getName() { - return "Snap Image"; - } } diff --git a/src/main/java/plugins/stef/micromanager/block/lang/VarChannels.java b/src/main/java/plugins/stef/micromanager/block/lang/VarChannels.java index 005b165..f97cb80 100644 --- a/src/main/java/plugins/stef/micromanager/block/lang/VarChannels.java +++ b/src/main/java/plugins/stef/micromanager/block/lang/VarChannels.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,7 +18,7 @@ package plugins.stef.micromanager.block.lang; -import icy.type.collection.CollectionUtil; +import org.bioimageanalysis.icy.common.collection.CollectionUtil; import org.micromanager.utils.ChannelSpec; import plugins.adufour.vars.gui.VarEditor; import plugins.adufour.vars.lang.Var; diff --git a/src/main/java/plugins/stef/micromanager/block/lang/VarChannelsEditor.java b/src/main/java/plugins/stef/micromanager/block/lang/VarChannelsEditor.java index 67d70d7..0342b5f 100644 --- a/src/main/java/plugins/stef/micromanager/block/lang/VarChannelsEditor.java +++ b/src/main/java/plugins/stef/micromanager/block/lang/VarChannelsEditor.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 @@ -86,8 +86,7 @@ public class VarChannelsEditor extends VarEditor<ChannelSpec[]> { }); final JButton upButton = new JButton("Up"); - upButton.setToolTipText(TooltipTextMaker - .addHTMLBreaksForTooltip("Move currently selected channel up (Channels higher on list are acquired first)")); + upButton.setToolTipText(TooltipTextMaker.addHTMLBreaksForTooltip("Move currently selected channel up (Channels higher on list are acquired first)")); upButton.addActionListener(e -> { final int sel = table.getSelectedRow(); diff --git a/src/main/java/plugins/stef/micromanager/block/lang/VarMMGroup.java b/src/main/java/plugins/stef/micromanager/block/lang/VarMMGroup.java index ecf62f7..dbe80b2 100644 --- a/src/main/java/plugins/stef/micromanager/block/lang/VarMMGroup.java +++ b/src/main/java/plugins/stef/micromanager/block/lang/VarMMGroup.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 @@ -27,7 +27,7 @@ import java.util.List; /** * EzVar representing Micro-Manager config group. * - * @author Stephane + * @author Stephane Dallongeville */ public class VarMMGroup extends VarString { public VarMMGroup(final String name) { @@ -36,7 +36,7 @@ public class VarMMGroup extends VarString { final List<String> groups = MicroManager.getConfigGroups(); if (!groups.isEmpty()) - setDefaultEditorModel(new ValueSelectionModel<>(groups.toArray(new String[0]), groups.get(0), false)); + setDefaultEditorModel(new ValueSelectionModel<>(groups.toArray(new String[0]), groups.getFirst(), false)); } public VarMMGroup() { diff --git a/src/main/java/plugins/stef/micromanager/block/lang/VarMMPreset.java b/src/main/java/plugins/stef/micromanager/block/lang/VarMMPreset.java index f6952b4..af62c44 100644 --- a/src/main/java/plugins/stef/micromanager/block/lang/VarMMPreset.java +++ b/src/main/java/plugins/stef/micromanager/block/lang/VarMMPreset.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,7 @@ package plugins.stef.micromanager.block.lang; +import org.jetbrains.annotations.NotNull; import plugins.adufour.vars.gui.model.ValueSelectionModel; import plugins.adufour.vars.lang.Var; import plugins.adufour.vars.lang.VarString; @@ -29,10 +30,10 @@ import java.util.List; /** * EzVar representing Micro-Manager config preset. * - * @author Stephane + * @author Stephane Dallongeville */ public class VarMMPreset extends VarString { - public VarMMPreset(final String name, final VarMMGroup groupVar) { + public VarMMPreset(final String name, final @NotNull VarMMGroup groupVar) { super(name, ""); // set values @@ -60,7 +61,7 @@ public class VarMMPreset extends VarString { final List<String> presets = MicroManager.getConfigs(group); if (!presets.isEmpty()) - setDefaultEditorModel(new ValueSelectionModel<>(presets.toArray(new String[0]), presets.get(0), false)); + setDefaultEditorModel(new ValueSelectionModel<>(presets.toArray(new String[0]), presets.getFirst(), false)); else setDefaultEditorModel(new ValueSelectionModel<>(new String[]{""}, "", false)); } diff --git a/src/main/java/plugins/stef/micromanager/block/lang/VarMultiStagePosition.java b/src/main/java/plugins/stef/micromanager/block/lang/VarMultiStagePosition.java index 656ff7d..c40882d 100644 --- a/src/main/java/plugins/stef/micromanager/block/lang/VarMultiStagePosition.java +++ b/src/main/java/plugins/stef/micromanager/block/lang/VarMultiStagePosition.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,7 @@ package plugins.stef.micromanager.block.lang; +import org.jetbrains.annotations.Contract; import org.micromanager.api.MultiStagePosition; import plugins.adufour.vars.gui.VarEditor; import plugins.adufour.vars.lang.Var; @@ -26,6 +27,7 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; import javax.swing.*; import java.awt.*; +import java.util.Objects; public class VarMultiStagePosition extends VarArray<MultiStagePosition> { VarEditorMultiStagePositions pos; @@ -56,19 +58,22 @@ public class VarMultiStagePosition extends VarArray<MultiStagePosition> { @Override protected JComponent createEditorComponent() { btnOpen = new JButton("Open"); - btnOpen.addActionListener(e -> MicroManager.getMMStudio().showXYPositionList()); + btnOpen.addActionListener(e -> Objects.requireNonNull(MicroManager.getMMStudio()).showXYPositionList()); return btnOpen; } + @Contract(pure = true) @Override protected void activateListeners() { } + @Contract(pure = true) @Override protected void deactivateListeners() { } + @Contract(pure = true) @Override protected void updateInterfaceValue() { } diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeChannels.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeChannels.java index ece292c..1dbc6b8 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeChannels.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeChannels.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,8 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; import plugins.adufour.blocks.tools.input.InputBlock; import plugins.adufour.blocks.util.VarList; import plugins.stef.micromanager.block.AbstractMicroscopeBlock; @@ -30,6 +32,8 @@ import plugins.stef.micromanager.block.lang.VarMMGroup; * * @author Stephane Dallongeville */ +@IcyPluginName("(WIP) Microscope Channels") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeChannels extends AbstractMicroscopeBlock implements InputBlock { VarMMGroup group; VarChannels channels; diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetBinning.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetBinning.java index 59c9086..5ad9ed0 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetBinning.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetBinning.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarInteger; import plugins.adufour.vars.lang.VarObject; @@ -30,17 +33,19 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; * * @author Stephane Dallongeville */ +@IcyPluginName("Get Micro-Manager Binning") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeGetBinning extends AbstractMicroscopeBlock { VarObject trigger = new VarObject("Trigger", null); VarInteger binning = new VarInteger("Binning", 1); @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("binning", binning); } diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetExposure.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetExposure.java index 52157d6..94baccb 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetExposure.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeGetExposure.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarDouble; import plugins.adufour.vars.lang.VarObject; @@ -30,17 +33,19 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; * * @author Stephane Dallongeville */ +@IcyPluginName("Get Micro-Manager Exposure") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeGetExposure extends AbstractMicroscopeBlock { VarObject trigger = new VarObject("Trigger", null); VarDouble exposure = new VarDouble("Exposure (ms)", 50d); @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("exposure", exposure); } diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopePositions.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopePositions.java index e481421..feedefb 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopePositions.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopePositions.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import org.micromanager.MMStudio; import org.micromanager.api.MultiStagePosition; import org.micromanager.api.PositionList; @@ -34,6 +37,8 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Stage Positions") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopePositions extends AbstractMicroscopeBlock implements InputBlock { VarArray<MultiStagePosition> varPositions; @@ -44,7 +49,7 @@ public class MicroscopePositions extends AbstractMicroscopeBlock implements Inpu } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("positions", varPositions); } diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetBinning.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetBinning.java index 19ce2c4..095ef69 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetBinning.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetBinning.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarBoolean; import plugins.adufour.vars.lang.VarInteger; @@ -31,19 +34,21 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Binning") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetBinning extends AbstractMicroscopeBlock { VarObject trigger = new VarObject("Trigger", null); VarInteger binning = new VarInteger("Binning", 1); VarBoolean done = new VarBoolean("Done", false); @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("binning", binning); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("done", done); } diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetConfig.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetConfig.java index fbb0c2b..79f230d 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetConfig.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetConfig.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.lang.BlockDescriptor; import plugins.adufour.blocks.lang.WorkFlow; import plugins.adufour.blocks.util.VarList; @@ -45,6 +48,8 @@ import java.util.List; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Preset") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetConfig extends AbstractMicroscopeBlock { VarObject trigger; VarMMGroup group; @@ -89,7 +94,7 @@ public class MicroscopeSetConfig extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("group", group); inputMap.add("preset", preset); diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetExposure.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetExposure.java index 803e6e7..90e9b45 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetExposure.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetExposure.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarBoolean; import plugins.adufour.vars.lang.VarDouble; @@ -31,19 +34,21 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Exposure") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetExposure extends AbstractMicroscopeBlock { VarObject trigger = new VarObject("Trigger", null); VarDouble exposure = new VarDouble("Exposure", 10d); VarBoolean done = new VarBoolean("Done", false); @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("exposure", exposure); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("done", done); } diff --git a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetShutter.java b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetShutter.java index 82b13e0..0588cd3 100644 --- a/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetShutter.java +++ b/src/main/java/plugins/stef/micromanager/block/setting/MicroscopeSetShutter.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,9 @@ package plugins.stef.micromanager.block.setting; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarBoolean; import plugins.adufour.vars.lang.VarObject; @@ -30,6 +33,8 @@ import plugins.tprovoost.Microscopy.MicroManager.MicroManager; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Shutter") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetShutter extends AbstractMicroscopeBlock { VarObject trigger = new VarObject("Trigger", null); VarBoolean open = new VarBoolean("Open", true); @@ -49,13 +54,13 @@ public class MicroscopeSetShutter extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("open", open); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("done", done); } } diff --git a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeGetStageXYZ.java b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeGetStageXYZ.java index 9f91b34..900b15a 100644 --- a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeGetStageXYZ.java +++ b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeGetStageXYZ.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,7 +18,10 @@ package plugins.stef.micromanager.block.stage; -import icy.type.point.Point3D; +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.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarBoolean; import plugins.adufour.vars.lang.VarDouble; @@ -32,6 +35,8 @@ import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; * * @author Stephane Dallongeville */ +@IcyPluginName("Get Micro-Manager Stage XYZ") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeGetStageXYZ extends AbstractMicroscopeBlock { VarObject trigger = new VarObject("Trigger", null); VarBoolean wait = new VarBoolean("Wait stage", true); @@ -40,13 +45,13 @@ public class MicroscopeGetStageXYZ extends AbstractMicroscopeBlock { VarDouble outZ = new VarDouble("Z", 0d); @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("wait", wait); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("x", outX); outputMap.add("y", outY); outputMap.add("z", outZ); diff --git a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStagePosition.java b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStagePosition.java index 8b08e76..aa52224 100644 --- a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStagePosition.java +++ b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStagePosition.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,8 +18,10 @@ package plugins.stef.micromanager.block.stage; -import icy.system.thread.ThreadUtil; import mmcorej.CMMCore; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.system.thread.ThreadUtil; import org.micromanager.api.MultiStagePosition; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.Var; @@ -35,6 +37,8 @@ import plugins.stef.micromanager.block.setting.MicroscopePositions; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Stage Position") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetStagePosition extends AbstractMicroscopeBlock { Var<MultiStagePosition> input; VarBoolean waitForStage; diff --git a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageXY.java b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageXY.java index 97db9cc..bbb32b2 100644 --- a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageXY.java +++ b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageXY.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,9 @@ package plugins.stef.micromanager.block.stage; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarBoolean; import plugins.adufour.vars.lang.VarDouble; @@ -33,6 +36,8 @@ import java.awt.geom.Point2D; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Stage XY") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetStageXY extends AbstractMicroscopeBlock { VarDouble inX; VarDouble inY; @@ -73,7 +78,7 @@ public class MicroscopeSetStageXY extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("x", inX); inputMap.add("y", inY); @@ -82,7 +87,7 @@ public class MicroscopeSetStageXY extends AbstractMicroscopeBlock { } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("done", done); } } diff --git a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageZ.java b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageZ.java index 71084a0..23f46ea 100644 --- a/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageZ.java +++ b/src/main/java/plugins/stef/micromanager/block/stage/MicroscopeSetStageZ.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,9 @@ package plugins.stef.micromanager.block.stage; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.VarBoolean; import plugins.adufour.vars.lang.VarDouble; @@ -31,6 +34,8 @@ import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; * * @author Stephane Dallongeville */ +@IcyPluginName("Set Micro-Manager Stage Z") +@IcyPluginIcon(path = "/mm_blocks.png") public class MicroscopeSetStageZ extends AbstractMicroscopeBlock { VarDouble inZ; VarObject trigger = new VarObject("Trigger", null); @@ -65,7 +70,7 @@ public class MicroscopeSetStageZ extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("trigger", trigger); inputMap.add("z", inZ); inputMap.add("relative", varRelative); @@ -73,7 +78,7 @@ public class MicroscopeSetStageZ extends AbstractMicroscopeBlock { } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("done", varDone); } } diff --git a/src/main/java/plugins/stef/micromanager/block/tool/TaggedImageToIcyImage.java b/src/main/java/plugins/stef/micromanager/block/tool/TaggedImageToIcyImage.java index 7574f55..15efac4 100644 --- a/src/main/java/plugins/stef/micromanager/block/tool/TaggedImageToIcyImage.java +++ b/src/main/java/plugins/stef/micromanager/block/tool/TaggedImageToIcyImage.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,9 +18,12 @@ package plugins.stef.micromanager.block.tool; -import icy.image.IcyBufferedImage; -import icy.type.collection.CollectionUtil; import mmcorej.TaggedImage; +import org.bioimageanalysis.icy.common.collection.CollectionUtil; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.model.image.IcyBufferedImage; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.Var; import plugins.adufour.vars.lang.VarArray; @@ -31,8 +34,10 @@ import plugins.tprovoost.Microscopy.MicroManager.tools.MMUtils; /** * Block to convert a TaggedImage to an IcyBufferedImage (Micro-Manager) * - * @author Stephane + * @author Stephane Dallongeville */ +@IcyPluginName("TaggedImage to IcyBufferedImage") +@IcyPluginIcon(path = "/mm_blocks.png") public class TaggedImageToIcyImage extends AbstractMicroscopeBlock { VarArray<TaggedImage> in = new VarArray<>("Tagged Image", TaggedImage[].class, new TaggedImage[0]); Var<IcyBufferedImage> out = new Var<>("Icy Image", IcyBufferedImage.class); @@ -48,17 +53,12 @@ public class TaggedImageToIcyImage extends AbstractMicroscopeBlock { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("taggedImage", in); } @Override - public void declareOutput(final VarList outputMap) { + public void declareOutput(final @NotNull VarList outputMap) { outputMap.add("icyImage", out); } - - @Override - public String getName() { - return "TaggedImage to IcyBufferedImage"; - } } \ No newline at end of file diff --git a/src/main/resources/mm_blocks.png b/src/main/resources/mm_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..0d67c2a6236f3c07c84f5b24989f19b80308d412 GIT binary patch literal 17218 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 literal 0 HcmV?d00001 -- GitLab