[Wsplgen-commits] r41 - trunk/src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Fri Mar 31 07:43:16 CEST 2006


Author: mrchip
Date: 2006-03-31 07:43:15 +0200 (Fri, 31 Mar 2006)
New Revision: 41

Modified:
   trunk/src/file.cpp
   trunk/src/parameter.cpp
   trunk/src/shape.cpp
   trunk/src/test.cpp
   trunk/src/tools.cpp
   trunk/src/tools.h
   trunk/src/wsplgen.cpp
   trunk/src/xy.cpp
   trunk/src/xy.h
Log:
Sperren und Br?\195?\188che verbessert und kleine Fehler gefunden

Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/file.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -59,6 +59,9 @@
 {
 	write_fortschritt("->DGM laden\n");
 
+	if (NodeList == 0)		dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
+	if (ElementList == 0)	dump_error(__FILE__, __LINE__, "Die Elementliste ist nicht definiert\n");
+
 	NodeList->Clear();
 	ElementList->Clear();
 
@@ -105,9 +108,6 @@
 {
 	write_fortschritt("->DGM TIN laden\n");
 
-	if (NodeList == 0)		dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
-	if (ElementList == 0)	dump_error(__FILE__, __LINE__, "Die Elementliste ist nicht definiert\n");
-
 	std::string XyFileName = GetFilePath(FileName) + "tnxy.adf";
 	std::string ZFileName = GetFilePath(FileName) + "tnz.adf";
 	std::string OdFileName = GetFilePath(FileName) + "tnod.adf";
@@ -242,8 +242,6 @@
 {
 	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)
 	{
@@ -464,8 +462,6 @@
 {
 	write_fortschritt("->DGM XYZ 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)
 	{
@@ -544,8 +540,6 @@
 {
 	write_fortschritt("->DGM SHP laden\n");
 
-	if (NodeList == 0)		dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
-
 	std::string SHPFileName = ExchangeFileExt(FileName, ".SHP");
 	SHPHandle hSHP = SHPOpen(SHPFileName.c_str(), "rb");
 
@@ -699,7 +693,7 @@
 
 			AnzWerte++;
 
-			if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzWerte % 10000 == 0) || (AnzWerte > 0 && AnzWerte % 100000 == 0))
+			if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzWerte % 10000 == 0) || (AnzWerte > 0 && AnzWerte % 100000 == 0))
 			{
 				write_fortschritt("%d von %d Objekten gelesen, %d von %d Knoten im Speicher\n", AnzWerte, RecordCount, NodeList->size(), AnzKnoten);
 			}
@@ -736,8 +730,6 @@
 {
 	write_fortschritt("->DGM 2DM 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)
 	{
@@ -765,7 +757,7 @@
 	{
 		AnzZeilen++;
 
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
 		{
 			write_fortschritt("%d Zeilen gelesen %d Knoten geladen %d Elemente gezählt\n", AnzZeilen, NodeList->size(), AnzElemente);
 		}
@@ -817,7 +809,7 @@
 		{
 			AnzZeilen++;
 
-			if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
+			if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
 			{
 				write_fortschritt("%d Zeilen gelesen %d Knoten geladen %d Elemente geladen\n", AnzZeilen, NodeList->size(), ElementList->size());
 			}
@@ -1058,7 +1050,7 @@
 
 	for (int i = 0; i<RecordCount; i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && ProfilList->size() % 10 == 0) || (ProfilList->size() > 0 && ProfilList->size() % 100 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && ProfilList->size() % 10 == 0) || (ProfilList->size() > 0 && ProfilList->size() % 100 == 0))
 		{
 			write_fortschritt("%d von %d Profilspuren geladen\n", ProfilList->size(), RecordCount);
 		}
@@ -1114,11 +1106,12 @@
 	TProfil* VorProfil = 0;
 	TProfil* NachProfil = 0;
 	int Count = 0;
+	int SwitchCount = 0;
 	for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && Count % 10 == 0) || (Count > 0 && Count % 100 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 10 == 0) || (Count > 0 && Count % 100 == 0))
 		{
-			write_fortschritt("%d von %d Profilspuren ausgerichtet\n", Count, ProfilList->size());
+			write_fortschritt("%d von %d Profilspuren ausgerichtet, %d gedreht\n", Count, ProfilList->size(), SwitchCount);
 		}
 
 		VorProfil = NachProfil;
@@ -1152,7 +1145,7 @@
 			// Hier ist ein echter Schnittpunkt gefunden
 			// Jetzt muss das NachProfil in seiner Reihenfolge vertauscht werden
 
-			Count++;
+			SwitchCount++;
 
 			TProfil* ExChangeProfil = new TProfil(NachProfil->Gewaesser, NachProfil->Station);
 			for (TPointList::reverse_iterator j = NachProfil->PointList->rbegin(); j != NachProfil->PointList->rend(); j++)
@@ -1168,8 +1161,12 @@
 			i = ProfilList->begin();
 			VorProfil = 0;
 			NachProfil = 0;
+			Count = 0;
 		}
+
+		Count++;
 	}
+	write_fortschritt("%d von %d Profilspuren ausgerichtet, %d gedreht\n", Count, ProfilList->size(), SwitchCount);
 
 	write_fortschritt("%d von %d Profilspuren ausgerichtet\n", Count, ProfilList->size());
 
@@ -1301,9 +1298,9 @@
 
 	for (int i = 0; i<RecordCount; i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && i % 10 == 0) || (i > 0 && i % 100 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && i % 10 == 0) || (i > 0 && i % 100 == 0))
 		{
-			write_fortschritt("%d von %d Liniensstrukturen geladen, %d Brüche und %d Sperren im Speicher\n", i, RecordCount, BruchList, SperrenList);
+			write_fortschritt("%d von %d Liniensstrukturen geladen, %d Brüche und %d Sperren im Speicher\n", i, RecordCount, BruchList->size(), SperrenList->size());
 		}
 
 		std::string Typ = DBFReadStringAttribute(hDBF, i, TypFieldIndex);
@@ -1318,7 +1315,7 @@
 		}
 		else
 		{
-			write_warning(3112, "Das Attribut 'TYP' (%s) in der Datei '%s' darf nur die Werte 'SPERRE' oder 'BRUCH' haben.\nDas Linienobjekt wird ignoriert.\n", DBFFileName.c_str());
+			write_warning(3112, "Das Attribut 'TYP' (%s) in der Datei '%s' darf nur die Werte 'SPERRE' oder 'BRUCH' haben.\nDas Linienobjekt wird ignoriert.\n", Typ.c_str(), DBFFileName.c_str());
 			continue;
 		}
 
@@ -1351,7 +1348,7 @@
 
 		SHPDestroyObject(psCShape);
 	}
-	write_fortschritt("%d von %d Liniensstrukturen geladen, %d Brüche und %d Sperren im Speicher\n", RecordCount, RecordCount, BruchList, SperrenList);
+	write_fortschritt("%d von %d Liniensstrukturen geladen, %d Brüche und %d Sperren im Speicher\n", RecordCount, RecordCount, BruchList->size(), SperrenList->size());
 
 	DBFClose(hDBF);
 	SHPClose(hSHP);
@@ -1411,7 +1408,7 @@
 	{
 		AktZeile++;
 
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AktZeile % 10 == 0) || (AktZeile > 0 && AktZeile % 100 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AktZeile % 10 == 0) || (AktZeile > 0 && AktZeile % 100 == 0))
 		{
 			write_fortschritt("%d Zeilen und %d Wasserstände geladen\n", AktZeile, ProfilList->size());
 		}
@@ -1690,7 +1687,7 @@
 
 	for (int i = 0; i<RecordCount; i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && i % 10 == 0) || (i > 0 && i % 100 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && i % 10 == 0) || (i > 0 && i % 100 == 0))
 		{
 			write_fortschritt("%d von %d Objekten gelesen, %d Wasserstände im Speicher\n", i, RecordCount, ProfilList->size());
 		}
@@ -1850,7 +1847,7 @@
 
 	for (int i = 0; i<RecordCount; i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && i % 10 == 0) || (i > 0 && i % 100 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && i % 10 == 0) || (i > 0 && i % 100 == 0))
 		{
 			write_fortschritt("%d von %d Objekten gelesen, %d Gewässerachsen im Speicher\n", i, RecordCount, GewaesserAchseList->size());
 		}
@@ -1913,7 +1910,7 @@
 
 	for (unsigned int i=0; i<ElementList->size(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && i % 5000 == 0) || (i > 0 && i % 50000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && i % 5000 == 0) || (i > 0 && i % 50000 == 0))
 		{
 			write_fortschritt("%d von %d Elementen gespeichert\n", i, ElementList->size());
 		}
@@ -1940,7 +1937,7 @@
 
 	for (unsigned int i=0; i<NodeList->size(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && i % 5000 == 0) || (i > 0 && i % 50000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && i % 5000 == 0) || (i > 0 && i % 50000 == 0))
 		{
 			write_fortschritt("%d von %d Knoten gespeichert\n", i, NodeList->size());
 		}
@@ -2076,7 +2073,7 @@
 
 		AnzProfil++;
 
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzProfil % 100 == 0) || (AnzProfil > 0 && AnzProfil % 1000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzProfil % 100 == 0) || (AnzProfil > 0 && AnzProfil % 1000 == 0))
 		{
 			write_fortschritt("%d von %d Profile gespeichert\n", AnzProfil, ProfilList->size());
 		}
@@ -2130,9 +2127,9 @@
 	int AnzPoint = 0;
 	for (TXYList::iterator i = XyList->begin(); i != XyList->end(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzPoint % 1000 == 0) || (AnzPoint > 0 && AnzPoint % 10000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzPoint % 1000 == 0) || (AnzPoint > 0 && AnzPoint % 10000 == 0))
 		{
-			write_fortschritt("%d von %d Stützstellen gespeichert\n", AnzPoint, XyList->size());
+			write_fortschritt("%d von %d Stützstellen gespeichert\n", AnzPoint, XyList->size()+1);
 		}
 
 		TXY* Xy = *i;
