Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions cimr-reader-ui/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.esa.microwavetbx</groupId>
<artifactId>microwave-toolbox</artifactId>
<version>14.0.0-SNAPSHOT</version>
</parent>

<groupId>eu.esa.snap.cimr.ui</groupId>
<artifactId>cimr-reader-ui</artifactId>
<name>CIMR Reader UI</name>

<packaging>nbm</packaging>

<dependencies>
<dependency>
<groupId>org.esa.snap</groupId>
<artifactId>snap-core</artifactId>
</dependency>
<dependency>
<groupId>org.esa.snap</groupId>
<artifactId>ceres-glayer</artifactId>
</dependency>
<dependency>
<groupId>org.esa.snap</groupId>
<artifactId>snap-ui</artifactId>
</dependency>
<dependency>
<groupId>org.esa.snap</groupId>
<artifactId>ceres-binding</artifactId>
</dependency>
<dependency>
<groupId>org.esa.snap</groupId>
<artifactId>snap-rcp</artifactId>
</dependency>
<dependency>
<groupId>eu.esa.snap.cimr</groupId>
<artifactId>cimr-reader</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>eu.esa.snap.netbeans</groupId>
<artifactId>snap-gui-lib</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.netbeans.utilities</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<configuration>
<publicPackages>
<publicPackage>eu.esa.snap.cimr.ui.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package eu.esa.snap.cimr.ui;

import com.bc.ceres.glayer.swing.LayerCanvas;
import com.bc.ceres.grender.Rendering;
import com.bc.ceres.grender.Viewport;
import eu.esa.snap.cimr.cimr.CimrFootprints;
import eu.esa.snap.cimr.cimr.CimrFootprintShape;
import org.esa.snap.core.datamodel.ColorPaletteDef;
import org.esa.snap.core.datamodel.ImageInfo;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.core.image.ImageManager;

import java.awt.*;
import java.awt.geom.*;
import java.util.List;


