[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