diff --git a/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java b/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java
index 5aa279b5ab6c5c3628857689bde6384f66e624d7..aa261af503cbbbebe4fd0fb9778e50ef12b40512 100644
--- a/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java
+++ b/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java
@@ -1,9 +1,11 @@
package cz.it4i.qcmp.cli;
+import cz.it4i.qcmp.data.HyperStackDimensions;
import cz.it4i.qcmp.data.Range;
import cz.it4i.qcmp.data.V2i;
import cz.it4i.qcmp.data.V3i;
+import java.util.ArrayList;
import java.util.Optional;
public abstract class ParseUtils {
@@ -95,4 +97,68 @@ public abstract class ParseUtils {
}
return Optional.empty();
}
+
+ /**
+ * Find all occurrences of c in string.
+ *
+ * @param string String to look for c in.
+ * @param c Characted to find in the string.
+ * @return Array of all indexes in the string.
+ */
+ private static int[] findAllIndexesOfChar(final String string, final char c) {
+ final ArrayList<Integer> indexes = new ArrayList<>(2);
+
+ int index = string.indexOf(c);
+ while (index >= 0) {
+ indexes.add(index);
+ index = string.indexOf(c, index + 1);
+ }
+
+ return indexes.stream().mapToInt(Integer::intValue).toArray();
+ }
+
+ /**
+ * Tries to parse HyperStackDimensions from a string with delimiters.
+ *
+ * @param hyperStackDimensionsString String containing the dimensions.
+ * @param delimiter Delimiter.
+ * @return Parsed HyperStackDimensions or empty optional.
+ */
+ public static Optional<HyperStackDimensions> tryParseHyperStackDimensions(final String hyperStackDimensionsString,
+ final char delimiter) {
+ final String string = (delimiter != ' ') ? removeSpacesInString(hyperStackDimensionsString) : hyperStackDimensionsString;
+
+ final int[] indexes = findAllIndexesOfChar(string, delimiter);
+
+ if ((indexes.length < 1) || (indexes.length > 3))
+ return Optional.empty();
+
+ int x = -1;
+ int y = -1;
+ int z = 1;
+ int t = 1;
+
+ // Required part.
+ final Optional<Integer> maybeX = tryParseInt(string.substring(0, indexes[0]));
+ final Optional<Integer> maybeY = tryParseInt(string.substring(indexes[0] + 1, indexes.length > 1 ? indexes[1] : string.length()));
+ if (!maybeX.isPresent() || !maybeY.isPresent())
+ return Optional.empty();
+ x = maybeX.get();
+ y = maybeY.get();
+
+ if (indexes.length > 1) {
+ final Optional<Integer> maybeZ = tryParseInt(string.substring(indexes[1], indexes.length > 2 ? indexes[2] : string.length()));
+ if (!maybeZ.isPresent())
+ return Optional.empty();
+ z = maybeZ.get();
+
+ if (indexes.length > 2) {
+ final Optional<Integer> maybeT = tryParseInt(string.substring(indexes[2]));
+ if (!maybeT.isPresent())
+ return Optional.empty();
+ t = maybeT.get();
+ }
+ }
+ return Optional.of(new HyperStackDimensions(x, y, z, t));
+ }
}
diff --git a/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java b/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java
index 652486dd75fcb9a03e71f821241549741b820a2e..140eee70e044de3368e7fed9ec76d8e8be813cfe 100644
--- a/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java
+++ b/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java
@@ -82,4 +82,9 @@ public class HyperStackDimensions {
public final int getNumberOfTimepoints() {
return numberOfTimepoints;
}
+
+ @Override
+ public String toString() {
+ return String.format("X=%d;Y=%d;Z=%d;T=%d", width, height, sliceCount, numberOfTimepoints);
+ }
}