[Wsplgen-commits] r39 - trunk/src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Tue Mar 21 01:53:17 CET 2006


Author: mrchip
Date: 2006-03-21 01:53:11 +0100 (Tue, 21 Mar 2006)
New Revision: 39

Modified:
   trunk/src/file.cpp
   trunk/src/file.h
   trunk/src/parameter.cpp
   trunk/src/tools.cpp
   trunk/src/tri.cpp
   trunk/src/wsplgen.cpp
   trunk/src/xy.cpp
   trunk/src/xy.h
Log:
Alle Dateiformate werden nun unterst?\195?\188tzt. Es fehlt nur noch die Behandlung von D?\195?\164mmen und Br?\195?\188chen.


Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/file.cpp	2006-03-21 00:53:11 UTC (rev 39)
@@ -71,14 +71,14 @@
 	{
 		AnzScheiben = LoadDGM2DM(FileName, NodeList, ElementList, XyList, MaxNodesPerSlice, Debug);
 	}
-	else if (ToUpperCase(Ext) == ".XYZ")
+	else if (ToUpperCase(Ext) == ".GRD")
 	{
-		AnzScheiben = LoadDGMXYZ(FileName, NodeList, XyList, MaxNodesPerSlice, Debug);
+		AnzScheiben = LoadDGMGRD(FileName, NodeList, ElementList, XyList, MaxNodesPerSlice, Debug);
 		CheckForDuplicates(NodeList, Debug);
 	}
-	else if (ToUpperCase(Ext) == ".GRD")
+	else if (ToUpperCase(Ext) == ".XYZ")
 	{
-		AnzScheiben = LoadDGMGRD(FileName, NodeList, XyList, MaxNodesPerSlice, Debug);
+		AnzScheiben = LoadDGMXYZ(FileName, NodeList, XyList, MaxNodesPerSlice, Debug);
 		CheckForDuplicates(NodeList, Debug);
 	}
 	else if (ToUpperCase(Ext) == ".SHP")
@@ -88,7 +88,7 @@
 	}
 	else
 	{
-		write_error(1222, "Ungültige Dateinamenserweiterung '%s' beim Dateinamen '%s' für den Parameter -DGM", ToUpperCase(Ext).c_str(), FileName.c_str());
+		write_error(1222, "Ungültige Dateinamenserweiterung '%s' beim Dateinamen '%s' für den Parameter -DGM\n", ToUpperCase(Ext).c_str(), FileName.c_str());
 	}
 
 	write_fortschritt("DGM geladen<-\n");
@@ -121,12 +121,12 @@
 
 		if (fhxy == 0)
 		{
-			write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", XyFileName.c_str());
+			write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", XyFileName.c_str());
 		}
 
 		if (fhz == 0)
 		{
-			write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", ZFileName.c_str());
+			write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", ZFileName.c_str());
 		}
 
 		double X;
@@ -144,7 +144,9 @@
 			Swap8Bytes((byte *)&Y);
 			Swap4Bytes((byte *)&Z);
 
-			if (++AnzNodes > 4)
+			AnzNodes++;
+
+			if (Z < 1e30 && Z > -1e30)
 			{
 				X = (long)(X * 100.0 + 0.5) / 100.0;
 				Y = (long)(Y * 100.0 + 0.5) / 100.0;
@@ -173,7 +175,7 @@
 
 		if (fhod == 0)
 		{
-			write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", OdFileName.c_str());
+			write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", OdFileName.c_str());
 		}
 
 		int Nr1;
@@ -192,19 +194,16 @@
 			Swap4Bytes((byte *)&Nr2);
 			Swap4Bytes((byte *)&Nr3);
 
-			if (Nr1 > 4 && Nr2 > 4 && Nr3 > 4)
+			TNode *Node1 = NodeList->FindByNr(Nr1);
+			TNode *Node2 = NodeList->FindByNr(Nr2);
+			TNode *Node3 = NodeList->FindByNr(Nr3);
+
+			if (Node1 && Node2 && Node3)
 			{
-				TNode *Node1 = NodeList->FindByNr(Nr1);
-				TNode *Node2 = NodeList->FindByNr(Nr2);
-				TNode *Node3 = NodeList->FindByNr(Nr3);
-
-				if (Node1 && Node2 && Node3)
-				{
-					TElement *Element = new TElement(Node1, Node2, Node3);
-					ElementList->push_back(Element);
-				}
-				AnzElements++;
+				TElement *Element = new TElement(Node1, Node2, Node3);
+				ElementList->push_back(Element);
 			}
+			AnzElements++;
 		}
 
 		fclose(fhod);
@@ -217,16 +216,236 @@
 		if (fhz)	fclose(fhz);
 		if (fhod)	fclose(fhod);
 
-		write_error(2299, "Es hat einen nicht näher bestimmten Eingabefehler gegeben.\nDer Datenträger könnte beschädigt sein");
+		write_error(2299, "Es hat einen nicht näher bestimmten Eingabefehler gegeben.\nDer Datenträger könnte beschädigt sein\n");
 	}
 
 	write_fortschritt("DGM TIN laden beendet<-\n");
 
-	if (AnzNodes <= MaxNodesPerSlice)	return (1);
-	else								return ((AnzNodes - 1) / MaxNodesPerSlice + 1);
+	if (NodeList->size() <= MaxNodesPerSlice)	return (1);
+	else										return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
 }
 
 //---------------------------------------------------------------------------
+unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
+{
+	write_fortschritt("->DGM GRD laden\n");
+
+	if (NodeList == 0)		dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
+
+	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];
+	std::string Line;
+
+	int 	NCols = 0;
+	int 	NRows = 0;
+	bool	Center = false;
+	double 	Xll = 0;
+	double	Yll = 0;
+	double	CellSize = 0.0;
+	double	NoDataValue = 0.0;
+
+	////////////
+	// NCols
+	////////////
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die 1. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+
+	Line = line;
+	Line = ToUpperCase(Line);
+
+	if (1 != sscanf(Line.c_str(), "NCOLS%d", &NCols))
+	{
+		write_error(2215, "Konnte in der 1. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'ncols' gefolgt von einer Zahl lesen\n", FileName.c_str());
+	}
+
+	if (NCols <= 0)
+	{
+		write_error(3209, "In der Datei '%s' ist NCols (%d) kleiner gleich Null.\nNCols muss immer positiv sein.\n", FileName.c_str(), NRows);
+	}
+
+	////////////
+	// NRows
+	////////////
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die 2. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+
+	Line = line;
+	Line = ToUpperCase(Line);
+
+	if (1 != sscanf(Line.c_str(), "NROWS%d", &NRows))
+	{
+		write_error(2215, "Konnte in der 2. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'nrows' gefolgt von einer Zahl lesen\n", FileName.c_str());
+	}
+
+	if (NRows <= 0)
+	{
+		write_error(3209, "In der Datei '%s' ist NCols (%d) kleiner gleich Null.\nNCols muss immer positiv sein.\n", FileName.c_str(), NCols);
+	}
+
+	////////////
+	// XLLCENTER oder XLLCORNER
+	////////////
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die 3. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+
+	Line = line;
+	Line = ToUpperCase(Line);
+
+	if (1 != sscanf(Line.c_str(), "XLLCORNER%lf", &Xll))
+	{
+		if (1 != sscanf(Line.c_str(), "XLLCENTER%lf", &Xll))
+		{
+			write_error(2215, "Konnte in der 3. Kopfzeile der Datei '%s'\nweder das Schlüsselwort 'xllcorner'\nnoch das Schlüsselwort 'xllcenter' gefolgt von einer Zahl lesen\n", FileName.c_str());
+		}
+		else
+		{
+			Center = true;
+		}
+	}
+
+	////////////
+	// YLLCENTER oder YLLCORNER
+	////////////
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die 4. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+
+	Line = line;
+	Line = ToUpperCase(Line);
+
+	if (Center)
+	{
+		if (1 != sscanf(Line.c_str(), "YLLCENTER%lf", &Yll))
+		{
+			write_error(2215, "Konnte in der 4. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'yllcenter' gefolgt von einer Zahl lesen\n", FileName.c_str());
+		}
+	}
+	else
+	{
+		if (1 != sscanf(Line.c_str(), "YLLCORNER%lf", &Yll))
+		{
+			write_error(2215, "Konnte in der 4. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'yllcorner' gefolgt von einer Zahl lesen\n", FileName.c_str());
+		}
+	}
+
+	////////////
+	// CellSize
+	////////////
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die 5. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+
+	Line = line;
+	Line = ToUpperCase(Line);
+
+	if (1 != sscanf(Line.c_str(), "CELLSIZE%lf", &CellSize))
+	{
+		write_error(2215, "Konnte in der 5. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'cellsize' gefolgt von einer Zahl lesen\n", FileName.c_str());
+	}
+
+	if (CellSize <= 0)
+	{
+		write_error(3211, "In der Datei '%s' ist CellSize (%.2f) kleiner gleich Null.\nCellSize muss immer positiv sein.\n", FileName.c_str(), CellSize);
+	}
+
+	////////////
+	// NoDataValue
+	////////////
+	if (0 == fgets (line, sizeof(line)-1, fh))
+	{
+		write_error(2298, "Konnte die 6. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+	}
+	line[sizeof(line)-1] = '\0';
+
+	Line = line;
+	Line = ToUpperCase(Line);
+
+	if (1 != sscanf(Line.c_str(), "NODATA_VALUE%lf", &NoDataValue))
+	{
+		write_error(2215, "Konnte in der 6. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'nodata_value' gefolgt von einer Zahl lesen\n", FileName.c_str());
+	}
+
+
+	unsigned int MaxWerte = NCols * NRows;
+	unsigned int AnzWerte = 0;
+	unsigned int AnzKnoten = 0;
+	for (unsigned int i=0; i<MaxWerte; i++)
+	{
+		if (1 != fscanf (fh, "%s", line))
+		{
+			write_error(2298, "Konnte den %d. Wert in der Datei '%s' nicht lesen\n", AnzWerte+1, FileName.c_str());
+		}
+
+		for (unsigned int i=0; i<strlen(line); i++)
+		{
+			if (line[i] == ',') line[i] = '.';
+		}
+
+		double Z = 0.0;
+		double X = Xll + (AnzWerte % NCols) * CellSize;
+		double Y = Yll + (NRows-1) * CellSize - (AnzWerte / NCols) * CellSize;
+		if (false == Center)
+		{
+			X = X + CellSize / 2.0;
+			Y = Y + CellSize / 2.0;
+		}
+
+		if (1 != sscanf (line, "%lf", &Z))
+		{
+			write_error(2298, "Konnte den %d. Wert in der Datei '%s' nicht lesen\n", AnzWerte+1, FileName.c_str());
+		}
+
+		AnzWerte++;
+
+		if (Debug && AnzWerte % 10000 == 0)		write_fortschritt("%d von %d Werten gelesen, %d von %d Knoten gespeichert\n", AnzWerte, MaxWerte, NodeList->size(), AnzKnoten);
+		else if (AnzWerte % 100000 == 0)		write_fortschritt("%d von %d Werten gelesen, %d von %d Knoten gespeichert\n", AnzWerte, MaxWerte, NodeList->size(), AnzKnoten);
+
+		X = (long)(X * 100 + 0.5) / 100.0;
+		Y = (long)(Y * 100 + 0.5) / 100.0;
+		Z = (long)(Z * 100 + 0.5) / 100.0;
+
+		TInsideTyp InsideTyp = INSIDE;
+		if (XyList) InsideTyp = XyList->IsInsideXYList(X, Y);
+		if (InsideTyp == INSIDE || InsideTyp == ON_LINE)
+		{
+			AnzKnoten++;
+
+			if (AnzKnoten < MaxNodesPerSlice)
+			{
+				TNode *Node = new TNode(AnzKnoten, X, Y, Z);
+				NodeList->push_back(Node);
+			}
+		}
+	}
+	write_fortschritt("%d von %d Werten gelesen, %d von %d Knoten gespeichert\n", AnzWerte, MaxWerte, NodeList->size(), AnzKnoten);
+
+	fclose(fh);
+
+	write_fortschritt("DGM GRD laden beendet<-\n");
+
+	if (NodeList->size() <= MaxNodesPerSlice)	return (1);
+	else										return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
+}
+
+//---------------------------------------------------------------------------
 unsigned int LoadDGMXYZ(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
 {
 	write_fortschritt("->DGM XYZ laden\n");
@@ -236,14 +455,14 @@
 	FILE *fh = fopen(FileName.c_str(), "r");
 	if (fh == 0)
 	{
-		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", FileName.c_str());
+		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
 	}
 
 	char line[1000];
 
 	if (0 == fgets (line, sizeof(line)-1, fh))
 	{
-		write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen", FileName.c_str());
+		write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
 	}
 	line[sizeof(line)-1] = '\0';
 
@@ -271,7 +490,7 @@
 
 		if (3 != sscanf (line, "%lf%lf%lf", &X, &Y, &Z))
 		{
-			write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+			write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
 		}
 
 		X = (long)(X * 100) / 100.0;
@@ -296,26 +515,11 @@
 
 	write_fortschritt("DGM XYZ laden beendet<-\n");
 
-	if (AnzKnoten <= MaxNodesPerSlice)	return (1);
-	else								return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
+	if (NodeList->size() <= MaxNodesPerSlice)	return (1);
+	else										return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
 }
 
 //---------------------------------------------------------------------------
-unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
-{
-	write_fortschritt("->DGM GRD laden\n");
-
-	if (NodeList == 0)		dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
-
-	unsigned int AnzKnoten = 0;
-
-	write_fortschritt("DGM GRD laden beendet<-\n");
-
-	if (AnzKnoten <= MaxNodesPerSlice)	return (1);
-	else								return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
-}
-
-//---------------------------------------------------------------------------
 unsigned int LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
 {
 	write_fortschritt("->DGM SHP laden\n");
@@ -327,7 +531,7 @@
 
 	if (hSHP == NULL)
 	{
-		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", SHPFileName.c_str());
+		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", SHPFileName.c_str());
 	}
 
 	int 		RecordCount = 0;
@@ -335,15 +539,122 @@
 	double		Mins[4];
 	double		Maxs[4];
 
+	std::string DBFFileName = ExchangeFileExt(FileName, ".DBF");
+	DBFHandle hDBF = DBFOpen(DBFFileName.c_str(), "rb");
+	if (hDBF == NULL)
+	{
+		SHPClose(hSHP);
+		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", DBFFileName.c_str());
+		return (false);
+	}
+
 	SHPGetInfo(hSHP, &RecordCount, &ShapeType, Mins, Maxs);
 
 	if (RecordCount == 0)
 	{
 		SHPClose(hSHP);
 
-		write_error(2204, "Es sind keine Objekte in der Shapedatei '%s'", SHPFileName.c_str());
+		write_error(2204, "Es sind keine Objekte in der Shapedatei '%s'\n", SHPFileName.c_str());
 	}
 
+	if (ShapeType != SHPT_POINT && ShapeType != SHPT_POINTZ && ShapeType != SHPT_POINTM)
+	{
+		write_error(2213, "Der Typ ('%s') der Shape-Datei '%s' ist nicht POINT, POINTZ oder POINTM.\nNur die genannten Typen sind für DGM-Daten zulässig.\n", ShapeTypeName(ShapeType), SHPFileName.c_str());
+	}
+
+	int DBFRecordCount = DBFGetRecordCount(hDBF);
+
+	if (DBFRecordCount == 0)
+	{
+		DBFClose(hDBF);
+		SHPClose(hSHP);
+
+		write_error(2204, "Es sind keine Objekte in der DBF-Datei '%s'\n", DBFFileName.c_str());
+	}
+
+	if (DBFRecordCount != RecordCount)
+	{
+		DBFClose(hDBF);
+		SHPClose(hSHP);
+
+		write_error(2205, "Shape-Datei '%s' und DBF-Datei '%s' enthalten verschieden viele Objekte\n", SHPFileName.c_str(), DBFFileName.c_str());
+	}
+
+	int FieldCount = DBFGetFieldCount(hDBF);
+
+	if (ShapeType != SHPT_POINTZ && FieldCount == 0)
+	{
+		SHPClose(hSHP);
+		DBFClose(hDBF);
+
+		write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs muss aber mindestens das Attibute 'Z' definiert sein.\n", DBFFileName.c_str());
+	}
+
+	std::string ZName = "Z";
+	int ZFieldIndex = DBFGetFieldIndex(hDBF, "Z");
+	if (ZFieldIndex == -1)
+	{
+		ZName = "z";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+	if (ZFieldIndex == -1)
+	{
+		ZName = "Topo";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+	if (ZFieldIndex == -1)
+	{
+		ZName = "TOPO";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+	if (ZFieldIndex == -1)
+	{
+		ZName = "topo";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+	if (ZFieldIndex == -1)
+	{
+		ZName = "mNN";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+	if (ZFieldIndex == -1)
+	{
+		ZName = "Höhe";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+	if (ZFieldIndex == -1)
+	{
+		ZName = "m";
+		ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+	}
+
+	if (ShapeType != SHPT_POINTZ && ZFieldIndex == -1)
+	{
+		SHPClose(hSHP);
+		DBFClose(hDBF);
+
+		write_error(2207, "In der DBD-Datei %s' ist das Attribut 'Z' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+	}
+
+	if (ZFieldIndex)
+	{
+		int Width = 0;
+		int Decimals = 0;
+		if (DBFGetFieldInfo(hDBF, ZFieldIndex, NULL, &Width, &Decimals) != FTDouble)
+		{
+			SHPClose(hSHP);
+			DBFClose(hDBF);
+
+			write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes 'Z' nicht Double.\n", DBFFileName.c_str());
+		}
+	}
+
+	if (ShapeType == SHPT_POINTZ && ZFieldIndex >= 0)
+	{
+		write_warning(2219, "Es liegen sowohl Höheninformationen an den Punkten (POINTZ-Shape) als auch als Attribut '%s' vor\nEs werden die Informationen des Attributes genommen.\n", ZName.c_str());
+	}
+
+
 	unsigned int AnzKnoten = 0;
 	for (int i = 0; i<RecordCount; i++)
 	{
@@ -365,6 +676,8 @@
 			double Y = psCShape->padfY[j];
 			double Z = psCShape->padfZ[j];
 
+			if (ZFieldIndex >= 0)	Z = DBFReadDoubleAttribute(hDBF, i, ZFieldIndex);
+
 			X = (long)(X * 100) / 100.0;
 			Y = (long)(Y * 100) / 100.0;
 			Z = (long)(Z * 100) / 100.0;
@@ -391,8 +704,8 @@
 
 	write_fortschritt("DGM SHP laden beendet<-\n");
 
-	if (AnzKnoten <= MaxNodesPerSlice)	return (1);
-	else								return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
+	if (NodeList->size() <= MaxNodesPerSlice)	return (1);
+	else										return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
 }
 
 //---------------------------------------------------------------------------
@@ -405,20 +718,20 @@
 	FILE *fh = fopen(FileName.c_str(), "r");
 	if (fh == 0)
 	{
-		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", FileName.c_str());
+		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
 	}
 
 	char line[1000];
 
 	if (0 == fgets (line, sizeof(line)-1, fh))
 	{
-		write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen", FileName.c_str());
+		write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
 	}
 	line[sizeof(line)-1] = '\0';
 
 	if (strncmp(line, "MESH2D", 6) != 0)
 	{
-		write_error(2298, "Die Kopfzeile in der Datei '%s' war nicht korrekt", FileName.c_str());
+		write_error(2298, "Die Kopfzeile in der Datei '%s' war nicht korrekt\n", FileName.c_str());
 	}
 
 	unsigned int AnzKnoten = 0;
@@ -445,7 +758,7 @@
 
 			if (4 != sscanf(line, "ND%d%lf%lf%lf\n", &Nr, &X, &Y, &Z))
 			{
-				write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+				write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
 			}
 
 			X = (long)(X * 100) / 100.0;
@@ -493,7 +806,7 @@
 			{
 				if (5 != sscanf(line, "E3T%d%d%d%d%d\n", &Nr, &Node1Nr, &Node2Nr, &Node3Nr, &Prop))
 				{
-					write_error(2297, "Konnte keine 5 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+					write_error(2297, "Konnte keine 5 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
 				}
 
 				TNode *Node1 = NodeList->FindByNr(Node1Nr);
@@ -512,7 +825,7 @@
 			{
 				if (6 != sscanf(line, "E4Q%d%d%d%d%d%d\n", &Nr, &Node1Nr, &Node2Nr, &Node3Nr, &Node4Nr, &Prop))
 				{
-					write_error(2297, "Konnte keine 6 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+					write_error(2297, "Konnte keine 6 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
 				}
 
 				TNode *Node1 = NodeList->FindByNr(Node1Nr);
@@ -536,8 +849,8 @@
 
 	write_fortschritt("DGM 2DM laden beendet<-\n");
 
-	if (AnzKnoten <= MaxNodesPerSlice)	return (1);
-	else								return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
+	if (NodeList->size() <= MaxNodesPerSlice)	return (1);
+	else										return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
 }
 
 //---------------------------------------------------------------------
@@ -587,8 +900,6 @@
 		write_error(2213, "Der Typ ('%s') der Shape-Datei '%s' ist nicht ARC, ARCZ oder ARCM.\nNur die genannten Typen sind für Profilspuren zulässig.\n", ShapeTypeName(ShapeType), SHPFileName.c_str());
 	}
 
-
-
 	int DBFRecordCount = DBFGetRecordCount(hDBF);
 
 	if (DBFRecordCount == 0)
@@ -616,27 +927,94 @@
 		SHPClose(hSHP);
 		DBFClose(hDBF);
 
-		write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute GEW und STATION definiert sein.\n", DBFFileName.c_str());
+		write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute Z und STATION definiert sein.\n", DBFFileName.c_str());
 	}
 
+	std::string GewName = "GEW";
 	int GewFieldIndex = DBFGetFieldIndex(hDBF, "GEW");
+	if (GewFieldIndex == -1)
+	{
+		GewName = "Gew";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "gew";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "GEWÄSSER";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "Gewässer";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "gewässer";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
 
 	if (GewFieldIndex == -1)
 	{
 		SHPClose(hSHP);
 		DBFClose(hDBF);
 
-		write_error(2207, "In der DBD-Datei %s' ist das Attribut GEW nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+		write_error(2207, "In der DBD-Datei %s' ist das Attribut 'GEW' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
 	}
 
-	int StationFieldIndex = DBFGetFieldIndex(hDBF, "STATION");
+	std::string StationName = "STATION";
+	int StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	if (StationFieldIndex == -1)
+	{
+		StationName = "Station";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "station";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "KILOMETER";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "Kilometer";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "kilometer";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "KM";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "Km";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "km";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
 
 	if (StationFieldIndex == -1)
 	{
 		SHPClose(hSHP);
 		DBFClose(hDBF);
 
-		write_error(2208, "In der DBD-Datei '%s' ist das Attribut STATION nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+		write_error(2208, "In der DBD-Datei '%s' ist das Attribut 'STATION' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
 	}
 
 	int Width = 0;
@@ -646,7 +1024,7 @@
 		SHPClose(hSHP);
 		DBFClose(hDBF);
 
-		write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes 'GEW' nicht Text.\n", DBFFileName.c_str());
+		write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Text.\n", DBFFileName.c_str(), GewName.c_str());
 	}
 
 	if (DBFGetFieldInfo(hDBF, StationFieldIndex, NULL, &Width, &Decimals) != FTDouble)
@@ -654,12 +1032,12 @@
 		SHPClose(hSHP);
 		DBFClose(hDBF);
 
-		write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes 'STATION' nicht Fliesskommazahl.\n", DBFFileName.c_str());
+		write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Fliesskommazahl.\n", DBFFileName.c_str(), StationName.c_str());
 	}
 
 	for (int i = 0; i<RecordCount; i++)
 	{
-		if (ProfilList->size() > 0 && ProfilList->size() % 10 == 0)	write_fortschritt("%d Profilspuren geladen\n", ProfilList->size());
+		if (ProfilList->size() > 0 && ProfilList->size() % 100 == 0)	write_fortschritt("%d Profilspuren geladen\n", ProfilList->size());
 
 		std::string Gewaesser = DBFReadStringAttribute(hDBF, i, GewFieldIndex);
 		double S = DBFReadDoubleAttribute(hDBF, i, StationFieldIndex);
@@ -679,7 +1057,7 @@
 
 		if (AnzVert <= 0)
 		{
-			write_warning(2112, "In der DBD-Datei '%s' hat das Profil ('%s',%.4f) keine Stützstellen.\nEs wird ignoriert.", DBFFileName.c_str(), Gewaesser.c_str(), Station / 10000.0);
+			write_warning(2112, "In der DBD-Datei '%s' hat das Profil ('%s',%.4f) keine Stützstellen.\nEs wird ignoriert.\n", DBFFileName.c_str(), Gewaesser.c_str(), Station / 10000.0);
 			continue;
 		}
 
@@ -707,6 +1085,63 @@
 
 	write_fortschritt("Profilspuren laden beendet<-\n");
 
+	write_fortschritt("->Die Profilspuren werden ausgerichtet\n");
+
+	TProfil* VorProfil = 0;
+	TProfil* NachProfil = 0;
+	for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
+	{
+		VorProfil = NachProfil;
+		NachProfil = *i;
+
+		if (VorProfil == 0)	continue;
+
+		TPoint* VorAnfang = *VorProfil->PointList->begin();
+		TPoint* VorEnde   = *VorProfil->PointList->rbegin();
+
+		TPoint* NachAnfang = *NachProfil->PointList->begin();
+		TPoint* NachEnde   = *NachProfil->PointList->rbegin();
+
+		double VAx = VorAnfang->X;
+		double VAy = VorAnfang->Y;
+		double VEx = VorEnde->X;
+		double VEy = VorEnde->Y;
+		double NAx = NachAnfang->X;
+		double NAy = NachAnfang->Y;
+		double NEx = NachEnde->X;
+		double NEy = NachEnde->Y;
+
+		double X = 0.0;
+		double Y = 0.0;
+		double LambdaA = -1;
+		double LambdaE = -1;
+		if (Calc2Schnitt(VAx, VAy, NAx, NAy, VEx, VEy, NEx, NEy, &X, &Y, &LambdaA, &LambdaE))
+		{
+			if (LambdaA < 0 || LambdaA > 1 || LambdaE < 0 || LambdaE > 1) continue;
+
+			// Hier ist ein echter Schnittpunkt gefunden
+			// Jetzt muss das NachProfil in seiner Reihenfolge vertauscht werden
+
+			TProfil* ExChangeProfil = new TProfil(NachProfil->Gewaesser, NachProfil->Station);
+			for (TPointList::reverse_iterator j = NachProfil->PointList->rbegin(); j != NachProfil->PointList->rend(); j++)
+			{
+				double X = (*j)->X;
+				double Y = (*j)->Y;
+
+				ExChangeProfil->AddPoint(X, Y);
+			}
+			ProfilList->erase(i);
+			delete NachProfil;
+			ProfilList->insert(ExChangeProfil);
+			i = ProfilList->begin();
+			VorProfil = 0;
+			NachProfil = 0;
+		}
+	}
+
+
+	write_fortschritt("Die Profilspuren sind nun ausgerichtet<-\n");
+
 	return (true);
 }
 
@@ -715,6 +1150,34 @@
 {
 	write_fortschritt("->Wasserstände werden geladen\n");
 
+	std::string Ext = GetFileExt(FileName);
+
+	bool Status = true;
+
+	if (ToUpperCase(Ext) == ".DBF")
+	{
+		Status = LoadWspDBF(FileName, ProfilList);
+	}
+	else
+	{
+		Status = LoadWspTxt(FileName, ProfilList);
+	}
+
+	write_fortschritt("Wasserstände wurden geladen<-\n");
+
+	return (Status);
+}
+
+//---------------------------------------------------------------------
+bool LoadWspTxt(std::string FileName, TProfilList* ProfilList)
+{
+	write_fortschritt("->Wasserstände im ASCII-Format werden geladen\n");
+
+	if (ProfilList == 0)
+	{
+		dump_error(__FILE__, __LINE__, "ProfilListe ist undefiniert\n");
+	}
+
 	FILE *fh = fopen(FileName.c_str(), "r");
 	if (fh == 0)
 	{
@@ -730,7 +1193,7 @@
 	char line[1000];
 	while (fgets (line, sizeof (line)-1, fh))
 	{
-		if (ProfilList->size() > 0 && ProfilList->size() % 10 == 0)	write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
+		if (ProfilList->size() > 0 && ProfilList->size() % 100 == 0)	write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
 
 		AktZeile++;
 
@@ -758,17 +1221,17 @@
 
 			if (AktZeile == 1)
 			{
-				if (strncmp(Col, "GEW", 3) == 0)
+				if (strcmp(Col, "GEW") == 0 || strcmp(Col, "Gew") == 0 || strcmp(Col, "gew") == 0 || strcmp(Col, "GEWÄSSER") == 0 || strcmp(Col, "Gewässer") == 0 || strcmp(Col, "gewässer") == 0)
 				{
 					GewCol = AktCol;
 					ColOk++;
 				}
-				if (strncmp(Col, "STATION", 7) == 0)
+				if (strcmp(Col, "STATION") == 0 || strcmp(Col, "Station") == 0 || strcmp(Col, "station") == 0 || strcmp(Col, "KILOMETER") == 0 || strcmp(Col, "Kilometer") == 0 || strcmp(Col, "kilometer") == 0 || strcmp(Col, "KM") == 0 || strcmp(Col, "Km") == 0 || strcmp(Col, "km") == 0)
 				{
 					StationCol = AktCol;
 					ColOk++;
 				}
-				if (strncmp(Col, "WSP", 3) == 0)
+				if (strcmp(Col, "WSP") == 0 || strcmp(Col, "Wsp") == 0 || strcmp(Col, "wsp") == 0 || strcmp(Col, "WASSERSTAND") == 0 || strcmp(Col, "Wasserstand") == 0 || strcmp(Col, "wasserstand") == 0)
 				{
 					WspCol = AktCol;
 					ColOk++;
@@ -802,8 +1265,11 @@
 
 			P = P + strlen(Col) + 1;
 		}
-		if (ColOk != 3) write_error(2215, "Nicht genug Informationen in der Zeile\n");
 
+		if (ColOk != 3 && AktZeile == 1) write_error(2215, "Nicht genug Informationen in der ersten Zeile\nEs müssen die Feldnamen GEW, STATION und WSP vorkommen.\n");
+
+		if (ColOk != 3 && AktZeile > 1) write_error(2215, "Nicht genug Informationen in der Zeile %d.\n", AktZeile);
+
 		if (AktZeile == 1) continue;
 
 		int Station = (int)(StationD * 10000.0 + 0.5);
@@ -817,12 +1283,227 @@
 
 	fclose(fh);
 
-	write_fortschritt("Wasserstände wurden geladen<-\n");
+	write_fortschritt("Wasserstände im ASCII-Format wurden geladen<-\n");
 
 	return (true);
 }
 
 //---------------------------------------------------------------------
+bool LoadWspDBF(std::string FileName, TProfilList* ProfilList)
+{
+	write_fortschritt("->Wasserstände im DBF-Format werden geladen\n");
+
+	if (ProfilList == 0)
+	{
+		dump_error(__FILE__, __LINE__, "ProfilListe ist undefiniert\n");
+	}
+
+	std::string DBFFileName = ExchangeFileExt(FileName, ".DBF");
+	DBFHandle hDBF = DBFOpen(DBFFileName.c_str(), "rb");
+	if (hDBF == NULL)
+	{
+		write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", DBFFileName.c_str());
+		return (false);
+	}
+
+	int DBFRecordCount = DBFGetRecordCount(hDBF);
+
+	if (DBFRecordCount == 0)
+	{
+		DBFClose(hDBF);
+
+		write_error(2204, "Es sind keine Objekte in der DBF-Datei '%s'\n", DBFFileName.c_str());
+	}
+
+	int RecordCount = DBFRecordCount;
+
+	int FieldCount = DBFGetFieldCount(hDBF);
+
+	if (FieldCount == 0)
+	{
+		DBFClose(hDBF);
+
+		write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute GEW und STATION definiert sein.\n", DBFFileName.c_str());
+	}
+
+	std::string GewName = "GEW";
+	int GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	if (GewFieldIndex == -1)
+	{
+		GewName = "Gew";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "gew";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "GEWÄSSER";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "Gewässer";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "gewässer";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+
+	if (GewFieldIndex == -1)
+	{
+		DBFClose(hDBF);
+
+		write_error(2207, "In der DBD-Datei %s' ist das Attribut 'GEW' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+	}
+
+	std::string StationName = "STATION";
+	int StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	if (StationFieldIndex == -1)
+	{
+		StationName = "Station";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "station";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "KILOMETER";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "Kilometer";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "kilometer";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "KM";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "Km";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+	if (StationFieldIndex == -1)
+	{
+		StationName = "km";
+		StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+	}
+
+	if (StationFieldIndex == -1)
+	{
+		DBFClose(hDBF);
+
+		write_error(2208, "In der DBD-Datei '%s' ist das Attribut 'STATION' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+	}
+
+	std::string WspName = "WSP";
+	int WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+	if (WspFieldIndex == -1)
+	{
+		WspName = "Wsp";
+		WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+	}
+	if (WspFieldIndex == -1)
+	{
+		WspName = "wsp";
+		WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+	}
+	if (WspFieldIndex == -1)
+	{
+		WspName = "WASSERSTAND";
+		WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+	}
+	if (WspFieldIndex == -1)
+	{
+		WspName = "Wasserstand";
+		WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+	}
+	if (WspFieldIndex == -1)
+	{
+		WspName = "wasserstand";
+		WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+	}
+
+	if (WspFieldIndex == -1)
+	{
+		DBFClose(hDBF);
+
+		write_error(2207, "In der DBD-Datei %s' ist das Attribut 'WSP' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+	}
+
+	int Width = 0;
+	int Decimals = 0;
+	if (DBFGetFieldInfo(hDBF, GewFieldIndex, NULL, &Width, &Decimals) != FTString)
+	{
+		DBFClose(hDBF);
+
+		write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Text.\n", DBFFileName.c_str(), GewName.c_str());
+	}
+
+	if (DBFGetFieldInfo(hDBF, StationFieldIndex, NULL, &Width, &Decimals) != FTDouble)
+	{
+		DBFClose(hDBF);
+
+		write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Fliesskommazahl.\n", DBFFileName.c_str(), StationName.c_str());
+	}
+
+	if (DBFGetFieldInfo(hDBF, WspFieldIndex, NULL, &Width, &Decimals) != FTDouble)
+	{
+		DBFClose(hDBF);
+
+		write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Fliesskommazahl.\n", DBFFileName.c_str(), WspName.c_str());
+	}
+
+	for (int i = 0; i<RecordCount; i++)
+	{
+		if (ProfilList->size() > 0 && ProfilList->size() % 100 == 0)	write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
+
+		std::string Gewaesser = DBFReadStringAttribute(hDBF, i, GewFieldIndex);
+		double S = DBFReadDoubleAttribute(hDBF, i, StationFieldIndex);
+		double W = DBFReadDoubleAttribute(hDBF, i, WspFieldIndex);
+
+		int Station = (int)(S * 10000.0 + 0.5);
+		if (S < 0)	Station = (int)(S * 10000.0 - 0.5);
+
+		double Wsp = (int)(W * 100.0 + 0.5) / 100.0;
+		if (Wsp < 0)	Wsp = (int)(W * 100.0 - 0.5) / 100.0;
+
+		if (ProfilList->Find(Gewaesser, Station))
+		{
+			write_warning(2111, "In der DBD-Datei '%s' kommt der Wasserstand ('%s',%.4f) mehrfach vor.\nEs wird nur die erste Definition berücksichtigt.\n", DBFFileName.c_str(), Gewaesser.c_str(), Station / 10000.0);
+			continue;
+		}
+
+		TProfil* Profil = new TProfil(Gewaesser, Station, Wsp);
+
+		ProfilList->insert(Profil);
+	}
+
+	write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
+
+	DBFClose(hDBF);
+
+	write_fortschritt("Wasserstände im DBF-Format wurden geladen<-\n");
+
+	return (true);
+}
+
+//---------------------------------------------------------------------
 bool LoadAchse(std::string FileName, TGewaesserAchseList* GewaesserAchseList)
 {
 	write_fortschritt("->Gewässerachse wird geladen\n");
@@ -899,14 +1580,40 @@
 		write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute GEW und STATION definiert sein.\n", DBFFileName.c_str());
 	}
 
+	std::string GewName = "GEW";
 	int GewFieldIndex = DBFGetFieldIndex(hDBF, "GEW");
+	if (GewFieldIndex == -1)
+	{
+		GewName = "Gew";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "gew";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "GEWÄSSER";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "Gewässer";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
+	if (GewFieldIndex == -1)
+	{
+		GewName = "gewässer";
+		GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+	}
 
 	if (GewFieldIndex == -1)
 	{
 		SHPClose(hSHP);
 		DBFClose(hDBF);
 
-		write_error(2207, "In der DBD-Datei %s' ist das Attribut GEW nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+		write_error(2207, "In der DBD-Datei %s' ist das Attribut 'GEW' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
 	}
 
 	int Width = 0;
@@ -921,7 +1628,7 @@
 
 	for (int i = 0; i<RecordCount; i++)
 	{
-		if (GewaesserAchseList->size() > 0 && GewaesserAchseList->size() % 10 == 0)	write_fortschritt("%d Gewässerachsen geladen\n", GewaesserAchseList->size());
+		if (GewaesserAchseList->size() > 0 && GewaesserAchseList->size() % 100 == 0)	write_fortschritt("%d Gewässerachsen geladen\n", GewaesserAchseList->size());
 
 		std::string Gewaesser = DBFReadStringAttribute(hDBF, i, GewFieldIndex);
 
@@ -931,11 +1638,10 @@
 
 		if (AnzVert <= 0)
 		{
-			write_warning(2118, "In der DBD-Datei '%s' hat eine Gewässerachse ('%s') keine Stützstellen.\nSie wird ignoriert.", DBFFileName.c_str(), Gewaesser.c_str());
+			write_warning(2118, "In der DBD-Datei '%s' hat eine Gewässerachse ('%s') keine Stützstellen.\nSie wird ignoriert.\n", DBFFileName.c_str(), Gewaesser.c_str());
 			continue;
 		}
 
-
 		TGewaesserAchse* GewaesserAchse = new TGewaesserAchse(Gewaesser, i);
 
 		GewaesserAchseList->insert(GewaesserAchse);
@@ -973,7 +1679,7 @@
 	FILE *fh = fopen (FileName.c_str(), "w");
 	if (fh == NULL)
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	fprintf(fh, "MESH2D\n");
@@ -1076,25 +1782,25 @@
 	DBFHandle DBFHandle = DBFCreate(FileName.c_str());
 	if(DBFHandle == NULL )
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "GEW", FTString, 255, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "STATION", FTDouble, 10, 4) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'STATION' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'STATION' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "WSP", FTDouble, 8, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'WSP' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'WSP' nicht erzeugen\n", FileName.c_str());
 	}
 
 	SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_ARC);
@@ -1103,9 +1809,6 @@
 	int AnzProfil = 0;
 	for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
 	{
-		if (Debug && AnzProfil % 100 == 0)	write_fortschritt("%d Profile bearbeitet\n", AnzProfil);
-		else if (AnzProfil % 1000 == 0)		write_fortschritt("%d Profile bearbeitet\n", AnzProfil);
-
 		TProfil* Profil = *i;
 
 		std::string Gewaesser = Profil->Gewaesser;
@@ -1131,17 +1834,6 @@
 			AnzPoint++;
 		}
 
-		TPoint* Point = *Profil->PointList->begin();
-
-		double X = Point->X;
-		double Y = Point->Y;
-
-		x[AnzPoint] = X;
-		y[AnzPoint] = Y;
-		z[AnzPoint] = 0.0;
-
-		AnzPoint++;
-
 		SHPObject *psShape = SHPCreateSimpleObject(SHPT_ARC, AnzPoint, x, y, z);
 		SHPWriteObject(SHPHandle, -1, psShape);
 		SHPDestroyObject(psShape);
@@ -1155,7 +1847,11 @@
 		free(z);
 
 		AnzProfil++;
+
+		if (Debug && AnzProfil % 100 == 0)		write_fortschritt("%d Profile gespeichert\n", AnzProfil);
+		else if (0 && AnzProfil % 1000 == 0)	write_fortschritt("%d Profile gespeichert\n", AnzProfil);
 	}
+	write_fortschritt("%d Profile gespeichert\n", AnzProfil);
 
 	DBFClose(DBFHandle);
 	SHPClose(SHPHandle);
@@ -1173,25 +1869,25 @@
 	DBFHandle DBFHandle = DBFCreate(FileName.c_str());
 	if(DBFHandle == NULL )
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "GEW", FTString, 255, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "VON", FTInteger, 10, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "BIS", FTInteger, 10, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen\n", FileName.c_str());
 	}
 
 	SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
@@ -1256,33 +1952,49 @@
 	DBFHandle DBFHandle = DBFCreate(FileName.c_str());
 	if(DBFHandle == NULL )
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "GEW", FTString, 255, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "VONKM", FTDouble, 12, 4) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "BISKM", FTDouble, 12, 4) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "DELTA", FTDouble, 12, 4) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen\n", FileName.c_str());
 	}
 
+	if (Debug)
+	{
+		for (TErgebnisPolygonList::iterator i = ErgebnisPolygonList->begin(); i != ErgebnisPolygonList->end(); i++)
+		{
+			TErgebnisPolygon* ErgebnisPolygon = *i;
+
+			std::string AktGewaesser = ErgebnisPolygon->Gewaesser;
+			double AktVonKm = ErgebnisPolygon->VonKm;
+			double AktBisKm = ErgebnisPolygon->BisKm;
+			double AktDiff = ErgebnisPolygon->Diff;
+
+			write_fortschritt("Gewässer %s %.4f - %.4f Wassertiefe %.2f\n", AktGewaesser.c_str(), AktVonKm, AktBisKm, AktDiff);
+		}
+	}
+
+
 	SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
 
 	int	AnzPolygons = 0;
@@ -1296,6 +2008,8 @@
 		double AktBisKm = ErgebnisPolygon->BisKm;
 		double AktDiff = ErgebnisPolygon->Diff;
 
+		write_fortschritt("Gewässer %s %.4f - %.4f Wassertiefe %.2f ", AktGewaesser.c_str(), AktVonKm, AktBisKm, AktDiff);
+
 		size_t	Size = 0;
 
 		int		*ps = 0;
@@ -1310,7 +2024,7 @@
 		for (TErgebnisPolygonList::iterator j = ErgebnisPolygonList->begin(); j != ErgebnisPolygonList->end(); j++)
 		{
 			TErgebnisPolygon* EP1 = *j;
-			if (EP1->Gewaesser != AktGewaesser || EP1->Diff != AktDiff) continue; // Die Moment nicht
+			if (EP1->Gewaesser != AktGewaesser || EP1->VonKm != AktVonKm || EP1->BisKm != AktBisKm || EP1->Diff != AktDiff) continue; // Die Moment nicht
 
 			TXYList::iterator First = EP1->begin();
 
@@ -1325,9 +2039,8 @@
 				TErgebnisPolygon* EP2 = *k;
 
 				if (EP2 == EP1)	continue;
-				
-				if (EP2->Gewaesser != AktGewaesser || EP2->Diff != AktDiff) continue; // Die Moment auch nicht
 
+				if (EP2->Gewaesser != AktGewaesser || EP2->VonKm != AktVonKm || EP2->BisKm != AktBisKm || EP2->Diff != AktDiff) continue; // Die Moment auch nicht
 
 				if (EP2->IsInsideXYList(X, Y))
 				{
@@ -1370,6 +2083,9 @@
 			}
 		}
 
+		if (Debug)	write_fortschritt("%d. Polygon %d Teile %d Ecken.\n", AnzPolygons+1, AnzPolyParts, AnzPolyPoints);
+		else		write_fortschritt("\n");
+
 		if (AnzPolyParts > 0 && AnzPolyPoints > 0)
 		{
 			DBFWriteStringAttribute(DBFHandle, AnzPolygons, 0, AktGewaesser.c_str());
@@ -1396,7 +2112,7 @@
 		while (j != ErgebnisPolygonList->end())
 		{
 			TErgebnisPolygon* EP1 = *j;
-			if (EP1->Gewaesser == AktGewaesser && EP1->Diff == AktDiff)
+			if (EP1->Gewaesser == AktGewaesser && EP1->VonKm == AktVonKm && EP1->BisKm == AktBisKm && EP1->Diff == AktDiff)
 			{
 				delete EP1;
 				ErgebnisPolygonList->erase(j);
@@ -1473,7 +2189,7 @@
 
 		if (Wsp > 0.0 && Depth <= 0.0)
 		{
-			dump_error(__FILE__, __LINE__, "Wasserstand > 0 aber Wassertiefe <= 0");
+			dump_error(__FILE__, __LINE__, "Wasserstand > 0 aber Wassertiefe <= 0\n");
 		}
 
 		if (Wsp > 0)	Topo = Wsp - Depth;
@@ -1556,25 +2272,25 @@
 	DBFHandle DBFHandle = DBFCreate(FileName.c_str());
 	if(DBFHandle == NULL )
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Topo", FTDouble, 7, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Wsp", FTDouble, 7, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Depth", FTDouble, 7, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen\n", FileName.c_str());
 	}
 
 	SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
@@ -1607,25 +2323,25 @@
 	DBFHandle DBFHandle = DBFCreate(FileName.c_str());
 	if(DBFHandle == NULL )
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Topo", FTDouble, 7, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Wsp", FTDouble, 7, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Depth", FTDouble, 7, 2) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen\n", FileName.c_str());
 	}
 
 	SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POINT);
@@ -1670,19 +2386,19 @@
 	DBFHandle DBFHandle = DBFCreate(FileName.c_str());
 	if(DBFHandle == NULL )
 	{
-		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+		write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Nr1", FTInteger, 10, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr1' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr1' nicht erzeugen\n", FileName.c_str());
 	}
 
 	if (DBFAddField(DBFHandle, "Nr2", FTInteger, 10, 0) == -1)
 	{
 		DBFClose(DBFHandle);
-		write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr2' nicht erzeugen", FileName.c_str());
+		write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr2' nicht erzeugen\n", FileName.c_str());
 	}
 
 	SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_ARC);

Modified: trunk/src/file.h
===================================================================
--- trunk/src/file.h	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/file.h	2006-03-21 00:53:11 UTC (rev 39)
@@ -22,13 +22,18 @@
 
 unsigned int	LoadDGM(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
 unsigned int	LoadDGMTIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
+unsigned int	LoadDGMGRD(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
 unsigned int	LoadDGMXYZ(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
-unsigned int	LoadDGMGRD(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
+unsigned int	LoadDGMGRD(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
 unsigned int	LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
 unsigned int	LoadDGM2DM(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
 
 bool 			LoadProfile(std::string FileName, TProfilList* ProfilList);
+
 bool 			LoadWsp(std::string FileName, TProfilList* ProfilList);
+bool 			LoadWspTxt(std::string FileName, TProfilList* ProfilList);
+bool 			LoadWspDBF(std::string FileName, TProfilList* ProfilList);
+
 bool			LoadAchse(std::string FileName, TGewaesserAchseList* GewaesserAchseList);
 
 bool 			SaveNet(std::string FileName, TNodeList *NodeList, TElementList *ElementList, bool Debug);

Modified: trunk/src/parameter.cpp
===================================================================
--- trunk/src/parameter.cpp	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/parameter.cpp	2006-03-21 00:53:11 UTC (rev 39)
@@ -63,7 +63,7 @@
 	std::vector<std::string>	ParList;
 
 	int AnzPar = 0;
-	for (int i=0, j=0; i<argc || j<AnzPar; i++)
+	for (int i=1, j=0; i<argc || j<AnzPar; i++)
 	{
 		std::string Parameter = "";
 
@@ -79,15 +79,19 @@
 
 		if (Parameter.substr(0, 6) == "-DEBUG" || Parameter.substr(0, 6) == "-debug")
 		{
+			///////////////////////////////////////////////
+			// DEBUG
+			///////////////////////////////////////////////
 			write_fortschritt("Parameter -DEBUG erkannt.\n");
 			write_fortschritt("Es werden jetzt ausführliche Informationen ausgegeben.\n");
 
 			IsDebug = true;
-			continue;
 		}
-
-		if (Parameter.substr(0, 4) == "-PAR" || Parameter.substr(0, 4) == "-par")
+		else if (Parameter.substr(0, 4) == "-PAR" || Parameter.substr(0, 4) == "-par")
 		{
+			///////////////////////////////////////////////
+			// PAR
+			///////////////////////////////////////////////
 			if (IsDebug) write_fortschritt("Parameter -PAR erkannt.\n");
 
 			if (IsSetPar)
@@ -112,12 +116,12 @@
 
 			LoadPar(FileNamePar, &ParList);
 			AnzPar = ParList.size();
-
-			continue;
 		}
-
-		if (Parameter.substr(0, 6) == "-DELTA" || Parameter.substr(0, 6) == "-delta")
+		else if (Parameter.substr(0, 6) == "-DELTA" || Parameter.substr(0, 6) == "-delta")
 		{
+			///////////////////////////////////////////////
+			// DELTA
+			///////////////////////////////////////////////
 			if (IsDebug) write_fortschritt("Parameter -DELTA erkannt.\n");
 
 			if (IsSetDelta)
@@ -178,12 +182,12 @@
 				if (IsSetDiff)	write_fortschritt(" Diff = %.2f\n", Diff);
 				else			write_fortschritt(" Diff = <default>\n");
 			}
-
-			continue;
 		}
-
-		if (Parameter.substr(0, 4) == "-GEL" || Parameter.substr(0, 4) == "-gel")
+		else if (Parameter.substr(0, 4) == "-GEL" || Parameter.substr(0, 4) == "-gel")
 		{
+			///////////////////////////////////////////////
+			// GEL
+			///////////////////////////////////////////////
 			if (IsDebug) write_fortschritt("Parameter -GEL erkannt.\n");
 
 			if (IsSetGel)
@@ -219,11 +223,8 @@
 				if (Sperre)	write_fortschritt("Gelände wirkt als Sperre\n");
 				else		write_fortschritt("Gelände wirkt nicht als Sperre\n");
 			}
-
-			continue;
 		}
-
-		if (Parameter.substr(0, 4) == "-DGM" || Parameter.substr(0, 4) == "-dgm")
+		else if (Parameter.substr(0, 4) == "-DGM" || Parameter.substr(0, 4) == "-dgm")
 		{
 			if (IsDebug) write_fortschritt("Parameter -DGM erkannt.\n");
 
@@ -246,11 +247,8 @@
 			IsSetDgm = true;
 
 			if (IsDebug) write_fortschritt("DGM-Datei: '%s'\n", FileNameDgm.c_str());
-
-			continue;
 		}
-
-		if (Parameter.substr(0, 4) == "-PRO" || Parameter.substr(0, 4) == "-pro")
+		else if (Parameter.substr(0, 4) == "-PRO" || Parameter.substr(0, 4) == "-pro")
 		{
 			if (IsDebug) write_fortschritt("Parameter -PRO erkannt.\n");
 
@@ -273,11 +271,8 @@
 			IsSetPro = true;
 
 			if (IsDebug) write_fortschritt("Profillagen-Datei: '%s'\n", FileNamePro.c_str());
-
-			continue;
 		}
-
-		if (Parameter.substr(0, 4) == "-WSP" || Parameter.substr(0, 4) == "-wsp")
+		else if (Parameter.substr(0, 4) == "-WSP" || Parameter.substr(0, 4) == "-wsp")
 		{
 			if (IsDebug) write_fortschritt("Parameter -WSP erkannt.\n");
 
@@ -303,8 +298,7 @@
 
 			continue;
 		}
-
-		if (Parameter.substr(0, 4) == "-LIN" || Parameter.substr(0, 4) == "-LIN")
+		else if (Parameter.substr(0, 4) == "-LIN" || Parameter.substr(0, 4) == "-LIN")
 		{
 			if (IsDebug) write_fortschritt("Parameter -LIN erkannt.\n");
 
@@ -327,11 +321,8 @@
 			IsSetLin = true;
 
 			if (IsDebug) write_fortschritt("Bruch- und Sperr-Datei: '%s'\n", FileNameLin.c_str());
-
-			continue;
 		}
-
-		if (Parameter.substr(0, 6) == "-ACHSE" || Parameter.substr(0, 6) == "-achse")
+		else if (Parameter.substr(0, 6) == "-ACHSE" || Parameter.substr(0, 6) == "-achse")
 		{
 			if (IsDebug) write_fortschritt("Parameter -ACHSE erkannt.\n");
 
@@ -357,8 +348,7 @@
 
 			continue;
 		}
-
-		if (Parameter.substr(0, 8) == "-AUSGABE" || Parameter.substr(0, 8) == "-ausgabe")
+		else if (Parameter.substr(0, 8) == "-AUSGABE" || Parameter.substr(0, 8) == "-ausgabe")
 		{
 			if (IsDebug) write_fortschritt("Parameter -AUSGABE erkannt.\n");
 
@@ -380,10 +370,12 @@
 
 			IsSetAusgabe = true;
 
-			if (IsDebug) write_fortschritt("Ausage-Datei: '%s'\n", FileNameAusgabe.c_str());
-
-			continue;
+			if (IsDebug) write_fortschritt("Ausgabe-Datei: '%s'\n", FileNameAusgabe.c_str());
 		}
+		else
+		{
+			write_warning(1124, "Eine unbekannte Zeichenkette %s' wurde als Parameter übergeben.\nDie Zeichenkette wird ignoriert.\n", Parameter.c_str());
+		}
 	}
 
 	if (false == IsSetDgm)

Modified: trunk/src/tools.cpp
===================================================================
--- trunk/src/tools.cpp	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/tools.cpp	2006-03-21 00:53:11 UTC (rev 39)
@@ -59,7 +59,7 @@
 	// deshalb wird hier auch kein 'sinnvoller' Rückgabewert definiert
 	ReturnCode = 9298;
 
-	throw TFehler("Fehler");
+	throw TFehler("Problem");
 }
 
 //---------------------------------------------------------------------------
@@ -334,8 +334,8 @@
 		double numy = n1Sq * (n3->X - n2->X) + n2Sq * (n1->X - n3->X) + n3Sq * (n2->X - n1->X);
 		double y = numy / (2.0 * cp);
 
-		double dx = n1->X - x;
-		double dy = n1->Y - y;
+		double dx = n3->X - x;
+		double dy = n3->Y - y;
 
 		*cx = x;
 		*cy = y;
@@ -349,12 +349,12 @@
 }
 
 //---------------------------------------------------------------------------
-size_t CheckMemory(bool IsDebug)
+size_t CheckMemory(bool Debug)
 {
 	write_fortschritt("->Ermitteln der Speicherauslastung\n");
 
-//	size_t MaxMemSize = 2UL * 1024UL * 1024UL * 1024UL;
-	size_t MaxMemSize = 200000000;
+	size_t MaxMemSize = 2UL * 1024UL * 1024UL * 1024UL;
+	if (Debug) MaxMemSize = 200000000;
 
 	while (MaxMemSize > 0)
 	{
@@ -367,7 +367,7 @@
 		}
 		else
 		{
-			if (IsDebug)
+			if (Debug)
 			{
 				write_fortschritt("%d MB stehen NICHT zur Verfügung\n", MaxMemSize / 1024 / 1024);
 			}
@@ -383,7 +383,7 @@
 }
 
 //---------------------------------------------------------------------------
-long CheckSpeed(bool IsDebug)
+long CheckSpeed(bool Debug)
 {
 	write_fortschritt("->Ermitteln der Geschwindigkeit\n");
 
@@ -400,7 +400,7 @@
 
 	do
 	{
-		if (IsDebug)
+		if (Debug)
 		{
 			if (Flops % 100000 == 0)	write_fortschritt("%d Flops berechnet\n", Flops);
 		}
@@ -418,6 +418,8 @@
 
 	} while (DiffMSec < 2000);
 
+	if (Debug) Flops = 1840000;
+
 	write_fortschritt("%.3f MFlops berechnet\n", Flops / 1000.0 / 1000.0);
 
 	if (DiffMSec > 10000) write_fortschritt("%d Dummy\n", Dummy);
@@ -501,7 +503,7 @@
 	int Anz = 0;
 	for (TProfilList::iterator i=ProfilList->begin(); i != ProfilList->end(); i++)
 	{
-		if (Anz > 0 && Anz % 10 == 0)	write_fortschritt ("%d Profile bearbeitet\n", Anz);
+		if (Anz > 0 && Anz % 100 == 0)	write_fortschritt ("%d Profile bearbeitet\n", Anz);
 
 		TProfil *Profil = *i;
 
@@ -586,7 +588,7 @@
 			for (TProfilList::iterator j = ProfilList->begin(); j != ProfilList->end(); j++)
 			{
 				TProfil* Profil = *j;
-				write_fortschritt("Profil '%s' '%.4f'}\n", Profil->Gewaesser.c_str(), Profil->Station / 10000.0);
+				write_fortschritt("Profil '%s' '%.4f'\n", Profil->Gewaesser.c_str(), Profil->Station / 10000.0);
 			}
 		}
 	}
@@ -608,9 +610,13 @@
 
 	XyList->Clear();
 
+	int Count = 0;
 	TProfilList::iterator ProfilIter = ProfilList->begin();
 	for (unsigned int i = 0; i < ProfilList->size()-1; i++)
 	{
+		if (Debug && Count % 100 == 0)	write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+		else if (Count % 1000 == 0)		write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+
 		TProfil* Profil = *ProfilIter;
 
 		if (i == 0)
@@ -627,11 +633,15 @@
 			XyList->Add(Point->X, Point->Y);
 		}
 		ProfilIter++;
+		Count++;
 	}
 
 	TProfilList::reverse_iterator RProfilIter = ProfilList->rbegin();
 	for (unsigned int i = ProfilList->size()-1; i > 0; i--)
 	{
+		if (Debug && Count % 100 == 0)	write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+		else if (Count % 1000 == 0)		write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+
 		TProfil* Profil = *RProfilIter;
 
 		if (i == ProfilList->size()-1)
@@ -648,8 +658,11 @@
 			XyList->Add(Point->X, Point->Y);
 		}
 		RProfilIter++;
+		Count++;
 	}
+	write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
 
+/*
 	if (Debug)
 	{
 		write_fortschritt("Polygon:\n");
@@ -659,6 +672,7 @@
 			write_fortschritt("%.3f %.3f\n", Xy->X, Xy->Y);
 		}
 	}
+*/
 
 	write_fortschritt ("Begrenzungspolygon wurde erzeugt<-\n");
 }
@@ -745,7 +759,7 @@
 		AntiEdge = EdgeList->Find((*N2)->Nr, (*N1)->Nr);
 		if (AntiEdge == 0)
 		{
-			// Im moment gehe ich mal davon aus, dass es könnte eine neue Randkante ist
+			// Im moment gehe ich mal davon aus, dass es eine neue Randkante ist
 			NewEdge = EdgeList->Add(*N1, *N2);
 			NewEdge->IsBoundary = true;
 		}
@@ -919,8 +933,8 @@
 	int Count = 0;
 	for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
 	{
-		if (Debug && Count % 100 == 0)	write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
-		else if (Count % 1000 == 0)		write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
+		if (Debug && Count % 10 == 0)	write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
+		else if (Count % 100 == 0)		write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
 
 		TProfil* Profil = *i;
 
@@ -928,6 +942,8 @@
 		int Station = Profil->Station;
 		double Wsp = Profil->Wsp;
 
+		if (Wsp < -9999)	continue;
+
 		double Meter = 0.0;
 
 		if (Sperre)
@@ -1100,43 +1116,42 @@
 	double  LambdaP = 0.0;
 	double  LambdaS = 0.0;
 
-	if (fabs(PDx) < 0.00001 && fabs(PDy) < 0.00001)
+	if (fabs(PDx) < 0.00000001 && fabs(PDy) < 0.00000001)
 	{
 		write_error(3207, "Profil-Punktabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", P0x, P0y, P1x, P1y);
 	}
-	else if (fabs(SDx) < 0.00001 && fabs(SDy) < 0.00001)
+	else if (fabs(SDx) < 0.00000001 && fabs(SDy) < 0.00000001)
 	{
 		write_error(3208, "GewaesserAchse-Punktabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", S0x, S0y, S1x, S1y);
 	}
-	else if (fabs(PDx) < 0.00001 && fabs(SDx) < 0.00001)
+	else if (fabs(PDx) < 0.00000001 && fabs(SDx) < 0.00000001)
 	{
 		// S-Segment und P->Abschnitt sind beide senkrecht (parallel)
 		return (false);
 	}
-	else if (fabs(PDy) < 0.00001 && fabs(SDy) < 0.00001)
+	else if (fabs(PDy) < 0.00000001 && fabs(SDy) < 0.00000001)
 	{
 		// S-Segment und P->Abschnitt sind beide waagerecht (parallel)
 		return (false);
 	}
-	else if (fabs(PDx) < 0.00001)
+	else if (fabs(PDx) < 0.00000001)
 	{
 		// P-Abschnitt senkrecht aber Spur-Abschnitt nicht
 		LambdaS = (P0x - S0x) / SDx;
 		LambdaP = ((S0y + LambdaS * SDy) - P0y) / PDy;
 	}
-	else if (fabs(PDy) < 0.00001)
+	else if (fabs(PDy) < 0.00000001)
 	{
 		// P-Abschnitt waagerecht aber Spur-Abschnitt nicht
 		LambdaS = (P0y - S0y) / SDy;
 		LambdaP = ((S0x + LambdaS * SDx) - P0x) / PDx;
 	}
-	else if (fabs((SDy / PDy) - (SDx / PDx)) < 0.00001)
+	else if (fabs((SDy / PDy) - (SDx / PDx)) < 0.00000001)
 	{
 		// Spur-Segment und PaPe->Abschnitt sind parallel
 		// fabs((SDy / PDy) - (SDx / PDx)) < 0.00001 entspricht
 		// SDy / PDy = SDx / PDx entspricht
 		// SDy / SDx = PDy / PDx (P-Steigung gleich S-Steigung) entspricht
-		// SDy / SDx = PDy / PDx (P-Steigung gleich S-Steigung) entspricht
 		// SDy / SDx = PDy / PDx entspricht
 		// SDy / PDy = SDx / PDx entspricht
 		// SDy / PDy * PDx = SDx entspricht
@@ -1156,7 +1171,7 @@
 	double Sx = S0x + LambdaS * SDx;
 	double Sy = S0y + LambdaS * SDy;
 
-	if (fabs(Px-Sx) > 0.0001 || fabs(Py-Sy) > 0.0001)
+	if (fabs(Px-Sx) > 0.001 || fabs(Py-Sy) > 0.001)
 	{
 		dump_error (__FILE__, __LINE__, "Errechnete Punkte sind nicht identisch (%10.5f,%10.5f) und (%10.5f,%10.5f)\n", Px, Py, Sx, Sy);
 	}
@@ -1379,6 +1394,8 @@
 //---------------------------------------------------------------------------
 void NassTrockenBerechnung(std::string FileName, TNodeList *NodeList, TEdgeList *EdgeList, TErgebnisPolygonList* ErgebnisPolygone, double Von, double Bis, double Diff, bool Debug)
 {
+	write_fortschritt("->Überschwemmungsgrenzen werden ermittelt.\n");
+
 	TNodeList *SaveNodeList = new TNodeList;
 	SaveNodeList = NodeList->Copy();
 
@@ -1389,6 +1406,8 @@
 
 	for (double DeltaTopo = Von; DeltaTopo <= Bis; DeltaTopo = DeltaTopo + Diff)
 	{
+		write_fortschritt("Wasserstand %.3f wird bearbeitet.\n", DeltaTopo);
+
 		// Zuerst alles wieder wie gehabt einstellen
 		// Bloss das die Topographie etwas angehoben wird
 		TNodeList::iterator n = NodeList->begin();
@@ -1432,6 +1451,8 @@
 		}
 */
 
+		if (Debug)	write_fortschritt("Maximaler Wasserstand wird ermittelt.\n");
+
 		// Maximalen Wasserstand ermitteln
 		double  MaxWsp = 0.0;
 		for (TNodeList::iterator i = NodeList->begin(); i != NodeList->end(); i++)
@@ -1441,6 +1462,8 @@
 			if (i == NodeList->begin() || MaxWsp < Node->Wsp)   MaxWsp = Node->Wsp;
 		}
 
+		if (Debug)	write_fortschritt("Sicher trockene Knoten werden ermittelt.\n");
+
 		// Anzahl der Knoten bestimmen, die höher als der maximale Wassrstand sind
 		// oder die schon einen Wasserstand haben
 		int Ready = 0;
@@ -1451,6 +1474,8 @@
 			if (Node->Wsp > -9999 || Node->Z > MaxWsp)  Ready++;
 		}
 
+		if (Debug)	write_fortschritt("Die ersten Kanten ermitteln, an denen ein Nass/Trocken-Übergng stattfindet.\n");
+
 		// Die Kanten bestimmen, die an einem Ende einen nassen und am anderen Ende einen trockenen Knoten haben
 		// Dies ist die Anfangskanten
 		TEdgeList *Temp2EdgeList = new TEdgeList();
@@ -1468,6 +1493,8 @@
 			}
 		}
 
+		if (Debug)	write_fortschritt("Jetzt die Wasserstände weitertragen.\n");
+
 		TEdgeList *TempEdgeList = new TEdgeList();
 		int Changed = 0;
 		do
@@ -1595,6 +1622,8 @@
 			Edge->Ready = false;
 		}
 
+		if (Debug)	write_fortschritt("Jetzt die Nass/Trocken-Überganänge auf den Kanten bestimmen.\n");
+
 		// Jetzt die Nass/Trocken Übergänge bestimmen
 		int FoundWetDry = 0;
 		for (TEdgeListNrSorted::iterator i = EdgeList->EdgeListNrSorted.begin(); i != EdgeList->EdgeListNrSorted.end(); i++)
@@ -1651,6 +1680,8 @@
 		// Jetzt sind alle Nass/Trockenübergänge bestimmt
 
 
+		if (Debug)	write_fortschritt("Jetzt die Nass/Trocken-Überganänge verbinden.\n");
+
 		// Jetzt muss man sie nur noch verbinden
 
 		bool FoundStartChangeEdge = false;
@@ -1696,5 +1727,6 @@
 
 		} while (FoundStartChangeEdge);
 	}
+	write_fortschritt("Überschwemmungsgrenzen wurden ermittelt.<-\n");
 }
 

Modified: trunk/src/tri.cpp
===================================================================
--- trunk/src/tri.cpp	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/tri.cpp	2006-03-21 00:53:11 UTC (rev 39)
@@ -27,6 +27,9 @@
 double cr = 0;
 TEdge *Edge = 0;
 
+double MinWin = 360.0;
+double MaxWin = 0.0;
+
 //---------------------------------------------------------------------
 void FindLeftMostNeighbours(TNodeList* NodeList, TNode* *Node1, TNode* *Node2)
 {
@@ -76,18 +79,6 @@
 }
 
 //---------------------------------------------------------------------
-TEdge* FindEdge(TEdgeList* EdgeList, TNode *Node1, TNode *Node2)
-{
-	TEdge *SearchEdge = new TEdge(Node1, Node2);
-
-	TEdge *FoundEdge = EdgeList->Find(SearchEdge);
-
-	delete SearchEdge;
-
-	return (FoundEdge);
-}
-
-//---------------------------------------------------------------------
 //
 // Complete a facet by looking for the circle free point to the left
 // of the edge "e_i".  Add the facet to the triangulation.
@@ -95,7 +86,7 @@
 // This function is a bit long and may be better split.
 //
 //---------------------------------------------------------------------
-void CompleteFacet(TNodeList* NodeList, TElementList* ElementList, TEdgeList *TodoEdgeList)
+void CompleteFacet(TNodeList* NodeList, TElementList* ElementList, TEdgeList *TodoEdgeList, TEdgeList *ReadyEdgeList)
 {
 	TEdge* AktEdge = TodoEdgeList->First();
 
@@ -115,13 +106,14 @@
 	double X = (X1 + X2) / 2;
 	double Y = (Y1 + Y2) / 2;
 
+	int MaxTestAnz = 5;
 	int TestAnz = 0;
 	do
 	{
 		TestAnz++;
 
-		double SX = X - TestAnz * Dy;
-		double SY = Y + TestAnz * Dx;
+		double SX = X - TestAnz * TestAnz * Dy;
+		double SY = Y + TestAnz * TestAnz * Dx;
 
 		TestNode->X = SX;
 		TestNode->Y = SY;
@@ -130,13 +122,11 @@
 
 		NodeList->FindAllByXY(FoundNodeList, cx, cy, sqrt(cr)+0.01);
 
-/*
 		if (FoundNodeList->size() <= 2)
 		{
-			// Da waren nur die beiden KantenKnoten drin
+			// Da waren nur die beiden Kanten-Knoten selbst drin
 			FoundNodeList->clear();
 		}
-*/
 
 		TNodeList::iterator i = FoundNodeList->begin();
 		while (i != FoundNodeList->end())
@@ -157,18 +147,49 @@
 			}
 
 			double CP = CrossProduct(Node1, Node2, Node);
-			if (CP < 0.000001)
+			if (CP < 0.0000001)
 			{
 				FoundNodeList->erase(i);
 				i = FoundNodeList->begin();
 				continue;
 			}
+
+
+			double X3 = Node->X;
+			double Y3 = Node->Y;
+			double Win = ThreeToWin(X2, Y2, X3, Y3, X1, Y1, 1);
+
+
+			if (MinWin > Win)
+			{
+				MinWin = Win;
+				write_fortschritt("Minimaler Winkel bisher: %.3f\n", MinWin);
+			}
+
+			if (MaxWin < Win)
+			{
+				MaxWin = Win;
+				write_fortschritt("Maximaler Winkel bisher: %.3f\n", MaxWin);
+			}
+
+			if (Win > 177)
+			{
+				dump_error(__FILE__, __LINE__, "Winkel zu groß");
+			}
+
+			if (Win < 3)
+			{
+				FoundNodeList->erase(i);
+				i = FoundNodeList->begin();
+				continue;
+			}
+
 			i++;
 		}
-	} while (TestAnz < 9 && FoundNodeList->size() == 0);
+	} while (TestAnz < MaxTestAnz && FoundNodeList->size() == 0);
 
-
-	// Dann versuche ich es noch mal allen
+	// Dann versuche ich es noch mal mit allen
+/*
 	if (FoundNodeList->size() == 0)
 	{
 		for (TNodeList::iterator i = NodeList->begin(); i != NodeList->end(); i++)
@@ -178,6 +199,7 @@
 			FoundNodeList->push_back(Node);
 		}
 	}
+*/
 
 	NewNode = 0;
 	TNodeList::iterator i = FoundNodeList->begin();
@@ -199,9 +221,13 @@
 
 			break;
 		}
+		else
+		{
+			dump_error(__FILE__, __LINE__, "Der erste gefundene Knoten ist auf der falschen Seite");
+		}
 	}
 
-	if (NewNode != 0)
+	if (NewNode)
 	{
 		// Find best point to form a triangle
 
@@ -213,7 +239,7 @@
 
 			if (Node->Nr == Node1->Nr || Node->Nr == Node2->Nr)
 			{
-				dump_error(__FILE__, __LINE__, "Einer der gefundenen Knoten ist einer der Kanteknoten");
+				dump_error(__FILE__, __LINE__, "Einer der gefundenen Knoten ist einer der beiden Kantenknoten");
 			}
 
 			if (Node->Nr != NewNode->Nr)
@@ -228,15 +254,22 @@
 					double Dx = cx - X;
 					double Dy = cy - Y;
 
-					if (Dx * Dx + Dy * Dy < cr)
+					if (sqrt(Dx * Dx + Dy * Dy) < sqrt(cr) - 0.01)
 					{
 						NewNode = Node;
 						CircumCircle(Node1, Node2, NewNode, &cx, &cy, &cr);
 					}
-					else if (Dx * Dx + Dy * Dy <= cr)
+					else if (sqrt(Dx * Dx + Dy * Dy) > sqrt(cr) + 0.01)
 					{
-						Edge = FindEdge(TodoEdgeList, Node, Node1);
+						// Do nothing
+					}
+					else
+					{
+						// Die beiden Knoten sind gleich oder wenigstens fast gleich gut
+						// Dann hilft nur eine andere Art der Unterscheidung
 
+						Edge = TodoEdgeList->Find(Node, Node1);
+
 						if (Edge)
 						{
 							NewNode = Node;
@@ -244,7 +277,7 @@
 						}
 						else
 						{
-							Edge = FindEdge(TodoEdgeList, Node2, Node);
+							Edge = TodoEdgeList->Find(Node2, Node);
 
 							if (Edge)
 							{
@@ -253,22 +286,63 @@
 							}
 						}
 					}
-
 				}
+				else
+				{
+					dump_error(__FILE__, __LINE__, "Einer der gefundenen Knoten ist auf der falschen Seite");
+				}
 			}
 			i++;
 		}
 	}
 
-	// Add new triangle or update edge info if s-t is on hull.
 	if (NewNode)
 	{
+		Edge = ReadyEdgeList->FindWithIndex(Node1, NewNode);
+		if (Edge && Edge->IsBoundary)
+		{
+			NewNode = 0;
+		}
+		else
+		{
+			Edge = ReadyEdgeList->FindWithIndex(NewNode, Node2);
+			if (Edge && Edge->IsBoundary)
+			{
+				NewNode = 0;
+			}
+		}
+	}
+
+	if (NewNode)
+	{
+/*
+		TEdge* Edge1 = ReadyEdgeList->FindWithIndex(Node1, Node2);
+		TEdge* Edge2 = ReadyEdgeList->FindWithIndex(Node2, NewNode);
+		TEdge* Edge3 = ReadyEdgeList->FindWithIndex(NewNode, Node1);
+
+		if (Edge1 || Edge2 || Edge3)
+		{
+			write_fortschritt("%d Anzahl fertiger Kanten\n", ReadyEdgeList->Anz);
+			dump_error(__FILE__, __LINE__, "Kante war schon fertig");
+		}
+*/
+
+		ReadyEdgeList->AddWithIndex(Node1, Node2);
+		ReadyEdgeList->AddWithIndex(Node2, NewNode);
+		ReadyEdgeList->AddWithIndex(NewNode, Node1);
+
 		TElement *Element = 0;
 		Element = new TElement(Node1, Node2, NewNode);
 		ElementList->push_back(Element);
 
-		// Richtung: Ist schon fertig
-		Edge = FindEdge(TodoEdgeList, Node2, NewNode);
+
+		////////////////////////////////////
+		// Jetzt eintragen was noch muss
+		////////////////////////////////////
+
+		// Diese Richtung ist jetzt fertig
+		// Falls sie also in der Todo-Liste war -> raus
+		Edge = TodoEdgeList->Find(Node2, NewNode);
 		if (Edge)
 		{
 			// In Todo Gefunden
@@ -277,12 +351,22 @@
 		}
 		else
 		{
-			Edge = new TEdge(NewNode, Node2);
-			TodoEdgeList->Add(Edge);
+			// Wenn diese Richtung nicht in der Todo-Liste war,
+			// so kann die Gegenrichtung noch nicht fertig sein
+			Edge = ReadyEdgeList->FindWithIndex(NewNode, Node2);
+			if (0 == Edge)
+			{
+				Edge = new TEdge(NewNode, Node2);
+				TodoEdgeList->Add(Edge);
+			}
+			else
+			{
+				dump_error(__FILE__, __LINE__, "Eine fertige Kante sollte noch mal eingetragen werden");
+			}
 		}
 
 		// Richtung: Ist schon fertig
-		Edge = FindEdge(TodoEdgeList, NewNode, Node1);
+		Edge = TodoEdgeList->Find(NewNode, Node1);
 		if (Edge)
 		{
 			// In Todo Gefunden
@@ -291,10 +375,24 @@
 		}
 		else
 		{
-			Edge = new TEdge(Node1, NewNode);
-			TodoEdgeList->Add(Edge);
+			Edge = ReadyEdgeList->FindWithIndex(Node1, NewNode);
+			if (0 == Edge)
+			{
+				Edge = new TEdge(Node1, NewNode);
+				TodoEdgeList->Add(Edge);
+			}
+			else
+			{
+				dump_error(__FILE__, __LINE__, "Eine fertige Kante sollte noch mal eingetragen werden");
+			}
 		}
 	}
+	else
+	{
+		// Wenn diese Kante nichts war, so ist die andere Richtung eine Aussenkante
+		Edge = ReadyEdgeList->FindWithIndex(Node2, Node1);
+		if (Edge)	Edge->IsBoundary = true;
+	}
 
 	// Die Kante ist jetzt fertig
 	TodoEdgeList->Erase(AktEdge);
@@ -310,9 +408,14 @@
 		write_error(1234, "Es sind im DGM nur %d Knoten vorhanden.\nEs werden aber mindestens 3 Knoten benötigt\n", NodeList->size());
 	}
 
+	write_fortschritt("Sortiere die Knoten\n");
 	NodeList->SortByXY();
 
+	write_fortschritt("Lösche den Knoten/Kanten-Index\n");
+	NodeList->ClearEdgeIndex();
+
 	TEdgeList *TodoEdgeList = new TEdgeList;
+	TEdgeList *ReadyEdgeList = new TEdgeList;
 
 	TNode *Node1 = 0;
 	TNode *Node2 = 0;
@@ -336,19 +439,20 @@
 	int Anz = 0;
 	while (TodoEdgeList->Anz > 0)
 	{
-		CompleteFacet(NodeList, ElementList, TodoEdgeList);
+		CompleteFacet(NodeList, ElementList, TodoEdgeList, ReadyEdgeList);
 
 
 
 if (Debug)
 {
+/*
 	#include "file.h"
-	if (ElementList->size() % 50000 == 49999)
+	if (ReadyEdgeList->Anz > 618)
 	{
-/*
-		SaveNet("tmp.2dm", NodeList, ElementList);
+		SaveElements("tmp_elements.shp", ElementList, true);
+		SaveNet("tmp.2dm", NodeList, ElementList, true);
+	}
 */
-	}
 }
 
 
@@ -359,13 +463,16 @@
 			ftime (&Now);
 			int NowMSec = Now.time * 1000 + Now.millitm;
 			int DiffMSec = NowMSec - StartMSec;
-			write_fortschritt("%d Kanten bearbeitet\n%d Kanten in der Warteschlange\n%d Elemente erzeugt\n", Anz, TodoEdgeList->Anz, ElementList->size());
+			write_fortschritt("%d von ca. %d Elementen erzeugt\n", ElementList->size(), NodeList->size() * 2);
 			if (Debug) write_fortschritt("%.2f sec -> %.4f sec pro Kante\n", DiffMSec / 1000.0, DiffMSec / 1000.0 / Anz);
 		}
 	}
 
 	delete TodoEdgeList;
 