public class CimrFootprintOverlay implements LayerCanvas.Overlay {

public static final CimrFootprintOverlay INSTANCE = new CimrFootprintOverlay();

private CimrFootprints footprints;
private RasterDataNode raster;

private CimrFootprintOverlay() {}

public void setFootprints(CimrFootprints footprints) {
this.footprints = footprints;
}

public void setRaster(RasterDataNode raster) {
this.raster = raster;
}

@Override
public void paintOverlay(LayerCanvas canvas, Rendering rendering) {
if (footprints == null || footprints.getShapes().isEmpty()) {
return;
}

Graphics2D g = rendering.getGraphics();

Color oldColor = g.getColor();
java.awt.Stroke oldStroke = g.getStroke();

Viewport vp = canvas.getViewport();
AffineTransform m2vBase = vp.getModelToViewTransform();

ImageInfo imageInfo = raster.getImageInfo();
Color baseColor = Color.WHITE;
Color[] fullPalette = null;
ColorPaletteDef cpd = null;

if (imageInfo != null) {
cpd = imageInfo.getColorPaletteDef();
fullPalette = ImageManager.createColorPalette(imageInfo);
}

List<CimrFootprintShape> shapes = footprints.getShapes();
List<Double> values = footprints.getValues();

for (int ii = 0; ii < shapes.size(); ii++) {
CimrFootprintShape shape = shapes.get(ii);
double cx = shape.getGeoPos().getLon();
double cy = shape.getGeoPos().getLat();
double rx = shape.getMajorAxisDegree();
double ry = shape.getMinorAxisDegree();

Ellipse2D modelEllipse = new Ellipse2D.Double(cx - rx, cy - ry, 2 * rx, 2 * ry);
double angleRad = Math.toRadians(shape.getAngle());

AffineTransform rotModel = AffineTransform.getRotateInstance(angleRad, cx, cy);
Shape rotatedModelShape = rotModel.createTransformedShape(modelEllipse);
Shape viewEllipse = m2vBase.createTransformedShape(rotatedModelShape);

if (imageInfo != null && cpd != null) {
baseColor = getColorForValue(cpd, fullPalette, values.get(ii));
}

g.setColor(baseColor);
g.fill(viewEllipse);
}

g.setStroke(oldStroke);
g.setColor(oldColor);
}

private Color getColorForValue(ColorPaletteDef cpd, Color[] fullPalette, double value) {
int numColors = cpd.getNumColors();
double min = cpd.getMinDisplaySample();
double max = cpd.getMaxDisplaySample();

if (Double.compare(min, max) == 0) {
Color c = cpd.getLastPoint().getColor();
return new Color(c.getRed(), c.getGreen(), c.getBlue());
}

double v = Math.max(min, Math.min(max, value));
double f = (v - min) / (max - min);

int idx = (int) Math.round(f * (numColors - 1));
idx = Math.max(0, Math.min(idx, numColors - 1));

return fullPalette[idx];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package eu.esa.snap.cimr.ui;

import org.esa.snap.core.datamodel.Product;
import org.esa.snap.rcp.windows.ToolTopComponent;
import org.esa.snap.ui.product.ProductSceneView;
import org.jspecify.annotations.NonNull;

import java.util.ArrayList;
import java.util.List;


public class CimrSceneViewSelectionService extends ToolTopComponent {

private final List<SelectionListener> selectionListeners = new ArrayList<>();
private ProductSceneView selectedSceneView;


@Override
protected void productSceneViewSelected(@NonNull ProductSceneView view) {
setSelectedSceneView(view);
}

@Override
protected void productSceneViewDeselected(@NonNull ProductSceneView view) {
setSelectedSceneView(null);
}

private void setSelectedSceneView(ProductSceneView newView) {
ProductSceneView oldView = selectedSceneView;
if (oldView == newView) {
return;
}
if (newView != null) {
Product p = newView.getProduct();
if (p == null) {
return;
}
}
selectedSceneView = newView;
fireSelectionChange(oldView, newView);
}

public synchronized void addSceneViewSelectionListener(SelectionListener l) {
selectionListeners.add(l);
}

private void fireSelectionChange(ProductSceneView oldView, ProductSceneView newView) {
for (SelectionListener listener : new ArrayList<>(selectionListeners)) {
listener.handleSceneViewSelectionChanged(oldView, newView);
}
}


public interface SelectionListener {
void handleSceneViewSelectionChanged(ProductSceneView oldView, ProductSceneView newView);
}
}
105 changes: 105 additions & 0 deletions cimr-reader-ui/src/main/java/eu/esa/snap/cimr/ui/CimrUIManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package eu.esa.snap.cimr.ui;

import com.bc.ceres.binding.PropertySet;
import com.bc.ceres.glayer.Layer;
import com.bc.ceres.glayer.LayerType;
import com.bc.ceres.glayer.LayerTypeRegistry;
import com.bc.ceres.glayer.support.ImageLayer;
import com.bc.ceres.glayer.support.LayerUtils;
import eu.esa.snap.cimr.CimrL1BProductReader;
import eu.esa.snap.cimr.cimr.CimrFootprints;
import org.esa.snap.core.dataio.ProductReader;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.core.layer.WorldMapLayerType;
import org.esa.snap.rcp.SnapApp;
import org.esa.snap.ui.product.ProductSceneView;
import org.openide.modules.OnStart;
import org.openide.windows.OnShowing;

import java.util.logging.Logger;


public class CimrUIManager {

private static final String WORLDMAP_TYPE_PROPERTY_NAME = "worldmap.type";
private static final String BLUE_MARBLE_LAYER_TYPE = "BlueMarbleLayerType";

private static final Logger LOG = Logger.getLogger(CimrUIManager.class.getName());
private static volatile CimrSceneViewSelectionService sceneViewSelectionService;

@OnStart
public static class StartOp implements Runnable {
@Override
public void run() {
LOG.info("Starting CIMR UI");
sceneViewSelectionService = new CimrSceneViewSelectionService();
}
}

@OnShowing
public static class ShowingOp implements Runnable {
@Override
public void run() {
LOG.info("CIMR UI showing – installing footprint overlay listener");
sceneViewSelectionService.addSceneViewSelectionListener(CimrUIManager::handleSceneViewChange);
}
}

private static void handleSceneViewChange(ProductSceneView oldView, ProductSceneView newView) {
// if (oldView != null) {
// oldView.getLayerCanvas().removeOverlay(CimrFootprintOverlay.INSTANCE);
// }
if (newView != null) {
// add worldmap layer
Layer worldMap = findWorldMapLayer(newView);
if (worldMap == null) {
worldMap = createWorldMapLayer();
final Layer rootLayer = newView.getRootLayer();
rootLayer.getChildren().add(worldMap);
}
worldMap.setVisible(true);

// // add footprints
// CimrL1BProductReader cimrReader = getCimrReader(newView);
// if (cimrReader != null) {
// RasterDataNode raster = newView.getRaster();
// String band = raster.getName();
// CimrFootprints fps = cimrReader.getFootprints(band);
// if (!fps.getShapes().isEmpty()) {
// CimrFootprintOverlay.INSTANCE.setFootprints(fps);
// CimrFootprintOverlay.INSTANCE.setRaster(raster);
// newView.getLayerCanvas().addOverlay(CimrFootprintOverlay.INSTANCE);
// }
// }
}
}

// private static CimrL1BProductReader getCimrReader(ProductSceneView view) {
// RasterDataNode raster = view.getRaster();
// if (raster == null) {
// return null;
// }
// ProductReader reader = raster.getProductReader();
// if (reader instanceof CimrL1BProductReader) {
// return (CimrL1BProductReader) reader;
// }
// return null;
// }

private static Layer findWorldMapLayer(ProductSceneView view) {
return LayerUtils.getChildLayer(view.getRootLayer(), LayerUtils.SearchMode.DEEP,
layer -> layer.getLayerType() instanceof WorldMapLayerType);
}

private static Layer createWorldMapLayer() {
final LayerType layerType = getWorldMapLayerType();
final PropertySet template = layerType.createLayerConfig(null);
template.setValue(ImageLayer.PROPERTY_NAME_PIXEL_BORDER_SHOWN, false);
return layerType.createLayer(null, template);
}

private static LayerType getWorldMapLayerType() {
String layerTypeClassName = SnapApp.getDefault().getPreferences().get(WORLDMAP_TYPE_PROPERTY_NAME, BLUE_MARBLE_LAYER_TYPE);
return LayerTypeRegistry.getLayerType(layerTypeClassName);
}
}
7 changes: 7 additions & 0 deletions cimr-reader-ui/src/main/nbm/manifest.mf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Manifest-Version: 1.0
OpenIDE-Module-Specification-Version: ${microwavetbx.nbmSpecVersion}
OpenIDE-Module-Implementation-Version: ${microwavetbx.nbmImplVersion}
AutoUpdate-Show-In-Client: false
AutoUpdate-Essential-Module: false
OpenIDE-Module-Java-Dependencies: Java > 11
OpenIDE-Module-Display-Category: SNAP Toolboxes
Loading