@@ -2174,7 +2171,7 @@
 	DBFClose(DBFHandle);
 	SHPClose(SHPHandle);
 
-	write_fortschritt("%d von %d Stützstellen gespeichert\n", AnzPoint, XyList->size());
+	write_fortschritt("%d von %d Stützstellen gespeichert\n", AnzPoint, XyList->size()+1);
 
 	write_fortschritt("Polygon gespeichert<-\n");
 
@@ -2238,7 +2235,7 @@
 	TErgebnisPolygonList::iterator i = ErgebnisPolygonList->begin();
 	while (i != ErgebnisPolygonList->end())
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzPolygons % 100 == 0) || (AnzPolygons > 0 && AnzPolygons % 1000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzPolygons % 100 == 0) || (AnzPolygons > 0 && AnzPolygons % 1000 == 0))
 		{
 			write_fortschritt("%d von %d Polygonen gespeichert\n", AnzPolygons, ErgebnisPolygonList->size());
 		}
@@ -2483,7 +2480,7 @@
 
 		AnzPolygone++;
 	}
-	else
+	else if (Element->Typ == QUAD)
 	{
 		TNode *Node1 = Element->Node1;
 		TNode *Node2 = Element->Node2;
@@ -2538,7 +2535,7 @@
 	int AnzPolygone = 0;
 	for (TElementList::iterator i=ElementList->begin(); i != ElementList->end(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzPolygone % 100 == 0) || (AnzPolygone > 0 && AnzPolygone % 1000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzPolygone % 100 == 0) || (AnzPolygone > 0 && AnzPolygone % 1000 == 0))
 		{
 			write_fortschritt("%d von %d Elementen (Polygone) gespeichert\n", AnzPolygone, ElementList->size());
 		}
@@ -2591,7 +2588,7 @@
 	int AnzNodes = 0;
 	for (TNodeList::iterator i=NodeList->begin(); i != NodeList->end(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && AnzNodes % 100 == 0) || (AnzNodes > 0 && AnzNodes % 1000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzNodes % 100 == 0) || (AnzNodes > 0 && AnzNodes % 1000 == 0))
 		{
 			write_fortschritt("%d von %d Knoten gespeichert\n", AnzNodes, NodeList->size());
 		}
@@ -2658,7 +2655,7 @@
 	int Count = 0;
 	for (TEdgeListNrSorted::iterator i = EdgeList->EdgeListNrSorted.begin(); i != EdgeList->EdgeListNrSorted.end(); i++)
 	{
-		if (DebugLevel >= 9 && (DebugLevel >= 1 && Count % 100 == 0) || (Count > 0 && Count % 1000 == 0))
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 1000 == 0) || (Count > 0 && Count % 10000 == 0))
 		{
 			write_fortschritt("%d von %d Kanten gespeichert\n", Count, EdgeList->EdgeListNrSorted.size());
 		}

Modified: trunk/src/parameter.cpp
===================================================================
--- trunk/src/parameter.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/parameter.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -393,6 +393,11 @@
 
 			if (IsSetDebug) write_fortschritt("Ausgabe-Datei: '%s'\n", FileNameAusgabe.c_str());
 		}
+		else if (Parameter.substr(0, 1) == "$")
+		{
+			// Geheimer Parameter zum Umleiten der Ausgaben
+			// Siehe WSPLGEN - main am Anfang !!!!
+		}
 		else
 		{
 			write_warning(1124, "Eine unbekannte Zeichenkette %s' wurde als Parameter übergeben.\nDie Zeichenkette wird ignoriert.\n", Parameter.c_str());

Modified: trunk/src/shape.cpp
===================================================================
--- trunk/src/shape.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/shape.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -7,7 +7,7 @@
 #include <stdio.h>
 #include <math.h>
 
-#include "Shape.h"
+#include "shape.h"
 
 typedef unsigned char uchar;
 

Modified: trunk/src/test.cpp
===================================================================
--- trunk/src/test.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/test.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -11,16 +11,22 @@
 //
 
 //---------------------------------------------------------------------------
-#include <iostream>
+//#include <iostream>
 #include <stdio.h>
 #include "tools.h"
 #include "test.h"
 
 int ReturnCode = 0;
 
+FILE *fhlog = 0;
+FILE *fhsta = 0;
+
 //---------------------------------------------------------------------
 int main(unsigned int argc, char **argv)
 {
+	fhlog = stdout;
+	fhsta = stderr;
+
 	int	Test = (1<<1) + (1<<2) + (1<<3) + (1<<4) + (1<<5);
 
 	if (argc > 1)

Modified: trunk/src/tools.cpp
===================================================================
--- trunk/src/tools.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/tools.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -24,6 +24,8 @@
 
 //---------------------------------------------------------------------------
 extern int ReturnCode;
+extern FILE *fhlog;
+extern FILE *fhsta;
 
 //---------------------------------------------------------------------------
 //
@@ -33,7 +35,7 @@
 //---------------------------------------------------------------------------
 void	dump_error(char *file, int line, char *format, ...)
 {
-	fprintf(stderr, "->Kritischer Fehler (9298)\n");
+	fprintf(fhsta, "->Kritischer Fehler (9298)\n");
 
 	char *p = file;
 
@@ -44,17 +46,19 @@
 		if (*p == '\\' || *p == '/') p++;
 	}
 
-	fprintf(stderr, "Datei: %s\n", p);
-	fprintf(stderr, "Zeile: %d\n", line);
+	fprintf(fhsta, "Datei: %s\n", p);
+	fprintf(fhsta, "Zeile: %d\n", line);
 
 	va_list argptr;
 
 	va_start(argptr, format);
-	vfprintf(stderr, format, argptr);
+	vfprintf(fhsta, format, argptr);
 	va_end(argptr);
 
-	fprintf(stderr, "Kritischer Fehler (9298)<-\n");
+	fprintf(fhsta, "Kritischer Fehler (9298)<-\n");
 
+	fflush(fhsta);
+
 	// Hier sollte das Programm eigentlich nie hinkommen,
 	// deshalb wird hier auch kein 'sinnvoller' Rückgabewert definiert
 	ReturnCode = 9298;
@@ -69,20 +73,22 @@
 //---------------------------------------------------------------------------
 void	write_error(int ErrorNr, char *format, ...)
 {
-	fprintf(stderr, "->Fehler (%d)\n", ErrorNr);
+	fprintf(fhsta, "->Fehler (%d)\n", ErrorNr);
 
 	va_list argptr;
 
 	va_start(argptr, format);
-	vfprintf(stderr, format, argptr);
+	vfprintf(fhsta, format, argptr);
 	va_end(argptr);
 
 	// Fehler sind wichtiger als Warningen,
 	// deshalb wird der Wert hier immer überschrieben
 	ReturnCode = ErrorNr;
 
-	fprintf(stderr, "Fehler (%d)<-\n", ErrorNr);
+	fprintf(fhsta, "Fehler (%d)<-\n", ErrorNr);
 
+	fflush(fhsta);
+
 	throw TFehler("Fehler");
 }
 
@@ -94,29 +100,43 @@
 //---------------------------------------------------------------------------
 void	write_warning(int WarningNr, char *format, ...)
 {
-	fprintf(stderr, "->Warnung (%d)\n", WarningNr);
+	fprintf(fhsta, "->Warnung (%d)\n", WarningNr);
 
 	va_list argptr;
 
 	va_start(argptr, format);
-	vfprintf(stderr, format, argptr);
+	vfprintf(fhsta, format, argptr);
 	va_end(argptr);
 
 	// Es wird immer die Nummer der ersten Warnung zurückgegeben.
 	// Ausser es kommt noch eine Fehler. Der hat Vorrang !
 	if (ReturnCode == 0) ReturnCode = WarningNr;
 
-	fprintf(stderr, "Warnung (%d)<-\n", WarningNr);
+	fprintf(fhsta, "Warnung (%d)<-\n", WarningNr);
+
+	fflush(fhsta);
 }
 
 //---------------------------------------------------------------------------
 void	write_fortschritt(char *format, ...)
 {
+	struct timeb Now;
+	ftime (&Now);
+	
+	long Secs = Now.time;
+	long Mins = Secs  / 60;		Secs = Secs - Mins * 60;
+	long Hours = Mins  / 60;	Mins = Mins - Hours * 60;
+	long Days = Hours  / 24;	Hours = Hours - Days * 24;
+	Hours = Hours % 24;
+	if (Now.dstflag == 1)	Hours = Hours + 1;
+
 	va_list argptr;
-
 	va_start(argptr, format);
-	vfprintf(stdout, format, argptr);
+	fprintf(fhlog, "%02ld:%02ld:%02ld: ", Hours, Mins, Secs);
+	vfprintf(fhlog, format, argptr);
 	va_end(argptr);
+
+	fflush(fhlog);
 }
 
 //---------------------------------------------------------------------------
@@ -365,13 +385,14 @@
 
 		MemSegSize = 300 * 1024 * 1024;
 		DiffMSec = Duration;
+		write_fortschritt("Aufgrund des DebugLevels wird die Geschwindigkeit nicht ermittelt sondern fest gesetzt.\n");
 	}
 	else
 	{
 		struct timeb Start;
 		ftime (&Start);
 
		long StartMSec = Start.time * 1000 + Start.millitm;
-
+
 		struct timeb Now;
 		ftime (&Now);
 
		long NowMSec = Now.time * 1000 + Now.millitm;
@@ -664,7 +685,7 @@
 	}
 	write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
 
-	if (DebugLevel >= 3)
+	if (DebugLevel >= 6)
 	{
 		write_fortschritt("Polygon:\n");
 		for (TXYList::iterator j = XyList->begin(); j != XyList->end(); j++)
@@ -752,6 +773,9 @@
 
 		TElement *Element = *i;
 
+		// Testen, ob das Element gesperrt wurde
+		if (Element->Typ == NO_ELEMENT)	continue;
+
 		TNode* N1 = Element->Node1;
 		TNode* N2 = Element->Node2;
 		TNode* N3 = Element->Node3;
@@ -921,7 +945,7 @@
 }
 
 //---------------------------------------------------------------------------
-void BuildProfilNodeList(TProfilList *ProfilList, TNodeList *NodeList, TGewaesserAchseList *GewaesserAchseList, TNodeList *ProfilNodeList, double AvgDistance, bool Sperre, int DebugLevel)
+void BuildProfilNodeList(TProfilList *ProfilList, TNodeList *NodeList, TGewaesserAchseList *GewaesserAchseList, TProfilList *SperrenList, TNodeList *ProfilNodeList, double AvgDistance, bool Sperre, int DebugLevel)
 {
 	write_fortschritt ("->Knotenliste wird aus den Profilspuren generiert\n");
 
@@ -958,23 +982,46 @@
 			}
 		}
 