+	ReadyEdgeList->Empty();
+	delete ReadyEdgeList;
+
 	write_fortschritt("Netz wurde trianguliert<-\n");
 
 	return (true);

Modified: trunk/src/wsplgen.cpp
===================================================================
--- trunk/src/wsplgen.cpp	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/wsplgen.cpp	2006-03-21 00:53:11 UTC (rev 39)
@@ -75,11 +75,17 @@
 	// Hier drin werden die Ergebnis Polygone drin verwaltet
 	TErgebnisPolygonList ErgebnisPolygonList;
 
-/*
-	LoadDGM("test_daten\\dgm_ziemlich_riesig.shp", NodeList, ElementList, 0, 99999999, true);
-	Triangulate (NodeList, ElementList, true);
-	SaveNet("test_daten\\dgm_ziemlich_riesig.2dm", NodeList, ElementList, true);
-*/
+//  Dies dient nur dazu mal kurz ein Netz zu triangulieren
+//	LoadDGM("test_daten\\dgm.shp", &NodeList, &ElementList, 0, 99999999, true);
+//	LoadDGM("test_daten\\dgm.xyz", &NodeList, &ElementList, 0, 99999999, true);
+//	LoadDGM("test_daten\\dgm.grd", &NodeList, &ElementList, 0, 99999999, true);
+//	LoadDGM("test_daten\\testdgm.shp", &NodeList, &ElementList, 0, 99999999, true);
+//	LoadDGM("test_daten\\testdgm2.shp", &NodeList, &ElementList, 0, 99999999, true);
+//	LoadDGM("test_daten\\dgm_riesig.shp", &NodeList, &ElementList, 0, 99999999, true);
+//	SaveNodes("tmp_ori_nodes.shp", &NodeList, true);
+//	Triangulate (&NodeList, &ElementList, true);
+//	SaveElements("tmp_elements.shp", &ElementList, true);
+//	return(0);
 
 	try
 	{
@@ -96,6 +102,8 @@
 			write_error(3204, "Es liegen nur %d Querprofilspuren vor\nEs werden aber mindestens 2 Querprofilspuren benötigt.", ProfilList.size());
 		}
 
