diff --git a/data/input/observersCharts.xml b/data/input/observersCharts.xml index 0147edc8e26db4c43b3e220912d79e5697aa93ef..eed0fea7d0d899477ebd9b256b66af2622fc3cc9 100644 --- a/data/input/observersCharts.xml +++ b/data/input/observersCharts.xml @@ -3,29 +3,30 @@ <hashtable> <entry> - <java-class>pikelake.GridObserver</java-class> + <java-class>pikelake.pikes.PikesGroup</java-class> <fr.cemagref.observation.kernel.ObservablesHandler> <observers> <pikelake.environment.Movement2DWithinShapeObserver> <title>Bariousses</title> <bgColor> - <red>168</red> - <green>0</green> - <blue>0</blue> + <red>230</red> + <green>230</green> + <blue>230</blue> <alpha>255</alpha> </bgColor> <pikeColor> - <red>0</red> + <red>255</red> <green>0</green> - <blue>255</blue> + <blue>0</blue> <alpha>255</alpha> </pikeColor> <shapeColor> - <red>0</red> - <green>0</green> + <red>51</red> + <green>102</green> <blue>255</blue> <alpha>255</alpha> </shapeColor> + <margin>0</margin> <!--shape>//data//input//shape//hsi_BROAUTOMNE507.shp</shape--> </pikelake.environment.Movement2DWithinShapeObserver> </observers> diff --git a/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java b/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java index e6acc06a564b58e3165e86e2c25fcbf0d3f63e42..d219ce6c6a96c6e5d80cf60fed58e744d65efc92 100644 --- a/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java +++ b/src/main/java/pikelake/environment/Movement2DWithinShapeObserver.java @@ -1,25 +1,34 @@ package pikelake.environment; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.MultiPolygon; +import fr.cemagref.observation.gui.Configurable; +import fr.cemagref.observation.gui.Drawable; +import fr.cemagref.observation.kernel.ObservablesHandler; +import fr.cemagref.observation.kernel.ObserverListener; +import fr.cemagref.ohoui.annotations.Description; +import fr.cemagref.ohoui.annotations.NoRecursive; +import fr.cemagref.ohoui.filters.NoTransientField; +import fr.cemagref.ohoui.swing.OhOUI; +import fr.cemagref.ohoui.swing.OhOUIDialog; +import fr.cemagref.simaqualife.pilot.Pilot; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; -import java.awt.geom.Point2D; +import java.awt.geom.Path2D; import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.Iterator; import java.util.List; - import javax.swing.JComponent; - import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; +import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.map.FeatureLayer; import org.geotools.map.Layer; @@ -27,35 +36,23 @@ import org.geotools.map.MapContent; import org.geotools.styling.SLD; import org.geotools.swing.JMapFrame; import org.opengis.style.Style; +import pikelake.pikes.Pike; +import pikelake.pikes.PikesGroup; -import fr.cemagref.observation.gui.Configurable; -import fr.cemagref.observation.gui.Drawable; -import fr.cemagref.observation.kernel.ObservablesHandler; -import fr.cemagref.observation.kernel.ObserverListener; -import fr.cemagref.ohoui.annotations.Description; -import fr.cemagref.ohoui.annotations.NoRecursive; -import fr.cemagref.ohoui.filters.NoTransientField; -import fr.cemagref.ohoui.swing.OhOUI; -import fr.cemagref.ohoui.swing.OhOUIDialog; -import fr.cemagref.simaqualife.kernel.AquaNism; -import fr.cemagref.simaqualife.kernel.AquaNismsGroup; -import fr.cemagref.simaqualife.pilot.Pilot; - - - -@SuppressWarnings({ "serial" }) +@SuppressWarnings({"serial"}) @NoRecursive public class Movement2DWithinShapeObserver extends ObserverListener implements Configurable, Drawable { + private Pilot pilot; // private transient FileChooserField modulesChooser; private transient JComponent display; - - // private String generalPathS; + + // private String generalPathS; private transient GeneralPath generalPath; - private transient List<AquaNismsGroup<? extends AquaNism<? extends Point2D,?>,?>> groups; - + private transient List<PikesGroup> groups; + private String title; - + // TODO supress transient when list will be supported by AutOUI @Description (name="Groups colors",tooltip="Colors af aquanisms groups") private transient List<Color> groupsColors; @@ -65,7 +62,7 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C private Color pikeColor; @Description (name="River color",tooltip="River color") private Color shapeColor; - + private int margin; private int sizeOfDisplayedIndividuals; // use for determine if generalPath must be rescaled @@ -74,26 +71,26 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C private transient double repositioningTranslateX,repositioningTranslateY; private transient double shapeOriginalWidth, shapeOriginalHeight; private transient double shapeAspectRatio; - private transient double rescaleFactorWithOriginal; - + private transient double rescaleFactorWithOriginal; + public Movement2DWithinShapeObserver(int margin) { this(margin,Color.BLACK,Color.BLUE); } - + public Movement2DWithinShapeObserver() { this(Color.BLACK,Color.BLUE); } - + public Movement2DWithinShapeObserver(Color bgColor,Color shapeColor) { this(0,bgColor,shapeColor); } - + public Movement2DWithinShapeObserver(int margin,Color bgColor,Color shapeColor) { this.margin = margin; this.bgColor = bgColor; this.shapeColor = shapeColor; } - + public String getTitle() { return title; } @@ -101,50 +98,53 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C public JComponent getDisplay() { return display; } - + public void valueChanged(ObserverListener clObservable, Object instance, int t) { display.repaint(); } - - @SuppressWarnings({ "unchecked" }) - public void init() { - Pilot pilot = new Pilot(); - - display = new DisplayComponent(); + + @SuppressWarnings({"unchecked"}) + public void init() { + display = new DisplayComponent(); display.setVisible(false); display.setDoubleBuffered(true); displayWidthBak = 0; displayHeightBak = 0; - + /////////////////////////// init shape //////////////////////////////////////////////////////////// - File file = new File("/Users/guillaume.garbay/workspace/PikeLake/data/input/shape/hsi_BROPRINTEMPS513_5.shp"); + File file = new File("data/input/shape/hsi_BROAUTOMNE507_hull.shp"); FileDataStore store; - try { - store = FileDataStoreFinder.getDataStore(file); - SimpleFeatureSource featureSource = store.getFeatureSource(); - - MapContent map = new MapContent(); - map.setTitle("Bariousses"); + try { + store = FileDataStoreFinder.getDataStore(file); + SimpleFeatureSource featureSource = store.getFeatureSource(); - Style style = SLD.createSimpleStyle(featureSource.getSchema()); - Layer layer = new FeatureLayer(featureSource, (org.geotools.styling.Style) style); - map.addLayer(layer); + /*MapContent map = new MapContent(); + map.setTitle("Bariousses"); - JMapFrame.showMap(map); + Style style = SLD.createSimpleStyle(featureSource.getSchema()); + Layer layer = new FeatureLayer(featureSource, (org.geotools.styling.Style) style); + map.addLayer(layer); + JMapFrame.showMap(map);*/ - this.generalPath = new GeneralPath((Shape) map); - //this.generalPath = new GeneralPath(((AsShapeConvertible) pilot.getAquaticWorld().getEnvironment()).getShape()); - + SimpleFeatureIterator iterator = featureSource.getFeatures().features(); + MultiPolygon p = (MultiPolygon) iterator.next().getDefaultGeometry(); + iterator.close(); + Path2D.Double shape = new Path2D.Double(); + shape.moveTo(p.getCoordinates()[0].x, p.getCoordinates()[0].y); + for (int i = 1; i < p.getCoordinates().length; i++) { + Coordinate coord = p.getCoordinates()[i]; + shape.lineTo(coord.x, coord.y); + } + this.generalPath = new GeneralPath(shape); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - // original dimension storage this.shapeOriginalWidth = this.generalPath.getBounds().getWidth(); this.shapeOriginalHeight = this.generalPath.getBounds().getHeight(); @@ -156,11 +156,8 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C // vertical flip this.generalPath.transform(AffineTransform.getScaleInstance(1,-1)); this.generalPath.transform(AffineTransform.getTranslateInstance(0,shapeOriginalHeight)); - - groups = new ArrayList<AquaNismsGroup<? extends AquaNism<? extends Point2D,?>,?>>((Collection<? extends AquaNismsGroup<? extends AquaNism<? extends Point2D, ?>, ?>>)pilot.getAquaticWorld().getAquaNismsGroupsList()); - if (groups!=null) { - display.setVisible(true); - } + + this.groups = new ArrayList<PikesGroup>(); groupsColors = new ArrayList<Color>(); groupsColors.add(Color.RED); groupsColors.add(Color.GREEN); @@ -168,8 +165,9 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C groupsColors.add(Color.CYAN); groupsColors.add(Color.GRAY); display.repaint(); + display.setVisible(true); } - + public void disable() { display.setVisible(false); } @@ -181,9 +179,12 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C @Override public void valueChanged(ObservablesHandler clObservable, Object instance, long t) { + if (groups == null && instance != null) { + groups.add((PikesGroup) instance); + } display.repaint(); } - + public static interface AsShapeConvertible { public Shape getShape(); } @@ -228,7 +229,7 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C generalPath.transform( AffineTransform.getScaleInstance(rescaleFactor,rescaleFactor) ); - + } // Draw Background g.setColor(bgColor); @@ -239,14 +240,17 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C //g.setColor(aquanismsColor); Iterator<Color> colorsIterator = groupsColors.iterator(); // Draw aquanisms - for (AquaNismsGroup<? extends AquaNism<? extends Point2D,?>,?> group : groups) { - if (colorsIterator.hasNext()) g.setColor(colorsIterator.next()); - for (AquaNism<? extends Point2D,?> aquanism : group.getAquaNismsList()) { - Rectangle rect=new Rectangle((int)((aquanism.getPosition().getX()+repositioningTranslateX) * rescaleFactorWithOriginal), - (int)(generalPath.getBounds().getHeight() /*flip vertically*/ - (aquanism.getPosition().getY()+repositioningTranslateY) * rescaleFactorWithOriginal), - sizeOfDisplayedIndividuals,sizeOfDisplayedIndividuals); + for (PikesGroup group : groups) { + if (colorsIterator.hasNext()) { + g.setColor(colorsIterator.next()); + } + for (Pike aquanism : group.getAquaNismsList()) { + // TODO get the cell position + //Rectangle rect = new Rectangle((int) ((aquanism.getPosition().getX() + repositioningTranslateX) * rescaleFactorWithOriginal), + // (int) (generalPath.getBounds().getHeight() /*flip vertically*/ - (aquanism.getPosition().getY() + repositioningTranslateY) * rescaleFactorWithOriginal), + // sizeOfDisplayedIndividuals, sizeOfDisplayedIndividuals); // draw the individuals after repositioning and rescaling the position - g2d.fill(rect); + //g2d.fill(rect); } } }