[Wsplgen-commits] r146 - trunk/src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon Nov 2 08:45:14 CET 2009


Author: mrchip
Date: 2009-11-02 08:45:14 +0100 (Mon, 02 Nov 2009)
New Revision: 146

Modified:
   trunk/src/file.cpp
   trunk/src/file.h
   trunk/src/tools.cpp
   trunk/src/wsplgen.h
   trunk/src/xy.cpp
   trunk/src/xy.h
Log:
Eine Fehler wurde korrigiert und neues DMG-Format

Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp	2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/file.cpp	2009-11-02 07:45:14 UTC (rev 146)
@@ -159,6 +159,11 @@
 		LoadDGMSHP(FileName, NodeList, BegrenzungsPolygon, IsSetNoProjWarn, DebugLevel);
 		CheckForDuplicates(NodeList, ElementList, DebugLevel);
 	}
+	else if (ToUpperCase(Ext) == ".TIN")
+	{
+		LoadDGMASCIITIN(FileName, NodeList, ElementList, BegrenzungsPolygon, DebugLevel);
+		CheckForDuplicates(NodeList, ElementList, DebugLevel);
+	}
 	else
 	{
 		write_error(1222, "Ungültige Dateinamenserweiterung '%s' beim Dateinamen '%s' für den Parameter -DGM\nErlaubt sind nur ADF, GRD, ASC, 2DM, XYZ, TXT oder SHP\n", ToUpperCase(Ext).c_str(), FileName.c_str());
@@ -1311,6 +1316,211 @@
 	return (true);
 }
 