+if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_ORIGINAL.shp", &ProfilList, Parameter.IsDebug);
+
 		// Jetzt die Waserstände einlesen und
 		// anschliessend gleich auf die Profile interpolieren
 		// Dabei wird die Stationierung von km in cm umgerechnet
@@ -106,12 +114,14 @@
 		delete WspProfilList;
 		WspProfilList = 0;
 
+if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_ORIGINAL_mit_WSP.shp", &ProfilList, Parameter.IsDebug);
+
 		// Jetzt die Gewässerachse einlesen, wenn es notwendig ist
 		if (Parameter.Sperre)
 		{
 			LoadAchse(Parameter.FileNameAchse, &GewaesserAchseList);
 		}
-		else if (false == Parameter.Sperre)
+		else if (false == Parameter.Sperre && true == Parameter.IsSetAchse)
 		{
 			write_warning(1123, "Parameter -ACHSE wird ignoriert, da der Parameter -SPERRE den Wert NOSPERRE hat\n");
 		}
@@ -137,7 +147,7 @@
 		// geteilt durch (10000 / KFlops).
 
 		write_fortschritt("->Ermitteln der maximalen DGM-Knotenanzahl\n");
-		int MaxNodesPerSlice = (MaxMem / 2) / (8 * 4 * 4) / (10000 / KFlops);
+		int MaxNodesPerSlice = (MaxMem / 6) / (8 * 4 * 4) / (10000 / KFlops);
 		write_fortschritt("Es können nur ca. %d DGM-Punkte eingelesen werden\n", MaxNodesPerSlice);
 		write_fortschritt("Ermitteln der maximalen DGM-Knotenanzahl beendet<-\n");
 
