|
From: <de...@us...> - 2013-01-14 12:45:17
|
Revision: 8206
http://fudaa.svn.sourceforge.net/fudaa/?rev=8206&view=rev
Author: deniger
Date: 2013-01-14 12:45:08 +0000 (Mon, 14 Jan 2013)
Log Message:
-----------
Ajout support filtre de points
Modified Paths:
--------------
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/action/CalqueCreateGridAction.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/AbstractCalqueCreateGridProcessor.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridGmshProcessor.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridPoly2TriProcessor.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridTriangleProcessor.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueGridSemisSynchronizeProcess.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/GridChooseToolAndContourConvexHullPanel.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlCalqueMultiPointEditable.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlElementModel.java
trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dMultiPointPersistence.java
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/action/CalqueCreateGridAction.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/action/CalqueCreateGridAction.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/action/CalqueCreateGridAction.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -25,6 +25,7 @@
import org.fudaa.fudaa.modeleur.grid.AbstractCalqueCreateGridProcessor;
import org.fudaa.fudaa.modeleur.grid.CalqueCreateGridPoly2TriProcessor;
import org.fudaa.fudaa.modeleur.grid.CalqueCreateGridTriangleProcessor;
+import org.fudaa.fudaa.modeleur.grid.CalqueGridSemisSynchronizeProcess.Result;
import org.fudaa.fudaa.modeleur.grid.GridChooseToolAndContourConvexHullPanel;
import org.fudaa.fudaa.modeleur.grid.MdlCalqueMultiPointEditable;
import org.fudaa.fudaa.modeleur.grid.MdlElementModel;
@@ -195,9 +196,11 @@
((FSigEditor) layer.getEditor()).getPanel().getArbreCalqueModel().setSelectionCalque(layer);
}
}
+ private double eps = 1e-3;
@Override
public void run() {
+ eps=panel.getEps();
final LinearRing finalConvexHull = panel.getSelectedConvexHull();
final MdlLayer2dContour finalContourLayer = (MdlLayer2dContour) panel.getSelectedLayer();
if (panel.isTriangleSelected()) {
@@ -205,16 +208,20 @@
} else {
processor = new CalqueCreateGridPoly2TriProcessor(layer.modeleDonnees(), getUI(), finalContourLayer, finalConvexHull);
}
+ processor.setEps(eps);
+ //TODO boolean
//on execute la triangulation et on lit le maillage
final EfGridInterface grid = processor.process(progression);
final MdlElementModel model = new MdlElementModel(grid);
//si non null, on fait des calculs suppl\xE9mentaires:
if (grid != null) {
- CalqueGridSemisSynchronizeProcess synchProcess = new CalqueGridSemisSynchronizeProcess(processor.getTriangleNodeAdapter());
+ CalqueGridSemisSynchronizeProcess synchProcess = new CalqueGridSemisSynchronizeProcess(processor.getPointsAdapter());
+ synchProcess.setEps(eps);
//recherche des relations entre les noeuds du maillage et le semis actuel:
- int[][] relations = synchProcess.getRelations(grid, progression);
- model.setTriangleNodeAdapter(processor.getTriangleNodeAdapter());
- model.setAltiIdxByGridPtIdx(relations);
+ Result relations = synchProcess.getRelations(grid, progression);
+ model.setPointsAdapter(processor.getPointsAdapter());
+ model.setAltiIdxByGridPtIdx(relations.getRelations());
+ model.setInitPointPaintedByMesh(relations.getInitPointPaintedByMesh());
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/AbstractCalqueCreateGridProcessor.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/AbstractCalqueCreateGridProcessor.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/AbstractCalqueCreateGridProcessor.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -13,8 +13,11 @@
import org.fudaa.ctulu.ProgressionInterface;
import org.fudaa.ctulu.gis.GISLib;
import org.fudaa.ctulu.gis.GISVisitorGeometryCollector;
+import org.fudaa.ctulu.gis.GisZoneCollectionAsListPointAdapter;
+import org.fudaa.ctulu.gis.process.GisZoneCollectionPointDoublonRemover;
+import org.fudaa.ctulu.gis.process.PointsMapping;
+import org.fudaa.ctulu.gis.process.PointsMappingEmpty;
import org.fudaa.dodico.ef.EfGridInterface;
-import org.fudaa.dodico.ef.io.triangle.TriangleNodeAdapter;
import org.fudaa.dodico.ef.io.triangle.TriangulationPolyDataNodeDefault;
import org.fudaa.dodico.objet.CExecListener;
import org.fudaa.ebli.calque.ZCalqueLigneBrisee;
@@ -26,22 +29,33 @@
*/
public abstract class AbstractCalqueCreateGridProcessor implements CExecListener {
- final TriangleNodeAdapter triangleNodeAdapter;
- final CtuluUI ui;
- final ZCalqueLigneBrisee contour;
- final LinearRing convexHull;
+ protected final CtuluUI ui;
+ protected final ZCalqueLigneBrisee contour;
+ protected final LinearRing convexHull;
+ protected double eps = 1e-3;
+ private final GisZoneCollectionAsListPointAdapter pointsAdapter;
+ private PointsMapping pointsMapping;
public AbstractCalqueCreateGridProcessor(ZModeleMultiPoint points, CtuluUI ui, ZCalqueLigneBrisee contour, LinearRing convexHull) {
this.ui = ui;
this.convexHull = convexHull;
this.contour = contour;
- triangleNodeAdapter = new TriangleNodeAdapter(points.getGeomData());
+ this.pointsAdapter = new GisZoneCollectionAsListPointAdapter(points.getGeomData());
}
- public final TriangleNodeAdapter getTriangleNodeAdapter() {
- return triangleNodeAdapter;
+ public PointsMapping getPointsMapping() {
+ return pointsMapping;
}
+ public GisZoneCollectionAsListPointAdapter getPointsAdapter() {
+ return pointsAdapter;
+ }
+
+ public void setEps(double epsForDoublon) {
+ this.eps = epsForDoublon;
+ }
+
+
@Override
public final void setProcess(Process _p) {
this.p = _p;
@@ -74,7 +88,16 @@
return true;
}
- public final TriangulationPolyDataNodeDefault createPolyData() {
+ protected PointsMapping createMapping(ProgressionInterface prog) {
+ pointsMapping = null;
+ GisZoneCollectionPointDoublonRemover remover = new GisZoneCollectionPointDoublonRemover(pointsAdapter, eps);
+ pointsMapping = remover.createFiltered(prog);
+
+ return pointsMapping;
+ }
+
+ public final TriangulationPolyDataNodeDefault createPolyData(ProgressionInterface prog) {
+
TriangulationPolyDataNodeDefault data = new TriangulationPolyDataNodeDefault();
if (contour != null) {
GISVisitorGeometryCollector collector = new GISVisitorGeometryCollector(GISLib.MASK_POLYGONE);
@@ -93,9 +116,8 @@
data.setHoles(holes);
data.setRings(linearRings);
}
-
- data.setNodeData(triangleNodeAdapter);
-
+ PointsMapping filteredPoints = createMapping(prog);
+ data.setNodeData(filteredPoints);
data.setUseZAsAttribute(false);
return data;
}
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridGmshProcessor.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridGmshProcessor.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridGmshProcessor.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -24,28 +24,29 @@
/**
* Pas complet: laisser si repris mais ne fonctionne pas comme attendu. Le chemin en dur vers gmsh est laiss\xE9 ( voir le TODO).
+ *
* @author Frederic Deniger
*/
-public class CalqueCreateGridGmshProcessor extends AbstractCalqueCreateGridProcessor{
-
-
+public class CalqueCreateGridGmshProcessor extends AbstractCalqueCreateGridProcessor {
+
public CalqueCreateGridGmshProcessor(ZModeleMultiPoint points, CtuluUI ui, ZCalqueLigneBrisee contour, LinearRing convexHull) {
super(points, ui, contour, convexHull);
}
-
+
@Override
public EfGridInterface process(ProgressionInterface prog) {
- try {
+ try {
stop = false;
File tmpDir = CtuluLibFile.createTempDir();
String fileName = null;
CExec exe = new CExec();
exe.setExecDirectory(tmpDir);
-
+
fileName = "in.geo";
- TriangulationPolyDataNodeDefault data = createPolyData();
+ TriangulationPolyDataNodeDefault data = createPolyData(prog);
File polyFile = new File(tmpDir, fileName);
GmshGeoWriter writer = new GmshGeoWriter();
+ writer.setEps(eps);
CtuluIOOperationSynthese write = writer.write(data, polyFile, prog);
if (write.containsError()) {
ui.manageErrorOperationAndIsFatal(write);
@@ -82,5 +83,4 @@
}
return null;
}
-
}
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridPoly2TriProcessor.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridPoly2TriProcessor.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridPoly2TriProcessor.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -24,10 +24,10 @@
import org.fudaa.dodico.ef.EfGridInterface;
import org.fudaa.dodico.ef.EfNode;
import org.fudaa.dodico.ef.impl.EfGrid;
-import org.fudaa.dodico.ef.io.common.TriangulationConvexHullBuilder;
-import org.fudaa.dodico.ef.io.common.TriangulationPolyDataInterface;
-import org.fudaa.dodico.ef.io.common.TriangulationUniqueDataContent;
-import org.fudaa.dodico.ef.io.common.TriangulationUniqueDataContentBuilder;
+import org.fudaa.dodico.ef.triangulation.TriangulationConvexHullBuilder;
+import org.fudaa.dodico.ef.triangulation.TriangulationPolyDataInterface;
+import org.fudaa.dodico.ef.triangulation.TriangulationUniqueDataContent;
+import org.fudaa.dodico.ef.triangulation.TriangulationUniqueDataContentBuilder;
import org.fudaa.ebli.calque.ZCalqueLigneBrisee;
import org.fudaa.ebli.calque.ZModeleMultiPoint;
import org.fudaa.fudaa.modeleur.resource.MdlResource;
@@ -54,7 +54,7 @@
@Override
public EfGridInterface process(ProgressionInterface prog) {
stop = false;
- TriangulationPolyDataInterface data = createPolyData();
+ TriangulationPolyDataInterface data = createPolyData(prog);
ProgressionUpdater updater = new ProgressionUpdater(prog);
updater.majProgessionStateOnly(MdlResource.getS("Construction des donn\xE9es d'entr\xE9e"));
@@ -69,14 +69,11 @@
data = builder.addConvexHullIfNeeded(data);
int idxExternPoly = builder.getExternPolygonIdx(data);
updater.majProgessionStateOnly(MdlResource.getS("Construction des points"));
- TreeSet<Coordinate> addedCoordinate = new TreeSet<Coordinate>(new CoordinateComparator());
+ TreeSet<Coordinate> addedCoordinate = new TreeSet<Coordinate>(new CoordinateComparator(eps));
LinearRing externRing = data.getPoly(idxExternPoly);
SIRtreePointInRing isInMainRing = new SIRtreePointInRing(externRing);
List<SIRtreePointInRing> isInHoles = new ArrayList<SIRtreePointInRing>();
List<PolygonPoint> polygonPoints = createPolygonPoints(externRing, addedCoordinate);
- boolean valid = externRing.isValid();
- boolean simple = externRing.isSimple();
- boolean ccW = CGAlgorithms.isCCW(externRing.getCoordinates());
Polygon polygon = new Polygon(polygonPoints);
if (data.getNbPoly() > 1) {
for (int idxPoly = 0; idxPoly < data.getNbPoly(); idxPoly++) {
@@ -86,7 +83,7 @@
}
}
}
- int nbPoints = data.getNbPoints();
+ int nbPoints = data.getPtsNb();
updater.setValue(10, nbPoints);
for (int idxPt = 0; idxPt < nbPoints; idxPt++) {
double x = data.getPtX(idxPt);
@@ -115,7 +112,7 @@
return createGrid(polygon, prog);
} else {
- TriangulationUniqueDataContent content = new TriangulationUniqueDataContentBuilder(data).build(null);
+ TriangulationUniqueDataContent content = new TriangulationUniqueDataContentBuilder(data, eps).build(prog);
List<TriangulationPoint> pointSet = new ArrayList<TriangulationPoint>();
for (int i = 0; i < content.getNbPoints(); i++) {
pointSet.add(new TPoint(content.getX(i), content.getY(i)));
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridTriangleProcessor.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridTriangleProcessor.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueCreateGridTriangleProcessor.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -13,9 +13,11 @@
import org.fudaa.ctulu.CtuluLibFile;
import org.fudaa.ctulu.CtuluUI;
import org.fudaa.ctulu.ProgressionInterface;
+import org.fudaa.ctulu.gis.process.PointsMapping;
import org.fudaa.dodico.ef.EfGridInterface;
import org.fudaa.dodico.ef.impl.EFGridArrayZ;
import org.fudaa.dodico.ef.io.triangle.TriangleEleNodeGridCreator;
+import org.fudaa.dodico.ef.io.triangle.TriangleNodeSupportAdapter;
import org.fudaa.dodico.ef.io.triangle.TriangleNodeWriter;
import org.fudaa.dodico.ef.io.triangle.TriangulationPolyDataNodeDefault;
import org.fudaa.dodico.ef.io.triangle.TrianglePolyWriter;
@@ -30,20 +32,19 @@
* @author Frederic Deniger
*/
public class CalqueCreateGridTriangleProcessor extends AbstractCalqueCreateGridProcessor {
-
+
public static String getTriangleExe() {
return MdlPreferences.MDL.getStringProperty("grid.triangle.path");
}
-
+
public static boolean isTriangleExeConfigured() {
return getTriangleExe() != null && new File(getTriangleExe()).exists();
}
-
+
public CalqueCreateGridTriangleProcessor(ZModeleMultiPoint points, CtuluUI ui, ZCalqueLigneBrisee contour, LinearRing convexHull) {
super(points, ui, contour, convexHull);
}
-
-
+
@Override
public EfGridInterface process(ProgressionInterface prog) {
if (!isTriangleExeConfigured()) {
@@ -59,7 +60,9 @@
fileName = "in.node";
File nodeFile = new File(tmpDir, fileName);
TriangleNodeWriter writer = new TriangleNodeWriter();
- CtuluIOOperationSynthese write = writer.write(triangleNodeAdapter, nodeFile, prog);
+ //construction des points filtr\xE9s.
+ PointsMapping points = createMapping(prog);
+ CtuluIOOperationSynthese write = writer.write(new TriangleNodeSupportAdapter(points), nodeFile, prog);
if (write.containsError()) {
ui.manageErrorOperationAndIsFatal(write);
return null;
@@ -67,9 +70,10 @@
exe.setCommand(new String[]{getTriangleExe(), fileName});
} else {
fileName = "in.poly";
- TriangulationPolyDataNodeDefault data = createPolyData();
+ TriangulationPolyDataNodeDefault data = createPolyData(prog);
File polyFile = new File(tmpDir, fileName);
TrianglePolyWriter writer = new TrianglePolyWriter();
+ writer.setEps(super.eps);
CtuluIOOperationSynthese write = writer.write(data, polyFile, prog);
if (write.containsError()) {
ui.manageErrorOperationAndIsFatal(write);
@@ -85,9 +89,9 @@
if (prog != null) {
prog.setDesc(MdlResource.getS("Ex\xE9cution du mailleur"));
}
-
-
-
+
+
+
exe.setListener(this);
exe.exec();
if (stop) {
@@ -114,5 +118,4 @@
}
return null;
}
-
}
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueGridSemisSynchronizeProcess.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueGridSemisSynchronizeProcess.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/CalqueGridSemisSynchronizeProcess.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -4,7 +4,9 @@
package org.fudaa.fudaa.modeleur.grid;
import com.vividsolutions.jts.geom.Coordinate;
+import gnu.trove.TIntArrayList;
import java.util.TreeMap;
+import org.fudaa.ctulu.CtuluListSelection;
import org.fudaa.ctulu.ProgressionInterface;
import org.fudaa.ctulu.ProgressionUpdater;
import org.fudaa.ctulu.gis.GisZoneCollectionAsListPointAdapter;
@@ -26,27 +28,71 @@
private final GisZoneCollectionAsListPointAdapter zone;
private double eps = 1e-3;
+ public static class Result {
+
+ //un tableau dont la taille est grid.nbPoint.Pour chaque point du maillage donne l'indice du noeud dans le mod\xE8les multipoint.
+ int[][] relations;
+ /**
+ * contient la liste des points du semis qui sera support\xE9 par un point du maillage.
+ */
+ CtuluListSelection initPointPaintedByMesh;
+
+ public Result(int[][] relations, CtuluListSelection initPointPaintedByMesh) {
+ this.relations = relations;
+ this.initPointPaintedByMesh = initPointPaintedByMesh;
+ }
+
+ /**
+ * un tableau dont la taille est grid.nbPoint.Pour chaque point du maillage donne l'indice du noeud dans le mod\xE8les multipoint.
+ * @return
+ */
+ public int[][] getRelations() {
+ return relations;
+ }
+
+ /**
+ *
+ * @return les points de la zone support\xE9 par un unique point du maillage.
+ */
+ public CtuluListSelection getInitPointPaintedByMesh() {
+ return initPointPaintedByMesh;
+ }
+ }
+
public CalqueGridSemisSynchronizeProcess(GisZoneCollectionAsListPointAdapter triangleNodeAdapter) {
this.zone = triangleNodeAdapter;
}
+ public void setEps(double eps) {
+ this.eps = eps;
+ }
+
/**
*
*
* @param grid
* @return un tableau dont la taille est grid.nbPoint.Pour chaque point du maillage donne l'indice du noeud dans le mod\xE8les multipoint.
*/
- public int[][] getRelations(EfGridInterface grid, ProgressionInterface prog) {
+ public Result getRelations(EfGridInterface grid, ProgressionInterface prog) {
if (grid == null) {
- return new int[0][0];
+ return new Result(new int[0][0], new CtuluListSelection());
}
int[][] res = new int[grid.getPtsNb()][];
+
ProgressionUpdater updater = new ProgressionUpdater(prog);
- TreeMap<Coordinate, Integer> index = new TreeMap<Coordinate, Integer>(new CoordinateComparator(eps));
+ TreeMap<Coordinate, TIntArrayList> index = new TreeMap<Coordinate, TIntArrayList>(new CoordinateComparator(eps));
updater.majProgessionStateOnly(MdlResource.getS("Synchronisation des indices"));
updater.setValue(10, zone.getPtsNb());
+ //indique les points de la zone qui seront repr\xE9sent\xE9s par un unique point du maillage.
+ CtuluListSelection initPointPaintedByMesh = new CtuluListSelection(zone.getPtsNb());
for (int i = 0; i < zone.getPtsNb(); i++) {
- index.put(new Coordinate(zone.getPtX(i), zone.getPtY(i)), i);
+ final Coordinate coordinate = new Coordinate(zone.getPtX(i), zone.getPtY(i));
+ TIntArrayList ptIdx = index.get(coordinate);
+ if (ptIdx == null) {
+ ptIdx = new TIntArrayList();
+ index.put(coordinate, ptIdx);
+ }
+ ptIdx.add(i);
updater.majAvancement();
}
updater.setValue(10, grid.getPtsNb());
@@ -54,9 +100,13 @@
for (int i = 0; i < grid.getPtsNb(); i++) {
Coordinate gridCoor = new Coordinate(grid.getPtX(i), grid.getPtY(i));
- Integer idx = index.get(gridCoor);
- if (idx != null) {
- res[i] = new int[]{idx};
+ TIntArrayList idxs = index.get(gridCoor);
+ if (idxs != null) {
+ for (int j = idxs.size() - 1; j >= 0; j--) {
+ initPointPaintedByMesh.add(idxs.get(j));
+ }
+ //le premier point de la collection est pris.
+ res[i] = new int[]{idxs.get(0)};
} else {
rescanElt = true;
}
@@ -74,7 +124,7 @@
}
//on va affecter a des points, les m\xEAme r\xE9sultats que ceux de l'\xE9l\xE9ments.
- return res;
+ return new Result(res, initPointPaintedByMesh);
}
}
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/GridChooseToolAndContourConvexHullPanel.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/GridChooseToolAndContourConvexHullPanel.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/GridChooseToolAndContourConvexHullPanel.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -5,6 +5,7 @@
import com.memoire.bu.BuGridLayout;
import com.memoire.bu.BuLabel;
+import com.memoire.bu.BuTextField;
import com.vividsolutions.jts.geom.LinearRing;
import java.awt.Component;
import java.awt.event.ItemEvent;
@@ -32,22 +33,28 @@
* @author Frederic Deniger
*/
public class GridChooseToolAndContourConvexHullPanel extends CtuluDialogPanel {
-
+
JComboBox cbTriangulateur;
JComboBox cbLayer;
JComboBox cbConvexHull;
+ BuTextField tfEps;
CtuluFileChooserPanel chooseExe;
-
+
public GridChooseToolAndContourConvexHullPanel(MdlVisuPanel visuPanel) {
super(false);
setHelpText(MdlResource.getS("Choisir le calque qui d\xE9terminera le contour et les trous du maillage"));
setLayout(new BuGridLayout(2, 5, 5));
+ BuLabel chooseEps = addLabel(MdlResource.getS("Epsilon"));
+ chooseEps.setToolTipText(MdlResource.getS("Distance en-dessous de laquelle 2 points sont consid\xE9r\xE9s comme \xE9gaux"));
+ tfEps = addDoubleText();
+ tfEps.setText("0.001");
+ tfEps.setToolTipText(chooseEps.getToolTipText());
BuLabel chooseMailleur = addLabel(MdlResource.getS("Triangulateur"));
chooseMailleur.setToolTipText(MdlResource.getS("<html><body>Choisi le triangulateur<br>Triangle est plus robuste et mieux adapt\xE9 au volume important.<br>Si vous utiliser Triangle, vous devez t\xE9l\xE9charger un ex\xE9cutable.<br>https://www.cs.cmu.edu/~quake/triangle.html"));
cbTriangulateur = new JComboBox(TriangulateurEnum.values());
add(cbTriangulateur);
chooseExe = addFileChooserPanel(this, MdlResource.getS("Chemin pour Triangle") + ": ", false, false);
-
+
cbTriangulateur.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
@@ -88,11 +95,11 @@
}
updateChooseExecState();
}
-
+
protected final void updateChooseExecState() {
chooseExe.setEnabled(isTriangleSelected());
}
-
+
@Override
public boolean isDataValid() {
if (!isTriangleSelected()) {
@@ -106,9 +113,18 @@
setErrorText(MdlResource.getS("Le chemin vers l'ex\xE9cutable Triangle n'existe pas: {0}", choosenFile.getAbsolutePath()));
return false;
}
+ Double value = getEps();
+ if (value == null || value < 0) {
+ setErrorText(MdlResource.getS("Une valeur strictement positive pour epsilon est requise"));
+ return false;
+ }
return super.isDataValid();
}
-
+
+ public Double getEps() {
+ return (Double) tfEps.getValue();
+ }
+
@Override
public void apply() {
super.apply();
@@ -116,30 +132,30 @@
File choosenFile = chooseExe.getFile();
if (choosenFile != null) {
MdlPreferences.MDL.putStringProperty("grid.triangle.path", choosenFile.getAbsolutePath());
-
+
}
}
MdlPreferences.MDL.putStringProperty("grid.triangulateur.used", isTriangleSelected() ? "triangle" : "interne");
MdlPreferences.MDL.writeIniFile();
}
-
+
private boolean isTriangleLastUsed() {
return "triangle".equals(MdlPreferences.MDL.getStringProperty("grid.triangulateur.used"));
}
-
+
public boolean isTriangleSelected() {
return TriangulateurEnum.TRIANGLE.equals(cbTriangulateur.getSelectedItem());
-
-
+
+
}
-
+
private class LinearRingCellRenderer extends CtuluCellTextRenderer {
-
+
@Override
public Component getListCellRendererComponent(JList _list, Object _value, int _index, boolean _isSelected, boolean _cellHasFocus) {
return super.getListCellRendererComponent(_list, getValue(_value, _index), _index, _isSelected, _cellHasFocus);
}
-
+
protected String getValue(Object _value, int selectedIdx) {
if (_value == null) {
return MdlResource.getS("Aucun");
@@ -161,7 +177,7 @@
return _value.toString();
}
}
-
+
protected void updateConvexHullCb() {
ZCalqueLigneBrisee selectedLayer = getSelectedLayer();
if (selectedLayer == null) {
@@ -170,13 +186,13 @@
cbConvexHull.setModel(new LinearRingComboBoxModel(selectedLayer));
cbConvexHull.setSelectedIndex(0);
}
-
+
}
-
+
public ZCalqueLigneBrisee getSelectedLayer() {
return cbLayer == null ? null : (ZCalqueLigneBrisee) cbLayer.getSelectedItem();
}
-
+
public LinearRing getSelectedConvexHull() {
return cbConvexHull == null ? null : (LinearRing) cbConvexHull.getSelectedItem();
}
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlCalqueMultiPointEditable.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlCalqueMultiPointEditable.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlCalqueMultiPointEditable.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -166,7 +166,7 @@
protected boolean isIconOnAtomicsPainted(int idxGeometry, int idxPoint) {
if (getLayerGridDelegate().isGridCreated() && isTraceIsoSurface()) {
MdlElementModel modele = getLayerGridDelegate().getGridLayer().modele();
- int idx = modele.getTriangleNodeAdapter().getIdx(idxGeometry, idxPoint);
+ int idx = modele.getPointsAdapter().getIdx(idxGeometry, idxPoint);
if (modele.isNodePaintedByIso(idx)) {
return false;
}
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlElementModel.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlElementModel.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/grid/MdlElementModel.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -31,27 +31,28 @@
/**
* une repr\xE9sentation des points du semis sous forme de liste.
*/
- private GisZoneCollectionAsListPointAdapter triangleNodeAdapter;
+ private GisZoneCollectionAsListPointAdapter pointsAdapter;
/**
- * Contient la liste des indices des points (issus de triangleNodeAdapter) qui seront dessin\xE9s par les iso c'est \xE0 dire les points du modele initial
- * qui correspondantent pr\xE9cisement \xE0 un point du maillage
+ * Contient la liste des indices des points (issus de pointsAdapter) qui seront dessin\xE9s par les iso c'est \xE0 dire les points du modele initial qui
+ * correspondantent pr\xE9cisement \xE0 un point du maillage
*/
CtuluListSelection gisNodePaintedInIso;
public void setAltiIdxByGridPtIdx(int[][] relations) {
this.altiIdxByGridPtIdx = relations;
- gisNodePaintedInIso = new CtuluListSelection();
- for (int i = 0; i < relations.length; i++) {
- int[] is = relations[i];
- if (is != null && is.length == 1) {
- gisNodePaintedInIso.add(is[0]);
- }
- }
}
/**
- * pour des raisons de perf permet de savoir si un point du TriangleNodeAdapter correspond \xE0 un point du
*
+ * @param initPointPaintedByMesh les points de la zone de points correspondant \xE0 un unique point du maillage.
+ */
+ public void setInitPointPaintedByMesh(CtuluListSelection initPointPaintedByMesh) {
+ this.gisNodePaintedInIso = initPointPaintedByMesh;
+ }
+
+ /**
+ * pour des raisons de perf permet de savoir si un point du PointsAdapter correspond \xE0 un point du
+ *
* @param idxInCollection
* @return
*/
@@ -113,7 +114,7 @@
return 0;
}
if (idxs.length == 1) {
- return triangleNodeAdapter.getValue(idxs[0], idxAttribute);
+ return pointsAdapter.getValue(idxs[0], idxAttribute);
}
//on interpole:
double num = 0;
@@ -124,24 +125,29 @@
// ptIdx est l'indice du point de reference
final int ptIdx = idxs[j];
if (ptIdx >= 0) {
- final double xref = triangleNodeAdapter.getPtX(ptIdx);
- final double yref = triangleNodeAdapter.getPtY(ptIdx);
+ final double xref = pointsAdapter.getPtX(ptIdx);
+ final double yref = pointsAdapter.getPtY(ptIdx);
final double dist = CtuluLibGeometrie.getD2(xref, yref, ptX, ptY);
- num += triangleNodeAdapter.getValue(ptIdx, idxAttribute) / dist;
+ num += pointsAdapter.getValue(ptIdx, idxAttribute) / dist;
den += 1d / dist;
}
}
return num / den;
}
- public void setTriangleNodeAdapter(GisZoneCollectionAsListPointAdapter triangleNodeAdapter) {
- this.triangleNodeAdapter = triangleNodeAdapter;
+ public void setPointsAdapter(GisZoneCollectionAsListPointAdapter triangleNodeAdapter) {
+ this.pointsAdapter = triangleNodeAdapter;
}
- public GisZoneCollectionAsListPointAdapter getTriangleNodeAdapter() {
- return triangleNodeAdapter;
+ public GisZoneCollectionAsListPointAdapter getPointsAdapter() {
+ return pointsAdapter;
}
+ public CtuluListSelection getGisNodePaintedInIso() {
+ return gisNodePaintedInIso;
+ }
+
+
/**
* Attention on ne fait pas de copie defensive du tableau pour des raisons de performance.
*
Modified: trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dMultiPointPersistence.java
===================================================================
--- trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dMultiPointPersistence.java 2013-01-14 12:44:27 UTC (rev 8205)
+++ trunk/soft/fudaa-modeleur/src/main/java/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dMultiPointPersistence.java 2013-01-14 12:45:08 UTC (rev 8206)
@@ -30,6 +30,7 @@
import org.apache.commons.lang.ArrayUtils;
import org.fudaa.ctulu.CtuluAnalyze;
import org.fudaa.ctulu.CtuluArkSaver;
+import org.fudaa.ctulu.CtuluListSelection;
import org.fudaa.dodico.ef.EfElement;
import org.fudaa.dodico.ef.EfGridInterface;
import org.fudaa.dodico.ef.EfNode;
@@ -50,7 +51,14 @@
public abstract class MdlLayer2dMultiPointPersistence extends FSigLayerLinePersistence {
public static final String PAINTED_EXT = ".painted";
- public static final String CORRESPONDANCE_EXT = ".correspondance";
+ /**
+ * correspondance entre points du maillage et point du semis
+ */
+ public static final String CORRESPONDANCE_EXT = ".mapping";
+ /**
+ * points du semis support\xE9s par un unique point du maillage
+ */
+ public static final String CORRESPONDANCE_PAINTED_EXT = ".painted.mapping";
public static final String GRID_X_EXT = ".grid.x";
public static final String GRID_Y_EXT = ".grid.y";
public static final String GRID_IPOBO_EXT = ".grid.ipobo";
@@ -121,11 +129,16 @@
if (reader != null) {
DodicoArraysBinaryFileSaver saver = new DodicoArraysBinaryFileSaver();
int[][] correspondance = saver.load(reader);
- if (correspondance != null) {
+ InputStream paintedReader = _loader.getReader(_parentDirEntry, _entryName + CORRESPONDANCE_PAINTED_EXT);
+ int[] gisNodePaintedInIso = null;
+ if (paintedReader != null) {
+ gisNodePaintedInIso = saver.loadSimpleArray(paintedReader);
+ }
+ if (correspondance != null && gisNodePaintedInIso != null) {
reader = _loader.getReader(_parentDirEntry, _entryName + PAINTED_EXT);
MdlElementModel model = new MdlElementModel(grid);
model.setAltiIdxByGridPtIdx(correspondance);
-
+ model.setInitPointPaintedByMesh(new CtuluListSelection(gisNodePaintedInIso));
boolean[] userVisible = saver.loadBoolean(reader);
if (ArrayUtils.isNotEmpty(userVisible)) {
model.setUserVisible(userVisible);
@@ -174,7 +187,7 @@
GISZoneCollection points = (GISZoneCollection) thisCalque.modeleDonnees().getGeomData();
points.updateListeners();
if (model != null) {
- model.setTriangleNodeAdapter(new TriangleNodeAdapter(points));
+ model.setPointsAdapter(new TriangleNodeAdapter(points));
thisCalque.getLayerGridDelegate().setGridLayer(model);
//on r\xE9initialise les propri\xE9t\xE9s por
thisCalque.initFrom(_saver.getUI());
@@ -236,13 +249,18 @@
public void saveCorrespondance(LayerGridController layerGridDelegate, BCalque _cqToSave, String _parentDirEntry, BCalqueSaverInterface res, CtuluArkSaver _saver) {
//le maillage:
MdlElementModel layerModel = layerGridDelegate.getGridLayer().modele();
- final String entry = getEntryBase(_cqToSave, _parentDirEntry, res.getId()) + CORRESPONDANCE_EXT;
+ final String entryCorrespondance = getEntryBase(_cqToSave, _parentDirEntry, res.getId()) + CORRESPONDANCE_EXT;
try {
- _saver.startEntry(entry);
+ _saver.startEntry(entryCorrespondance);
int[][] corr = layerModel.getCorrespondance();
DodicoArraysBinaryFileSaver saver = new DodicoArraysBinaryFileSaver();
saver.save(_saver.getOutStream(), corr);
_saver.getOutStream().flush();
+ final String entryPainted = getEntryBase(_cqToSave, _parentDirEntry, res.getId()) + CORRESPONDANCE_PAINTED_EXT;
+ _saver.startEntry(entryPainted);
+ final int[] selectedIndex = layerModel.getGisNodePaintedInIso().getSelectedIndex();
+ saver.saveSimpleArray(_saver.getOutStream(), selectedIndex);
+ _saver.getOutStream().flush();
} catch (final Exception _evt) {
FuLog.error(_evt);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|