-		for (TPointList::reverse_iterator v = Profil->PointList->rbegin(); v != Profil->PointList->rend(); v++)
+
+		TPointList::reverse_iterator v = Profil->PointList->rbegin();
+		while (v != Profil->PointList->rend())
 		{
-			TPoint* Point = *v;
+			TPoint* Point = *v++;
 
+			TPoint* NextPoint = 0;
+			if (v != Profil->PointList->rend())	NextPoint = *v;
+
 			if (Point->Meter > Meter)	continue;
 
+			if (NextPoint && SperrenList)
+			{
+				double X = 0.0;
+				double Y = 0.0;
+				double Lambda = 0.0;
+				double Meter = 0.0;
+
+				bool Found = CalcProfilSchnitt(Point->X, Point->Y, NextPoint->X, NextPoint->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+
+				if (Found)
+				{
+					// Wenn mit Sperren gearbeitet wird,
+					// ist hier jetzt Schluss mit weiterreichen
+
+					break;
+				}
+			}
+
 			double X = Point->X;
 			double Y = Point->Y;
 
 			double Z = 0.0;
 			double WspDummy = 0.0;
-			bool Found = NodeList->Interpolate(X, Y, AvgDistance, &Z, &WspDummy);
+			bool Found = NodeList->Interpolate(SperrenList, X, Y, AvgDistance, &Z, &WspDummy);
 
 			if (false == Found)
 			{
 				// Dies bedeutet, die Profile ragen aus dem DGM raus oder die Punkte sind lokal sehr weit auseinander
-				if (DebugLevel >= 8)
+				if (DebugLevel >= 6)
 				{
 					write_warning(9999, "Es konnte für den Profilpunkt (%.2f, %.2f) keine Höhe interpoliert werden\n", X, Y);
 				}
@@ -995,24 +1042,46 @@
 			}
 		}
 
-		for (TPointList::iterator n = Profil->PointList->begin(); n != Profil->PointList->end(); n++)
+		TPointList::iterator n = Profil->PointList->begin();
+		while (n != Profil->PointList->end())
 		{
-			TPoint* Point = *n;
+			TPoint* Point = *n++;
 
+			TPoint* NextPoint = 0;
+			if (n != Profil->PointList->end())	NextPoint = *n;
+
 			if (Point->Meter < Meter)	continue;
 
+			if (NextPoint && SperrenList)
+			{
+				double X = 0.0;
+				double Y = 0.0;
+				double Lambda = 0.0;
+				double Meter = 0.0;
+
+				bool Found = CalcProfilSchnitt(Point->X, Point->Y, NextPoint->X, NextPoint->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+
+				if (Found)
+				{
+					// Wenn mit Sperren gearbeitet wird,
+					// ist hier jetzt Schluss mit weiterreichen
+
+					break;
+				}
+			}
+
 			double X = Point->X;
 			double Y = Point->Y;
 
 			double Z = 0.0;
 			double WspDummy = 0.0;
-			bool Found = NodeList->Interpolate(X, Y, AvgDistance, &Z, &WspDummy);
+			bool Found = NodeList->Interpolate(SperrenList, X, Y, AvgDistance, &Z, &WspDummy);
 
 			if (false == Found)
 			{
 				// Dies bedeutet, die Profile ragen aus dem DGM raus oder die Punkte sind lokal sehr weit auseinander
 
-				if (DebugLevel >= 8)
+				if (DebugLevel >= 6)
 				{
 					write_warning(9999, "Es konnte für den Profilpunkt (%.2f, %.2f) keine Höhe interpoliert werden\n", X, Y);
 				}
@@ -1040,7 +1109,7 @@
 }
 
 //---------------------------------------------------------------------------
-void TransferWsp(TNodeList *ProfilNodeList, TNodeList *NodeList, double AvgDistance, int DebugLevel)
+void TransferWsp(TNodeList *ProfilNodeList, TNodeList *NodeList, TProfilList* SperrenList, double AvgDistance, int DebugLevel)
 {
 	write_fortschritt ("->Wasserstände werden übertragen\n");
 
@@ -1062,7 +1131,7 @@
 
 		double ZDummy = 0.0;
 		double Wsp = 0.0;
-		bool Found = ProfilNodeList->Interpolate(X, Y, AvgDistance, &ZDummy, &Wsp);
+		bool Found = ProfilNodeList->Interpolate(SperrenList, X, Y, AvgDistance, &ZDummy, &Wsp);
 
 		if (Found)
 		{
@@ -1080,7 +1149,7 @@
 }
 
 //---------------------------------------------------------------------------
-void GetWspFromNodeList(TProfilList* BruchList, TNodeList* NodeList, double AvgDistance, int DebugLevel)
+void GetWspFromNodeList(TProfilList* BruchList, TNodeList* NodeList, TProfilList* SperrenList, double AvgDistance, int DebugLevel)
 {
 	write_fortschritt ("->Wasserstände für Brüche werden ermittelt\n");
 
@@ -1105,14 +1174,14 @@
 
 			double ZDummy = 0.0;
 			double Wsp = 0.0;
-			bool Found = NodeList->Interpolate(X, Y, AvgDistance, &ZDummy, &Wsp);
+			bool Found = NodeList->Interpolate(SperrenList, X, Y, AvgDistance, &ZDummy, &Wsp);
 
 			if (Found)
 			{
 				if (WspCount == 0 || MaxWsp < Wsp)
 				{
 					MaxWsp = Wsp;
-					if (DebugLevel >= 3)	write_fortschritt("Für Bruch %d ist der bisher höchste Wasserstand (%.3f) ermittelt worden.\n", Count, MaxWsp);
+					if (DebugLevel >= 6)	write_fortschritt("Bruch %d: bisher höchster Wasserstand (%.3f)\n", Count, MaxWsp);
 				}
 				WspCount++;
 			}
@@ -1245,6 +1314,48 @@
 	return (true);
 }
 
+//---------------------------------------------------------------------
+bool CalcProfilSchnitt (double P0x, double P0y, double P1x, double P1y, TProfilList *ProfilList, double *x, double *y, double *lambdap, double *meter)
+{
+	for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
+	{
+		TProfil* Profil = *i;
+
+		TPoint* S0 = 0;
+		TPoint* S1 = 0;
+
+		for (TPointList::iterator j = Profil->PointList->begin(); j != Profil->PointList->end(); j++)
+		{
+			if (S1 == 0)
+			{
+				S1 = *j;
+				continue;
+			}
+			else
+			{
+				S0 = S1;
+				S1 = *j;
+			}
+
+			double S0x = S0->X;
+			double S0y = S0->Y;
+			double S1x = S1->X;
+			double S1y = S1->Y;
+
+			double LambdaS;
+			bool Found = Calc2Schnitt(P0x, P0y, P1x, P1y, S0x, S0y, S1x, S1y, x, y, lambdap, &LambdaS);
+
+			if (Found)
+			{
+				*meter = S0->Meter + LambdaS * (S1->Meter - S0->Meter);
+				return (true);
+			}
+		}
+	}
+
+	return (false);
+}
+
 //---------------------------------------------------------------------------
 const double Eps =0.01;
 
@@ -1788,7 +1899,7 @@
 	}
 
 	delete SaveNodeList;
-	
+
 	write_fortschritt("Überschwemmungsgrenzen wurden ermittelt.<-\n");
 }
 

Modified: trunk/src/tools.h
===================================================================
--- trunk/src/tools.h	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/tools.h	2006-03-31 05:43:15 UTC (rev 41)
@@ -59,19 +59,20 @@
 const char*				ShapePartTypeName(TPartType PartType);
 char*					SkipSpaces(char* P);
 char*					GetCol(char* P);
+double 					TwoToWin (double x0, double y0, double x1, double y1);
+double 					ThreeToWin (double x0, double y0, double x1, double y1, double x2, double y2, int turn);
+bool 					Calc2Schnitt (double P0x, double P0y, double P1x, double P1y, double S0x, double S0y, double S1x, double S1y, double *x, double *y, double *lambdap, double *lambdas);
+bool 					CalcProfilSchnitt (double P0x, double P0y, double P1x, double P1y, TProfilList *ProfilList, double *x, double *y, double *lambdap, double *meter);
 void 					InterpolateWsp(TProfilList *ProfilList, TProfilList *WspProfilList, int DebugLevel);
 TProfilMap 				BuildGewaesserListen(TProfilList *ProfilList, int DebugLevel);
 void 					BuildPolygon(TProfilList *ProfilList, TXYList *XyList, int DebugLevel);
 void 					EqualizeProfil(TProfil *ProfilOne, TProfil *ProfilTwo);
 void 					CheckForDuplicates(TNodeList *NodeList, int DebugLevel);
 void 					BuildEdgeList(TEdgeList* EdgeList, TElementList* ElementList, int DebugLevel);
-void 					BuildProfilNodeList(TProfilList *ProfilList, TNodeList *NodeList, TGewaesserAchseList *GewaesserAchseList, TNodeList *ProfilNodeList, double AvgDistance, bool Sperre, int DebugLevel);
-void					TransferWsp(TNodeList *ProfilNodeList, TNodeList *NodeList, double AvgDistance, int DebugLevel);
-void 					GetWspFromNodeList(TProfilList* BruchList, TNodeList* NodeList, double AvgDistance, int DebugLevel);
+void 					BuildProfilNodeList(TProfilList *ProfilList, TNodeList *NodeList, TGewaesserAchseList *GewaesserAchseList, TProfilList *SperrenList, TNodeList *ProfilNodeList, double AvgDistance, bool Sperre, int DebugLevel);
+void					TransferWsp(TNodeList *ProfilNodeList, TNodeList *NodeList, TProfilList* SperrenList, double AvgDistance, int DebugLevel);
+void 					GetWspFromNodeList(TProfilList* BruchList, TNodeList* NodeList, TProfilList* SperrenList, double AvgDistance, int DebugLevel);
 void 					NassTrockenBerechnung(TNodeList *NodeList, TEdgeList *edgelist, TErgebnisPolygonList* ErgebnisPolygone, double Von, double Bis, double Diff, int DebugLevel);
-double 					TwoToWin (double x0, double y0, double x1, double y1);
-double 					ThreeToWin (double x0, double y0, double x1, double y1, double x2, double y2, int turn);
-bool 					Calc2Schnitt (double P0x, double P0y, double P1x, double P1y, double S0x, double S0y, double S1x, double S1y, double *x, double *y, double *lambdap, double *lambdas);
 
 //---------------------------------------------------------------------------
 template<class TClass> int IsInside(TClass *p, double x, double y)

Modified: trunk/src/wsplgen.cpp
===================================================================
--- trunk/src/wsplgen.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/wsplgen.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -16,22 +16,21 @@
 // 1 Kurze Zwischeninformationen und mehr Fortschrittanzeigen
 // 2 Mehr Zwischeninformationen und mehr Fortschrittanzeigen
 // 3 Noch mehr Zwischeninformationen
-//
-//
-// 5 Nur die wichtigsten Testausgabedateien
-// 6 Alle wichtigen Testausgabedateien
+// 4 Nur die wichtigsten Testausgabedateien
+// 5 Alle wichtigen Testausgabedateien
+// 6 Auch ein paar unwichtige Testausgaben
 // 7 Alle Testausgabedateien
 // 8 Alle Informationen und Tests
-// 9 Alle Informationenn und ALLE Fortschrittanzeigen (nicht für größere Netze geeignet)
+// 9 Alle Informationen und ALLE Fortschrittanzeigen (nicht für größere Netze geeignet)
 
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
 
 //---------------------------------------------------------------------------
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <io.h>
+//#include <sys/stat.h>
+//#include <fcntl.h>
+//#include <io.h>
 
 #ifndef __BORLANDC__
 #include <unistd.h>
@@ -44,26 +43,27 @@
 
 int ReturnCode = 0;
 
+FILE *fhlog = 0;
+FILE *fhsta = 0;
+
 //---------------------------------------------------------------------------
 #define NOSTDOUTPUT	0
 
 //---------------------------------------------------------------------------
 int main(int argc, char **argv)
 {
-#if NOSTDOUTPUT == 1
-	char StaFileName[] = "C:\\WSPLGEN\\WSPLGEN.STA";
-	char LogFileName[] = "C:\\WSPLGEN\\WSPLGEN.LOG";
+	if (argc > 1 && argv[1][0] == '$')
+	{
+		fhlog = fopen ("wsplgen_log.txt", "w");
+		fhsta = fopen ("wsplgen_sta.txt", "w");
+	}
+	else
+	{
+		fhlog = stdout;
+		fhsta = stderr;
+	}
 
-	int newstdlog = open (LogFileName, O_WRONLY	| O_CREAT | O_TRUNC | O_TEXT, S_IWRITE);
-	int newstderr = open (StaFileName, O_WRONLY	| O_CREAT | O_TRUNC | O_TEXT, S_IWRITE);
 
-	dup2 (newstdout, fileno(stdout));
-	dup2 (newstderr, fileno(stderr));
-
-	close (newstdout);
-	close (newstderr);
-#endif
-
 	write_fortschritt ("->WSPLGEN wurde gestartet\n");
 
 	// Hier werden alle Profile drin verwaltet
@@ -104,15 +104,16 @@
 	TErgebnisPolygonList ErgebnisPolygonList;
 
 //  Dies dient nur dazu mal kurz ein Netz zu triangulieren
-//	LoadDGM("debug_output\\dgm.shp", &NodeList, &ElementList, 0, 99999999, true);
+//	LoadDGM("daten\\dgm_ziemlich_riesig.shp", &NodeList, &ElementList, 0, 99999999, 3);
 //	LoadDGM("debug_output\\dgm.xyz", &NodeList, &ElementList, 0, 99999999, true);
 //	LoadDGM("debug_output\\dgm.grd", &NodeList, &ElementList, 0, 99999999, true);
 //	LoadDGM("debug_output\\testdgm.shp", &NodeList, &ElementList, 0, 99999999, true);
 //	LoadDGM("debug_output\\testdgm2.shp", &NodeList, &ElementList, 0, 99999999, true);
 //	LoadDGM("debug_output\\dgm_riesig.shp", &NodeList, &ElementList, 0, 99999999, true);
 //	SaveNodes("tmp_ori_nodes.shp", &NodeList, true);
-//	Triangulate (&NodeList, &ElementList, 9);
+//	Triangulate (&NodeList, &ElementList, 3);
 //	SaveElements("tmp_elements.shp", &ElementList, true);
+//	SaveNet("daten\\dgm_riesig.2dm.shp", &NodeList, &ElementList, 3);
 //	return(0);
 
 
@@ -142,7 +143,7 @@
 		delete WspProfilList;
 		WspProfilList = 0;
 
-		if (Parameter.DebugLevel >= 6) SaveProfile("debug_output\\02_Profile_ORIGINAL_mit_WSP.shp", &ProfilList, Parameter.DebugLevel);
+		if (Parameter.DebugLevel >= 5) SaveProfile("debug_output\\02_Profile_ORIGINAL_mit_WSP.shp", &ProfilList, Parameter.DebugLevel);
 
 		// Jetzt die Gewässerachse einlesen, wenn es notwendig ist
 		if (Parameter.Sperre)
@@ -169,7 +170,7 @@
 		write_fortschritt("->Ermitteln der maximalen DGM-Knotenanzahl\n");
 		// Eine rein empirische Formel
 		int MaxNodesPerSlice = Speed * 10;
-MaxNodesPerSlice = 257805;
+
 		write_fortschritt("Es können nur ca. %d DGM-Punkte eingelesen werden\n", MaxNodesPerSlice);
 		write_fortschritt("Ermitteln der maximalen DGM-Knotenanzahl beendet<-\n");
 
@@ -195,12 +196,12 @@
 			}
 
 			// Mal wieder Zwischenergebnisse produzieren
-			if (Parameter.DebugLevel >= 6) SaveProfile("debug_output\\03_" + Gewaesser + "_Profile_100" + ".shp", GewProfilList, Parameter.DebugLevel);
+			if (Parameter.DebugLevel >= 5) SaveProfile("debug_output\\03_" + Gewaesser + "_Profile_100" + ".shp", GewProfilList, Parameter.DebugLevel);
 
 			// Jetzt ein Polygon bilden, das die Profile begrenzt
 			BuildPolygon(GewProfilList, &Bereichspolygon, Parameter.DebugLevel);
 
-			if (Parameter.DebugLevel >= 5) SavePolygon("debug_output\\04_" + Gewaesser + "_Polygon" + ".shp", Gewaesser, 0, 0, &Bereichspolygon, Parameter.DebugLevel);
+			if (Parameter.DebugLevel >= 4) SavePolygon("debug_output\\04_" + Gewaesser + "_Polygon" + ".shp", Gewaesser, 0, 0, &Bereichspolygon, Parameter.DebugLevel);
 
 			unsigned int AnzScheiben = LoadDGM(Parameter.FileNameDgm, &NodeList, &ElementList, &Bereichspolygon, MaxNodesPerSlice, Parameter.DebugLevel);
 
@@ -216,8 +217,11 @@
 
 			TBereichsList BereichsList(GewProfilList, AnzScheiben);
 
+			int Count = 0;
 			for (TBereichsList::iterator i=BereichsList.begin(); i != BereichsList.end(); i++)
 			{
+				Count++;
+
 				TProfilList::iterator Von = i->first;
 				TProfilList::iterator Bis = i->second;
 
@@ -230,28 +234,26 @@
 				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);
+				write_fortschritt("->Bei Gewaesser %s wird der %d. Bereich von %.4f bis %.4f bearbeitet\n", Gewaesser.c_str(), Count, VonProfil->Station / 10000.0, BisProfil->Station / 10000.0);
 
 				// Als Endemarkierung
 				Bis++;
 
-				if (AnzScheiben > 1)
+				TProfilList *TempProfilList = new TProfilList;
+				for (TProfilList::iterator P = Von; P != Bis; P++)
 				{
-					TProfilList *TempProfilList = new TProfilList;
-					for (TProfilList::iterator P = Von; P != Bis; P++)
-					{
-						TProfil *TempProfil = new TProfil(*P);
-						TempProfilList->insert(TempProfil);
-					}
+					TProfil *TempProfil = new TProfil(*P);
+					TempProfilList->insert(TempProfil);
+				}
 
-					// Jetzt das Polygon bilden, das die Profile begrenzen
-					BuildPolygon(TempProfilList, &Bereichspolygon, Parameter.DebugLevel);
+				// Jetzt das Polygon bilden, das die Profile begrenzen
+				BuildPolygon(TempProfilList, &Bereichspolygon, Parameter.DebugLevel);
 
-					if (Parameter.DebugLevel >= 5) SavePolygon("debug_output\\05_" + Gewaesser + "_Polygon_" + VC + NC + ".shp", Gewaesser, 0, 0, &Bereichspolygon, Parameter.DebugLevel);
+				if (Parameter.DebugLevel >= 4) SavePolygon("debug_output\\05_" + Gewaesser + "_Polygon_" + VC + NC + ".shp", Gewaesser, 0, 0, &Bereichspolygon, Parameter.DebugLevel);
 
+				if (AnzScheiben > 1)
+				{
 					LoadDGM(Parameter.FileNameDgm, &NodeList, &ElementList, &Bereichspolygon, 99999999, Parameter.DebugLevel);
-
-					delete TempProfilList;
 				}
 
 				// Wenn die Elementliste noch leer ist, müssen die Knoten noch trianguliert werden.
@@ -262,16 +264,19 @@
 
 				NodeList.SortByNr();
 
-				if (Parameter.DebugLevel >= 8) SaveNet("debug_output\\06_" + Gewaesser + "_Net_" + VC + NC + ".2dm", &NodeList, &ElementList, true);
-				if (Parameter.DebugLevel >= 7) SaveNodes("debug_output\\07_" + Gewaesser + "_Nodes_" + VC + NC + ".shp", &NodeList, true);
-				if (Parameter.DebugLevel >= 6) SaveElements("debug_output\\08_" + Gewaesser + "_Elements_" + VC + NC + ".shp", &ElementList, true);
+				if (Parameter.DebugLevel >= 7) SaveNet("debug_output\\06_" + Gewaesser + "_Net_" + VC + NC + ".2dm", &NodeList, &ElementList, true);
+				if (Parameter.DebugLevel >= 5) SaveNodes("debug_output\\07_" + Gewaesser + "_Nodes_" + VC + NC + ".shp", &NodeList, true);
+				if (Parameter.DebugLevel >= 5) SaveElements("debug_output\\08_" + Gewaesser + "_Elements_" + VC + NC + ".shp", &ElementList, true);
 
 				// Aus den Elementen werden nun die Kanten gebildet
-				// Hier ist noch Optimierungspotential
-				// Man kann auch gleich die Kanten erzeugen statt der Elemente
 				// Der durchschnittliche Abstand der Knoten (bzw. die Kantenlänge) wird dabei mit ermittelt.
 				// Das DGM sollte einigermassen homogen sein
 
+				// Jetzt die gesperrten Elemente entfernen
+				ElementList.EraseElements(&SperrenList, Parameter.DebugLevel);
+
+				if (Parameter.DebugLevel >= 5) SaveElements("debug_output\\09_" + Gewaesser + "_Elements_" + VC + NC + ".shp", &ElementList, true);
+
 				// Hier werden die Kanten drin verwaltet
 				// Die Kanten werden im Moment noch aus den Elementen generiert
 				// Dieser Umweg ist eingendlich nicht notwendig
@@ -281,8 +286,14 @@
 				// Die Elemete werden nun nicht mehr gebraucht
 				ElementList.Clear();
 
-				if (Parameter.DebugLevel >= 5) SaveEdges("debug_output\\09_" + Gewaesser + "_Edges_" + VC + NC + ".shp", EdgeList, Parameter.DebugLevel);
+				// Den alten Knoten Kanten Index löschen
+				NodeList.ClearEdgeIndex();
 
+				// Einen neuen Knoten Kanten Index aufbauen
+				EdgeList->BuildEdgeIndex();
+
+				if (Parameter.DebugLevel >= 4) SaveEdges("debug_output\\10_" + Gewaesser + "_Edges_" + VC + NC + ".shp", EdgeList, Parameter.DebugLevel);
+
 				// Nachdem die durchschnittliche Kantenlänge bekannt ist,
 				// wird sie für die spätere Verwendung zwischengespeichert
 				double AvgDistance = EdgeList->AvgDistance;
@@ -293,47 +304,50 @@
 				// werden die Profile entsprechend fein interpoliert
 				// Dabei muss der Faktor zwischen Kantenlänge in Metern
 				// und Station in Centimetern beachtet werden
-				GewProfilList->InterpoliereProfile(AvgDistance * 10);
+				TempProfilList->InterpoliereProfile(AvgDistance * 10.0);
 
 				// Mal wieder Zwischenergebnisse produzieren
-				if (Parameter.DebugLevel >= 6) SaveProfile("debug_output\\10_" + Gewaesser + "_Profile_all_" + VC + NC + ".shp", GewProfilList, Parameter.DebugLevel);
+				if (Parameter.DebugLevel >= 5) SaveProfile("debug_output\\11_" + Gewaesser + "_Profile_all_" + VC + NC + ".shp", TempProfilList, Parameter.DebugLevel);
 
 				// Jetzt die Stützstellen auffüllen
-				GewProfilList->FillProfile(AvgDistance, -1, Parameter.DebugLevel);
+				TempProfilList->FillProfile(AvgDistance / 2.0, -1, Parameter.DebugLevel);
 
 				// Mal wieder Zwischenergebnisse produzieren
-				if (Parameter.DebugLevel >= 8) SaveProfile("debug_output\\11_" + Gewaesser + "_Profile_fill_" + VC + NC + ".shp", GewProfilList, Parameter.DebugLevel);
+				if (Parameter.DebugLevel >= 7) SaveProfile("debug_output\\12_" + Gewaesser + "_Profile_fill_" + VC + NC + ".shp", TempProfilList, Parameter.DebugLevel);
 
 				// Jetzt eine neue Knotenliste aus den Profilen generienen
-				BuildProfilNodeList(GewProfilList, &NodeList, &GewaesserAchseList, &ProfilNodeList, AvgDistance, Parameter.Sperre, Parameter.DebugLevel);
+				BuildProfilNodeList(TempProfilList, &NodeList, &GewaesserAchseList, &SperrenList, &ProfilNodeList, AvgDistance * 2.0, Parameter.Sperre, Parameter.DebugLevel);
 
-				if (Parameter.DebugLevel >= 5) SaveNodes("debug_output\\12_" + Gewaesser + "_ProfilNodes_" + VC + NC + ".shp", &ProfilNodeList, true);
+				if (Parameter.DebugLevel >= 4) SaveNodes("debug_output\\13_" + Gewaesser + "_ProfilNodes_" + VC + NC + ".shp", &ProfilNodeList, true);
 
 				// Jetzt die Wasserstände übertragen
-				TransferWsp(&ProfilNodeList, &NodeList, AvgDistance, Parameter.DebugLevel);
+				TransferWsp(&ProfilNodeList, &NodeList, &SperrenList, AvgDistance, Parameter.DebugLevel);
 
 				if (BruchList.size() > 0)
 				{
 					// Mit Stützstellen auffüllen
-					BruchList.FillProfile(AvgDistance, -1, Parameter.DebugLevel);
+					BruchList.FillProfile(AvgDistance / 2.0, -1, Parameter.DebugLevel);
 
-					// Jetzt eine neue Knotenliste aus den Brüchen generienen
-					GetWspFromNodeList(&BruchList, &NodeList, AvgDistance, Parameter.DebugLevel);
+					// Jetzt den Wasserstand aus der Node_List extrahieren
+					GetWspFromNodeList(&BruchList, &NodeList, &SperrenList, AvgDistance / 2.0, Parameter.DebugLevel);
 
-					if (Parameter.DebugLevel >= 8) SaveProfile("debug_output\\13_" + Gewaesser + "_Bruch_ohne_Wsp_" + VC + NC + ".shp", &BruchList, Parameter.DebugLevel);
+					if (Parameter.DebugLevel >= 7) SaveProfile("debug_output\\14_" + Gewaesser + "_Bruch_ohne_Wsp_" + VC + NC + ".shp", &BruchList, Parameter.DebugLevel);
 
-					BuildProfilNodeList(&BruchList, &NodeList, &GewaesserAchseList, &BruchNodeList, AvgDistance, false, Parameter.DebugLevel);
+					// Jetzt eine neue Knotenliste aus den Brüchen generienen
+					BuildProfilNodeList(&BruchList, &NodeList, &GewaesserAchseList, 0, &BruchNodeList, AvgDistance * 2.0, false, Parameter.DebugLevel);
 
-					if (Parameter.DebugLevel >= 7) SaveNodes("debug_output\\14_" + Gewaesser + "_Bruch_mit_Wsp_" + VC + NC + ".shp", &BruchNodeList, true);
+					if (Parameter.DebugLevel >= 6) SaveNodes("debug_output\\15_" + Gewaesser + "_Bruch_mit_Wsp_" + VC + NC + ".shp", &BruchNodeList, true);
 
 					// Jetzt die Wasserstände übertragen
-					TransferWsp(&BruchNodeList, &NodeList, AvgDistance, Parameter.DebugLevel);
+					TransferWsp(&BruchNodeList, &NodeList, &SperrenList, AvgDistance / 2.0, Parameter.DebugLevel);
 				}
 
 				ProfilNodeList.Clear();
 
-				if (Parameter.DebugLevel >= 5) SaveNodes("debug_output\\15_" + Gewaesser + "_Nodes_mit_WSP_" + VC + NC + ".shp", &NodeList, true);
+				delete TempProfilList;
 
+				if (Parameter.DebugLevel >= 4) SaveNodes("debug_output\\16_" + Gewaesser + "_Nodes_mit_WSP_" + 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)
@@ -368,12 +382,6 @@
 					}
 				}
 