@@ -163,23 +173,25 @@
 			}
 
 			// Mal wieder Zwischenergebnisse produzieren
-if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_100_" + Gewaesser + ".shp", GewProfilList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveProfile("test_daten\\" + Gewaesser + "_Profile_100" + ".shp", GewProfilList, Parameter.IsDebug);
 
 			// Jetzt ein Polygon bilden, das die Profile begrenzt
 			BuildPolygon(GewProfilList, &Bereichspolygon, Parameter.IsDebug);
 
-if (Parameter.IsDebug) SavePolygon("test_daten\\Polygon_" + Gewaesser + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
+if (Parameter.IsDebug) SavePolygon("test_daten\\" + Gewaesser + "_Polygon" + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
 
 			unsigned int AnzScheiben = LoadDGM(Parameter.FileNameDgm, &NodeList, &ElementList, &Bereichspolygon, MaxNodesPerSlice, Parameter.IsDebug);
 
 			// Wenn LoadDGM eine Scheibenanzahl von mehr als 1 ergeben hat, ist das DGM nicht geladen,
 			// es muss jetzt mit Scheiben gearbeitet werden.
-			if (GewProfilList->size() < AnzScheiben + 1)
+			if (GewProfilList->size() - 1 < AnzScheiben)
 			{
-				write_warning(3103, "Die Anzahl der gewünschten Bearbeitungsscheiben ist kleiner als die Anzahl der Profile");
+				write_warning(3103, "Die  Anzahl der gewünschten Bearbeitungsabschnitte (%d) ist größer als die Anzahl der Profile minus 1 (%d).\n", AnzScheiben, GewProfilList->size() - 1);
 				AnzScheiben = GewProfilList->size() - 1;
 			}
 
+			write_fortschritt("Das Gewässer '%s' wird in %d Bearbeitungsabschnitte aufgeteilt\n", Gewaesser.c_str(), AnzScheiben);
+
 			TBereichsList BereichsList(GewProfilList, AnzScheiben);
 
 			for (TBereichsList::iterator i=BereichsList.begin(); i != BereichsList.end(); i++)
@@ -190,11 +202,11 @@
 				TProfil *VonProfil = *Von;
 				TProfil *BisProfil = *Bis;
 
-char VC[100];
-char NC[100];
+				char VC[100];
+				char NC[100];
 
-sprintf (VC, "_Von%d", VonProfil->Station);
-sprintf (NC, "_Bis%d", BisProfil->Station);
+				sprintf (VC, "_Von%d", VonProfil->Station);
+				sprintf (NC, "_Bis%d", BisProfil->Station);
 
 				write_fortschritt("->Bei Gewaesser %s wird der Bereich von %.4f bis %.4f bearbeitet\n", Gewaesser.c_str(), VonProfil->Station / 10000.0, BisProfil->Station / 10000.0);
 
@@ -213,7 +225,7 @@
 					// Jetzt das Polygon bilden, das die Profile begrenzen
 					BuildPolygon(TempProfilList, &Bereichspolygon, Parameter.IsDebug);
 
-if (Parameter.IsDebug) SavePolygon("test_daten\\Polygon_" + Gewaesser + VC + NC + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
+if (Parameter.IsDebug) SavePolygon("test_daten\\" + Gewaesser + "_Polygon_" + VC + NC + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
 
 					LoadDGM(Parameter.FileNameDgm, &NodeList, &ElementList, &Bereichspolygon, 99999999, Parameter.IsDebug);
 
@@ -228,9 +240,9 @@
 
 				NodeList.SortByNr();
 
-if (Parameter.IsDebug) SaveNet("test_daten\\Net_" + Gewaesser + VC + NC + ".2dm", &NodeList, &ElementList, true);
-if (Parameter.IsDebug) SaveNodes("test_daten\\Nodes_" + Gewaesser + VC + NC + ".shp", &NodeList, true);
-if (Parameter.IsDebug) SaveElements("test_daten\\Elements_" + Gewaesser + VC + NC + ".shp", &ElementList, true);
+if (Parameter.IsDebug) SaveNet("test_daten\\" + Gewaesser + "_Net_" + VC + NC + ".2dm", &NodeList, &ElementList, true);
+if (Parameter.IsDebug) SaveNodes("test_daten\\" + Gewaesser + "_Nodes_" + VC + NC + ".shp", &NodeList, true);
+if (Parameter.IsDebug) SaveElements("test_daten\\" + Gewaesser + "_Elements_" + VC + NC + ".shp", &ElementList, true);
 
 				// Aus den Elementen werden nun die Kanten gebildet
 				// Hier ist noch Optimierungspotential
@@ -247,7 +259,7 @@
 				// Die Elemete werden nun nicht mehr gebraucht
 				ElementList.Clear();
 
-if (Parameter.IsDebug) SaveEdges("test_daten\\Edges_" + Gewaesser + VC + NC + ".shp", EdgeList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveEdges("test_daten\\" + Gewaesser + "_Edges_" + VC + NC + ".shp", EdgeList, Parameter.IsDebug);
 
 				// Nachdem die durchschnittliche Kantenlänge bekannt ist,
 				// wird sie für die spätere Verwendung zwischengespeichert
@@ -262,26 +274,60 @@
 				GewProfilList->InterpoliereProfile(AvgDistance * 10);
 
 				// Mal wieder Zwischenergebnisse produzieren
-if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_all_" + Gewaesser + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveProfile("test_daten\\" + Gewaesser + "_Profile_all_" + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
 
 				// Jetzt die Stützstellen auffüllen
 				GewProfilList->FillProfile(AvgDistance, Parameter.IsDebug);
 
 				// Mal wieder Zwischenergebnisse produzieren
-if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_fill_" + Gewaesser + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveProfile("test_daten\\" + Gewaesser + "_Profile_fill_" + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
 
 				// Jetzt eine neue Knotenliste aus den Profilen generienen
 				BuildProfilNodeList(GewProfilList, &NodeList, &GewaesserAchseList, &ProfilNodeList, AvgDistance, Parameter.Sperre, Parameter.IsDebug);
 
-if (Parameter.IsDebug) SaveNodes("test_daten\\ProfilNodes_" + Gewaesser + VC + NC + ".shp", &ProfilNodeList, true);
+if (Parameter.IsDebug) SaveNodes("test_daten\\" + Gewaesser + "_ProfilNodes_" + VC + NC + ".shp", &ProfilNodeList, true);
 
 				// Jetzt die Wasserstände übertragen
 				TransferWsp(&ProfilNodeList, &NodeList, AvgDistance, Parameter.IsDebug);
 
 				ProfilNodeList.Clear();
 
-if (Parameter.IsDebug) SaveNodes("test_daten\\Nodes_mitWSP_" + Gewaesser + VC + NC + ".shp", &NodeList, true);
+if (Parameter.IsDebug) SaveNodes("test_daten\\" + Gewaesser + "_Nodes_mitWSP_" + VC + NC + ".shp", &NodeList, true);
 
+				// Wurde der Wert für das Argument 'Bis' beim Parameter -DELTA nicht gesetzt
+				// so ist jetzt die Zeit das nachzuholen
+				if (false == Parameter.IsSetBis)
+				{
+					Parameter.Bis = NodeList.GetMaxDepth(Parameter.IsDebug);
+				}
+
+				// Nachdem nun 'Bis' sicher gesetzt ist, kann nun auch Diff bestimmt werden,
+				// wenn es nicht schon bestimmt wurde
+				if (false == Parameter.IsSetDiff)
+				{
+					Parameter.Diff = (int)((Parameter.Bis - Parameter.Von) / 10.0 * 100.0 + 0.5) / 100.0;
+				}
+
+				if (Parameter.Von > Parameter.Bis)
+				{
+					write_error(1210, "Das Argument <Von> (%.2f) ist größer als das Argument <Bis> (%.2f).\nGeben sie bitte sowohl den Parameter <Von> als auch den Parameter <Bis> sinnvoll an.\n", Parameter.Von, Parameter.Bis);
+				}
+
+				if (Parameter.Diff <= 0.0)
+				{
+					if (Parameter.Bis - Parameter.Von > 0.0001)
+					{
+						write_error(1212, "Das Argument <Diff> darf nur dann Null sein, wenn <Von> (%.2f) und <Bis> (%.2f) gleich sind.\n", Parameter.Von, Parameter.Bis);
+					}
+					else
+					{
+						// Wenn 'Von' == 'Bis' ist
+						// wird Diff auf 1 gesetzt
+						// Der Wert spielt keine Rolle, nur größer als Null sollte er sein.
+						Parameter.Diff = 1.0;
+					}
+				}
+
 				// Den alten Knoten Kanten Index löschen
 				NodeList.ClearEdgeIndex();
 
@@ -300,13 +346,30 @@
 					ErgebnisPolygon->BisKm = BisProfil->Station / 10000.0;
 				}
 
+/*
+if (Parameter.IsDebug) SavePolygone(Parameter.FileNameAusgabe, &TempErgebnisPolygone, Parameter.IsDebug);
+*/
+
 				ErgebnisPolygonList.Append(TempErgebnisPolygone);
 
+				if (Parameter.IsDebug)
+				{
+					for (TErgebnisPolygonList::iterator i = ErgebnisPolygonList.begin(); i != ErgebnisPolygonList.end(); i++)
+					{
+						TErgebnisPolygon* ErgebnisPolygon = *i;
+
+						std::string AktGewaesser = ErgebnisPolygon->Gewaesser;
+						double AktVonKm = ErgebnisPolygon->VonKm;
+						double AktBisKm = ErgebnisPolygon->BisKm;
+						double AktDiff = ErgebnisPolygon->Diff;
+
+						write_fortschritt("Gewässer %s %.4f - %.4f Wassertiefe %.2f\n", AktGewaesser.c_str(), AktVonKm, AktBisKm, AktDiff);
+					}
+				}
+
 				TempErgebnisPolygone->clear();
 				delete TempErgebnisPolygone;
 
-if (Parameter.IsDebug) SavePolygone(Parameter.FileNameAusgabe, &ErgebnisPolygonList, Parameter.IsDebug);
-
 				// Löscht nur die Verwaltung und nicht die Knoten der Kanten,
 				// die Knoten waren nur geliehen
 				EdgeList->Empty();
@@ -315,7 +378,7 @@
 			}
 		}
 
-		// Speichern der Ergenispolygone
+		// Speichern der Ergebnispolygone
 		SavePolygone(Parameter.FileNameAusgabe, &ErgebnisPolygonList, Parameter.IsDebug);
 
 		for (TProfilMap::iterator i = ProfilMap.begin(); i != ProfilMap.end(); i++)
@@ -334,7 +397,7 @@
 	}
 	catch (TFehler fehler)
 	{
-		printf ("Unbekannter Fehler wurde korrekt abgefangen\n");
+		printf ("Bekannter Fehler wurde korrekt abgefangen\n");
 		printf ("Programmabbruch\n");
 	}
 	catch (...)

Modified: trunk/src/xy.cpp
===================================================================
--- trunk/src/xy.cpp	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/xy.cpp	2006-03-21 00:53:11 UTC (rev 39)
@@ -957,6 +957,42 @@
 }
 
 //---------------------------------------------------------------------
