[Wsplgen-commits] r142 - in trunk: . src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon Feb 16 00:15:23 CET 2009


Author: mrchip
Date: 2009-02-16 00:15:18 +0100 (Mon, 16 Feb 2009)
New Revision: 142

Modified:
   trunk/NEWS
   trunk/src/file.cpp
   trunk/src/test_file.cpp
   trunk/src/wsplgen.h
Log:
neues DGM-Format wird nun z.T. unterstuetzt

Modified: trunk/NEWS
===================================================================
--- trunk/NEWS	2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/NEWS	2009-02-15 23:15:18 UTC (rev 142)
@@ -10,6 +10,11 @@
 // Read the file COPYING coming with WSPLGEN for details.
 //
 
+Version 1.3.0
+
+       - Ein neues DGM-Format (bisher nur als Beispiel der BfG wird nun unterstützt
+         Das Format ist noch nicht endgültig implementiert
+
 Version 1.2.9
 
        - Die Höhen von Linienstrukturen werden bei fehlenden Z-Höhen nun korrekt interpoliert.

Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp	2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/src/file.cpp	2009-02-15 23:15:18 UTC (rev 142)
@@ -149,6 +149,11 @@
 		LoadDGMXYZ(FileName, NodeList, BegrenzungsPolygon, DebugLevel);
 		CheckForDuplicates(NodeList, ElementList, DebugLevel);
 	}
+	else if (ToUpperCase(Ext) == ".XML")
+	{
+		LoadDGMXML(FileName, NodeList, BegrenzungsPolygon, DebugLevel);
+		CheckForDuplicates(NodeList, ElementList, DebugLevel);
+	}
 	else if (ToUpperCase(Ext) == ".SHP")
 	{
 		LoadDGMSHP(FileName, NodeList, BegrenzungsPolygon, IsSetNoProjWarn, DebugLevel);
@@ -735,6 +740,190 @@
 }
 
 //---------------------------------------------------------------------------