-				// Den alten Knoten Kanten Index löschen
-				NodeList.ClearEdgeIndex();
-
-				// Einen neuen Knoten Kanten Index aufbauen
-				EdgeList->BuildEdgeIndex();
-
 				TErgebnisPolygonList* TempErgebnisPolygone = new TErgebnisPolygonList;
 				NassTrockenBerechnung(&NodeList, EdgeList, TempErgebnisPolygone, Parameter.Von, Parameter.Bis, Parameter.Diff, Parameter.DebugLevel);
 
@@ -386,8 +394,6 @@
 					ErgebnisPolygon->BisKm = BisProfil->Station / 10000.0;
 				}
 
-//				if (Parameter.DebugLevel >= 9) SavePolygone(Parameter.FileNameAusgabe, TempErgebnisPolygone, Parameter.DebugLevel);
-
 				ErgebnisPolygonList.Append(TempErgebnisPolygone);
 
 				if (Parameter.DebugLevel >= 8)
@@ -412,7 +418,7 @@
 				// die Knoten waren nur geliehen
 				delete EdgeList;
 
-				write_fortschritt("Der Bereich von %.4f bis %.4f wurde bei Gewässer %s bearbeitet\n", VonProfil->Station / 10000.0, BisProfil->Station / 10000.0, Gewaesser.c_str());
+				write_fortschritt("Bei Gewaesser %s wurde der %d. Bereich von %.4f bis %.4f bearbeitet<-\n", Gewaesser.c_str(), Count, VonProfil->Station / 10000.0, BisProfil->Station / 10000.0);
 			}
 		}
 