+double TNodeList::GetMaxDepth(bool Debug)
+{
+	write_fortschritt("->Maximale Wassertiefe wird ermittelt\n");
+
+	double MaxDepth = 0.0;
+	int Count = 0;
+	for (iterator i = begin(); i != end(); i++)
+	{
+		if (Debug && Count % 10000 == 0)			write_fortschritt("Knoten %d von %d wird untersucht.\n", Count, size());
+		else if (Count > 0 && Count % 100000 == 0)	write_fortschritt("Knoten %d von %d wird untersucht.\n", Count, size());
+
+		TNode* Node = *i;
+
+		if (Node->Wsp < -9999)	continue;
+
+		double Depth = Node->Wsp - Node->Z;
+
+		if (Depth < 0.0)
+		{
+			dump_error(__FILE__, __LINE__, "Der Wasserstand ist negative");
+		}
+
+		if (Count == 0 || Depth > MaxDepth)	MaxDepth = Depth;
+
+		Count++;
+	}
+	write_fortschritt("Knoten %d von %d wird untersucht.\n", Count, size());
+
+	write_fortschritt("Maximale Wassertiefe: %.3f.\n", MaxDepth);
+
+	write_fortschritt("Maximale Wassertiefe ermittelt<-\n");
+
+	return (MaxDepth);
+}
+
+//---------------------------------------------------------------------
 // TElementList
 //---------------------------------------------------------------------
 
