|
From: <de...@us...> - 2013-01-21 09:38:23
|
Revision: 8228
http://fudaa.svn.sourceforge.net/fudaa/?rev=8228&view=rev
Author: deniger
Date: 2013-01-21 09:38:14 +0000 (Mon, 21 Jan 2013)
Log Message:
-----------
Modified Paths:
--------------
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/AbstractTriangulationPolyData.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationConvexHullBuilder.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataConvexHullAdapter.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataInterface.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationUniqueDataContentBuilder.java
trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/gmsh/GmshGeoWriter.java
trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriter.java
trunk/business/fudaa-ef/io/src/test/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriterTest.java
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/AbstractTriangulationPolyData.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/AbstractTriangulationPolyData.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/AbstractTriangulationPolyData.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -3,7 +3,7 @@
*/
package org.fudaa.dodico.ef.triangulation;
-import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.LineString;
/**
* une impl\xE9mentation par defaut avec les z comme attributs.
@@ -12,7 +12,7 @@
*/
public abstract class AbstractTriangulationPolyData implements TriangulationPolyDataInterface {
- LinearRing[] rings = new LinearRing[0];
+ LineString[] lines = new LineString[0];
boolean[] holes = new boolean[0];
boolean useZAsAttribute;
@@ -27,30 +27,35 @@
this.holes = holes;
}
- public void setRings(LinearRing[] rings) {
- this.rings = rings;
+ public void setLineString(LineString[] rings) {
+ this.lines = rings;
}
+ @Override
+ public boolean isClosed(int idxLine) {
+ return lines[idxLine].isRing();
+ }
+
public int getNbAttributes() {
return useZAsAttribute ? 1 : 0;
}
@Override
- public int getNbPoly() {
- return rings.length;
+ public int getNbLines() {
+ return lines.length;
}
@Override
- public LinearRing getPoly(int idxPoly) {
- return rings[idxPoly];
+ public LineString getLine(int idxPoly) {
+ return lines[idxPoly];
}
@Override
- public boolean isHole(int idxPoly) {
- return holes[idxPoly];
+ public boolean isClosedAndHole(int idxPoly) {
+ return isClosed(idxPoly) && holes[idxPoly];
}
public double getPolyAttributes(int idxPoly, int idxPtInPoly, int idxAtt) {
- return getPoly(idxPoly).getCoordinateSequence().getCoordinate(idxPtInPoly).z;
+ return getLine(idxPoly).getCoordinateSequence().getCoordinate(idxPtInPoly).z;
}
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationConvexHullBuilder.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationConvexHullBuilder.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationConvexHullBuilder.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -5,6 +5,7 @@
import com.vividsolutions.jts.algorithm.ConvexHull;
import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.Polygon;
import java.util.TreeSet;
@@ -12,16 +13,17 @@
import org.fudaa.ctulu.gis.comparator.CoordinateComparator;
/**
- * Permet de d\xE9terminer l'enveloppe convexe d'un ensemble de donn\xE9es points/polylignes
+ * Permet de d\xE9terminer l'enveloppe convexe d'un ensemble de donn\xE9es points/polylignes
+ *
* @author Frederic Deniger
*/
public class TriangulationConvexHullBuilder {
public int getNbExternPolygon(TriangulationPolyDataInterface data) {
int nbExtern = 0;
- int nbPoly = data.getNbPoly();
+ int nbPoly = data.getNbLines();
for (int i = 0; i < nbPoly; i++) {
- if (!data.isHole(i)) {
+ if (!data.isClosedAndHole(i)) {
nbExtern++;
}
}
@@ -29,9 +31,9 @@
}
public int getExternPolygonIdx(TriangulationPolyDataInterface data) {
- int nbPoly = data.getNbPoly();
+ int nbPoly = data.getNbLines();
for (int i = 0; i < nbPoly; i++) {
- if (!data.isHole(i)) {
+ if (!data.isClosedAndHole(i)) {
return i;
}
}
@@ -47,8 +49,8 @@
for (int idxPoint = 0; idxPoint < data.getPtsNb(); idxPoint++) {
cs.add(new Coordinate(data.getPtX(idxPoint), data.getPtY(idxPoint)));
}
- for (int idxPoly = 0; idxPoly < data.getNbPoly(); idxPoly++) {
- LinearRing poly = data.getPoly(idxPoly);
+ for (int idxPoly = 0; idxPoly < data.getNbLines(); idxPoly++) {
+ LineString poly = data.getLine(idxPoly);
for (int idxPt = 0; idxPt < poly.getNumPoints(); idxPt++) {
cs.add(new Coordinate(poly.getCoordinateN(idxPt)));
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataConvexHullAdapter.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataConvexHullAdapter.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataConvexHullAdapter.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -3,6 +3,7 @@
*/
package org.fudaa.dodico.ef.triangulation;
+import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
/**
@@ -36,23 +37,23 @@
}
@Override
- public int getNbPoly() {
- return init.getNbPoly() + 1;
+ public int getNbLines() {
+ return init.getNbLines() + 1;
}
@Override
- public LinearRing getPoly(int idxPoly) {
+ public LineString getLine(int idxPoly) {
if (idxPoly == 0) {
return convexHull;
}
- return init.getPoly(idxPoly - 1);
+ return init.getLine(idxPoly - 1);
}
@Override
- public boolean isHole(int idxPoly) {
+ public boolean isClosedAndHole(int idxPoly) {
if (idxPoly == 0) {
return false;
}
- return init.isHole(idxPoly - 1);
+ return init.isClosedAndHole(idxPoly - 1);
}
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataInterface.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataInterface.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationPolyDataInterface.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -3,7 +3,7 @@
*/
package org.fudaa.dodico.ef.triangulation;
-import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.LineString;
import org.fudaa.ctulu.interpolation.SupportLocationI;
/**
@@ -17,18 +17,20 @@
*
* @return le nombre de polygone
*/
- int getNbPoly();
+ int getNbLines();
/**
- * @param idxPoly entre 0 et getNbPoly-1
+ * @param idxClosedLine entre 0 et getNbLines-1
* @return le polygone
*/
- LinearRing getPoly(int idxPoly);
+ LineString getLine(int idxClosedLine);
+ boolean isClosed(int idxLine);
+
/**
*
- * @param idxPoly entre 0 et getNbPoly-1
- * @return true si le polygone i est un true.
+ * @param idxClosedLine entre 0 et getNbLines-1
+ * @return true si le polygone i est un trou.
*/
- boolean isHole(int idxPoly);
+ boolean isClosedAndHole(int idxClosedLine);
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationUniqueDataContentBuilder.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationUniqueDataContentBuilder.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/triangulation/TriangulationUniqueDataContentBuilder.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -5,6 +5,7 @@
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
+import com.vividsolutions.jts.geom.LineString;
import gnu.trove.TIntArrayList;
import java.util.ArrayList;
import java.util.List;
@@ -14,8 +15,9 @@
import org.fudaa.ctulu.gis.comparator.CoordinateComparator;
/**
- * Permet de construire un TriangulationUniqueDataContent \xE0 partir d'un TriangulationPolyDataInterface.
- * Ce contenu \xE9vite les doublons au niveau des points.
+ * Permet de construire un TriangulationUniqueDataContent \xE0 partir d'un TriangulationPolyDataInterface. Ce contenu \xE9vite les doublons au niveau des
+ * points.
+ *
* @author Frederic Deniger
*/
public class TriangulationUniqueDataContentBuilder {
@@ -38,7 +40,7 @@
TIntArrayList linearRingContainingPoint = new TIntArrayList();
TreeMap<Coordinate, Integer> idxByCoordinate = new TreeMap<Coordinate, Integer>(coordinateComparator);
int nb = in.getPtsNb();
- final int nbPoly = in.getNbPoly();
+ final int nbPoly = in.getNbLines();
ProgressionUpdater updater = new ProgressionUpdater();
updater.setValue(10, nb + nbPoly);
int idxPtAdded = 0;
@@ -49,13 +51,14 @@
//point interne:
linearRingContainingPoint.add(-1);
idxByCoordinate.put(coordinate, idxPtAdded++);
- }
+ }
updater.majAvancement();
}
int[][] idx = new int[nbPoly][];
for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
- CoordinateSequence coordinateSequence = in.getPoly(idxPoly).getCoordinateSequence();
- int nbPt = coordinateSequence.size() - 1;//premier point = dernier point
+ final LineString line = in.getLine(idxPoly);
+ CoordinateSequence coordinateSequence = line.getCoordinateSequence();
+ int nbPt = in.isClosed(idxPoly) ? coordinateSequence.size() - 1 : coordinateSequence.size();//premier point = dernier point
idx[idxPoly] = new int[nbPt];
for (int idxPt = 0; idxPt < nbPt; idxPt++) {
Coordinate coordinate = coordinateSequence.getCoordinate(idxPt);
Modified: trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/gmsh/GmshGeoWriter.java
===================================================================
--- trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/gmsh/GmshGeoWriter.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/gmsh/GmshGeoWriter.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -3,6 +3,7 @@
*/
package org.fudaa.dodico.ef.io.gmsh;
+import com.vividsolutions.jts.geom.LineString;
import org.fudaa.dodico.ef.io.triangle.*;
import org.fudaa.dodico.ef.triangulation.TriangulationPolyDataInterface;
import com.vividsolutions.jts.geom.LinearRing;
@@ -20,6 +21,7 @@
import org.fudaa.dodico.ef.triangulation.TriangulationUniqueDataContent;
import org.fudaa.dodico.ef.triangulation.TriangulationUniqueDataContentBuilder;
import org.fudaa.dodico.fortran.FileOpWriterCharSimpleAbstract;
+import sun.nio.cs.ext.ISCII91;
/**
* Permet d'\xE9crire un fichier d'entr\xE9e pour GMSH. Par contre, le mailleur ne semble pas extr\xEAmenent robuste. Lors de l'\xE9criture du fichier geo, on
@@ -82,7 +84,7 @@
if (nbExtern == 0) {
data = convexHullBuilder.addConvexHullIfNeeded(data);
}
- int nbPoly = data.getNbPoly();
+ int nbPoly = data.getNbLines();
TriangulationUniqueDataContentBuilder builder = new TriangulationUniqueDataContentBuilder(data, eps);
TriangulationUniqueDataContent content = builder.build(progress_);
@@ -112,7 +114,7 @@
}
int nbSegment = 0;
for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
- LinearRing poly = data.getPoly(idxPoly);
+ LineString poly = data.getLine(idxPoly);
//premier point = dernier point donc -1
int numPoints = poly.getNumPoints() - 1;
nbSegment = nbSegment + numPoints;
@@ -127,8 +129,8 @@
TIntArrayList[] segmentBySurface = new TIntArrayList[nbPoly];
for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
segmentBySurface[idxPoly] = new TIntArrayList();
- LinearRing poly = data.getPoly(idxPoly);
- int numPoints = poly.getNumPoints() - 2;//le dernier segment est \xE9crit apr\xE8s
+ LineString poly = data.getLine(idxPoly);
+ int numPoints = data.isClosed(idxPoly) ? poly.getNumPoints() - 2 : poly.getNumPoints() - 1;//le dernier segment est \xE9crit apr\xE8s
for (int idxPt = 0; idxPt < numPoints; idxPt++) {
writeString("Line(");
segmentBySurface[idxPoly].add(globalIdxSeg);
@@ -145,27 +147,32 @@
writelnToOut();
updater.majAvancement();
}
- //le segment fermant
- writeString("Line(");
- segmentBySurface[idxPoly].add(globalIdxSeg);
- writeInt(globalIdxSeg++);
- writeString(") = {");
- final int idxVertex = content.getPtIdxFor(idxPoly, numPoints) + 1;
- writeInt(idxVertex);
- writeString(",");
- final int idxVertexNext = content.getPtIdxFor(idxPoly, 0) + 1;
- writeInt(idxVertexNext);
- pointInSurface.remove(idxVertex);
- pointInSurface.remove(idxVertexNext);
- writeString("};");
- writelnToOut();
- updater.majAvancement();
+ if (data.isClosed(idxPoly)) {
+ //le segment fermant
+ writeString("Line(");
+ segmentBySurface[idxPoly].add(globalIdxSeg);
+ writeInt(globalIdxSeg++);
+ writeString(") = {");
+ final int idxVertex = content.getPtIdxFor(idxPoly, numPoints) + 1;
+ writeInt(idxVertex);
+ writeString(",");
+ final int idxVertexNext = content.getPtIdxFor(idxPoly, 0) + 1;
+ writeInt(idxVertexNext);
+ pointInSurface.remove(idxVertex);
+ pointInSurface.remove(idxVertexNext);
+ writeString("};");
+ writelnToOut();
+ updater.majAvancement();
+ }
}
int idxLineExterne = -1;
// Line Loop(19) = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1};
int firstLineLoopIdx = globalIdxSeg;
for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
- if (!data.isHole(idxPoly)) {
+ if (!data.isClosed(idxPoly)) {
+ continue;
+ }
+ if (!data.isClosedAndHole(idxPoly)) {
idxLineExterne = globalIdxSeg;
}
final TIntArrayList lineLoop = segmentBySurface[idxPoly];
Modified: trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriter.java
===================================================================
--- trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriter.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriter.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -3,6 +3,7 @@
*/
package org.fudaa.dodico.ef.io.triangle;
+import com.vividsolutions.jts.geom.LineString;
import org.fudaa.dodico.ef.triangulation.TriangulationPolyDataInterface;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.Point;
@@ -20,7 +21,7 @@
import org.fudaa.dodico.fortran.FileOpWriterCharSimpleAbstract;
/**
- * Permet d'\xE9crire les fichiers de type poly: https://www.cs.cmu.edu/~quake/triangle.poly.html
+ * Permet d'\xE9crire les fichiers de type line: https://www.cs.cmu.edu/~quake/triangle.line.html
*
* @author Frederic Deniger
*/
@@ -57,7 +58,7 @@
TriangulationUniqueDataContentBuilder builder = new TriangulationUniqueDataContentBuilder(data, eps);
TriangulationUniqueDataContent content = builder.build(progress_);
- int nbPoly = data.getNbPoly();
+ int nbPoly = data.getNbLines();
int nbPointsTotal = content.getNbPoints();
//premiere ligne
// First line: <# of vertices> <dimension (must be 2)> <# of attributes> <# of boundary markers (0 or 1)>
@@ -89,9 +90,10 @@
}
int nbSegment = 0;
for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
- LinearRing poly = data.getPoly(idxPoly);
- //premier point = dernier point donc -1
- int numPoints = poly.getNumPoints() - 1;
+ LineString line = data.getLine(idxPoly);
+ //si ligne ferm\xE9e: premier point = dernier point donc -1
+ //si ligne ouverte -1 aussi.
+ int numPoints = line.getNumPoints() - 1;
nbSegment = nbSegment + numPoints;
}
//One line: <# of segments> <# of boundary markers (0 or 1)>
@@ -104,31 +106,34 @@
updater.majProgessionStateOnly(EfIOResource.getS("Ecriture des segments"));
//Following lines: <segment #> <endpoint> <endpoint> [boundary marker]
int globalIdxSeg = 1;
- for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
- LinearRing poly = data.getPoly(idxPoly);
- int numPoints = poly.getNumPoints() - 2;//le dernier segment est \xE9crit apr\xE8s
+ for (int idxLine = 0; idxLine < nbPoly; idxLine++) {
+ LineString poly = data.getLine(idxLine);
+ final boolean closed = data.isClosed(idxLine);
+ int numPoints = closed ? poly.getNumPoints() - 2 : poly.getNumPoints() - 1;//le dernier segment est \xE9crit apr\xE8s
for (int idxPt = 0; idxPt < numPoints; idxPt++) {
writeInt(globalIdxSeg++);
writeSpace();
- writeInt(content.getPtIdxFor(idxPoly, idxPt) + 1);
+ writeInt(content.getPtIdxFor(idxLine, idxPt) + 1);
writeSpace();
- writeInt(content.getPtIdxFor(idxPoly, idxPt + 1) + 1);
+ writeInt(content.getPtIdxFor(idxLine, idxPt + 1) + 1);
writeSpace();
//boundary marker
- writeInt(idxPoly + 1);
+ writeInt(idxLine + 1);
writelnToOut();
updater.majAvancement();
}
- //le segment fermant
- writeInt(globalIdxSeg++);
- writeSpace();
- writeInt(content.getPtIdxFor(idxPoly, numPoints) + 1);
- writeSpace();
- writeInt(content.getPtIdxFor(idxPoly, 0) + 1);
- writeSpace();
- //boundary marker
- writeInt(idxPoly + 1);
- writelnToOut();
+ if (closed) {
+ //le segment fermant
+ writeInt(globalIdxSeg++);
+ writeSpace();
+ writeInt(content.getPtIdxFor(idxLine, numPoints) + 1);
+ writeSpace();
+ writeInt(content.getPtIdxFor(idxLine, 0) + 1);
+ writeSpace();
+ //boundary marker
+ writeInt(idxLine + 1);
+ writelnToOut();
+ }
updater.majAvancement();
}
@@ -138,8 +143,8 @@
//on calcul le nombre de trous en stockant un point int\xE9rieur du trou
List<Point> holes = new ArrayList<Point>();
for (int idxPoly = 0; idxPoly < nbPoly; idxPoly++) {
- if (data.isHole(idxPoly)) {
- LinearRing poly = data.getPoly(idxPoly);
+ if (data.isClosedAndHole(idxPoly)) {
+ LinearRing poly = (LinearRing) data.getLine(idxPoly);
holes.add(poly.getCentroid());
}
}
Modified: trunk/business/fudaa-ef/io/src/test/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriterTest.java
===================================================================
--- trunk/business/fudaa-ef/io/src/test/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriterTest.java 2013-01-18 18:22:33 UTC (rev 8227)
+++ trunk/business/fudaa-ef/io/src/test/java/org/fudaa/dodico/ef/io/triangle/TrianglePolyWriterTest.java 2013-01-21 09:38:14 UTC (rev 8228)
@@ -6,7 +6,7 @@
import org.fudaa.dodico.ef.triangulation.TriangulationPolyDataDefault;
import org.fudaa.dodico.ef.triangulation.TriangulationPolyDataInterface;
import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.LineString;
import java.io.File;
import java.util.List;
import org.fudaa.ctulu.CtuluLibFile;
@@ -28,7 +28,7 @@
cs[0] = new Coordinate(3.5, 4, 10);
cs[1] = new Coordinate(4.5, 4, 10);
cs[2] = new Coordinate(5.5, 4, 10);
- LinearRing[] rings = new LinearRing[3];
+ LineString[] rings = new LineString[3];
rings[0] = GISGeometryFactory.INSTANCE.createLinearRing(2, 3, 4, 5);
setZ(rings[0], 20);
rings[1] = GISGeometryFactory.INSTANCE.createLinearRing(1, 10, 1, 20);
@@ -42,11 +42,11 @@
res.setUseZAsAttribute(true);
res.setCoordinates(cs);
res.setHoles(holes);
- res.setRings(rings);
+ res.setLineString(rings);
return res;
}
- private static void setZ(LinearRing ring, double z) {
+ private static void setZ(LineString ring, double z) {
for (int i = 0; i < ring.getNumPoints(); i++) {
ring.getCoordinateSequence().setOrdinate(i, 2, z);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|