@@ -442,10 +448,11 @@
 	write_fortschritt ("WSPLGEN wird beendet<-\n");
 
 
-#if NOSTDOUTPUT == 1
-	close (fileno(stdout));
-	close (fileno(stderr));
-#endif
+	if (argc > 1 && argv[1][0] == '$')
+	{
+		fclose(fhlog);
+		fclose(fhsta);
+	}
 
 	return (ReturnCode);
 }

Modified: trunk/src/xy.cpp
===================================================================
--- trunk/src/xy.cpp	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/xy.cpp	2006-03-31 05:43:15 UTC (rev 41)
@@ -132,6 +132,62 @@
 }
 
 //---------------------------------------------------------------------
+void TNode::EraseEdgeIndex(TEdge *Edge)
+{
+/*
+	TEdgeIndex *AktEdgeIndex1 = EdgeIndex;
+	while (AktEdgeIndex1)
+	{
+		TEdgeIndex *NextEdgeIndex = AktEdgeIndex1->NextEdgeIndex;
+		TEdge* E = AktEdgeIndex1->Edge;
+		write_fortschritt("Knoten %d: Kante %d - %d\n", Nr, E->Node1->Nr, E->Node2->Nr);
+		AktEdgeIndex1 = NextEdgeIndex;
+	}
+
+	write_fortschritt("\nKante %d - %d soll gelöscht werden\n", Edge->Node1->Nr, Edge->Node2->Nr);
+*/
+
+
+	bool Found = false;
+	TEdgeIndex *AktEdgeIndex = EdgeIndex;
+	TEdgeIndex *PrevEdgeIndex = EdgeIndex;
+	while (AktEdgeIndex)
+	{
+		TEdgeIndex *NextEdgeIndex = AktEdgeIndex->NextEdgeIndex;
+
+		if (AktEdgeIndex->Edge == Edge)
+		{
+			Found = true;
+			delete AktEdgeIndex;
+
+			if (AktEdgeIndex == EdgeIndex)	EdgeIndex = NextEdgeIndex;
+			else 							PrevEdgeIndex->NextEdgeIndex = NextEdgeIndex;
+			break;
+		}
+
+		PrevEdgeIndex = AktEdgeIndex;
+		AktEdgeIndex = NextEdgeIndex;
+	}
+
+/*
+	TEdgeIndex *AktEdgeIndex2 = EdgeIndex;
+	while (AktEdgeIndex2)
+	{
+		TEdgeIndex *NextEdgeIndex = AktEdgeIndex2->NextEdgeIndex;
+		TEdge* E = AktEdgeIndex2->Edge;
+		write_fortschritt("Knoten %d: Kante %d - %d\n", Nr, E->Node1->Nr, E->Node2->Nr);
+		AktEdgeIndex2 = NextEdgeIndex;
+	}
+	write_fortschritt("\n");
+*/
+
+	if (false == Found)
+	{
+		dump_error(__FILE__, __LINE__, "Konnte zu löschende Kante nicht finden\n");
+	}
+}
+
+//---------------------------------------------------------------------
 struct TNodeSortByX
 {
 	 bool operator()(TNode* const &Node1, TNode* const &Node2)
@@ -310,7 +366,7 @@
 		}
 		else
 		{
-			dump_error(__FILE__, __LINE__, "Falschen Knoten gefunden");
+			dump_error(__FILE__, __LINE__, "Falschen Knoten gefunden\n");
 		}
 	}
 	else