@@ -1211,20 +1247,18 @@
 {
 	if (Anz == 0) return(0);
 
-//	if (EdgeListNrSorted.size() == 0)
 	if (EdgeListDistanceSorted.size() == 0)
 	{
 		dump_error(__FILE__, __LINE__, "Da ist nichts mehr drin");
 	}
 
-//	TEdgeListNrSorted::iterator It = EdgeListNrSorted.begin();
+	TEdge *Edge = 0;
 	TEdgeListDistanceSorted::iterator It = EdgeListDistanceSorted.begin();
-
-	TEdge *Edge = 0;
-//	if (It != EdgeListNrSorted.end())	Edge = *It;
-	if (It != EdgeListDistanceSorted.end())	Edge = *It;
-
-	if (Edge == 0) dump_error(__FILE__, __LINE__, "Erste Kante ist 0");
+	while (It != EdgeListDistanceSorted.end())
+	{
+		Edge = *It++;
+		if (false == Edge->IsBoundary)	break;
+	}
 	return (Edge);
 }
 
@@ -1256,6 +1290,20 @@
 }
 
 //---------------------------------------------------------------------
+TEdge* TEdgeList::AddWithIndex(TNode *Node1, TNode *Node2)
+{
+	TEdge *NewEdge = new TEdge(Node1, Node2);
+
+	Add(NewEdge);
+
+	Node1->EdgeIndex = new TEdgeIndex (Node1->EdgeIndex, NewEdge);
+
+	Node2->EdgeIndex = new TEdgeIndex (Node2->EdgeIndex, NewEdge);
+
+	return (NewEdge);
+}
+
+//---------------------------------------------------------------------
 void TEdgeList::Erase(TEdge *edge)
 {
 	if (Anz == 0)
@@ -1324,18 +1372,50 @@
 {
 	if (Anz == 0)	return(0);
 
+	// SearchNode1 und SearchNode2 sind Elemente von SearchNode
 	SearchNode1->Nr = NodeNr1;
 	SearchNode2->Nr = NodeNr2;
 
-	TEdgeListNrSorted::iterator NrIt = EdgeListNrSorted.find(SearchEdge);
+	return (Find(SearchEdge));
+}
 
-	TEdge *Edge = 0;
-	if (NrIt != EdgeListNrSorted.end())	Edge = *NrIt;
+//---------------------------------------------------------------------
+TEdge* TEdgeList::Find(TNode *Node1, TNode *Node2)
+{
+	if (Anz == 0)	return(0);
+
+	// SearchNode1 und SearchNode2 sind Elemente von SearchNode
+	SearchNode1->Nr = Node1->Nr;
+	SearchNode2->Nr = Node2->Nr;
 
-	return (Edge);
-}
+	return (Find(SearchEdge));
+}
 
 //---------------------------------------------------------------------