+//---------------------------------------------------------------------------
+bool LoadDGMASCIITIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel)
+{
+	write_fortschritt("->Laden des DGM in Datei '%s' als ASCII-TIN 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());
+	}
+
+	char line[1000];
+	unsigned int AnzZeilen = 0;
+
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die erste Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+	AnzZeilen++;
+
+	if (strncmp(line, "TIN", 3) != 0)
+	{
+		write_error(2298, "Die erste Kopfzeile in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+	}
+
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die zweite Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+	AnzZeilen++;
+
+	if (strncmp(line, "BEGT", 4) != 0)
+	{
+		write_error(2298, "Die zweite Kopfzeile in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+	}
+
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die Zeile mit der Knotenanzahl in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+	AnzZeilen++;
+
+	if (strncmp(line, "VERT", 4) != 0)
+	{
+		write_error(2298, "Die Zeile mit der Knotenanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+	}
+
+	unsigned int MaxAnzKnoten = 0;
+	if (1 != sscanf(line, "VERT%d", &MaxAnzKnoten))
+	{
+		write_error(2298, "Die Zeile mit der Knotenanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+	}
+
+	unsigned int AnzKnoten = 0;
+	for (unsigned int Nr=1; Nr <= MaxAnzKnoten; Nr++)
+	{
+		AnzZeilen++;
+
+		double  X;
+		double  Y;
+		double  Z;
+
+		if (3 != fscanf(fh, "%lf%lf%lf\n", &X, &Y, &Z))
+		{
+			write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+		}
+
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
+		{
+			write_fortschritt("%d Zeilen, %d Knoten geladen\n", AnzZeilen, 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(Nr, XL, YL, ZI);
+			NodeList->Add(Node);
+		}
+	}
+
+	NodeList->SortByNr();
+
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die Zeile mit der Elementanzahl in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+	AnzZeilen++;
+
+	if (strncmp(line, "TRI", 3) != 0)
+	{
+		write_error(2298, "Die Zeile mit der Elementanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+	}
+
+	unsigned int MaxAnzElemente = 0;
+	if (1 != sscanf(line, "TRI%d", &MaxAnzElemente))
+	{
+		write_error(2298, "Die Zeile mit der Knotenanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+	}
+
+
+	if (MaxAnzElemente > 0)
+	{
+		for (unsigned int Nr=1; Nr <= MaxAnzElemente; Nr++)
+		{
+			AnzZeilen++;
+
+			if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
+			{
+				write_fortschritt("%d Zeilen, %d Elemente geladen\n", AnzZeilen, ElementList->size());
+			}
+
+			int Node1Nr;
+			int Node2Nr;
+			int Node3Nr;
+
+			if (3 != fscanf(fh, "%d%d%d\n", &Node1Nr, &Node2Nr, &Node3Nr))
+			{
+				write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+			}
+
+			TNode *Node1 = NodeList->FindByNr(Node1Nr);
+			TNode *Node2 = NodeList->FindByNr(Node2Nr);
+			TNode *Node3 = NodeList->FindByNr(Node3Nr);
+
+			if (Node1 && Node2 && Node3)
+			{
+				TElement *Element = new TElement(Node1, Node2, Node3);
+				ElementList->Add(Element);
+			}
+			continue;
+		}
+	}
+
+	fclose(fh);
+
+	write_fortschritt("%d Elemente und %d Knoten geladen\n", ElementList->size(), NodeList->size());
+	write_fortschritt("%d Knoten insgesamt\n", AnzKnoten);
+
+	if (XyList && XyList->size() > 2)
+	{
+		write_fortschritt("->Löschen aussenliegender Kanten gestartet\n");
+
+		int Count = 0;
+		for (TElementList::iterator i=ElementList->begin(); i != ElementList->end(); i++)
+		{
+			TElement *Element = *i;
+
+			TNode* Node1 = Element->Node1;
+			TNode* Node2 = Element->Node2;
+			TNode* Node3 = Element->Node3;
+
+			long X12 = (Node1->X + Node2->X) / 2;
+			long Y12 = (Node1->Y + Node2->Y) / 2;
+
+			if (!XyList->IsInsideXYList(X12, Y12))
+			{
+				Element->Typ = NO_ELEMENT;
+				continue;
+			}
+
+			long X23 = (Node2->X + Node3->X) / 2;
+			long Y23 = (Node2->Y + Node3->Y) / 2;
+
+			if (!XyList->IsInsideXYList(X23, Y23))
+			{
+				Element->Typ = NO_ELEMENT;
+				continue;
+			}
+
+			long X31 = (Node3->X + Node1->X) / 2;
+			long Y31 = (Node3->Y + Node1->Y) / 2;
+
+			if (!XyList->IsInsideXYList(X31, Y31))
+			{
+				Element->Typ = NO_ELEMENT;
+				continue;
+			}
+
+			Count++;
+
+			if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count % 50000 == 0))
+			{
+				write_fortschritt("%d von %d Elementen überprüft\n", Count, ElementList->size());
+			}
+		}
+
+		write_fortschritt("<-Löschen aussenliegender Kanten beendet\n");
+	}
+
+	write_fortschritt("<-Laden des DGM in Datei '%s' als ASCII-TIN beendet\n", FileName.c_str());
+
+	return (true);
+}
+
 //---------------------------------------------------------------------
 bool LoadProfile(std::string FileName, TProfilList* ProfilList, TGewaesserAchseList* GewaesserAchseList, double VonKmD, double BisKmD, bool NoProjWarn, int DebugLevel)
 {
@@ -2006,27 +2216,37 @@
 		for (int j=0; j < AnzVert; j++)
 		{
 			double X = psCShape->padfX[j];
+			long XL = (long)(X * 100.0 + 0.5);
+
 			double Y = psCShape->padfY[j];
-			double Z = 0.0;
+			long YL = (long)(Y * 100.0 + 0.5);
 
-			long* L1 = (long *)&(psCShape->padfZ[j]);
-			long* L2 = L1 +1;
+			int ZL = 0;
 
-			// Ein Test auf NaN (also einen unbestimmten Knoten)
-			if (*L1 == 0x00000000L && *L2 == 0x7FF80000L)	Z = NoZ;
-			else											Z = psCShape->padfZ[j];
+			if (ShapeType == SHPT_ARCZ || ShapeType == SHPT_POLYGONZ)
+			{
+				long* L1 = (long *)&(psCShape->padfZ[j]);
+				long* L2 = L1 +1;
 
-			if (ShapeType == SHPT_ARC || ShapeType == SHPT_ARCM || ShapeType == SHPT_POLYGON || ShapeType == SHPT_POLYGONM)
+				// Ein Test auf NaN (also einen unbestimmten Knoten)
+				if (*L1 == 0x00000000L  && *L2 == 0x7FF80000L)
+				{
+					ZL = NoZ;
+				}
+				else
+				{
+					double Z = psCShape->padfZ[j];
+					if (Z <= NoZ)	ZL = NoZ;
+					else			ZL = (int)(Z * 100.0 + 0.5);
+				}
+			}
+			else
 			{
-				if (Typ == "DAMM")			Z = DammZ;
-				else if (Typ == "GRABEN")	Z = GrabenZ;
-				else						Z = 0.0;
+				if (Typ == "DAMM")			ZL = DammZ;
+				else if (Typ == "GRABEN")	ZL = GrabenZ;
+				else						ZL = 0;
 			}
 
-			long XL = (long)(X * 100.0 + 0.5);
-			long YL = (long)(Y * 100.0 + 0.5);
-			int ZL = Z;
-			if (Z != NoZ) ZL = (int)(Z * 100.0 + 0.5);
 			Linie->AddPoint(XL, YL, ZL);
 		}
 

Modified: trunk/src/file.h
===================================================================
--- trunk/src/file.h	2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/file.h	2009-11-02 07:45:14 UTC (rev 146)
@@ -30,8 +30,10 @@
 bool			LoadDGMTIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel);
 bool			LoadDGMGRD(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel);
 bool			LoadDGMXYZ(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel);
+bool			LoadDGMXML(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel);
 bool			LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYZList *XyList, bool NoProjWarn, int DebugLevel);
 bool			LoadDGM2DM(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel);
+bool			LoadDGMASCIITIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel);
 
 bool 			LoadProfile(std::string FileName, TProfilList* ProfilList, TGewaesserAchseList* GewaesserAchseList, double VonKmD, double BisKmD, bool NoProjWarn, int DebugLevel);
 bool 			LoadLinien(std::string FileName, TProfilList* SperrenList, TProfilList* GrabenList, TProfilList* Rohre1List, TProfilList* Rohre2List, bool NoProjWarn, int DebugLevel);

Modified: trunk/src/tools.cpp
===================================================================
--- trunk/src/tools.cpp	2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/tools.cpp	2009-11-02 07:45:14 UTC (rev 146)
@@ -1579,6 +1579,8 @@
 {
 	write_fortschritt ("->Übertragen der Wasserstände gestartet\n");
 
+	NodeList->ClearWsp();
+
 	TNodeList* Temp1NodeList = new TNodeList;
 	TNodeList* Temp2NodeList = new TNodeList;
 
@@ -1696,17 +1698,17 @@
 						if (Edge->Node1 == Node && Edge->Node2->Wsp == NoWsp && (false == Sperre || Edge->Node2->Z < Wsp))
 						{
 							Temp2NodeList->AddUnique(Edge->Node2);
-							if (DebugLevel >= 8)
+							if (DebugLevel >= 9)
 							{
-								write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld)\n", Station / 10000.0, Edge->Node2->X, Edge->Node2->Y);
+								write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld,%.3f)\n", Station / 10000.0, Edge->Node2->X, Edge->Node2->Y, Wsp / 100.0);
 							}
 						}
 						if (Edge->Node2 == Node && Edge->Node1->Wsp == NoWsp && (false == Sperre || Edge->Node1->Z < Wsp))
 						{
 							Temp2NodeList->AddUnique(Edge->Node1);
-							if (DebugLevel >= 8)
+							if (DebugLevel >= 9)
 							{
-								write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld)\n", Station / 10000.0, Edge->Node1->X, Edge->Node1->Y);
+								write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld,%.3f)\n", Station / 10000.0, Edge->Node1->X, Edge->Node1->Y, Wsp / 100.0);
 							}
 						}
 					}
@@ -1751,7 +1753,7 @@
 
 							if (DebugLevel >= 9)
 							{
-								write_fortschritt("nasser Knoten bei Profil %.4f: (%ld,%ld)\n", Station / 10000.0, Node->X, Node->Y);
+								write_fortschritt("nasser Knoten bei Profil %.4f: (%ld,%ld,%.2f)\n", Station / 10000.0, Node->X, Node->Y, Wsp / 100.0);
 							}
                         }
 
@@ -2711,6 +2713,7 @@
 				}
 				else if (Edge->Node2->Wsp <= Edge->Node2->Z && Edge->Node1->Wsp != NoWsp && Edge->Node1->Wsp > Edge->Node1->Z && Edge->Node1->Wsp > Edge->Node2->Z)
 				{
+					// Der bisher trockene Knoten hatte schon einen Wasserstand, er bekommt nun einen neuen
 					Edge->Node2->Wsp = Edge->Node2->Z + 1;
 
 					// Hier jetzt neue potentielle Kanten aufnehmen

Modified: trunk/src/wsplgen.h
===================================================================
--- trunk/src/wsplgen.h	2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/wsplgen.h	2009-11-02 07:45:14 UTC (rev 146)
@@ -10,7 +10,7 @@
 // Read the file COPYING coming with WSPLGEN for details.
 //
 
-const char Version[] = "1.3.0";
+const char Version[] = "1.3.1";
 
 // In der Datei wsplgen.h wird jetzt keine Historie mehr gespeichert.
 // Diese ist nun in der Datei NEWS zu finden

Modified: trunk/src/xy.cpp
===================================================================
--- trunk/src/xy.cpp	2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/xy.cpp	2009-11-02 07:45:14 UTC (rev 146)
@@ -1450,6 +1450,21 @@
 }
 
 //---------------------------------------------------------------------
+void TNodeList::ClearWsp(void)
+{
+	write_fortschritt("->Vorbereiten der Wasserstände gestartet\n");
+
+	for (iterator i	= begin(); i !=	end(); i++)
+	{
+		TNode* Node = *i;
+
+		Node->Wsp = NoWsp;
+	}
+
+	write_fortschritt("<-Vorbereiten der Wasserstände beendet\n");
+}
+
+//---------------------------------------------------------------------
 // TElementList
 //---------------------------------------------------------------------
 
@@ -2603,7 +2618,7 @@
 {
 	if (vorprofil->PointList->size() != nachprofil->PointList->size())
 	{
-		dump_error(__FILE__, __LINE__, "Angeglichene Profile ('%.2f' und '%.2f') haben verschieden viele Stützstellen\n", vorprofil->Station / 10000.0,	nachprofil->Station / 10000.0);
+		dump_error(__FILE__, __LINE__, "Angeglichene Profile ('%.4f' und '%.4f') haben verschieden viele Stützstellen\n", vorprofil->Station / 10000.0,	nachprofil->Station / 10000.0);
 	}
 
 	TPointList::iterator V = vorprofil->PointList->begin();

Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h	2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/xy.h	2009-11-02 07:45:14 UTC (rev 146)
@@ -248,6 +248,7 @@
 		int 				GetMaxZ(int DebugLevel);
 		void 				Scale(void);
 		void 				ReScale(void);
+		void 				ClearWsp(void);
 };
 
 //----------------------------------------------------------------------------



More information about the Wsplgen-commits mailing list