@@ -325,7 +381,7 @@
 
 			if (R <= Eps)
 			{
-				dump_error(__FILE__, __LINE__, "Existierenden Knoten nicht gefunden");
+				dump_error(__FILE__, __LINE__, "Existierenden Knoten nicht gefunden\n");
 			}
 		}
 		return (0);
@@ -483,7 +539,7 @@
 		}
 		else
 		{
-			dump_error(__FILE__, __LINE__, "Falschen Knoten gefunden");
+			dump_error(__FILE__, __LINE__, "Falschen Knoten gefunden\n");
 		}
 	}
 	else
@@ -498,7 +554,7 @@
 
 			if (R <= Eps)
 			{
-				dump_error(__FILE__, __LINE__, "Existierenden Knoten nicht gefunden");
+				dump_error(__FILE__, __LINE__, "Existierenden Knoten nicht gefunden\n");
 			}
 		}
 		return (0);
@@ -651,7 +707,7 @@
 {
 	if (size() != XYKombiIndex->Anzahl)
 	{
-		dump_error(__FILE__, __LINE__, "Knotenanzahl (%d) und XYKombiIndex-Anzahl (%d) stimmen nicht überein", size(), XYKombiIndex->Anzahl);
+		dump_error(__FILE__, __LINE__, "Knotenanzahl (%d) und XYKombiIndex-Anzahl (%d) stimmen nicht überein\n", size(), XYKombiIndex->Anzahl);
 	}
 
 	if (size() <= 0) return (0);
@@ -712,7 +768,7 @@
 
 	if (size() != XYKombiIndex->Anzahl)
 	{
-		dump_error(__FILE__, __LINE__, "Knotenanzahl (%d) und XYKombiIndex-Anzahl (%d) stimmen nicht überein", size(), XYKombiIndex->Anzahl);
+		dump_error(__FILE__, __LINE__, "Knotenanzahl (%d) und XYKombiIndex-Anzahl (%d) stimmen nicht überein\n", size(), XYKombiIndex->Anzahl);
 	}
 
 	if (size() <= 0) return(SearchNodeList);
@@ -733,11 +789,11 @@
 }
 
 //---------------------------------------------------------------------
-bool TNodeList::Interpolate(double X, double Y, double R, double *ZWert, double *WspWert)
+bool TNodeList::Interpolate(TProfilList *SperrenList, double X, double Y, double R, double *ZWert, double *WspWert)
 {
 	if (size() != XYKombiIndex->Anzahl)
 	{
-		dump_error(__FILE__, __LINE__, "Knotenanzahl (%d) und XYKombiIndex-Anzahl (%d) stimmen nicht überein", size(), XYKombiIndex->Anzahl);
+		dump_error(__FILE__, __LINE__, "Knotenanzahl (%d) und XYKombiIndex-Anzahl (%d) stimmen nicht überein\n", size(), XYKombiIndex->Anzahl);
 	}
 
 	TNodeList *SearchNodeList = FindAllByXY(X, Y, R);
@@ -766,6 +822,13 @@
 			return (true);
 		}
 
+		double DummyX = 0.0;
+		double DummyY = 0.0;
+		double DummyLambda = 0.0;
+		double DummyMeter = 0.0;
+
+		if (SperrenList && CalcProfilSchnitt(Node->X, Node->Y, X, Y, SperrenList, &DummyX, &DummyY, &DummyLambda, &DummyMeter)) continue;
+
 		if (Node->X >= X && Node->Y > Y)
 		{
 			if (0 == TRNode)
@@ -875,52 +938,85 @@
 		}
 	}
 
-	int Anzahl = 0;
-	double Summe = 0.0;
+	int ZAnzahl = 0;
+	double ZSumme = 0.0;
+	int WspAnzahl = 0;
+	double WspSumme = 0.0;
 	if (TLNode != 0)
 	{
 		TLD = sqrt(TLD);
-		Summe = Summe + 1 / TLD;
-		Anzahl++;
+		ZSumme = ZSumme + 1 / TLD;
+		ZAnzahl++;
+
+		if (TLNode->Wsp > -9999.0)
+		{
+			WspSumme = WspSumme + 1 / TLD;
+			WspAnzahl++;
+		}
 	}
 	if (TRNode != 0)
 	{
 		TRD = sqrt(TRD);
-		Summe = Summe + 1 / TRD;
-		Anzahl++;
+		ZSumme = ZSumme + 1 / TRD;
+		ZAnzahl++;
+
+		if (TRNode->Wsp > -9999.0)
+		{
+			WspSumme = WspSumme + 1 / TRD;
+			WspAnzahl++;
+		}
 	}
 	if (BLNode != 0)
 	{
 		BLD = sqrt(BLD);
-		Summe = Summe + 1 / BLD;
-		Anzahl++;
+		ZSumme = ZSumme + 1 / BLD;
+		ZAnzahl++;
+
+		if (BLNode->Wsp > -9999.0)
+		{
+			WspSumme = WspSumme + 1 / BLD;
+			WspAnzahl++;
+		}
 	}
 	if (BRNode != 0)
 	{
 		BRD = sqrt(BRD);
-		Summe = Summe + 1 / BRD;
-		Anzahl++;
+		ZSumme = ZSumme + 1 / BRD;
+		ZAnzahl++;
+
+		if (BRNode->Wsp > -9999.0)
+		{
+			WspSumme = WspSumme + 1 / BRD;
+			WspAnzahl++;
+		}
 	}
 