+int ReadString(FILE* fh, char* compstring)
+{
+	int AnzZeilen = 0;
+
+	// Lese solange bis nix oder das erste Zeichen kommt
+	// und zaehle die Zeilen
+	int c = fgetc(fh);
+	do
+	{
+		while (EOF != c && compstring[0] != c)
+		{
+			if (c == '\n') AnzZeilen++;
+			c = fgetc(fh);
+		}
+		if (EOF == c)	return (-1);
+
+		// Ok, das erste Zeichen stimmt
+		// nun muessen alle weiteren auch stimmen
+		unsigned int i = 1;
+		c = fgetc(fh);
+		while (i < strlen(compstring) && EOF != c && compstring[i] == c)
+		{
+			i++;
+			if (i >= strlen(compstring)) break;
+			c = fgetc(fh);
+		}
+
+		if (EOF == c)	return (-1);
+		if (i >= strlen(compstring)) return (AnzZeilen);
+	} while (true);
+}
+//---------------------------------------------------------------------------
+int ReadDouble(FILE* fh, double* D)
+{
+	int AnzZeilen = 0;
+
+	// Lese solange bis nix oder eine Ziffer kommt
+	// und zaehle die Zeilen
+	int c = fgetc(fh);
+	while (EOF != c && (c < '0' || c > '9'))
+	{
+		if (c == '\n') AnzZeilen++;
+		c = fgetc(fh);
+	}
+	if (EOF == c)	return (-1);
+
+	// Ok, das erste ist eine Ziffer
+	// nun muessen alle weiteren Zeichen entweder Ziffern oder ein Punkt oder ein Komma sein
+	double v = 0.0;
+	int exp = 1;
+	double faktor = 1.0;
+	while (EOF != c && ((c >= '0' && c <= '9') || c == '.' || c == ','))
+	{
+		if (c == '.' || c == ',')
+		{
+			if (exp != 1)
+			{
+				// Es gab zwei kommata
+				return (-1);
+			}
+			exp = exp + 1;
+		}
+		else
+		{
+			if (exp == 1)
+			{
+				v = v * 10 + (c - '0');
+			}
+			else
+			{
+				faktor = faktor / 10.0;
+				v = v + (c - '0') * faktor;
+			}
+		}
+		c = fgetc(fh);
+	}
+
+	if (EOF == c)	return (-1);
+
+	fseek(fh, -1L, SEEK_CUR); 
+
+	*D = v;
+
+	return (AnzZeilen);
+}
+//---------------------------------------------------------------------------
+bool LoadDGMXML(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel)
+{
+	write_fortschritt("->Laden des DGM in Datei '%s' als XML gestartet\n", FileName.c_str());
+
+	FILE *fh = fopen(FileName.c_str(), "r");
+	if (fh == 0)
+	{
+		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
+	}
+
+	double X = 0.0;
+	double Y = 0.0;
+	double Z = 0.0;
+
+	unsigned int AnzWerte = 0;
+	unsigned int AnzKnoten = 0;
+
+	int Zeilen = 0;
+	int AnzZeilen = ReadString(fh, "<Koordinate>");
+	while (AnzZeilen > 0)
+	{
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "<x>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), Zeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadDouble(fh, &X);
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "</x>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "<y>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten y Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadDouble(fh, &Y);
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten y Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "</y>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten y Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "<z>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadDouble(fh, &Z);
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "</z>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzZeilen = ReadString(fh, "</Koordinate>");
+		if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x,y,z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		Zeilen = Zeilen + AnzZeilen;
+
+		AnzWerte++;
+
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzWerte % 10000 == 0) || (AnzWerte > 0 && AnzWerte % 100000 == 0))
+		{
+			write_fortschritt("%d Werte gelesen, %d Knoten im Speicher\n", AnzWerte, NodeList->size());
+		}
+
+		long XL = (long)(X * 100 + 0.5);
+		long YL = (long)(Y * 100 + 0.5);
+		int ZI = (long)(Z * 100 + 0.5);
+
+		TInsideTyp InsideTyp = INSIDE;
+		if (XyList && XyList->size() > 2) InsideTyp = XyList->IsInsideXYList(XL, YL);
+		if (InsideTyp == INSIDE || InsideTyp == ON_LINE)
+		{
+			AnzKnoten++;
+
+			TNode *Node = new TNode(AnzKnoten, XL, YL, ZI);
+			NodeList->Add(Node);
+		}
+
+		AnzZeilen = ReadString(fh, "<Koordinate>");
+		Zeilen = Zeilen + AnzZeilen;
+	}
+
+	write_fortschritt("%d Werte gelesen, %d Knoten im Speicher\n", AnzWerte, NodeList->size());
+
+	fclose(fh);
+
+	write_fortschritt("<-Laden des DGM in Datei '%s' als XML beendet\n", FileName.c_str());
+
+	return (true);
+}
+
+//---------------------------------------------------------------------------
 bool LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYZList *XyList, bool NoProjWarn, int DebugLevel)
 {
 	write_fortschritt("->Laden des DGM in Datei '%s' als SHP gestartet\n", FileName.c_str());

Modified: trunk/src/test_file.cpp
===================================================================
--- trunk/src/test_file.cpp	2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/src/test_file.cpp	2009-02-15 23:15:18 UTC (rev 142)
@@ -33,9 +33,9 @@
 #define DGMXYZFILE2		"test_daten\\dgm_gross.xyz"
 #define DGMXYZFILE3		"test_daten\\dgm_ziemlich_gross.xyz"
 #define DGMXYZFILE4		"test_daten\\dgm_sehr_gross.xyz"
+#define DGMXMLFILE		"test_daten\\dgm.xml"
 #define DGMSHPFILE		"test_daten\\dgm.shp"
 #define DGMSHPFILE2		"test_daten\\dgm2.shp"
-#define DGMXYZFILE4		"test_daten\\dgm_sehr_gross.xyz"
 #define DGM2DMFILE		"test_daten\\dgm.2dm"
 #define PROFILFILE		"test_daten\\profile.shp"
 #define PROFILZFILE		"test_daten\\profilez.shp"
@@ -60,6 +60,7 @@
 #define DGMXYZFILE2		"test_daten/dgm_gross.xyz"
 #define DGMXYZFILE3		"test_daten/dgm_ziemlich_gross.xyz"
 #define DGMXYZFILE4		"test_daten/dgm_sehr_gross.xyz"
+#define DGMXMLFILE		"test_daten/dgm.xml"
 #define DGMSHPFILE		"test_daten/dgm.shp"
 #define DGMSHPFILE2		"test_daten/dgm2.shp"
 #define DGM2DMFILE		"test_daten/dgm.2dm"
@@ -660,6 +661,25 @@
 	}
 
 	/////////////////////////////////////////////////
+	// Test von DGM-XML ohne Begrenzungspolygon laden
+	/////////////////////////////////////////////////
+
+	{
+		printf ("Test DGM-XML ohne Begrenzungspolygon laden:                          ");
+
+		TNodeList *NodeList = new TNodeList();
+		TElementList *ElementList = new TElementList();
+
+		LoadDGM(DGMXMLFILE, NodeList, ElementList, 0, false, 8);
+
+		if (NodeList->size() != 3)	printf("Failed\n");
+		else					 	printf("Pass\n");
+
+		delete NodeList;
+		delete ElementList;
+	}
+
+	/////////////////////////////////////////////////
 	// Test von DGM-SHP ohne Begrenzungspolygon laden
 	/////////////////////////////////////////////////
 

Modified: trunk/src/wsplgen.h
===================================================================
--- trunk/src/wsplgen.h	2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/src/wsplgen.h	2009-02-15 23:15:18 UTC (rev 142)
@@ -10,7 +10,7 @@
 // Read the file COPYING coming with WSPLGEN for details.
 //
 
-const char Version[] = "1.2.9";
+const char Version[] = "1.3.0";
 
 // In der Datei wsplgen.h wird jetzt keine Historie mehr gespeichert.
 // Diese ist nun in der Datei NEWS zu finden



More information about the Wsplgen-commits mailing list