[Wsplgen-commits] r39 - trunk/src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Tue Mar 21 01:53:17 CET 2006
Author: mrchip
Date: 2006-03-21 01:53:11 +0100 (Tue, 21 Mar 2006)
New Revision: 39
Modified:
trunk/src/file.cpp
trunk/src/file.h
trunk/src/parameter.cpp
trunk/src/tools.cpp
trunk/src/tri.cpp
trunk/src/wsplgen.cpp
trunk/src/xy.cpp
trunk/src/xy.h
Log:
Alle Dateiformate werden nun unterst?\195?\188tzt. Es fehlt nur noch die Behandlung von D?\195?\164mmen und Br?\195?\188chen.
Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/file.cpp 2006-03-21 00:53:11 UTC (rev 39)
@@ -71,14 +71,14 @@
{
AnzScheiben = LoadDGM2DM(FileName, NodeList, ElementList, XyList, MaxNodesPerSlice, Debug);
}
- else if (ToUpperCase(Ext) == ".XYZ")
+ else if (ToUpperCase(Ext) == ".GRD")
{
- AnzScheiben = LoadDGMXYZ(FileName, NodeList, XyList, MaxNodesPerSlice, Debug);
+ AnzScheiben = LoadDGMGRD(FileName, NodeList, ElementList, XyList, MaxNodesPerSlice, Debug);
CheckForDuplicates(NodeList, Debug);
}
- else if (ToUpperCase(Ext) == ".GRD")
+ else if (ToUpperCase(Ext) == ".XYZ")
{
- AnzScheiben = LoadDGMGRD(FileName, NodeList, XyList, MaxNodesPerSlice, Debug);
+ AnzScheiben = LoadDGMXYZ(FileName, NodeList, XyList, MaxNodesPerSlice, Debug);
CheckForDuplicates(NodeList, Debug);
}
else if (ToUpperCase(Ext) == ".SHP")
@@ -88,7 +88,7 @@
}
else
{
- write_error(1222, "Ungültige Dateinamenserweiterung '%s' beim Dateinamen '%s' für den Parameter -DGM", ToUpperCase(Ext).c_str(), FileName.c_str());
+ write_error(1222, "Ungültige Dateinamenserweiterung '%s' beim Dateinamen '%s' für den Parameter -DGM\n", ToUpperCase(Ext).c_str(), FileName.c_str());
}
write_fortschritt("DGM geladen<-\n");
@@ -121,12 +121,12 @@
if (fhxy == 0)
{
- write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", XyFileName.c_str());
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", XyFileName.c_str());
}
if (fhz == 0)
{
- write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", ZFileName.c_str());
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", ZFileName.c_str());
}
double X;
@@ -144,7 +144,9 @@
Swap8Bytes((byte *)&Y);
Swap4Bytes((byte *)&Z);
- if (++AnzNodes > 4)
+ AnzNodes++;
+
+ if (Z < 1e30 && Z > -1e30)
{
X = (long)(X * 100.0 + 0.5) / 100.0;
Y = (long)(Y * 100.0 + 0.5) / 100.0;
@@ -173,7 +175,7 @@
if (fhod == 0)
{
- write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", OdFileName.c_str());
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", OdFileName.c_str());
}
int Nr1;
@@ -192,19 +194,16 @@
Swap4Bytes((byte *)&Nr2);
Swap4Bytes((byte *)&Nr3);
- if (Nr1 > 4 && Nr2 > 4 && Nr3 > 4)
+ TNode *Node1 = NodeList->FindByNr(Nr1);
+ TNode *Node2 = NodeList->FindByNr(Nr2);
+ TNode *Node3 = NodeList->FindByNr(Nr3);
+
+ if (Node1 && Node2 && Node3)
{
- TNode *Node1 = NodeList->FindByNr(Nr1);
- TNode *Node2 = NodeList->FindByNr(Nr2);
- TNode *Node3 = NodeList->FindByNr(Nr3);
-
- if (Node1 && Node2 && Node3)
- {
- TElement *Element = new TElement(Node1, Node2, Node3);
- ElementList->push_back(Element);
- }
- AnzElements++;
+ TElement *Element = new TElement(Node1, Node2, Node3);
+ ElementList->push_back(Element);
}
+ AnzElements++;
}
fclose(fhod);
@@ -217,16 +216,236 @@
if (fhz) fclose(fhz);
if (fhod) fclose(fhod);
- write_error(2299, "Es hat einen nicht näher bestimmten Eingabefehler gegeben.\nDer Datenträger könnte beschädigt sein");
+ write_error(2299, "Es hat einen nicht näher bestimmten Eingabefehler gegeben.\nDer Datenträger könnte beschädigt sein\n");
}
write_fortschritt("DGM TIN laden beendet<-\n");
- if (AnzNodes <= MaxNodesPerSlice) return (1);
- else return ((AnzNodes - 1) / MaxNodesPerSlice + 1);
+ if (NodeList->size() <= MaxNodesPerSlice) return (1);
+ else return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
}
//---------------------------------------------------------------------------
+unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
+{
+ write_fortschritt("->DGM GRD laden\n");
+
+ if (NodeList == 0) dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
+
+ FILE *fh = fopen(FileName.c_str(), "r");
+ if (fh == 0)
+ {
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
+ }
+
+ char line[1000];
+ std::string Line;
+
+ int NCols = 0;
+ int NRows = 0;
+ bool Center = false;
+ double Xll = 0;
+ double Yll = 0;
+ double CellSize = 0.0;
+ double NoDataValue = 0.0;
+
+ ////////////
+ // NCols
+ ////////////
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die 1. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+
+ Line = line;
+ Line = ToUpperCase(Line);
+
+ if (1 != sscanf(Line.c_str(), "NCOLS%d", &NCols))
+ {
+ write_error(2215, "Konnte in der 1. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'ncols' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+
+ if (NCols <= 0)
+ {
+ write_error(3209, "In der Datei '%s' ist NCols (%d) kleiner gleich Null.\nNCols muss immer positiv sein.\n", FileName.c_str(), NRows);
+ }
+
+ ////////////
+ // NRows
+ ////////////
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die 2. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+
+ Line = line;
+ Line = ToUpperCase(Line);
+
+ if (1 != sscanf(Line.c_str(), "NROWS%d", &NRows))
+ {
+ write_error(2215, "Konnte in der 2. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'nrows' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+
+ if (NRows <= 0)
+ {
+ write_error(3209, "In der Datei '%s' ist NCols (%d) kleiner gleich Null.\nNCols muss immer positiv sein.\n", FileName.c_str(), NCols);
+ }
+
+ ////////////
+ // XLLCENTER oder XLLCORNER
+ ////////////
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die 3. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+
+ Line = line;
+ Line = ToUpperCase(Line);
+
+ if (1 != sscanf(Line.c_str(), "XLLCORNER%lf", &Xll))
+ {
+ if (1 != sscanf(Line.c_str(), "XLLCENTER%lf", &Xll))
+ {
+ write_error(2215, "Konnte in der 3. Kopfzeile der Datei '%s'\nweder das Schlüsselwort 'xllcorner'\nnoch das Schlüsselwort 'xllcenter' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+ else
+ {
+ Center = true;
+ }
+ }
+
+ ////////////
+ // YLLCENTER oder YLLCORNER
+ ////////////
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die 4. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+
+ Line = line;
+ Line = ToUpperCase(Line);
+
+ if (Center)
+ {
+ if (1 != sscanf(Line.c_str(), "YLLCENTER%lf", &Yll))
+ {
+ write_error(2215, "Konnte in der 4. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'yllcenter' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+ }
+ else
+ {
+ if (1 != sscanf(Line.c_str(), "YLLCORNER%lf", &Yll))
+ {
+ write_error(2215, "Konnte in der 4. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'yllcorner' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+ }
+
+ ////////////
+ // CellSize
+ ////////////
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die 5. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+
+ Line = line;
+ Line = ToUpperCase(Line);
+
+ if (1 != sscanf(Line.c_str(), "CELLSIZE%lf", &CellSize))
+ {
+ write_error(2215, "Konnte in der 5. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'cellsize' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+
+ if (CellSize <= 0)
+ {
+ write_error(3211, "In der Datei '%s' ist CellSize (%.2f) kleiner gleich Null.\nCellSize muss immer positiv sein.\n", FileName.c_str(), CellSize);
+ }
+
+ ////////////
+ // NoDataValue
+ ////////////
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die 6. Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+
+ Line = line;
+ Line = ToUpperCase(Line);
+
+ if (1 != sscanf(Line.c_str(), "NODATA_VALUE%lf", &NoDataValue))
+ {
+ write_error(2215, "Konnte in der 6. Kopfzeile der Datei '%s'\nnicht das Schlüsselwort 'nodata_value' gefolgt von einer Zahl lesen\n", FileName.c_str());
+ }
+
+
+ unsigned int MaxWerte = NCols * NRows;
+ unsigned int AnzWerte = 0;
+ unsigned int AnzKnoten = 0;
+ for (unsigned int i=0; i<MaxWerte; i++)
+ {
+ if (1 != fscanf (fh, "%s", line))
+ {
+ write_error(2298, "Konnte den %d. Wert in der Datei '%s' nicht lesen\n", AnzWerte+1, FileName.c_str());
+ }
+
+ for (unsigned int i=0; i<strlen(line); i++)
+ {
+ if (line[i] == ',') line[i] = '.';
+ }
+
+ double Z = 0.0;
+ double X = Xll + (AnzWerte % NCols) * CellSize;
+ double Y = Yll + (NRows-1) * CellSize - (AnzWerte / NCols) * CellSize;
+ if (false == Center)
+ {
+ X = X + CellSize / 2.0;
+ Y = Y + CellSize / 2.0;
+ }
+
+ if (1 != sscanf (line, "%lf", &Z))
+ {
+ write_error(2298, "Konnte den %d. Wert in der Datei '%s' nicht lesen\n", AnzWerte+1, FileName.c_str());
+ }
+
+ AnzWerte++;
+
+ if (Debug && AnzWerte % 10000 == 0) write_fortschritt("%d von %d Werten gelesen, %d von %d Knoten gespeichert\n", AnzWerte, MaxWerte, NodeList->size(), AnzKnoten);
+ else if (AnzWerte % 100000 == 0) write_fortschritt("%d von %d Werten gelesen, %d von %d Knoten gespeichert\n", AnzWerte, MaxWerte, NodeList->size(), AnzKnoten);
+
+ X = (long)(X * 100 + 0.5) / 100.0;
+ Y = (long)(Y * 100 + 0.5) / 100.0;
+ Z = (long)(Z * 100 + 0.5) / 100.0;
+
+ TInsideTyp InsideTyp = INSIDE;
+ if (XyList) InsideTyp = XyList->IsInsideXYList(X, Y);
+ if (InsideTyp == INSIDE || InsideTyp == ON_LINE)
+ {
+ AnzKnoten++;
+
+ if (AnzKnoten < MaxNodesPerSlice)
+ {
+ TNode *Node = new TNode(AnzKnoten, X, Y, Z);
+ NodeList->push_back(Node);
+ }
+ }
+ }
+ write_fortschritt("%d von %d Werten gelesen, %d von %d Knoten gespeichert\n", AnzWerte, MaxWerte, NodeList->size(), AnzKnoten);
+
+ fclose(fh);
+
+ write_fortschritt("DGM GRD laden beendet<-\n");
+
+ if (NodeList->size() <= MaxNodesPerSlice) return (1);
+ else return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
+}
+
+//---------------------------------------------------------------------------
unsigned int LoadDGMXYZ(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
{
write_fortschritt("->DGM XYZ laden\n");
@@ -236,14 +455,14 @@
FILE *fh = fopen(FileName.c_str(), "r");
if (fh == 0)
{
- write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", FileName.c_str());
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
}
char line[1000];
if (0 == fgets (line, sizeof(line)-1, fh))
{
- write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen", FileName.c_str());
+ write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
}
line[sizeof(line)-1] = '\0';
@@ -271,7 +490,7 @@
if (3 != sscanf (line, "%lf%lf%lf", &X, &Y, &Z))
{
- write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+ write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
}
X = (long)(X * 100) / 100.0;
@@ -296,26 +515,11 @@
write_fortschritt("DGM XYZ laden beendet<-\n");
- if (AnzKnoten <= MaxNodesPerSlice) return (1);
- else return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
+ if (NodeList->size() <= MaxNodesPerSlice) return (1);
+ else return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
}
//---------------------------------------------------------------------------
-unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
-{
- write_fortschritt("->DGM GRD laden\n");
-
- if (NodeList == 0) dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
-
- unsigned int AnzKnoten = 0;
-
- write_fortschritt("DGM GRD laden beendet<-\n");
-
- if (AnzKnoten <= MaxNodesPerSlice) return (1);
- else return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
-}
-
-//---------------------------------------------------------------------------
unsigned int LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug)
{
write_fortschritt("->DGM SHP laden\n");
@@ -327,7 +531,7 @@
if (hSHP == NULL)
{
- write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", SHPFileName.c_str());
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", SHPFileName.c_str());
}
int RecordCount = 0;
@@ -335,15 +539,122 @@
double Mins[4];
double Maxs[4];
+ std::string DBFFileName = ExchangeFileExt(FileName, ".DBF");
+ DBFHandle hDBF = DBFOpen(DBFFileName.c_str(), "rb");
+ if (hDBF == NULL)
+ {
+ SHPClose(hSHP);
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", DBFFileName.c_str());
+ return (false);
+ }
+
SHPGetInfo(hSHP, &RecordCount, &ShapeType, Mins, Maxs);
if (RecordCount == 0)
{
SHPClose(hSHP);
- write_error(2204, "Es sind keine Objekte in der Shapedatei '%s'", SHPFileName.c_str());
+ write_error(2204, "Es sind keine Objekte in der Shapedatei '%s'\n", SHPFileName.c_str());
}
+ if (ShapeType != SHPT_POINT && ShapeType != SHPT_POINTZ && ShapeType != SHPT_POINTM)
+ {
+ write_error(2213, "Der Typ ('%s') der Shape-Datei '%s' ist nicht POINT, POINTZ oder POINTM.\nNur die genannten Typen sind für DGM-Daten zulässig.\n", ShapeTypeName(ShapeType), SHPFileName.c_str());
+ }
+
+ int DBFRecordCount = DBFGetRecordCount(hDBF);
+
+ if (DBFRecordCount == 0)
+ {
+ DBFClose(hDBF);
+ SHPClose(hSHP);
+
+ write_error(2204, "Es sind keine Objekte in der DBF-Datei '%s'\n", DBFFileName.c_str());
+ }
+
+ if (DBFRecordCount != RecordCount)
+ {
+ DBFClose(hDBF);
+ SHPClose(hSHP);
+
+ write_error(2205, "Shape-Datei '%s' und DBF-Datei '%s' enthalten verschieden viele Objekte\n", SHPFileName.c_str(), DBFFileName.c_str());
+ }
+
+ int FieldCount = DBFGetFieldCount(hDBF);
+
+ if (ShapeType != SHPT_POINTZ && FieldCount == 0)
+ {
+ SHPClose(hSHP);
+ DBFClose(hDBF);
+
+ write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs muss aber mindestens das Attibute 'Z' definiert sein.\n", DBFFileName.c_str());
+ }
+
+ std::string ZName = "Z";
+ int ZFieldIndex = DBFGetFieldIndex(hDBF, "Z");
+ if (ZFieldIndex == -1)
+ {
+ ZName = "z";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+ if (ZFieldIndex == -1)
+ {
+ ZName = "Topo";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+ if (ZFieldIndex == -1)
+ {
+ ZName = "TOPO";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+ if (ZFieldIndex == -1)
+ {
+ ZName = "topo";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+ if (ZFieldIndex == -1)
+ {
+ ZName = "mNN";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+ if (ZFieldIndex == -1)
+ {
+ ZName = "Höhe";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+ if (ZFieldIndex == -1)
+ {
+ ZName = "m";
+ ZFieldIndex = DBFGetFieldIndex(hDBF, ZName.c_str());
+ }
+
+ if (ShapeType != SHPT_POINTZ && ZFieldIndex == -1)
+ {
+ SHPClose(hSHP);
+ DBFClose(hDBF);
+
+ write_error(2207, "In der DBD-Datei %s' ist das Attribut 'Z' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ }
+
+ if (ZFieldIndex)
+ {
+ int Width = 0;
+ int Decimals = 0;
+ if (DBFGetFieldInfo(hDBF, ZFieldIndex, NULL, &Width, &Decimals) != FTDouble)
+ {
+ SHPClose(hSHP);
+ DBFClose(hDBF);
+
+ write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes 'Z' nicht Double.\n", DBFFileName.c_str());
+ }
+ }
+
+ if (ShapeType == SHPT_POINTZ && ZFieldIndex >= 0)
+ {
+ write_warning(2219, "Es liegen sowohl Höheninformationen an den Punkten (POINTZ-Shape) als auch als Attribut '%s' vor\nEs werden die Informationen des Attributes genommen.\n", ZName.c_str());
+ }
+
+
unsigned int AnzKnoten = 0;
for (int i = 0; i<RecordCount; i++)
{
@@ -365,6 +676,8 @@
double Y = psCShape->padfY[j];
double Z = psCShape->padfZ[j];
+ if (ZFieldIndex >= 0) Z = DBFReadDoubleAttribute(hDBF, i, ZFieldIndex);
+
X = (long)(X * 100) / 100.0;
Y = (long)(Y * 100) / 100.0;
Z = (long)(Z * 100) / 100.0;
@@ -391,8 +704,8 @@
write_fortschritt("DGM SHP laden beendet<-\n");
- if (AnzKnoten <= MaxNodesPerSlice) return (1);
- else return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
+ if (NodeList->size() <= MaxNodesPerSlice) return (1);
+ else return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
}
//---------------------------------------------------------------------------
@@ -405,20 +718,20 @@
FILE *fh = fopen(FileName.c_str(), "r");
if (fh == 0)
{
- write_error(2201, "Konnte '%s' nicht zum Lesen öffnen", FileName.c_str());
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
}
char line[1000];
if (0 == fgets (line, sizeof(line)-1, fh))
{
- write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen", FileName.c_str());
+ write_error(2298, "Konnte die Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
}
line[sizeof(line)-1] = '\0';
if (strncmp(line, "MESH2D", 6) != 0)
{
- write_error(2298, "Die Kopfzeile in der Datei '%s' war nicht korrekt", FileName.c_str());
+ write_error(2298, "Die Kopfzeile in der Datei '%s' war nicht korrekt\n", FileName.c_str());
}
unsigned int AnzKnoten = 0;
@@ -445,7 +758,7 @@
if (4 != sscanf(line, "ND%d%lf%lf%lf\n", &Nr, &X, &Y, &Z))
{
- write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+ write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
}
X = (long)(X * 100) / 100.0;
@@ -493,7 +806,7 @@
{
if (5 != sscanf(line, "E3T%d%d%d%d%d\n", &Nr, &Node1Nr, &Node2Nr, &Node3Nr, &Prop))
{
- write_error(2297, "Konnte keine 5 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+ write_error(2297, "Konnte keine 5 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
}
TNode *Node1 = NodeList->FindByNr(Node1Nr);
@@ -512,7 +825,7 @@
{
if (6 != sscanf(line, "E4Q%d%d%d%d%d%d\n", &Nr, &Node1Nr, &Node2Nr, &Node3Nr, &Node4Nr, &Prop))
{
- write_error(2297, "Konnte keine 6 Werte in der Datei '%s' in der Zeile %d lesen", FileName.c_str(), AnzZeilen);
+ write_error(2297, "Konnte keine 6 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
}
TNode *Node1 = NodeList->FindByNr(Node1Nr);
@@ -536,8 +849,8 @@
write_fortschritt("DGM 2DM laden beendet<-\n");
- if (AnzKnoten <= MaxNodesPerSlice) return (1);
- else return ((AnzKnoten - 1) / MaxNodesPerSlice + 1);
+ if (NodeList->size() <= MaxNodesPerSlice) return (1);
+ else return ((NodeList->size() - 1) / MaxNodesPerSlice + 1);
}
//---------------------------------------------------------------------
@@ -587,8 +900,6 @@
write_error(2213, "Der Typ ('%s') der Shape-Datei '%s' ist nicht ARC, ARCZ oder ARCM.\nNur die genannten Typen sind für Profilspuren zulässig.\n", ShapeTypeName(ShapeType), SHPFileName.c_str());
}
-
-
int DBFRecordCount = DBFGetRecordCount(hDBF);
if (DBFRecordCount == 0)
@@ -616,27 +927,94 @@
SHPClose(hSHP);
DBFClose(hDBF);
- write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute GEW und STATION definiert sein.\n", DBFFileName.c_str());
+ write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute Z und STATION definiert sein.\n", DBFFileName.c_str());
}
+ std::string GewName = "GEW";
int GewFieldIndex = DBFGetFieldIndex(hDBF, "GEW");
+ if (GewFieldIndex == -1)
+ {
+ GewName = "Gew";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "gew";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "GEWÄSSER";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "Gewässer";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "gewässer";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
if (GewFieldIndex == -1)
{
SHPClose(hSHP);
DBFClose(hDBF);
- write_error(2207, "In der DBD-Datei %s' ist das Attribut GEW nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ write_error(2207, "In der DBD-Datei %s' ist das Attribut 'GEW' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
}
- int StationFieldIndex = DBFGetFieldIndex(hDBF, "STATION");
+ std::string StationName = "STATION";
+ int StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ if (StationFieldIndex == -1)
+ {
+ StationName = "Station";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "station";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "KILOMETER";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "Kilometer";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "kilometer";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "KM";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "Km";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "km";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
if (StationFieldIndex == -1)
{
SHPClose(hSHP);
DBFClose(hDBF);
- write_error(2208, "In der DBD-Datei '%s' ist das Attribut STATION nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ write_error(2208, "In der DBD-Datei '%s' ist das Attribut 'STATION' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
}
int Width = 0;
@@ -646,7 +1024,7 @@
SHPClose(hSHP);
DBFClose(hDBF);
- write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes 'GEW' nicht Text.\n", DBFFileName.c_str());
+ write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Text.\n", DBFFileName.c_str(), GewName.c_str());
}
if (DBFGetFieldInfo(hDBF, StationFieldIndex, NULL, &Width, &Decimals) != FTDouble)
@@ -654,12 +1032,12 @@
SHPClose(hSHP);
DBFClose(hDBF);
- write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes 'STATION' nicht Fliesskommazahl.\n", DBFFileName.c_str());
+ write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Fliesskommazahl.\n", DBFFileName.c_str(), StationName.c_str());
}
for (int i = 0; i<RecordCount; i++)
{
- if (ProfilList->size() > 0 && ProfilList->size() % 10 == 0) write_fortschritt("%d Profilspuren geladen\n", ProfilList->size());
+ if (ProfilList->size() > 0 && ProfilList->size() % 100 == 0) write_fortschritt("%d Profilspuren geladen\n", ProfilList->size());
std::string Gewaesser = DBFReadStringAttribute(hDBF, i, GewFieldIndex);
double S = DBFReadDoubleAttribute(hDBF, i, StationFieldIndex);
@@ -679,7 +1057,7 @@
if (AnzVert <= 0)
{
- write_warning(2112, "In der DBD-Datei '%s' hat das Profil ('%s',%.4f) keine Stützstellen.\nEs wird ignoriert.", DBFFileName.c_str(), Gewaesser.c_str(), Station / 10000.0);
+ write_warning(2112, "In der DBD-Datei '%s' hat das Profil ('%s',%.4f) keine Stützstellen.\nEs wird ignoriert.\n", DBFFileName.c_str(), Gewaesser.c_str(), Station / 10000.0);
continue;
}
@@ -707,6 +1085,63 @@
write_fortschritt("Profilspuren laden beendet<-\n");
+ write_fortschritt("->Die Profilspuren werden ausgerichtet\n");
+
+ TProfil* VorProfil = 0;
+ TProfil* NachProfil = 0;
+ for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
+ {
+ VorProfil = NachProfil;
+ NachProfil = *i;
+
+ if (VorProfil == 0) continue;
+
+ TPoint* VorAnfang = *VorProfil->PointList->begin();
+ TPoint* VorEnde = *VorProfil->PointList->rbegin();
+
+ TPoint* NachAnfang = *NachProfil->PointList->begin();
+ TPoint* NachEnde = *NachProfil->PointList->rbegin();
+
+ double VAx = VorAnfang->X;
+ double VAy = VorAnfang->Y;
+ double VEx = VorEnde->X;
+ double VEy = VorEnde->Y;
+ double NAx = NachAnfang->X;
+ double NAy = NachAnfang->Y;
+ double NEx = NachEnde->X;
+ double NEy = NachEnde->Y;
+
+ double X = 0.0;
+ double Y = 0.0;
+ double LambdaA = -1;
+ double LambdaE = -1;
+ if (Calc2Schnitt(VAx, VAy, NAx, NAy, VEx, VEy, NEx, NEy, &X, &Y, &LambdaA, &LambdaE))
+ {
+ if (LambdaA < 0 || LambdaA > 1 || LambdaE < 0 || LambdaE > 1) continue;
+
+ // Hier ist ein echter Schnittpunkt gefunden
+ // Jetzt muss das NachProfil in seiner Reihenfolge vertauscht werden
+
+ TProfil* ExChangeProfil = new TProfil(NachProfil->Gewaesser, NachProfil->Station);
+ for (TPointList::reverse_iterator j = NachProfil->PointList->rbegin(); j != NachProfil->PointList->rend(); j++)
+ {
+ double X = (*j)->X;
+ double Y = (*j)->Y;
+
+ ExChangeProfil->AddPoint(X, Y);
+ }
+ ProfilList->erase(i);
+ delete NachProfil;
+ ProfilList->insert(ExChangeProfil);
+ i = ProfilList->begin();
+ VorProfil = 0;
+ NachProfil = 0;
+ }
+ }
+
+
+ write_fortschritt("Die Profilspuren sind nun ausgerichtet<-\n");
+
return (true);
}
@@ -715,6 +1150,34 @@
{
write_fortschritt("->Wasserstände werden geladen\n");
+ std::string Ext = GetFileExt(FileName);
+
+ bool Status = true;
+
+ if (ToUpperCase(Ext) == ".DBF")
+ {
+ Status = LoadWspDBF(FileName, ProfilList);
+ }
+ else
+ {
+ Status = LoadWspTxt(FileName, ProfilList);
+ }
+
+ write_fortschritt("Wasserstände wurden geladen<-\n");
+
+ return (Status);
+}
+
+//---------------------------------------------------------------------
+bool LoadWspTxt(std::string FileName, TProfilList* ProfilList)
+{
+ write_fortschritt("->Wasserstände im ASCII-Format werden geladen\n");
+
+ if (ProfilList == 0)
+ {
+ dump_error(__FILE__, __LINE__, "ProfilListe ist undefiniert\n");
+ }
+
FILE *fh = fopen(FileName.c_str(), "r");
if (fh == 0)
{
@@ -730,7 +1193,7 @@
char line[1000];
while (fgets (line, sizeof (line)-1, fh))
{
- if (ProfilList->size() > 0 && ProfilList->size() % 10 == 0) write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
+ if (ProfilList->size() > 0 && ProfilList->size() % 100 == 0) write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
AktZeile++;
@@ -758,17 +1221,17 @@
if (AktZeile == 1)
{
- if (strncmp(Col, "GEW", 3) == 0)
+ if (strcmp(Col, "GEW") == 0 || strcmp(Col, "Gew") == 0 || strcmp(Col, "gew") == 0 || strcmp(Col, "GEWÄSSER") == 0 || strcmp(Col, "Gewässer") == 0 || strcmp(Col, "gewässer") == 0)
{
GewCol = AktCol;
ColOk++;
}
- if (strncmp(Col, "STATION", 7) == 0)
+ if (strcmp(Col, "STATION") == 0 || strcmp(Col, "Station") == 0 || strcmp(Col, "station") == 0 || strcmp(Col, "KILOMETER") == 0 || strcmp(Col, "Kilometer") == 0 || strcmp(Col, "kilometer") == 0 || strcmp(Col, "KM") == 0 || strcmp(Col, "Km") == 0 || strcmp(Col, "km") == 0)
{
StationCol = AktCol;
ColOk++;
}
- if (strncmp(Col, "WSP", 3) == 0)
+ if (strcmp(Col, "WSP") == 0 || strcmp(Col, "Wsp") == 0 || strcmp(Col, "wsp") == 0 || strcmp(Col, "WASSERSTAND") == 0 || strcmp(Col, "Wasserstand") == 0 || strcmp(Col, "wasserstand") == 0)
{
WspCol = AktCol;
ColOk++;
@@ -802,8 +1265,11 @@
P = P + strlen(Col) + 1;
}
- if (ColOk != 3) write_error(2215, "Nicht genug Informationen in der Zeile\n");
+ if (ColOk != 3 && AktZeile == 1) write_error(2215, "Nicht genug Informationen in der ersten Zeile\nEs müssen die Feldnamen GEW, STATION und WSP vorkommen.\n");
+
+ if (ColOk != 3 && AktZeile > 1) write_error(2215, "Nicht genug Informationen in der Zeile %d.\n", AktZeile);
+
if (AktZeile == 1) continue;
int Station = (int)(StationD * 10000.0 + 0.5);
@@ -817,12 +1283,227 @@
fclose(fh);
- write_fortschritt("Wasserstände wurden geladen<-\n");
+ write_fortschritt("Wasserstände im ASCII-Format wurden geladen<-\n");
return (true);
}
//---------------------------------------------------------------------
+bool LoadWspDBF(std::string FileName, TProfilList* ProfilList)
+{
+ write_fortschritt("->Wasserstände im DBF-Format werden geladen\n");
+
+ if (ProfilList == 0)
+ {
+ dump_error(__FILE__, __LINE__, "ProfilListe ist undefiniert\n");
+ }
+
+ std::string DBFFileName = ExchangeFileExt(FileName, ".DBF");
+ DBFHandle hDBF = DBFOpen(DBFFileName.c_str(), "rb");
+ if (hDBF == NULL)
+ {
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", DBFFileName.c_str());
+ return (false);
+ }
+
+ int DBFRecordCount = DBFGetRecordCount(hDBF);
+
+ if (DBFRecordCount == 0)
+ {
+ DBFClose(hDBF);
+
+ write_error(2204, "Es sind keine Objekte in der DBF-Datei '%s'\n", DBFFileName.c_str());
+ }
+
+ int RecordCount = DBFRecordCount;
+
+ int FieldCount = DBFGetFieldCount(hDBF);
+
+ if (FieldCount == 0)
+ {
+ DBFClose(hDBF);
+
+ write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute GEW und STATION definiert sein.\n", DBFFileName.c_str());
+ }
+
+ std::string GewName = "GEW";
+ int GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ if (GewFieldIndex == -1)
+ {
+ GewName = "Gew";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "gew";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "GEWÄSSER";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "Gewässer";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "gewässer";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+
+ if (GewFieldIndex == -1)
+ {
+ DBFClose(hDBF);
+
+ write_error(2207, "In der DBD-Datei %s' ist das Attribut 'GEW' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ }
+
+ std::string StationName = "STATION";
+ int StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ if (StationFieldIndex == -1)
+ {
+ StationName = "Station";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "station";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "KILOMETER";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "Kilometer";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "kilometer";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "KM";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "Km";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+ if (StationFieldIndex == -1)
+ {
+ StationName = "km";
+ StationFieldIndex = DBFGetFieldIndex(hDBF, StationName.c_str());
+ }
+
+ if (StationFieldIndex == -1)
+ {
+ DBFClose(hDBF);
+
+ write_error(2208, "In der DBD-Datei '%s' ist das Attribut 'STATION' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ }
+
+ std::string WspName = "WSP";
+ int WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+ if (WspFieldIndex == -1)
+ {
+ WspName = "Wsp";
+ WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+ }
+ if (WspFieldIndex == -1)
+ {
+ WspName = "wsp";
+ WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+ }
+ if (WspFieldIndex == -1)
+ {
+ WspName = "WASSERSTAND";
+ WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+ }
+ if (WspFieldIndex == -1)
+ {
+ WspName = "Wasserstand";
+ WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+ }
+ if (WspFieldIndex == -1)
+ {
+ WspName = "wasserstand";
+ WspFieldIndex = DBFGetFieldIndex(hDBF, WspName.c_str());
+ }
+
+ if (WspFieldIndex == -1)
+ {
+ DBFClose(hDBF);
+
+ write_error(2207, "In der DBD-Datei %s' ist das Attribut 'WSP' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ }
+
+ int Width = 0;
+ int Decimals = 0;
+ if (DBFGetFieldInfo(hDBF, GewFieldIndex, NULL, &Width, &Decimals) != FTString)
+ {
+ DBFClose(hDBF);
+
+ write_error(2209, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Text.\n", DBFFileName.c_str(), GewName.c_str());
+ }
+
+ if (DBFGetFieldInfo(hDBF, StationFieldIndex, NULL, &Width, &Decimals) != FTDouble)
+ {
+ DBFClose(hDBF);
+
+ write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Fliesskommazahl.\n", DBFFileName.c_str(), StationName.c_str());
+ }
+
+ if (DBFGetFieldInfo(hDBF, WspFieldIndex, NULL, &Width, &Decimals) != FTDouble)
+ {
+ DBFClose(hDBF);
+
+ write_error(2210, "In der DBD-Datei '%s' ist der Attribut-Typ des Attributes '%s' nicht Fliesskommazahl.\n", DBFFileName.c_str(), WspName.c_str());
+ }
+
+ for (int i = 0; i<RecordCount; i++)
+ {
+ if (ProfilList->size() > 0 && ProfilList->size() % 100 == 0) write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
+
+ std::string Gewaesser = DBFReadStringAttribute(hDBF, i, GewFieldIndex);
+ double S = DBFReadDoubleAttribute(hDBF, i, StationFieldIndex);
+ double W = DBFReadDoubleAttribute(hDBF, i, WspFieldIndex);
+
+ int Station = (int)(S * 10000.0 + 0.5);
+ if (S < 0) Station = (int)(S * 10000.0 - 0.5);
+
+ double Wsp = (int)(W * 100.0 + 0.5) / 100.0;
+ if (Wsp < 0) Wsp = (int)(W * 100.0 - 0.5) / 100.0;
+
+ if (ProfilList->Find(Gewaesser, Station))
+ {
+ write_warning(2111, "In der DBD-Datei '%s' kommt der Wasserstand ('%s',%.4f) mehrfach vor.\nEs wird nur die erste Definition berücksichtigt.\n", DBFFileName.c_str(), Gewaesser.c_str(), Station / 10000.0);
+ continue;
+ }
+
+ TProfil* Profil = new TProfil(Gewaesser, Station, Wsp);
+
+ ProfilList->insert(Profil);
+ }
+
+ write_fortschritt("%d Wasserstände geladen\n", ProfilList->size());
+
+ DBFClose(hDBF);
+
+ write_fortschritt("Wasserstände im DBF-Format wurden geladen<-\n");
+
+ return (true);
+}
+
+//---------------------------------------------------------------------
bool LoadAchse(std::string FileName, TGewaesserAchseList* GewaesserAchseList)
{
write_fortschritt("->Gewässerachse wird geladen\n");
@@ -899,14 +1580,40 @@
write_error(2206, "In der DBD-Datei %s' sind keine Attribute definiert\nEs müssen aber mindestens die Attibute GEW und STATION definiert sein.\n", DBFFileName.c_str());
}
+ std::string GewName = "GEW";
int GewFieldIndex = DBFGetFieldIndex(hDBF, "GEW");
+ if (GewFieldIndex == -1)
+ {
+ GewName = "Gew";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "gew";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "GEWÄSSER";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "Gewässer";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
+ if (GewFieldIndex == -1)
+ {
+ GewName = "gewässer";
+ GewFieldIndex = DBFGetFieldIndex(hDBF, GewName.c_str());
+ }
if (GewFieldIndex == -1)
{
SHPClose(hSHP);
DBFClose(hDBF);
- write_error(2207, "In der DBD-Datei %s' ist das Attribut GEW nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
+ write_error(2207, "In der DBD-Datei %s' ist das Attribut 'GEW' nicht definiert\nEs muss aber vorhanden sein.\n", DBFFileName.c_str());
}
int Width = 0;
@@ -921,7 +1628,7 @@
for (int i = 0; i<RecordCount; i++)
{
- if (GewaesserAchseList->size() > 0 && GewaesserAchseList->size() % 10 == 0) write_fortschritt("%d Gewässerachsen geladen\n", GewaesserAchseList->size());
+ if (GewaesserAchseList->size() > 0 && GewaesserAchseList->size() % 100 == 0) write_fortschritt("%d Gewässerachsen geladen\n", GewaesserAchseList->size());
std::string Gewaesser = DBFReadStringAttribute(hDBF, i, GewFieldIndex);
@@ -931,11 +1638,10 @@
if (AnzVert <= 0)
{
- write_warning(2118, "In der DBD-Datei '%s' hat eine Gewässerachse ('%s') keine Stützstellen.\nSie wird ignoriert.", DBFFileName.c_str(), Gewaesser.c_str());
+ write_warning(2118, "In der DBD-Datei '%s' hat eine Gewässerachse ('%s') keine Stützstellen.\nSie wird ignoriert.\n", DBFFileName.c_str(), Gewaesser.c_str());
continue;
}
-
TGewaesserAchse* GewaesserAchse = new TGewaesserAchse(Gewaesser, i);
GewaesserAchseList->insert(GewaesserAchse);
@@ -973,7 +1679,7 @@
FILE *fh = fopen (FileName.c_str(), "w");
if (fh == NULL)
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
fprintf(fh, "MESH2D\n");
@@ -1076,25 +1782,25 @@
DBFHandle DBFHandle = DBFCreate(FileName.c_str());
if(DBFHandle == NULL )
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "GEW", FTString, 255, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "STATION", FTDouble, 10, 4) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'STATION' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'STATION' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "WSP", FTDouble, 8, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'WSP' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'WSP' nicht erzeugen\n", FileName.c_str());
}
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_ARC);
@@ -1103,9 +1809,6 @@
int AnzProfil = 0;
for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
{
- if (Debug && AnzProfil % 100 == 0) write_fortschritt("%d Profile bearbeitet\n", AnzProfil);
- else if (AnzProfil % 1000 == 0) write_fortschritt("%d Profile bearbeitet\n", AnzProfil);
-
TProfil* Profil = *i;
std::string Gewaesser = Profil->Gewaesser;
@@ -1131,17 +1834,6 @@
AnzPoint++;
}
- TPoint* Point = *Profil->PointList->begin();
-
- double X = Point->X;
- double Y = Point->Y;
-
- x[AnzPoint] = X;
- y[AnzPoint] = Y;
- z[AnzPoint] = 0.0;
-
- AnzPoint++;
-
SHPObject *psShape = SHPCreateSimpleObject(SHPT_ARC, AnzPoint, x, y, z);
SHPWriteObject(SHPHandle, -1, psShape);
SHPDestroyObject(psShape);
@@ -1155,7 +1847,11 @@
free(z);
AnzProfil++;
+
+ if (Debug && AnzProfil % 100 == 0) write_fortschritt("%d Profile gespeichert\n", AnzProfil);
+ else if (0 && AnzProfil % 1000 == 0) write_fortschritt("%d Profile gespeichert\n", AnzProfil);
}
+ write_fortschritt("%d Profile gespeichert\n", AnzProfil);
DBFClose(DBFHandle);
SHPClose(SHPHandle);
@@ -1173,25 +1869,25 @@
DBFHandle DBFHandle = DBFCreate(FileName.c_str());
if(DBFHandle == NULL )
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "GEW", FTString, 255, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "VON", FTInteger, 10, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "BIS", FTInteger, 10, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen\n", FileName.c_str());
}
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
@@ -1256,33 +1952,49 @@
DBFHandle DBFHandle = DBFCreate(FileName.c_str());
if(DBFHandle == NULL )
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "GEW", FTString, 255, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'GEW' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "VONKM", FTDouble, 12, 4) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'VON' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "BISKM", FTDouble, 12, 4) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "DELTA", FTDouble, 12, 4) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'BIS' nicht erzeugen\n", FileName.c_str());
}
+ if (Debug)
+ {
+ for (TErgebnisPolygonList::iterator i = ErgebnisPolygonList->begin(); i != ErgebnisPolygonList->end(); i++)
+ {
+ TErgebnisPolygon* ErgebnisPolygon = *i;
+
+ std::string AktGewaesser = ErgebnisPolygon->Gewaesser;
+ double AktVonKm = ErgebnisPolygon->VonKm;
+ double AktBisKm = ErgebnisPolygon->BisKm;
+ double AktDiff = ErgebnisPolygon->Diff;
+
+ write_fortschritt("Gewässer %s %.4f - %.4f Wassertiefe %.2f\n", AktGewaesser.c_str(), AktVonKm, AktBisKm, AktDiff);
+ }
+ }
+
+
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
int AnzPolygons = 0;
@@ -1296,6 +2008,8 @@
double AktBisKm = ErgebnisPolygon->BisKm;
double AktDiff = ErgebnisPolygon->Diff;
+ write_fortschritt("Gewässer %s %.4f - %.4f Wassertiefe %.2f ", AktGewaesser.c_str(), AktVonKm, AktBisKm, AktDiff);
+
size_t Size = 0;
int *ps = 0;
@@ -1310,7 +2024,7 @@
for (TErgebnisPolygonList::iterator j = ErgebnisPolygonList->begin(); j != ErgebnisPolygonList->end(); j++)
{
TErgebnisPolygon* EP1 = *j;
- if (EP1->Gewaesser != AktGewaesser || EP1->Diff != AktDiff) continue; // Die Moment nicht
+ if (EP1->Gewaesser != AktGewaesser || EP1->VonKm != AktVonKm || EP1->BisKm != AktBisKm || EP1->Diff != AktDiff) continue; // Die Moment nicht
TXYList::iterator First = EP1->begin();
@@ -1325,9 +2039,8 @@
TErgebnisPolygon* EP2 = *k;
if (EP2 == EP1) continue;
-
- if (EP2->Gewaesser != AktGewaesser || EP2->Diff != AktDiff) continue; // Die Moment auch nicht
+ if (EP2->Gewaesser != AktGewaesser || EP2->VonKm != AktVonKm || EP2->BisKm != AktBisKm || EP2->Diff != AktDiff) continue; // Die Moment auch nicht
if (EP2->IsInsideXYList(X, Y))
{
@@ -1370,6 +2083,9 @@
}
}
+ if (Debug) write_fortschritt("%d. Polygon %d Teile %d Ecken.\n", AnzPolygons+1, AnzPolyParts, AnzPolyPoints);
+ else write_fortschritt("\n");
+
if (AnzPolyParts > 0 && AnzPolyPoints > 0)
{
DBFWriteStringAttribute(DBFHandle, AnzPolygons, 0, AktGewaesser.c_str());
@@ -1396,7 +2112,7 @@
while (j != ErgebnisPolygonList->end())
{
TErgebnisPolygon* EP1 = *j;
- if (EP1->Gewaesser == AktGewaesser && EP1->Diff == AktDiff)
+ if (EP1->Gewaesser == AktGewaesser && EP1->VonKm == AktVonKm && EP1->BisKm == AktBisKm && EP1->Diff == AktDiff)
{
delete EP1;
ErgebnisPolygonList->erase(j);
@@ -1473,7 +2189,7 @@
if (Wsp > 0.0 && Depth <= 0.0)
{
- dump_error(__FILE__, __LINE__, "Wasserstand > 0 aber Wassertiefe <= 0");
+ dump_error(__FILE__, __LINE__, "Wasserstand > 0 aber Wassertiefe <= 0\n");
}
if (Wsp > 0) Topo = Wsp - Depth;
@@ -1556,25 +2272,25 @@
DBFHandle DBFHandle = DBFCreate(FileName.c_str());
if(DBFHandle == NULL )
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Topo", FTDouble, 7, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Wsp", FTDouble, 7, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Depth", FTDouble, 7, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen\n", FileName.c_str());
}
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POLYGON);
@@ -1607,25 +2323,25 @@
DBFHandle DBFHandle = DBFCreate(FileName.c_str());
if(DBFHandle == NULL )
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Topo", FTDouble, 7, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Topo' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Wsp", FTDouble, 7, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Wsp' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Depth", FTDouble, 7, 2) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Depth' nicht erzeugen\n", FileName.c_str());
}
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_POINT);
@@ -1670,19 +2386,19 @@
DBFHandle DBFHandle = DBFCreate(FileName.c_str());
if(DBFHandle == NULL )
{
- write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen", FileName.c_str());
+ write_error(4201, "Kann Datei '%s' nicht zum Schreiben öffnen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Nr1", FTInteger, 10, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr1' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr1' nicht erzeugen\n", FileName.c_str());
}
if (DBFAddField(DBFHandle, "Nr2", FTInteger, 10, 0) == -1)
{
DBFClose(DBFHandle);
- write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr2' nicht erzeugen", FileName.c_str());
+ write_error(4204, "Kann bei Datei '%s' das Attribut 'Nr2' nicht erzeugen\n", FileName.c_str());
}
SHPHandle SHPHandle = SHPCreate(FileName.c_str(), SHPT_ARC);
Modified: trunk/src/file.h
===================================================================
--- trunk/src/file.h 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/file.h 2006-03-21 00:53:11 UTC (rev 39)
@@ -22,13 +22,18 @@
unsigned int LoadDGM(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
unsigned int LoadDGMTIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
+unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
unsigned int LoadDGMXYZ(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
-unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
+unsigned int LoadDGMGRD(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
unsigned int LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
unsigned int LoadDGM2DM(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYList *XyList, unsigned int MaxNodesPerSlice, bool Debug);
bool LoadProfile(std::string FileName, TProfilList* ProfilList);
+
bool LoadWsp(std::string FileName, TProfilList* ProfilList);
+bool LoadWspTxt(std::string FileName, TProfilList* ProfilList);
+bool LoadWspDBF(std::string FileName, TProfilList* ProfilList);
+
bool LoadAchse(std::string FileName, TGewaesserAchseList* GewaesserAchseList);
bool SaveNet(std::string FileName, TNodeList *NodeList, TElementList *ElementList, bool Debug);
Modified: trunk/src/parameter.cpp
===================================================================
--- trunk/src/parameter.cpp 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/parameter.cpp 2006-03-21 00:53:11 UTC (rev 39)
@@ -63,7 +63,7 @@
std::vector<std::string> ParList;
int AnzPar = 0;
- for (int i=0, j=0; i<argc || j<AnzPar; i++)
+ for (int i=1, j=0; i<argc || j<AnzPar; i++)
{
std::string Parameter = "";
@@ -79,15 +79,19 @@
if (Parameter.substr(0, 6) == "-DEBUG" || Parameter.substr(0, 6) == "-debug")
{
+ ///////////////////////////////////////////////
+ // DEBUG
+ ///////////////////////////////////////////////
write_fortschritt("Parameter -DEBUG erkannt.\n");
write_fortschritt("Es werden jetzt ausführliche Informationen ausgegeben.\n");
IsDebug = true;
- continue;
}
-
- if (Parameter.substr(0, 4) == "-PAR" || Parameter.substr(0, 4) == "-par")
+ else if (Parameter.substr(0, 4) == "-PAR" || Parameter.substr(0, 4) == "-par")
{
+ ///////////////////////////////////////////////
+ // PAR
+ ///////////////////////////////////////////////
if (IsDebug) write_fortschritt("Parameter -PAR erkannt.\n");
if (IsSetPar)
@@ -112,12 +116,12 @@
LoadPar(FileNamePar, &ParList);
AnzPar = ParList.size();
-
- continue;
}
-
- if (Parameter.substr(0, 6) == "-DELTA" || Parameter.substr(0, 6) == "-delta")
+ else if (Parameter.substr(0, 6) == "-DELTA" || Parameter.substr(0, 6) == "-delta")
{
+ ///////////////////////////////////////////////
+ // DELTA
+ ///////////////////////////////////////////////
if (IsDebug) write_fortschritt("Parameter -DELTA erkannt.\n");
if (IsSetDelta)
@@ -178,12 +182,12 @@
if (IsSetDiff) write_fortschritt(" Diff = %.2f\n", Diff);
else write_fortschritt(" Diff = <default>\n");
}
-
- continue;
}
-
- if (Parameter.substr(0, 4) == "-GEL" || Parameter.substr(0, 4) == "-gel")
+ else if (Parameter.substr(0, 4) == "-GEL" || Parameter.substr(0, 4) == "-gel")
{
+ ///////////////////////////////////////////////
+ // GEL
+ ///////////////////////////////////////////////
if (IsDebug) write_fortschritt("Parameter -GEL erkannt.\n");
if (IsSetGel)
@@ -219,11 +223,8 @@
if (Sperre) write_fortschritt("Gelände wirkt als Sperre\n");
else write_fortschritt("Gelände wirkt nicht als Sperre\n");
}
-
- continue;
}
-
- if (Parameter.substr(0, 4) == "-DGM" || Parameter.substr(0, 4) == "-dgm")
+ else if (Parameter.substr(0, 4) == "-DGM" || Parameter.substr(0, 4) == "-dgm")
{
if (IsDebug) write_fortschritt("Parameter -DGM erkannt.\n");
@@ -246,11 +247,8 @@
IsSetDgm = true;
if (IsDebug) write_fortschritt("DGM-Datei: '%s'\n", FileNameDgm.c_str());
-
- continue;
}
-
- if (Parameter.substr(0, 4) == "-PRO" || Parameter.substr(0, 4) == "-pro")
+ else if (Parameter.substr(0, 4) == "-PRO" || Parameter.substr(0, 4) == "-pro")
{
if (IsDebug) write_fortschritt("Parameter -PRO erkannt.\n");
@@ -273,11 +271,8 @@
IsSetPro = true;
if (IsDebug) write_fortschritt("Profillagen-Datei: '%s'\n", FileNamePro.c_str());
-
- continue;
}
-
- if (Parameter.substr(0, 4) == "-WSP" || Parameter.substr(0, 4) == "-wsp")
+ else if (Parameter.substr(0, 4) == "-WSP" || Parameter.substr(0, 4) == "-wsp")
{
if (IsDebug) write_fortschritt("Parameter -WSP erkannt.\n");
@@ -303,8 +298,7 @@
continue;
}
-
- if (Parameter.substr(0, 4) == "-LIN" || Parameter.substr(0, 4) == "-LIN")
+ else if (Parameter.substr(0, 4) == "-LIN" || Parameter.substr(0, 4) == "-LIN")
{
if (IsDebug) write_fortschritt("Parameter -LIN erkannt.\n");
@@ -327,11 +321,8 @@
IsSetLin = true;
if (IsDebug) write_fortschritt("Bruch- und Sperr-Datei: '%s'\n", FileNameLin.c_str());
-
- continue;
}
-
- if (Parameter.substr(0, 6) == "-ACHSE" || Parameter.substr(0, 6) == "-achse")
+ else if (Parameter.substr(0, 6) == "-ACHSE" || Parameter.substr(0, 6) == "-achse")
{
if (IsDebug) write_fortschritt("Parameter -ACHSE erkannt.\n");
@@ -357,8 +348,7 @@
continue;
}
-
- if (Parameter.substr(0, 8) == "-AUSGABE" || Parameter.substr(0, 8) == "-ausgabe")
+ else if (Parameter.substr(0, 8) == "-AUSGABE" || Parameter.substr(0, 8) == "-ausgabe")
{
if (IsDebug) write_fortschritt("Parameter -AUSGABE erkannt.\n");
@@ -380,10 +370,12 @@
IsSetAusgabe = true;
- if (IsDebug) write_fortschritt("Ausage-Datei: '%s'\n", FileNameAusgabe.c_str());
-
- continue;
+ if (IsDebug) write_fortschritt("Ausgabe-Datei: '%s'\n", FileNameAusgabe.c_str());
}
+ else
+ {
+ write_warning(1124, "Eine unbekannte Zeichenkette %s' wurde als Parameter übergeben.\nDie Zeichenkette wird ignoriert.\n", Parameter.c_str());
+ }
}
if (false == IsSetDgm)
Modified: trunk/src/tools.cpp
===================================================================
--- trunk/src/tools.cpp 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/tools.cpp 2006-03-21 00:53:11 UTC (rev 39)
@@ -59,7 +59,7 @@
// deshalb wird hier auch kein 'sinnvoller' Rückgabewert definiert
ReturnCode = 9298;
- throw TFehler("Fehler");
+ throw TFehler("Problem");
}
//---------------------------------------------------------------------------
@@ -334,8 +334,8 @@
double numy = n1Sq * (n3->X - n2->X) + n2Sq * (n1->X - n3->X) + n3Sq * (n2->X - n1->X);
double y = numy / (2.0 * cp);
- double dx = n1->X - x;
- double dy = n1->Y - y;
+ double dx = n3->X - x;
+ double dy = n3->Y - y;
*cx = x;
*cy = y;
@@ -349,12 +349,12 @@
}
//---------------------------------------------------------------------------
-size_t CheckMemory(bool IsDebug)
+size_t CheckMemory(bool Debug)
{
write_fortschritt("->Ermitteln der Speicherauslastung\n");
-// size_t MaxMemSize = 2UL * 1024UL * 1024UL * 1024UL;
- size_t MaxMemSize = 200000000;
+ size_t MaxMemSize = 2UL * 1024UL * 1024UL * 1024UL;
+ if (Debug) MaxMemSize = 200000000;
while (MaxMemSize > 0)
{
@@ -367,7 +367,7 @@
}
else
{
- if (IsDebug)
+ if (Debug)
{
write_fortschritt("%d MB stehen NICHT zur Verfügung\n", MaxMemSize / 1024 / 1024);
}
@@ -383,7 +383,7 @@
}
//---------------------------------------------------------------------------
-long CheckSpeed(bool IsDebug)
+long CheckSpeed(bool Debug)
{
write_fortschritt("->Ermitteln der Geschwindigkeit\n");
@@ -400,7 +400,7 @@
do
{
- if (IsDebug)
+ if (Debug)
{
if (Flops % 100000 == 0) write_fortschritt("%d Flops berechnet\n", Flops);
}
@@ -418,6 +418,8 @@
} while (DiffMSec < 2000);
+ if (Debug) Flops = 1840000;
+
write_fortschritt("%.3f MFlops berechnet\n", Flops / 1000.0 / 1000.0);
if (DiffMSec > 10000) write_fortschritt("%d Dummy\n", Dummy);
@@ -501,7 +503,7 @@
int Anz = 0;
for (TProfilList::iterator i=ProfilList->begin(); i != ProfilList->end(); i++)
{
- if (Anz > 0 && Anz % 10 == 0) write_fortschritt ("%d Profile bearbeitet\n", Anz);
+ if (Anz > 0 && Anz % 100 == 0) write_fortschritt ("%d Profile bearbeitet\n", Anz);
TProfil *Profil = *i;
@@ -586,7 +588,7 @@
for (TProfilList::iterator j = ProfilList->begin(); j != ProfilList->end(); j++)
{
TProfil* Profil = *j;
- write_fortschritt("Profil '%s' '%.4f'}\n", Profil->Gewaesser.c_str(), Profil->Station / 10000.0);
+ write_fortschritt("Profil '%s' '%.4f'\n", Profil->Gewaesser.c_str(), Profil->Station / 10000.0);
}
}
}
@@ -608,9 +610,13 @@
XyList->Clear();
+ int Count = 0;
TProfilList::iterator ProfilIter = ProfilList->begin();
for (unsigned int i = 0; i < ProfilList->size()-1; i++)
{
+ if (Debug && Count % 100 == 0) write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+ else if (Count % 1000 == 0) write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+
TProfil* Profil = *ProfilIter;
if (i == 0)
@@ -627,11 +633,15 @@
XyList->Add(Point->X, Point->Y);
}
ProfilIter++;
+ Count++;
}
TProfilList::reverse_iterator RProfilIter = ProfilList->rbegin();
for (unsigned int i = ProfilList->size()-1; i > 0; i--)
{
+ if (Debug && Count % 100 == 0) write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+ else if (Count % 1000 == 0) write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+
TProfil* Profil = *RProfilIter;
if (i == ProfilList->size()-1)
@@ -648,8 +658,11 @@
XyList->Add(Point->X, Point->Y);
}
RProfilIter++;
+ Count++;
}
+ write_fortschritt("%d Begrenzungspunkte erzeugt\n", XyList->size());
+/*
if (Debug)
{
write_fortschritt("Polygon:\n");
@@ -659,6 +672,7 @@
write_fortschritt("%.3f %.3f\n", Xy->X, Xy->Y);
}
}
+*/
write_fortschritt ("Begrenzungspolygon wurde erzeugt<-\n");
}
@@ -745,7 +759,7 @@
AntiEdge = EdgeList->Find((*N2)->Nr, (*N1)->Nr);
if (AntiEdge == 0)
{
- // Im moment gehe ich mal davon aus, dass es könnte eine neue Randkante ist
+ // Im moment gehe ich mal davon aus, dass es eine neue Randkante ist
NewEdge = EdgeList->Add(*N1, *N2);
NewEdge->IsBoundary = true;
}
@@ -919,8 +933,8 @@
int Count = 0;
for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
{
- if (Debug && Count % 100 == 0) write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
- else if (Count % 1000 == 0) write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
+ if (Debug && Count % 10 == 0) write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
+ else if (Count % 100 == 0) write_fortschritt("%d Profile getestet %d Knoten erzeugt\n", Count, NodeNr);
TProfil* Profil = *i;
@@ -928,6 +942,8 @@
int Station = Profil->Station;
double Wsp = Profil->Wsp;
+ if (Wsp < -9999) continue;
+
double Meter = 0.0;
if (Sperre)
@@ -1100,43 +1116,42 @@
double LambdaP = 0.0;
double LambdaS = 0.0;
- if (fabs(PDx) < 0.00001 && fabs(PDy) < 0.00001)
+ if (fabs(PDx) < 0.00000001 && fabs(PDy) < 0.00000001)
{
write_error(3207, "Profil-Punktabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", P0x, P0y, P1x, P1y);
}
- else if (fabs(SDx) < 0.00001 && fabs(SDy) < 0.00001)
+ else if (fabs(SDx) < 0.00000001 && fabs(SDy) < 0.00000001)
{
write_error(3208, "GewaesserAchse-Punktabstand (%.3f %.3f) - (%.3f %.3f) ist zu klein\n", S0x, S0y, S1x, S1y);
}
- else if (fabs(PDx) < 0.00001 && fabs(SDx) < 0.00001)
+ else if (fabs(PDx) < 0.00000001 && fabs(SDx) < 0.00000001)
{
// S-Segment und P->Abschnitt sind beide senkrecht (parallel)
return (false);
}
- else if (fabs(PDy) < 0.00001 && fabs(SDy) < 0.00001)
+ else if (fabs(PDy) < 0.00000001 && fabs(SDy) < 0.00000001)
{
// S-Segment und P->Abschnitt sind beide waagerecht (parallel)
return (false);
}
- else if (fabs(PDx) < 0.00001)
+ else if (fabs(PDx) < 0.00000001)
{
// P-Abschnitt senkrecht aber Spur-Abschnitt nicht
LambdaS = (P0x - S0x) / SDx;
LambdaP = ((S0y + LambdaS * SDy) - P0y) / PDy;
}
- else if (fabs(PDy) < 0.00001)
+ else if (fabs(PDy) < 0.00000001)
{
// P-Abschnitt waagerecht aber Spur-Abschnitt nicht
LambdaS = (P0y - S0y) / SDy;
LambdaP = ((S0x + LambdaS * SDx) - P0x) / PDx;
}
- else if (fabs((SDy / PDy) - (SDx / PDx)) < 0.00001)
+ else if (fabs((SDy / PDy) - (SDx / PDx)) < 0.00000001)
{
// Spur-Segment und PaPe->Abschnitt sind parallel
// fabs((SDy / PDy) - (SDx / PDx)) < 0.00001 entspricht
// SDy / PDy = SDx / PDx entspricht
// SDy / SDx = PDy / PDx (P-Steigung gleich S-Steigung) entspricht
- // SDy / SDx = PDy / PDx (P-Steigung gleich S-Steigung) entspricht
// SDy / SDx = PDy / PDx entspricht
// SDy / PDy = SDx / PDx entspricht
// SDy / PDy * PDx = SDx entspricht
@@ -1156,7 +1171,7 @@
double Sx = S0x + LambdaS * SDx;
double Sy = S0y + LambdaS * SDy;
- if (fabs(Px-Sx) > 0.0001 || fabs(Py-Sy) > 0.0001)
+ if (fabs(Px-Sx) > 0.001 || fabs(Py-Sy) > 0.001)
{
dump_error (__FILE__, __LINE__, "Errechnete Punkte sind nicht identisch (%10.5f,%10.5f) und (%10.5f,%10.5f)\n", Px, Py, Sx, Sy);
}
@@ -1379,6 +1394,8 @@
//---------------------------------------------------------------------------
void NassTrockenBerechnung(std::string FileName, TNodeList *NodeList, TEdgeList *EdgeList, TErgebnisPolygonList* ErgebnisPolygone, double Von, double Bis, double Diff, bool Debug)
{
+ write_fortschritt("->Überschwemmungsgrenzen werden ermittelt.\n");
+
TNodeList *SaveNodeList = new TNodeList;
SaveNodeList = NodeList->Copy();
@@ -1389,6 +1406,8 @@
for (double DeltaTopo = Von; DeltaTopo <= Bis; DeltaTopo = DeltaTopo + Diff)
{
+ write_fortschritt("Wasserstand %.3f wird bearbeitet.\n", DeltaTopo);
+
// Zuerst alles wieder wie gehabt einstellen
// Bloss das die Topographie etwas angehoben wird
TNodeList::iterator n = NodeList->begin();
@@ -1432,6 +1451,8 @@
}
*/
+ if (Debug) write_fortschritt("Maximaler Wasserstand wird ermittelt.\n");
+
// Maximalen Wasserstand ermitteln
double MaxWsp = 0.0;
for (TNodeList::iterator i = NodeList->begin(); i != NodeList->end(); i++)
@@ -1441,6 +1462,8 @@
if (i == NodeList->begin() || MaxWsp < Node->Wsp) MaxWsp = Node->Wsp;
}
+ if (Debug) write_fortschritt("Sicher trockene Knoten werden ermittelt.\n");
+
// Anzahl der Knoten bestimmen, die höher als der maximale Wassrstand sind
// oder die schon einen Wasserstand haben
int Ready = 0;
@@ -1451,6 +1474,8 @@
if (Node->Wsp > -9999 || Node->Z > MaxWsp) Ready++;
}
+ if (Debug) write_fortschritt("Die ersten Kanten ermitteln, an denen ein Nass/Trocken-Übergng stattfindet.\n");
+
// Die Kanten bestimmen, die an einem Ende einen nassen und am anderen Ende einen trockenen Knoten haben
// Dies ist die Anfangskanten
TEdgeList *Temp2EdgeList = new TEdgeList();
@@ -1468,6 +1493,8 @@
}
}
+ if (Debug) write_fortschritt("Jetzt die Wasserstände weitertragen.\n");
+
TEdgeList *TempEdgeList = new TEdgeList();
int Changed = 0;
do
@@ -1595,6 +1622,8 @@
Edge->Ready = false;
}
+ if (Debug) write_fortschritt("Jetzt die Nass/Trocken-Überganänge auf den Kanten bestimmen.\n");
+
// Jetzt die Nass/Trocken Übergänge bestimmen
int FoundWetDry = 0;
for (TEdgeListNrSorted::iterator i = EdgeList->EdgeListNrSorted.begin(); i != EdgeList->EdgeListNrSorted.end(); i++)
@@ -1651,6 +1680,8 @@
// Jetzt sind alle Nass/Trockenübergänge bestimmt
+ if (Debug) write_fortschritt("Jetzt die Nass/Trocken-Überganänge verbinden.\n");
+
// Jetzt muss man sie nur noch verbinden
bool FoundStartChangeEdge = false;
@@ -1696,5 +1727,6 @@
} while (FoundStartChangeEdge);
}
+ write_fortschritt("Überschwemmungsgrenzen wurden ermittelt.<-\n");
}
Modified: trunk/src/tri.cpp
===================================================================
--- trunk/src/tri.cpp 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/tri.cpp 2006-03-21 00:53:11 UTC (rev 39)
@@ -27,6 +27,9 @@
double cr = 0;
TEdge *Edge = 0;
+double MinWin = 360.0;
+double MaxWin = 0.0;
+
//---------------------------------------------------------------------
void FindLeftMostNeighbours(TNodeList* NodeList, TNode* *Node1, TNode* *Node2)
{
@@ -76,18 +79,6 @@
}
//---------------------------------------------------------------------
-TEdge* FindEdge(TEdgeList* EdgeList, TNode *Node1, TNode *Node2)
-{
- TEdge *SearchEdge = new TEdge(Node1, Node2);
-
- TEdge *FoundEdge = EdgeList->Find(SearchEdge);
-
- delete SearchEdge;
-
- return (FoundEdge);
-}
-
-//---------------------------------------------------------------------
//
// Complete a facet by looking for the circle free point to the left
// of the edge "e_i". Add the facet to the triangulation.
@@ -95,7 +86,7 @@
// This function is a bit long and may be better split.
//
//---------------------------------------------------------------------
-void CompleteFacet(TNodeList* NodeList, TElementList* ElementList, TEdgeList *TodoEdgeList)
+void CompleteFacet(TNodeList* NodeList, TElementList* ElementList, TEdgeList *TodoEdgeList, TEdgeList *ReadyEdgeList)
{
TEdge* AktEdge = TodoEdgeList->First();
@@ -115,13 +106,14 @@
double X = (X1 + X2) / 2;
double Y = (Y1 + Y2) / 2;
+ int MaxTestAnz = 5;
int TestAnz = 0;
do
{
TestAnz++;
- double SX = X - TestAnz * Dy;
- double SY = Y + TestAnz * Dx;
+ double SX = X - TestAnz * TestAnz * Dy;
+ double SY = Y + TestAnz * TestAnz * Dx;
TestNode->X = SX;
TestNode->Y = SY;
@@ -130,13 +122,11 @@
NodeList->FindAllByXY(FoundNodeList, cx, cy, sqrt(cr)+0.01);
-/*
if (FoundNodeList->size() <= 2)
{
- // Da waren nur die beiden KantenKnoten drin
+ // Da waren nur die beiden Kanten-Knoten selbst drin
FoundNodeList->clear();
}
-*/
TNodeList::iterator i = FoundNodeList->begin();
while (i != FoundNodeList->end())
@@ -157,18 +147,49 @@
}
double CP = CrossProduct(Node1, Node2, Node);
- if (CP < 0.000001)
+ if (CP < 0.0000001)
{
FoundNodeList->erase(i);
i = FoundNodeList->begin();
continue;
}
+
+
+ double X3 = Node->X;
+ double Y3 = Node->Y;
+ double Win = ThreeToWin(X2, Y2, X3, Y3, X1, Y1, 1);
+
+
+ if (MinWin > Win)
+ {
+ MinWin = Win;
+ write_fortschritt("Minimaler Winkel bisher: %.3f\n", MinWin);
+ }
+
+ if (MaxWin < Win)
+ {
+ MaxWin = Win;
+ write_fortschritt("Maximaler Winkel bisher: %.3f\n", MaxWin);
+ }
+
+ if (Win > 177)
+ {
+ dump_error(__FILE__, __LINE__, "Winkel zu groß");
+ }
+
+ if (Win < 3)
+ {
+ FoundNodeList->erase(i);
+ i = FoundNodeList->begin();
+ continue;
+ }
+
i++;
}
- } while (TestAnz < 9 && FoundNodeList->size() == 0);
+ } while (TestAnz < MaxTestAnz && FoundNodeList->size() == 0);
-
- // Dann versuche ich es noch mal allen
+ // Dann versuche ich es noch mal mit allen
+/*
if (FoundNodeList->size() == 0)
{
for (TNodeList::iterator i = NodeList->begin(); i != NodeList->end(); i++)
@@ -178,6 +199,7 @@
FoundNodeList->push_back(Node);
}
}
+*/
NewNode = 0;
TNodeList::iterator i = FoundNodeList->begin();
@@ -199,9 +221,13 @@
break;
}
+ else
+ {
+ dump_error(__FILE__, __LINE__, "Der erste gefundene Knoten ist auf der falschen Seite");
+ }
}
- if (NewNode != 0)
+ if (NewNode)
{
// Find best point to form a triangle
@@ -213,7 +239,7 @@
if (Node->Nr == Node1->Nr || Node->Nr == Node2->Nr)
{
- dump_error(__FILE__, __LINE__, "Einer der gefundenen Knoten ist einer der Kanteknoten");
+ dump_error(__FILE__, __LINE__, "Einer der gefundenen Knoten ist einer der beiden Kantenknoten");
}
if (Node->Nr != NewNode->Nr)
@@ -228,15 +254,22 @@
double Dx = cx - X;
double Dy = cy - Y;
- if (Dx * Dx + Dy * Dy < cr)
+ if (sqrt(Dx * Dx + Dy * Dy) < sqrt(cr) - 0.01)
{
NewNode = Node;
CircumCircle(Node1, Node2, NewNode, &cx, &cy, &cr);
}
- else if (Dx * Dx + Dy * Dy <= cr)
+ else if (sqrt(Dx * Dx + Dy * Dy) > sqrt(cr) + 0.01)
{
- Edge = FindEdge(TodoEdgeList, Node, Node1);
+ // Do nothing
+ }
+ else
+ {
+ // Die beiden Knoten sind gleich oder wenigstens fast gleich gut
+ // Dann hilft nur eine andere Art der Unterscheidung
+ Edge = TodoEdgeList->Find(Node, Node1);
+
if (Edge)
{
NewNode = Node;
@@ -244,7 +277,7 @@
}
else
{
- Edge = FindEdge(TodoEdgeList, Node2, Node);
+ Edge = TodoEdgeList->Find(Node2, Node);
if (Edge)
{
@@ -253,22 +286,63 @@
}
}
}
-
}
+ else
+ {
+ dump_error(__FILE__, __LINE__, "Einer der gefundenen Knoten ist auf der falschen Seite");
+ }
}
i++;
}
}
- // Add new triangle or update edge info if s-t is on hull.
if (NewNode)
{
+ Edge = ReadyEdgeList->FindWithIndex(Node1, NewNode);
+ if (Edge && Edge->IsBoundary)
+ {
+ NewNode = 0;
+ }
+ else
+ {
+ Edge = ReadyEdgeList->FindWithIndex(NewNode, Node2);
+ if (Edge && Edge->IsBoundary)
+ {
+ NewNode = 0;
+ }
+ }
+ }
+
+ if (NewNode)
+ {
+/*
+ TEdge* Edge1 = ReadyEdgeList->FindWithIndex(Node1, Node2);
+ TEdge* Edge2 = ReadyEdgeList->FindWithIndex(Node2, NewNode);
+ TEdge* Edge3 = ReadyEdgeList->FindWithIndex(NewNode, Node1);
+
+ if (Edge1 || Edge2 || Edge3)
+ {
+ write_fortschritt("%d Anzahl fertiger Kanten\n", ReadyEdgeList->Anz);
+ dump_error(__FILE__, __LINE__, "Kante war schon fertig");
+ }
+*/
+
+ ReadyEdgeList->AddWithIndex(Node1, Node2);
+ ReadyEdgeList->AddWithIndex(Node2, NewNode);
+ ReadyEdgeList->AddWithIndex(NewNode, Node1);
+
TElement *Element = 0;
Element = new TElement(Node1, Node2, NewNode);
ElementList->push_back(Element);
- // Richtung: Ist schon fertig
- Edge = FindEdge(TodoEdgeList, Node2, NewNode);
+
+ ////////////////////////////////////
+ // Jetzt eintragen was noch muss
+ ////////////////////////////////////
+
+ // Diese Richtung ist jetzt fertig
+ // Falls sie also in der Todo-Liste war -> raus
+ Edge = TodoEdgeList->Find(Node2, NewNode);
if (Edge)
{
// In Todo Gefunden
@@ -277,12 +351,22 @@
}
else
{
- Edge = new TEdge(NewNode, Node2);
- TodoEdgeList->Add(Edge);
+ // Wenn diese Richtung nicht in der Todo-Liste war,
+ // so kann die Gegenrichtung noch nicht fertig sein
+ Edge = ReadyEdgeList->FindWithIndex(NewNode, Node2);
+ if (0 == Edge)
+ {
+ Edge = new TEdge(NewNode, Node2);
+ TodoEdgeList->Add(Edge);
+ }
+ else
+ {
+ dump_error(__FILE__, __LINE__, "Eine fertige Kante sollte noch mal eingetragen werden");
+ }
}
// Richtung: Ist schon fertig
- Edge = FindEdge(TodoEdgeList, NewNode, Node1);
+ Edge = TodoEdgeList->Find(NewNode, Node1);
if (Edge)
{
// In Todo Gefunden
@@ -291,10 +375,24 @@
}
else
{
- Edge = new TEdge(Node1, NewNode);
- TodoEdgeList->Add(Edge);
+ Edge = ReadyEdgeList->FindWithIndex(Node1, NewNode);
+ if (0 == Edge)
+ {
+ Edge = new TEdge(Node1, NewNode);
+ TodoEdgeList->Add(Edge);
+ }
+ else
+ {
+ dump_error(__FILE__, __LINE__, "Eine fertige Kante sollte noch mal eingetragen werden");
+ }
}
}
+ else
+ {
+ // Wenn diese Kante nichts war, so ist die andere Richtung eine Aussenkante
+ Edge = ReadyEdgeList->FindWithIndex(Node2, Node1);
+ if (Edge) Edge->IsBoundary = true;
+ }
// Die Kante ist jetzt fertig
TodoEdgeList->Erase(AktEdge);
@@ -310,9 +408,14 @@
write_error(1234, "Es sind im DGM nur %d Knoten vorhanden.\nEs werden aber mindestens 3 Knoten benötigt\n", NodeList->size());
}
+ write_fortschritt("Sortiere die Knoten\n");
NodeList->SortByXY();
+ write_fortschritt("Lösche den Knoten/Kanten-Index\n");
+ NodeList->ClearEdgeIndex();
+
TEdgeList *TodoEdgeList = new TEdgeList;
+ TEdgeList *ReadyEdgeList = new TEdgeList;
TNode *Node1 = 0;
TNode *Node2 = 0;
@@ -336,19 +439,20 @@
int Anz = 0;
while (TodoEdgeList->Anz > 0)
{
- CompleteFacet(NodeList, ElementList, TodoEdgeList);
+ CompleteFacet(NodeList, ElementList, TodoEdgeList, ReadyEdgeList);
if (Debug)
{
+/*
#include "file.h"
- if (ElementList->size() % 50000 == 49999)
+ if (ReadyEdgeList->Anz > 618)
{
-/*
- SaveNet("tmp.2dm", NodeList, ElementList);
+ SaveElements("tmp_elements.shp", ElementList, true);
+ SaveNet("tmp.2dm", NodeList, ElementList, true);
+ }
*/
- }
}
@@ -359,13 +463,16 @@
ftime (&Now);
int NowMSec = Now.time * 1000 + Now.millitm;
int DiffMSec = NowMSec - StartMSec;
- write_fortschritt("%d Kanten bearbeitet\n%d Kanten in der Warteschlange\n%d Elemente erzeugt\n", Anz, TodoEdgeList->Anz, ElementList->size());
+ write_fortschritt("%d von ca. %d Elementen erzeugt\n", ElementList->size(), NodeList->size() * 2);
if (Debug) write_fortschritt("%.2f sec -> %.4f sec pro Kante\n", DiffMSec / 1000.0, DiffMSec / 1000.0 / Anz);
}
}
delete TodoEdgeList;
+ ReadyEdgeList->Empty();
+ delete ReadyEdgeList;
+
write_fortschritt("Netz wurde trianguliert<-\n");
return (true);
Modified: trunk/src/wsplgen.cpp
===================================================================
--- trunk/src/wsplgen.cpp 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/wsplgen.cpp 2006-03-21 00:53:11 UTC (rev 39)
@@ -75,11 +75,17 @@
// Hier drin werden die Ergebnis Polygone drin verwaltet
TErgebnisPolygonList ErgebnisPolygonList;
-/*
- LoadDGM("test_daten\\dgm_ziemlich_riesig.shp", NodeList, ElementList, 0, 99999999, true);
- Triangulate (NodeList, ElementList, true);
- SaveNet("test_daten\\dgm_ziemlich_riesig.2dm", NodeList, ElementList, true);
-*/
+// Dies dient nur dazu mal kurz ein Netz zu triangulieren
+// LoadDGM("test_daten\\dgm.shp", &NodeList, &ElementList, 0, 99999999, true);
+// LoadDGM("test_daten\\dgm.xyz", &NodeList, &ElementList, 0, 99999999, true);
+// LoadDGM("test_daten\\dgm.grd", &NodeList, &ElementList, 0, 99999999, true);
+// LoadDGM("test_daten\\testdgm.shp", &NodeList, &ElementList, 0, 99999999, true);
+// LoadDGM("test_daten\\testdgm2.shp", &NodeList, &ElementList, 0, 99999999, true);
+// LoadDGM("test_daten\\dgm_riesig.shp", &NodeList, &ElementList, 0, 99999999, true);
+// SaveNodes("tmp_ori_nodes.shp", &NodeList, true);
+// Triangulate (&NodeList, &ElementList, true);
+// SaveElements("tmp_elements.shp", &ElementList, true);
+// return(0);
try
{
@@ -96,6 +102,8 @@
write_error(3204, "Es liegen nur %d Querprofilspuren vor\nEs werden aber mindestens 2 Querprofilspuren benötigt.", ProfilList.size());
}
+if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_ORIGINAL.shp", &ProfilList, Parameter.IsDebug);
+
// Jetzt die Waserstände einlesen und
// anschliessend gleich auf die Profile interpolieren
// Dabei wird die Stationierung von km in cm umgerechnet
@@ -106,12 +114,14 @@
delete WspProfilList;
WspProfilList = 0;
+if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_ORIGINAL_mit_WSP.shp", &ProfilList, Parameter.IsDebug);
+
// Jetzt die Gewässerachse einlesen, wenn es notwendig ist
if (Parameter.Sperre)
{
LoadAchse(Parameter.FileNameAchse, &GewaesserAchseList);
}
- else if (false == Parameter.Sperre)
+ else if (false == Parameter.Sperre && true == Parameter.IsSetAchse)
{
write_warning(1123, "Parameter -ACHSE wird ignoriert, da der Parameter -SPERRE den Wert NOSPERRE hat\n");
}
@@ -137,7 +147,7 @@
// geteilt durch (10000 / KFlops).
write_fortschritt("->Ermitteln der maximalen DGM-Knotenanzahl\n");
- int MaxNodesPerSlice = (MaxMem / 2) / (8 * 4 * 4) / (10000 / KFlops);
+ int MaxNodesPerSlice = (MaxMem / 6) / (8 * 4 * 4) / (10000 / KFlops);
write_fortschritt("Es können nur ca. %d DGM-Punkte eingelesen werden\n", MaxNodesPerSlice);
write_fortschritt("Ermitteln der maximalen DGM-Knotenanzahl beendet<-\n");
@@ -163,23 +173,25 @@
}
// Mal wieder Zwischenergebnisse produzieren
-if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_100_" + Gewaesser + ".shp", GewProfilList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveProfile("test_daten\\" + Gewaesser + "_Profile_100" + ".shp", GewProfilList, Parameter.IsDebug);
// Jetzt ein Polygon bilden, das die Profile begrenzt
BuildPolygon(GewProfilList, &Bereichspolygon, Parameter.IsDebug);
-if (Parameter.IsDebug) SavePolygon("test_daten\\Polygon_" + Gewaesser + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
+if (Parameter.IsDebug) SavePolygon("test_daten\\" + Gewaesser + "_Polygon" + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
unsigned int AnzScheiben = LoadDGM(Parameter.FileNameDgm, &NodeList, &ElementList, &Bereichspolygon, MaxNodesPerSlice, Parameter.IsDebug);
// Wenn LoadDGM eine Scheibenanzahl von mehr als 1 ergeben hat, ist das DGM nicht geladen,
// es muss jetzt mit Scheiben gearbeitet werden.
- if (GewProfilList->size() < AnzScheiben + 1)
+ if (GewProfilList->size() - 1 < AnzScheiben)
{
- write_warning(3103, "Die Anzahl der gewünschten Bearbeitungsscheiben ist kleiner als die Anzahl der Profile");
+ write_warning(3103, "Die Anzahl der gewünschten Bearbeitungsabschnitte (%d) ist größer als die Anzahl der Profile minus 1 (%d).\n", AnzScheiben, GewProfilList->size() - 1);
AnzScheiben = GewProfilList->size() - 1;
}
+ write_fortschritt("Das Gewässer '%s' wird in %d Bearbeitungsabschnitte aufgeteilt\n", Gewaesser.c_str(), AnzScheiben);
+
TBereichsList BereichsList(GewProfilList, AnzScheiben);
for (TBereichsList::iterator i=BereichsList.begin(); i != BereichsList.end(); i++)
@@ -190,11 +202,11 @@
TProfil *VonProfil = *Von;
TProfil *BisProfil = *Bis;
-char VC[100];
-char NC[100];
+ char VC[100];
+ char NC[100];
-sprintf (VC, "_Von%d", VonProfil->Station);
-sprintf (NC, "_Bis%d", BisProfil->Station);
+ sprintf (VC, "_Von%d", VonProfil->Station);
+ sprintf (NC, "_Bis%d", BisProfil->Station);
write_fortschritt("->Bei Gewaesser %s wird der Bereich von %.4f bis %.4f bearbeitet\n", Gewaesser.c_str(), VonProfil->Station / 10000.0, BisProfil->Station / 10000.0);
@@ -213,7 +225,7 @@
// Jetzt das Polygon bilden, das die Profile begrenzen
BuildPolygon(TempProfilList, &Bereichspolygon, Parameter.IsDebug);
-if (Parameter.IsDebug) SavePolygon("test_daten\\Polygon_" + Gewaesser + VC + NC + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
+if (Parameter.IsDebug) SavePolygon("test_daten\\" + Gewaesser + "_Polygon_" + VC + NC + ".shp", Gewaesser, 0, 0, &Bereichspolygon);
LoadDGM(Parameter.FileNameDgm, &NodeList, &ElementList, &Bereichspolygon, 99999999, Parameter.IsDebug);
@@ -228,9 +240,9 @@
NodeList.SortByNr();
-if (Parameter.IsDebug) SaveNet("test_daten\\Net_" + Gewaesser + VC + NC + ".2dm", &NodeList, &ElementList, true);
-if (Parameter.IsDebug) SaveNodes("test_daten\\Nodes_" + Gewaesser + VC + NC + ".shp", &NodeList, true);
-if (Parameter.IsDebug) SaveElements("test_daten\\Elements_" + Gewaesser + VC + NC + ".shp", &ElementList, true);
+if (Parameter.IsDebug) SaveNet("test_daten\\" + Gewaesser + "_Net_" + VC + NC + ".2dm", &NodeList, &ElementList, true);
+if (Parameter.IsDebug) SaveNodes("test_daten\\" + Gewaesser + "_Nodes_" + VC + NC + ".shp", &NodeList, true);
+if (Parameter.IsDebug) SaveElements("test_daten\\" + Gewaesser + "_Elements_" + VC + NC + ".shp", &ElementList, true);
// Aus den Elementen werden nun die Kanten gebildet
// Hier ist noch Optimierungspotential
@@ -247,7 +259,7 @@
// Die Elemete werden nun nicht mehr gebraucht
ElementList.Clear();
-if (Parameter.IsDebug) SaveEdges("test_daten\\Edges_" + Gewaesser + VC + NC + ".shp", EdgeList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveEdges("test_daten\\" + Gewaesser + "_Edges_" + VC + NC + ".shp", EdgeList, Parameter.IsDebug);
// Nachdem die durchschnittliche Kantenlänge bekannt ist,
// wird sie für die spätere Verwendung zwischengespeichert
@@ -262,26 +274,60 @@
GewProfilList->InterpoliereProfile(AvgDistance * 10);
// Mal wieder Zwischenergebnisse produzieren
-if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_all_" + Gewaesser + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveProfile("test_daten\\" + Gewaesser + "_Profile_all_" + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
// Jetzt die Stützstellen auffüllen
GewProfilList->FillProfile(AvgDistance, Parameter.IsDebug);
// Mal wieder Zwischenergebnisse produzieren
-if (Parameter.IsDebug) SaveProfile("test_daten\\Profile_fill_" + Gewaesser + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
+if (Parameter.IsDebug) SaveProfile("test_daten\\" + Gewaesser + "_Profile_fill_" + VC + NC + ".shp", GewProfilList, Parameter.IsDebug);
// Jetzt eine neue Knotenliste aus den Profilen generienen
BuildProfilNodeList(GewProfilList, &NodeList, &GewaesserAchseList, &ProfilNodeList, AvgDistance, Parameter.Sperre, Parameter.IsDebug);
-if (Parameter.IsDebug) SaveNodes("test_daten\\ProfilNodes_" + Gewaesser + VC + NC + ".shp", &ProfilNodeList, true);
+if (Parameter.IsDebug) SaveNodes("test_daten\\" + Gewaesser + "_ProfilNodes_" + VC + NC + ".shp", &ProfilNodeList, true);
// Jetzt die Wasserstände übertragen
TransferWsp(&ProfilNodeList, &NodeList, AvgDistance, Parameter.IsDebug);
ProfilNodeList.Clear();
-if (Parameter.IsDebug) SaveNodes("test_daten\\Nodes_mitWSP_" + Gewaesser + VC + NC + ".shp", &NodeList, true);
+if (Parameter.IsDebug) SaveNodes("test_daten\\" + Gewaesser + "_Nodes_mitWSP_" + VC + NC + ".shp", &NodeList, true);
+ // Wurde der Wert für das Argument 'Bis' beim Parameter -DELTA nicht gesetzt
+ // so ist jetzt die Zeit das nachzuholen
+ if (false == Parameter.IsSetBis)
+ {
+ Parameter.Bis = NodeList.GetMaxDepth(Parameter.IsDebug);
+ }
+
+ // Nachdem nun 'Bis' sicher gesetzt ist, kann nun auch Diff bestimmt werden,
+ // wenn es nicht schon bestimmt wurde
+ if (false == Parameter.IsSetDiff)
+ {
+ Parameter.Diff = (int)((Parameter.Bis - Parameter.Von) / 10.0 * 100.0 + 0.5) / 100.0;
+ }
+
+ if (Parameter.Von > Parameter.Bis)
+ {
+ write_error(1210, "Das Argument <Von> (%.2f) ist größer als das Argument <Bis> (%.2f).\nGeben sie bitte sowohl den Parameter <Von> als auch den Parameter <Bis> sinnvoll an.\n", Parameter.Von, Parameter.Bis);
+ }
+
+ if (Parameter.Diff <= 0.0)
+ {
+ if (Parameter.Bis - Parameter.Von > 0.0001)
+ {
+ write_error(1212, "Das Argument <Diff> darf nur dann Null sein, wenn <Von> (%.2f) und <Bis> (%.2f) gleich sind.\n", Parameter.Von, Parameter.Bis);
+ }
+ else
+ {
+ // Wenn 'Von' == 'Bis' ist
+ // wird Diff auf 1 gesetzt
+ // Der Wert spielt keine Rolle, nur größer als Null sollte er sein.
+ Parameter.Diff = 1.0;
+ }
+ }
+
// Den alten Knoten Kanten Index löschen
NodeList.ClearEdgeIndex();
@@ -300,13 +346,30 @@
ErgebnisPolygon->BisKm = BisProfil->Station / 10000.0;
}
+/*
+if (Parameter.IsDebug) SavePolygone(Parameter.FileNameAusgabe, &TempErgebnisPolygone, Parameter.IsDebug);
+*/
+
ErgebnisPolygonList.Append(TempErgebnisPolygone);
+ if (Parameter.IsDebug)
+ {
+ for (TErgebnisPolygonList::iterator i = ErgebnisPolygonList.begin(); i != ErgebnisPolygonList.end(); i++)
+ {
+ TErgebnisPolygon* ErgebnisPolygon = *i;
+
+ std::string AktGewaesser = ErgebnisPolygon->Gewaesser;
+ double AktVonKm = ErgebnisPolygon->VonKm;
+ double AktBisKm = ErgebnisPolygon->BisKm;
+ double AktDiff = ErgebnisPolygon->Diff;
+
+ write_fortschritt("Gewässer %s %.4f - %.4f Wassertiefe %.2f\n", AktGewaesser.c_str(), AktVonKm, AktBisKm, AktDiff);
+ }
+ }
+
TempErgebnisPolygone->clear();
delete TempErgebnisPolygone;
-if (Parameter.IsDebug) SavePolygone(Parameter.FileNameAusgabe, &ErgebnisPolygonList, Parameter.IsDebug);
-
// Löscht nur die Verwaltung und nicht die Knoten der Kanten,
// die Knoten waren nur geliehen
EdgeList->Empty();
@@ -315,7 +378,7 @@
}
}
- // Speichern der Ergenispolygone
+ // Speichern der Ergebnispolygone
SavePolygone(Parameter.FileNameAusgabe, &ErgebnisPolygonList, Parameter.IsDebug);
for (TProfilMap::iterator i = ProfilMap.begin(); i != ProfilMap.end(); i++)
@@ -334,7 +397,7 @@
}
catch (TFehler fehler)
{
- printf ("Unbekannter Fehler wurde korrekt abgefangen\n");
+ printf ("Bekannter Fehler wurde korrekt abgefangen\n");
printf ("Programmabbruch\n");
}
catch (...)
Modified: trunk/src/xy.cpp
===================================================================
--- trunk/src/xy.cpp 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/xy.cpp 2006-03-21 00:53:11 UTC (rev 39)
@@ -957,6 +957,42 @@
}
//---------------------------------------------------------------------
+double TNodeList::GetMaxDepth(bool Debug)
+{
+ write_fortschritt("->Maximale Wassertiefe wird ermittelt\n");
+
+ double MaxDepth = 0.0;
+ int Count = 0;
+ for (iterator i = begin(); i != end(); i++)
+ {
+ if (Debug && Count % 10000 == 0) write_fortschritt("Knoten %d von %d wird untersucht.\n", Count, size());
+ else if (Count > 0 && Count % 100000 == 0) write_fortschritt("Knoten %d von %d wird untersucht.\n", Count, size());
+
+ TNode* Node = *i;
+
+ if (Node->Wsp < -9999) continue;
+
+ double Depth = Node->Wsp - Node->Z;
+
+ if (Depth < 0.0)
+ {
+ dump_error(__FILE__, __LINE__, "Der Wasserstand ist negative");
+ }
+
+ if (Count == 0 || Depth > MaxDepth) MaxDepth = Depth;
+
+ Count++;
+ }
+ write_fortschritt("Knoten %d von %d wird untersucht.\n", Count, size());
+
+ write_fortschritt("Maximale Wassertiefe: %.3f.\n", MaxDepth);
+
+ write_fortschritt("Maximale Wassertiefe ermittelt<-\n");
+
+ return (MaxDepth);
+}
+
+//---------------------------------------------------------------------
// TElementList
//---------------------------------------------------------------------
@@ -1211,20 +1247,18 @@
{
if (Anz == 0) return(0);
-// if (EdgeListNrSorted.size() == 0)
if (EdgeListDistanceSorted.size() == 0)
{
dump_error(__FILE__, __LINE__, "Da ist nichts mehr drin");
}
-// TEdgeListNrSorted::iterator It = EdgeListNrSorted.begin();
+ TEdge *Edge = 0;
TEdgeListDistanceSorted::iterator It = EdgeListDistanceSorted.begin();
-
- TEdge *Edge = 0;
-// if (It != EdgeListNrSorted.end()) Edge = *It;
- if (It != EdgeListDistanceSorted.end()) Edge = *It;
-
- if (Edge == 0) dump_error(__FILE__, __LINE__, "Erste Kante ist 0");
+ while (It != EdgeListDistanceSorted.end())
+ {
+ Edge = *It++;
+ if (false == Edge->IsBoundary) break;
+ }
return (Edge);
}
@@ -1256,6 +1290,20 @@
}
//---------------------------------------------------------------------
+TEdge* TEdgeList::AddWithIndex(TNode *Node1, TNode *Node2)
+{
+ TEdge *NewEdge = new TEdge(Node1, Node2);
+
+ Add(NewEdge);
+
+ Node1->EdgeIndex = new TEdgeIndex (Node1->EdgeIndex, NewEdge);
+
+ Node2->EdgeIndex = new TEdgeIndex (Node2->EdgeIndex, NewEdge);
+
+ return (NewEdge);
+}
+
+//---------------------------------------------------------------------
void TEdgeList::Erase(TEdge *edge)
{
if (Anz == 0)
@@ -1324,18 +1372,50 @@
{
if (Anz == 0) return(0);
+ // SearchNode1 und SearchNode2 sind Elemente von SearchNode
SearchNode1->Nr = NodeNr1;
SearchNode2->Nr = NodeNr2;
- TEdgeListNrSorted::iterator NrIt = EdgeListNrSorted.find(SearchEdge);
+ return (Find(SearchEdge));
+}
- TEdge *Edge = 0;
- if (NrIt != EdgeListNrSorted.end()) Edge = *NrIt;
+//---------------------------------------------------------------------
+TEdge* TEdgeList::Find(TNode *Node1, TNode *Node2)
+{
+ if (Anz == 0) return(0);
+
+ // SearchNode1 und SearchNode2 sind Elemente von SearchNode
+ SearchNode1->Nr = Node1->Nr;
+ SearchNode2->Nr = Node2->Nr;
- return (Edge);
-}
+ return (Find(SearchEdge));
+}
//---------------------------------------------------------------------
+TEdge* TEdgeList::FindWithIndex(TNode *Node1, TNode *Node2)
+{
+ if (Anz == 0) return(0);
+
+ TEdgeIndex *AktEdgeIndex = Node1->EdgeIndex;
+
+ while (AktEdgeIndex)
+ {
+ TEdgeIndex *NextEdgeIndex = AktEdgeIndex->NextEdgeIndex;
+
+ TEdge *Edge = AktEdgeIndex->Edge;
+
+ if (Edge->Node1 == Node1 && Edge->Node2 == Node2)
+ {
+ return (Edge);
+ }
+
+ AktEdgeIndex = NextEdgeIndex;
+ }
+
+ return (0);
+}
+
+//---------------------------------------------------------------------
void TEdgeList::BuildEdgeIndex(void)
{
for (TEdgeListNrSorted::const_iterator i=EdgeListNrSorted.begin(); i != EdgeListNrSorted.end(); i++)
@@ -1836,6 +1916,10 @@
}
//---------------------------------------------------------------------
+// TBereichsList
+//---------------------------------------------------------------------
+
+//---------------------------------------------------------------------
TBereichsList::TBereichsList(TProfilList* ProfilList, int AnzBereiche)
{
// An dieser Stelle wird bereits davon ausgegangen das es mindestens 2 Querprofilspuren gibt und
Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h 2006-03-21 00:51:36 UTC (rev 38)
+++ trunk/src/xy.h 2006-03-21 00:53:11 UTC (rev 39)
@@ -450,8 +450,9 @@
TNode* FindByXY(double X, double Y, double Eps = 0.01);
void FindAllByXY(TNodeList *NodeList, double X, double Y, double Eps = 0.01);
TNode* FindByNr(int Nr);
- bool Interpolate(double X, double Y, double R, double *Z, double *Wsp);
+ bool Interpolate(double X, double Y, double R, double *Z, double *Wsp);
void ClearEdgeIndex(void);
+ double GetMaxDepth(bool Debug);
};
//----------------------------------------------------------------------------
@@ -523,8 +524,11 @@
TEdge* First(void);
void Add(TEdge *Edge);
TEdge* Add(TNode* Node1, TNode* Node2);
+ TEdge* AddWithIndex(TNode *Node1, TNode *Node2);
TEdge* Find(TEdge *Edge);
TEdge* Find(int NodeNr1, int NodeNr2);
+ TEdge* Find(TNode *Node1, TNode *Node2);
+ TEdge* FindWithIndex(TNode *Node1, TNode *Node2);
void Erase(TEdge *Edge);
void BuildDistanceSortedList(void);
@@ -601,6 +605,7 @@
TProfil* Find(std::string Gewaesser, int Station);
void InterpoliereProfile(double SollAbstand);
void FillProfile(double SollAbstand, bool Debug);
+ double GetMaxWsp(bool Debug);
};
typedef std::map<std::string, TProfilList *> TProfilMap;
More information about the Wsplgen-commits
mailing list