-	if (Anzahl > 0)
+	if (WspAnzahl > 0)
 	{
-		double Z = 0.0;
+		double Wsp = 0.0;
 
-		if (TLNode != 0) Z = Z +  1 / TLD / Summe * TLNode->Z;
-		if (TRNode != 0) Z = Z +  1 / TRD / Summe * TRNode->Z;
-		if (BLNode != 0) Z = Z +  1 / BLD / Summe * BLNode->Z;
-		if (BRNode != 0) Z = Z +  1 / BRD / Summe * BRNode->Z;
+		if (TLNode != 0 && TLNode->Wsp > -9999.0) Wsp = Wsp +  1 / TLD / WspSumme * TLNode->Wsp;
+		if (TRNode != 0 && TRNode->Wsp > -9999.0) Wsp = Wsp +  1 / TRD / WspSumme * TRNode->Wsp;
+		if (BLNode != 0 && BLNode->Wsp > -9999.0) Wsp = Wsp +  1 / BLD / WspSumme * BLNode->Wsp;
+		if (BRNode != 0 && BRNode->Wsp > -9999.0) Wsp = Wsp +  1 / BRD / WspSumme * BRNode->Wsp;
 
-		*ZWert = Z;
+		*WspWert = Wsp;
+	}
+	else
+	{
+		*WspWert = -9999.9;
+	}
 
-		double Wsp = 0.0;
+	if (ZAnzahl > 0)
+	{
+		double Z = 0.0;
 
-		if (TLNode != 0) Wsp = Wsp +  1 / TLD / Summe * TLNode->Wsp;
-		if (TRNode != 0) Wsp = Wsp +  1 / TRD / Summe * TRNode->Wsp;
-		if (BLNode != 0) Wsp = Wsp +  1 / BLD / Summe * BLNode->Wsp;
-		if (BRNode != 0) Wsp = Wsp +  1 / BRD / Summe * BRNode->Wsp;
+		if (TLNode != 0) Z = Z +  1 / TLD / ZSumme * TLNode->Z;
+		if (TRNode != 0) Z = Z +  1 / TRD / ZSumme * TRNode->Z;
+		if (BLNode != 0) Z = Z +  1 / BLD / ZSumme * BLNode->Z;
+		if (BRNode != 0) Z = Z +  1 / BRD / ZSumme * BRNode->Z;
 
-		*WspWert = Wsp;
+		*ZWert = Z;
 
 		return (true);
 	}
@@ -958,7 +1054,7 @@
 
 		if (Depth < 0.0)
 		{
-			dump_error(__FILE__, __LINE__, "Der Wasserstand ist negative");
+			dump_error(__FILE__, __LINE__, "Der Wasserstand ist negative\n");
 		}
 
 		if (Count == 0 || Depth > MaxDepth)	MaxDepth = Depth;
@@ -994,7 +1090,7 @@
 
 		if (Wsp < 0.0)
 		{
-			dump_error(__FILE__, __LINE__, "Der Wasserstand ist negative");
+			dump_error(__FILE__, __LINE__, "Der Wasserstand ist negative\n");
 		}
 
 		if (Count == 0 || Wsp > MaxWsp)	MaxWsp = Wsp;
@@ -1031,6 +1127,104 @@
 	clear();
 }
 
