final String expression; if (overlayMask.getImageType() == Mask.BandMathsType.INSTANCE) { expression = Mask.BandMathsType.getExpression(overlayMask); } else if (overlayMask.getImageType() == Mask.RangeType.INSTANCE) { expression = Mask.RangeType.getExpression(overlayMask);
private static List<RasterDataNode> getReferencedMasks(final RasterDataNode node) { final Product product = node.getProduct(); final List<RasterDataNode> rasterList = new ArrayList<RasterDataNode>(); if (product != null) { final ProductNodeGroup<Mask> maskGroup = product.getMaskGroup(); final Mask[] masks = maskGroup.toArray(new Mask[maskGroup.getNodeCount()]); for (final Mask mask : masks) { final String expression; if (mask.getImageType() == Mask.BandMathsType.INSTANCE) { expression = Mask.BandMathsType.getExpression(mask); } else if (mask.getImageType() == Mask.RangeType.INSTANCE) { expression = Mask.RangeType.getRasterName(mask); } else { expression = null; } if (isNodeReferencedByExpression(node, expression)) { rasterList.add(mask); } } } return rasterList; }
final Mask mask = maskGroup.get(i); if (mask.getImageType() == Mask.BandMathsType.INSTANCE) { if (maskExpression.equals(Mask.BandMathsType.getExpression(mask))) { maskImage = mask.getSourceImage(); break;
@Override public boolean canTransferMask(Mask mask, Product product) { final String expression = getExpression(mask); if (StringUtils.isNullOrEmpty(expression)) { return false; } try { if (mask.getProduct() != null) { for (RasterDataNode raster : BandArithmetic.getRefRasters(expression, mask.getProduct())) { if (raster instanceof Mask) { if (!product.getMaskGroup().contains(raster.getName())) { Mask refMask = (Mask) raster; if (!canTransferMask(refMask, product)) { return false; } } } else { if (!product.containsRasterDataNode(raster.getName())) { return false; } } } } else { // the mask has not been added to a product yet BandArithmetic.getRefRasters(expression, product); } } catch (ParseException e) { return false; } return true; }
/** * Creates the image. * * @param mask The mask which requests creation of its image. * * @return The image. */ @Override public MultiLevelImage createImage(final Mask mask) { final MultiLevelModel multiLevelModel = ImageManager.getMultiLevelModel(mask); final MultiLevelSource multiLevelSource = new AbstractMultiLevelSource(multiLevelModel) { @Override public RenderedImage createImage(int level) { return VirtualBandOpImage.createMask(getExpression(mask), mask.getProduct(), ResolutionLevel.create(getModel(), level)); } }; return new VirtualBandMultiLevelImage(multiLevelSource, getExpression(mask), mask.getProduct()) { @Override public void reset() { super.reset(); mask.fireProductNodeDataChanged(); } }; }
@Override public Mask transferMask(Mask mask, Product product) { if (canTransferMask(mask, product)) { String expression = getExpression(mask); final Map<Mask, Mask> translationMap = transferReferredMasks(expression, mask.getProduct(), product); expression = translateExpression(translationMap, expression); final String originalMaskName = mask.getName(); final String maskName = getAvailableMaskName(originalMaskName, product.getMaskGroup()); return product.addMask(maskName, expression, mask.getDescription(), mask.getImageColor(), mask.getImageTransparency()); } return null; }
@Test public void testRenameBand() { Product product = new Product("t", "d", 1, 1); Band band = product.addBand("b", ProductData.TYPE_INT8); Mask mask = new Mask("m", 1, 1, Mask.BandMathsType.INSTANCE); Mask.BandMathsType.setExpression(mask, "b == 2"); product.getMaskGroup().add(mask); String expression = Mask.BandMathsType.getExpression(mask); assertEquals("b == 2", expression); band.setName("c"); expression = Mask.BandMathsType.getExpression(mask); assertEquals("c == 2", expression); }
@Override public void handleRename(Mask mask, String oldExternalName, String newExternalName) { String oldExpression = getExpression(mask); final String newExpression = StringUtils.replaceWord(oldExpression, oldExternalName, newExternalName); setExpression(mask, newExpression); super.handleRename(mask, oldExternalName, newExternalName); }
@Override public RenderedImage createImage(int level) { return VirtualBandOpImage.createMask(getExpression(mask), mask.getProduct(), ResolutionLevel.create(getModel(), level)); } };
static Mask createSubset(Mask sourceMask, Scene targetScene, ProductSubsetDef subsetDef) { final Mask targetMask = Mask.BandMathsType.create(sourceMask.getName(), sourceMask.getDescription(), targetScene.getRasterWidth(), targetScene.getRasterHeight(), Mask.BandMathsType.getExpression(sourceMask), sourceMask.getImageColor(), sourceMask.getImageTransparency()); targetMask.setSourceImage(getSourceImage(subsetDef, sourceMask)); return targetMask; }
private void handleMaskAdded(ProductNodeEvent event) { // TODO - move code to where masks are created final Mask mask = (Mask) event.getSourceNode(); if (StringUtils.isNullOrEmpty(mask.getDescription()) && mask.getImageType() == Mask.BandMathsType.INSTANCE) { String expression = Mask.BandMathsType.getExpression(mask); mask.setDescription(getSuitableBitmaskDefDescription(expression)); } }