+TEdge* TEdgeList::FindWithIndex(TNode *Node1, TNode *Node2)
+{
+	if (Anz == 0)	return(0);
+
+	TEdgeIndex *AktEdgeIndex = Node1->EdgeIndex;
+
+	while (AktEdgeIndex)
+	{
+		TEdgeIndex *NextEdgeIndex = AktEdgeIndex->NextEdgeIndex;
+
+		TEdge *Edge = AktEdgeIndex->Edge;
+
+		if (Edge->Node1 == Node1 && Edge->Node2 == Node2)
+		{
+			return (Edge);
+		}
+
+		AktEdgeIndex = NextEdgeIndex;
+	}
+
+	return (0);
+}
+
+//---------------------------------------------------------------------
 void TEdgeList::BuildEdgeIndex(void)
 {
 	for (TEdgeListNrSorted::const_iterator i=EdgeListNrSorted.begin(); i != EdgeListNrSorted.end(); i++)
@@ -1836,6 +1916,10 @@
 }
 
 //---------------------------------------------------------------------
+// TBereichsList
+//---------------------------------------------------------------------
+
+//---------------------------------------------------------------------
 TBereichsList::TBereichsList(TProfilList* ProfilList, int AnzBereiche)
 {
 	// An dieser Stelle wird bereits davon ausgegangen das es mindestens 2 Querprofilspuren gibt und

Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h	2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/xy.h	2006-03-21 00:53:11 UTC (rev 39)
@@ -450,8 +450,9 @@
 		TNode*			FindByXY(double X, double Y, double Eps = 0.01);
 		void			FindAllByXY(TNodeList *NodeList, double X, double Y, double Eps = 0.01);
 		TNode*			FindByNr(int Nr);
-		bool			Interpolate(double X, double Y, double R, double *Z, double *Wsp); 
+		bool			Interpolate(double X, double Y, double R, double *Z, double *Wsp);
 		void			ClearEdgeIndex(void);
+		double			GetMaxDepth(bool Debug);
 };
 
 //----------------------------------------------------------------------------
@@ -523,8 +524,11 @@
 		TEdge* 						First(void);
 		void 						Add(TEdge *Edge);
 		TEdge* 						Add(TNode* Node1, TNode* Node2);
+		TEdge* 						AddWithIndex(TNode *Node1, TNode *Node2);
 		TEdge* 						Find(TEdge *Edge);
 		TEdge* 						Find(int NodeNr1, int NodeNr2);
+		TEdge* 						Find(TNode *Node1, TNode *Node2);
+		TEdge* 						FindWithIndex(TNode *Node1, TNode *Node2);
 		void 						Erase(TEdge *Edge);
 
 		void 						BuildDistanceSortedList(void);
@@ -601,6 +605,7 @@
 		TProfil* 	Find(std::string Gewaesser, int Station);
 		void		InterpoliereProfile(double SollAbstand);
 		void		FillProfile(double SollAbstand, bool Debug);
+		double		GetMaxWsp(bool Debug);
 };
 
 typedef std::map<std::string, TProfilList *> TProfilMap;



More information about the Wsplgen-commits mailing list