+//---------------------------------------------------------------------------
+void TElementList::EraseElements(TProfilList *SperrenList, int DebugLevel)
+{
+	write_fortschritt("->Gesperrte Elemente werden gelöscht\n");
+
+	int Count = 0;
+	int DelCount = 0;
+	for (TElementList::iterator i = begin(); i != end(); i++)
+	{
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 1000 == 0) || (Count > 0 && Count % 10000 == 0))
+		{
+			write_fortschritt("%d von %d Elemente auf Sperren getestet, %d Elemente gelöscht\n", Count, size(), DelCount);
+		}
+
+		TElement* Element = *i;
+
+		TNode* Node1 = Element->Node1;
+		TNode* Node2 = Element->Node2;
+		TNode* Node3 = Element->Node3;
+
+		double X = 0.0;
+		double Y = 0.0;
+		double Lambda = 0.0;
+		double Meter = 0.0;
+		bool Schnitt = false;
+
+		Schnitt = CalcProfilSchnitt(Node1->X, Node1->Y, Node2->X, Node2->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+		if (Schnitt)
+		{
+			// Das Element wird invalidiert
+			if (DebugLevel >= 6) write_fortschritt("Element %d : %d - %d - %d wird gelöscht\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
+			Element->Typ = NO_ELEMENT;
+			DelCount++;
+			Count++;
+			continue;
+		}
+
+		Schnitt = CalcProfilSchnitt(Node2->X, Node2->Y, Node3->X, Node3->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+		if (Schnitt)
+		{
+			// Das Element wird invalidiert
+			if (DebugLevel >= 6) write_fortschritt("Element %d : %d - %d - %d wird gelöscht\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
+			Element->Typ = NO_ELEMENT;
+			DelCount++;
+			Count++;
+			continue;
+		}
+
+		if (Element->Typ == TRI)
+		{
+			Schnitt = CalcProfilSchnitt(Node3->X, Node3->Y, Node1->X, Node1->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+			if (Schnitt)
+			{
+				// Das Element wird invalidiert
+				if (DebugLevel >= 6) write_fortschritt("Element %d : %d - %d - %d wird gelöscht\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
+				Element->Typ = NO_ELEMENT;
+				DelCount++;
+				Count++;
+				continue;
+			}
+		}
+		else if (Element->Typ == QUAD)
+		{
+			TNode* Node4 = Element->Node4;
+
+			Schnitt = CalcProfilSchnitt(Node3->X, Node3->Y, Node4->X, Node4->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+			if (Schnitt)
+			{
+				// Das Element wird invalidiert
+				Element->Typ = NO_ELEMENT;
+				DelCount++;
+				Count++;
+				continue;
+			}
+
+			Schnitt = CalcProfilSchnitt(Node4->X, Node4->Y, Node1->X, Node1->Y, SperrenList, &X, &Y, &Lambda, &Meter);
+			if (Schnitt)
+			{
+				// Das Element wird invalidiert
+				if (DebugLevel >= 6) write_fortschritt("Element %d : %d - %d - %d wird gelöscht\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
+				Element->Typ = NO_ELEMENT;
+				DelCount++;
+				Count++;
+				continue;
+			}
+		}
+		else
+		{
+			dump_error(__FILE__, __LINE__, "Ungültiger ElementTyp\nElement %d : %d - %d - %d sollte getestet werden\n", Count, Node1->Nr, Node2->Nr, Node3->Nr);
+		}
+
+		Count++;
+	}
+	write_fortschritt("%d von %d Elemente auf Sperren getestet, %d Elemente gelöscht\n", Count, size(), DelCount);
+
+	write_fortschritt("Gesperrte Elemente wurden gelöscht<-\n");
+}
+
 //---------------------------------------------------------------------
 // TPolygonList
 //---------------------------------------------------------------------
@@ -1138,12 +1332,12 @@
 {
 	if (node1->Nr < 0)
 	{
-		dump_error (__FILE__, __LINE__, "Beim Erzeugen einer Kante ist die Knotennummer 1 negativ (%d)", node1->Nr);
+		dump_error (__FILE__, __LINE__, "Beim Erzeugen einer Kante ist die Knotennummer 1 negativ (%d)\n", node1->Nr);
 	}
 
 	if (node2->Nr < 0)
 	{
-		dump_error (__FILE__, __LINE__, "Beim Erzeugen einer Kante ist die Knotennummer 2 negativ (%d)", node2->Nr);
+		dump_error (__FILE__, __LINE__, "Beim Erzeugen einer Kante ist die Knotennummer 2 negativ (%d)\n", node2->Nr);
 	}
 
 	Node1 = node1;
@@ -1193,6 +1387,7 @@
 	IsBoundary = Edge->IsBoundary;
 }
 
+
 //---------------------------------------------------------------------
 
 //---------------------------------------------------------------------
@@ -1232,7 +1427,7 @@
 	}
 	if (Anz != 0)
 	{
-		dump_error(__FILE__, __LINE__, "Anz der Kanten ist nicht 0");
+		dump_error(__FILE__, __LINE__, "Anz der Kanten ist nicht 0\n");
 	}
 
 	AvgDistance = 0.0;
@@ -1251,7 +1446,7 @@
 
 	if (Anz != 0)
 	{
-		dump_error(__FILE__, __LINE__, "Anz der Kanten ist nicht 0");
+		dump_error(__FILE__, __LINE__, "Anz der Kanten ist nicht 0\n");
 	}
 
 	AvgDistance = 0.0;
@@ -1267,7 +1462,7 @@
 
 	if (EdgeListDistanceSorted.size() == 0)
 	{
-		dump_error(__FILE__, __LINE__, "Da ist nichts mehr drin");
+		dump_error(__FILE__, __LINE__, "Da ist nichts mehr drin\n");
 	}
 
 	TEdge *Edge = 0;
@@ -1326,27 +1521,37 @@
 {
 	if (Anz == 0)
 	{
-		dump_error(__FILE__, __LINE__, "Konnte Kante nicht löschen da keine Kanten mehr da waren");
+		dump_error(__FILE__, __LINE__, "Konnte Kante nicht löschen da keine Kanten mehr da waren\n");
 	}
 
 	TEdgeListNrSorted::iterator NrIt = EdgeListNrSorted.find(edge);
 
+	if (NrIt == EdgeListNrSorted.end())
+	{
+		dump_error(__FILE__, __LINE__, "Konnte Kante nicht löschen, da sie nicht gefunden wurde\n");
+	}
 
 	TEdgeListDistanceSorted::iterator DistanceIt = EdgeListDistanceSorted.find(edge);
 
+	if (DistanceIt == EdgeListDistanceSorted.end())
+	{
+		dump_error(__FILE__, __LINE__, "Konnte Kante nicht löschen, da sie nicht gefunden wurde\n");
+	}
+
 	TEdge *Edge1 = *NrIt;
 	TEdge *Edge2 = *DistanceIt;
 
 	if (Edge1->Node1->Nr != Edge2->Node1->Nr || Edge1->Node2->Nr != Edge2->Node2->Nr)
 	{
-		dump_error(__FILE__, __LINE__, "Es werden zwei verschiedene Kanten gelöscht");
+		dump_error(__FILE__, __LINE__, "Es werden zwei verschiedene Kanten gelöscht (durch Nr identifiziert)\n");
 	}
 
-	if (NrIt == EdgeListNrSorted.end())
+	if (Edge1->Node1 != Edge2->Node1 || Edge1->Node2 != Edge2->Node2)
 	{
-		dump_error(__FILE__, __LINE__, "Konnte Kante nicht löschen da sie nicht gefunden wurde");
+		dump_error(__FILE__, __LINE__, "Es werden zwei verschiedene Kanten gelöscht (durch Nodes identifiziert)\n");
 	}
 
+
 	AvgDistance = AvgDistance * Anz;
 	AvgDistance = AvgDistance - edge->Distance;
 
@@ -1510,7 +1715,10 @@
 //---------------------------------------------------------------------
 void TProfil::AddPoint(double meter)
 {
-	if (0 == PointList || PointList->size() < 2)	dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Profil vorhanden");
+	if (0 == PointList || PointList->size() < 2)
+	{
+		dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Profil vorhanden\n");
+	}
 
 	double X = 0.0;
 	double Y = 0.0;
@@ -1559,7 +1767,10 @@
 //---------------------------------------------------------------------
 bool TProfil::GetXY(double meter, double *x, double *y)
 {
-	if (0 == PointList || PointList->size() < 2)	dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Profil vorhanden");
+	if (0 == PointList || PointList->size() < 2)
+	{
+		dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Profil vorhanden\n");
+	}
 
 	TPointList::iterator i = PointList->begin();
 
@@ -1592,7 +1803,7 @@
 
 				if (Faktor >= 0.0)
 				{
-					dump_error(__FILE__, __LINE__,  "Faktor ist nicht negativ, aber der gesuchte Punkt liegt vor dem Profil");
+					dump_error(__FILE__, __LINE__,  "Faktor ist nicht negativ, aber der gesuchte Punkt liegt vor dem Profil\n");
 				}
 
 				return (false);
@@ -1611,7 +1822,7 @@
 
 				if (Faktor <= 0.0 || Faktor >= 1.0)
 				{
-					dump_error(__FILE__, __LINE__,  "Faktor ist nicht zwischen 0 und 1, aber der gesuchte Punkt liegt im Profil");
+					dump_error(__FILE__, __LINE__,  "Faktor ist nicht zwischen 0 und 1, aber der gesuchte Punkt liegt im Profil\n");
 				}
 
 				return (true);
@@ -1636,7 +1847,7 @@
 
 	if (Faktor <= 1.0)
 	{
-		dump_error(__FILE__, __LINE__,  "Faktor ist nicht größer als 1, aber der gesuchte Punkt liegt hinter dem Profil");
+		dump_error(__FILE__, __LINE__,  "Faktor ist nicht größer als 1, aber der gesuchte Punkt liegt hinter dem Profil\n");
 	}
 
 	return (false);
@@ -1689,7 +1900,7 @@
 {
 	if (vorprofil->PointList->size() != nachprofil->PointList->size())
 	{
-		dump_error(__FILE__, __LINE__, "Angeglichene Profile ('%.2f' und '%.2f') haben verschiedenviel Stützstellen", vorprofil->Station / 10000.0, nachprofil->Station / 10000.0);
+		dump_error(__FILE__, __LINE__, "Angeglichene Profile ('%.2f' und '%.2f') haben verschieden viele Stützstellen\n", vorprofil->Station / 10000.0, nachprofil->Station / 10000.0);
 	}
 
 	TPointList::iterator V = vorprofil->PointList->begin();
@@ -1980,9 +2191,9 @@
 			T++;
 		}
 
-		if (T == ProfilList->end()) dump_error(__FILE__, __LINE__, "Konnte nicht alle Bereiche generieren");
+		if (T == ProfilList->end()) dump_error(__FILE__, __LINE__, "Konnte nicht alle Bereiche generieren\n");
 
-		if (P == Start) dump_error(__FILE__, __LINE__, "Bin nicht von der Stelle gekommen");
+		if (P == Start) dump_error(__FILE__, __LINE__, "Bin nicht von der Stelle gekommen\n");
 
 		if ((*T)->Station - SollStation < SollStation - (*P)->Station)
 		{
@@ -2046,7 +2257,7 @@
 //---------------------------------------------------------------------
 void TGewaesserAchse::AddPoint(double meter)
 {
-	if (0 == PointList || PointList->size() < 2)	dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Gewässerachse vorhanden");
+	if (0 == PointList || PointList->size() < 2)	dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Gewässerachse vorhanden\n");
 
 	double X = 0.0;
 	double Y = 0.0;
@@ -2095,7 +2306,7 @@
 //---------------------------------------------------------------------
 bool TGewaesserAchse::GetXY(double meter, double *x, double *y)
 {
-	if (0 == PointList || PointList->size() < 2)	dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Gewässerachse vorhanden");
+	if (0 == PointList || PointList->size() < 2)	dump_error(__FILE__, __LINE__, "Weniger als 2 Punkte im Gewässerachse vorhanden\n");
 
 	TPointList::iterator i = PointList->begin();
 
@@ -2128,7 +2339,7 @@
 
 				if (Faktor >= 0.0)
 				{
-					dump_error(__FILE__, __LINE__,  "Faktor ist nicht negativ, aber der gesuchte Punkt liegt vor dem Profil");
+					dump_error(__FILE__, __LINE__,  "Faktor ist nicht negativ, aber der gesuchte Punkt liegt vor dem Profil\n");
 				}
 
 				return (false);
@@ -2147,7 +2358,7 @@
 
 				if (Faktor <= 0.0 || Faktor >= 1.0)
 				{
-					dump_error(__FILE__, __LINE__,  "Faktor ist nicht zwischen 0 und 1, aber der gesuchte Punkt liegt im Profil");
+					dump_error(__FILE__, __LINE__,  "Faktor ist nicht zwischen 0 und 1, aber der gesuchte Punkt liegt im Profil\n");
 				}
 
 				return (true);
@@ -2172,7 +2383,7 @@
 
 	if (Faktor <= 1.0)
 	{
-		dump_error(__FILE__, __LINE__,  "Faktor ist nicht größer als 1, aber der gesuchte Punkt liegt hinter dem Profil");
+		dump_error(__FILE__, __LINE__,  "Faktor ist nicht größer als 1, aber der gesuchte Punkt liegt hinter dem Profil\n");
 	}
 
 	return (false);

Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h	2006-03-27 11:04:13 UTC (rev 40)
+++ trunk/src/xy.h	2006-03-31 05:43:15 UTC (rev 41)
@@ -32,14 +32,16 @@
 #include <math.h>
 
 //----------------------------------------------------------------------------
-typedef enum { TRI, QUAD } TElementTyp;
+typedef enum { NO_ELEMENT, TRI, QUAD } TElementTyp;
 typedef enum { NOT_INSIDE, INSIDE, ON_LINE, UNDEFINED } TInsideTyp;
 
 //----------------------------------------------------------------------------
+class TEdge;
 class TEdgeIndex;
 class TXYList;
 class TXYZList;
 class TNodeList;
+class TProfilList;
 class TGewaesserAchseList;
 
 //----------------------------------------------------------------------------
@@ -88,6 +90,7 @@
 					~TNode(void);
 
 		void 		ClearEdgeIndex(void);
+		void 		EraseEdgeIndex(TEdge *Edge);
 };
 
 
@@ -143,8 +146,8 @@
 		bool	Ready;
 		bool	IsBoundary;
 
-		TEdge(TNode *Node1, TNode *Node2);
-		TEdge(TEdge *Edge);
+				TEdge(TNode *Node1, TNode *Node2);
+				TEdge(TEdge *Edge);
 };
 
 //----------------------------------------------------------------------------
@@ -451,7 +454,7 @@
 		TNode*			FindByXY(double X, double Y, double Eps = 0.01);
 		TNodeList*		FindAllByXY(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(TProfilList* SperrenList, double X, double Y, double R, double *Z, double *Wsp);
 		void			ClearEdgeIndex(void);
 		double			GetMaxDepth(bool Debug);
 		double 			GetMaxWsp(bool Debug);
@@ -463,6 +466,7 @@
 	public:
 						~TElementList(void);
 		void			Clear(void);
+		void			EraseElements(TProfilList *SperrenList, int DebugLevel);
 };
 
 
@@ -475,7 +479,7 @@
 			if (Edge1->Node1->Nr < Edge2->Node1->Nr)	return (true);
 			if (Edge1->Node1->Nr > Edge2->Node1->Nr)	return (false);
 			if (Edge1->Node2->Nr < Edge2->Node2->Nr)	return (true);
-			if (Edge1->Node1->Nr > Edge2->Node2->Nr)	return (false);
+			if (Edge1->Node2->Nr > Edge2->Node2->Nr)	return (false);
 			return (false); // Gleichheit ist NICHT kleiner
 		}
 };
@@ -491,7 +495,7 @@
 			if (Edge1->Node1->Nr < Edge2->Node1->Nr)	return (true);
 			if (Edge1->Node1->Nr > Edge2->Node1->Nr)	return (false);
 			if (Edge1->Node2->Nr < Edge2->Node2->Nr)	return (true);
-			if (Edge1->Node1->Nr > Edge2->Node2->Nr)	return (false);
+			if (Edge1->Node2->Nr > Edge2->Node2->Nr)	return (false);
 			return (false); // Gleichheit ist NICHT kleiner
 		}
 };
@@ -592,7 +596,7 @@
 		bool operator()(TProfil* const &Profil1, TProfil* const &Profil2) const
 		{
 			if (Profil1->Gewaesser < Profil2->Gewaesser)	return (true);
-			if (Profil2->Gewaesser > Profil2->Gewaesser)	return (false);
+			if (Profil2->Gewaesser < Profil1->Gewaesser)	return (false);
 			return (Profil1->Station < Profil2->Station);
 		}
 };



More information about the Wsplgen-commits mailing list