[Wsplgen-commits] r146 - trunk/src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Mon Nov 2 08:45:14 CET 2009
Author: mrchip
Date: 2009-11-02 08:45:14 +0100 (Mon, 02 Nov 2009)
New Revision: 146
Modified:
trunk/src/file.cpp
trunk/src/file.h
trunk/src/tools.cpp
trunk/src/wsplgen.h
trunk/src/xy.cpp
trunk/src/xy.h
Log:
Eine Fehler wurde korrigiert und neues DMG-Format
Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp 2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/file.cpp 2009-11-02 07:45:14 UTC (rev 146)
@@ -159,6 +159,11 @@
LoadDGMSHP(FileName, NodeList, BegrenzungsPolygon, IsSetNoProjWarn, DebugLevel);
CheckForDuplicates(NodeList, ElementList, DebugLevel);
}
+ else if (ToUpperCase(Ext) == ".TIN")
+ {
+ LoadDGMASCIITIN(FileName, NodeList, ElementList, BegrenzungsPolygon, DebugLevel);
+ CheckForDuplicates(NodeList, ElementList, DebugLevel);
+ }
else
{
write_error(1222, "Ungültige Dateinamenserweiterung '%s' beim Dateinamen '%s' für den Parameter -DGM\nErlaubt sind nur ADF, GRD, ASC, 2DM, XYZ, TXT oder SHP\n", ToUpperCase(Ext).c_str(), FileName.c_str());
@@ -1311,6 +1316,211 @@
return (true);
}
+//---------------------------------------------------------------------------
+bool LoadDGMASCIITIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel)
+{
+ write_fortschritt("->Laden des DGM in Datei '%s' als ASCII-TIN gestartet\n", FileName.c_str());
+
+ FILE *fh = fopen(FileName.c_str(), "r");
+ if (fh == 0)
+ {
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
+ }
+
+ char line[1000];
+ unsigned int AnzZeilen = 0;
+
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die erste Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+ AnzZeilen++;
+
+ if (strncmp(line, "TIN", 3) != 0)
+ {
+ write_error(2298, "Die erste Kopfzeile in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+ }
+
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die zweite Kopfzeile in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+ AnzZeilen++;
+
+ if (strncmp(line, "BEGT", 4) != 0)
+ {
+ write_error(2298, "Die zweite Kopfzeile in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+ }
+
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die Zeile mit der Knotenanzahl in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+ AnzZeilen++;
+
+ if (strncmp(line, "VERT", 4) != 0)
+ {
+ write_error(2298, "Die Zeile mit der Knotenanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+ }
+
+ unsigned int MaxAnzKnoten = 0;
+ if (1 != sscanf(line, "VERT%d", &MaxAnzKnoten))
+ {
+ write_error(2298, "Die Zeile mit der Knotenanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+ }
+
+ unsigned int AnzKnoten = 0;
+ for (unsigned int Nr=1; Nr <= MaxAnzKnoten; Nr++)
+ {
+ AnzZeilen++;
+
+ double X;
+ double Y;
+ double Z;
+
+ if (3 != fscanf(fh, "%lf%lf%lf\n", &X, &Y, &Z))
+ {
+ write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ }
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
+ {
+ write_fortschritt("%d Zeilen, %d Knoten geladen\n", AnzZeilen, NodeList->size());
+ }
+
+ long XL = (long)(X * 100 + 0.5);
+ long YL = (long)(Y * 100 + 0.5);
+ int ZI = (long)(Z * 100 + 0.5);
+
+ TInsideTyp InsideTyp = INSIDE;
+ if (XyList && XyList->size() > 2) InsideTyp = XyList->IsInsideXYList(XL, YL);
+ if (InsideTyp == INSIDE || InsideTyp == ON_LINE)
+ {
+ AnzKnoten++;
+
+ TNode *Node = new TNode(Nr, XL, YL, ZI);
+ NodeList->Add(Node);
+ }
+ }
+
+ NodeList->SortByNr();
+
+ if (0 == fgets (line, sizeof(line)-1, fh))
+ {
+ write_error(2298, "Konnte die Zeile mit der Elementanzahl in der Datei '%s' nicht lesen\n", FileName.c_str());
+ }
+ line[sizeof(line)-1] = '\0';
+ AnzZeilen++;
+
+ if (strncmp(line, "TRI", 3) != 0)
+ {
+ write_error(2298, "Die Zeile mit der Elementanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+ }
+
+ unsigned int MaxAnzElemente = 0;
+ if (1 != sscanf(line, "TRI%d", &MaxAnzElemente))
+ {
+ write_error(2298, "Die Zeile mit der Knotenanzahl in der Datei '%s' war nicht korrekt\n", FileName.c_str());
+ }
+
+
+ if (MaxAnzElemente > 0)
+ {
+ for (unsigned int Nr=1; Nr <= MaxAnzElemente; Nr++)
+ {
+ AnzZeilen++;
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzZeilen % 10000 == 0) || (AnzZeilen > 0 && AnzZeilen % 100000 == 0))
+ {
+ write_fortschritt("%d Zeilen, %d Elemente geladen\n", AnzZeilen, ElementList->size());
+ }
+
+ int Node1Nr;
+ int Node2Nr;
+ int Node3Nr;
+
+ if (3 != fscanf(fh, "%d%d%d\n", &Node1Nr, &Node2Nr, &Node3Nr))
+ {
+ write_error(2297, "Konnte keine 3 Werte in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ }
+
+ TNode *Node1 = NodeList->FindByNr(Node1Nr);
+ TNode *Node2 = NodeList->FindByNr(Node2Nr);
+ TNode *Node3 = NodeList->FindByNr(Node3Nr);
+
+ if (Node1 && Node2 && Node3)
+ {
+ TElement *Element = new TElement(Node1, Node2, Node3);
+ ElementList->Add(Element);
+ }
+ continue;
+ }
+ }
+
+ fclose(fh);
+
+ write_fortschritt("%d Elemente und %d Knoten geladen\n", ElementList->size(), NodeList->size());
+ write_fortschritt("%d Knoten insgesamt\n", AnzKnoten);
+
+ if (XyList && XyList->size() > 2)
+ {
+ write_fortschritt("->Löschen aussenliegender Kanten gestartet\n");
+
+ int Count = 0;
+ for (TElementList::iterator i=ElementList->begin(); i != ElementList->end(); i++)
+ {
+ TElement *Element = *i;
+
+ TNode* Node1 = Element->Node1;
+ TNode* Node2 = Element->Node2;
+ TNode* Node3 = Element->Node3;
+
+ long X12 = (Node1->X + Node2->X) / 2;
+ long Y12 = (Node1->Y + Node2->Y) / 2;
+
+ if (!XyList->IsInsideXYList(X12, Y12))
+ {
+ Element->Typ = NO_ELEMENT;
+ continue;
+ }
+
+ long X23 = (Node2->X + Node3->X) / 2;
+ long Y23 = (Node2->Y + Node3->Y) / 2;
+
+ if (!XyList->IsInsideXYList(X23, Y23))
+ {
+ Element->Typ = NO_ELEMENT;
+ continue;
+ }
+
+ long X31 = (Node3->X + Node1->X) / 2;
+ long Y31 = (Node3->Y + Node1->Y) / 2;
+
+ if (!XyList->IsInsideXYList(X31, Y31))
+ {
+ Element->Typ = NO_ELEMENT;
+ continue;
+ }
+
+ Count++;
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && Count % 5000 == 0) || (Count % 50000 == 0))
+ {
+ write_fortschritt("%d von %d Elementen überprüft\n", Count, ElementList->size());
+ }
+ }
+
+ write_fortschritt("<-Löschen aussenliegender Kanten beendet\n");
+ }
+
+ write_fortschritt("<-Laden des DGM in Datei '%s' als ASCII-TIN beendet\n", FileName.c_str());
+
+ return (true);
+}
+
//---------------------------------------------------------------------
bool LoadProfile(std::string FileName, TProfilList* ProfilList, TGewaesserAchseList* GewaesserAchseList, double VonKmD, double BisKmD, bool NoProjWarn, int DebugLevel)
{
@@ -2006,27 +2216,37 @@
for (int j=0; j < AnzVert; j++)
{
double X = psCShape->padfX[j];
+ long XL = (long)(X * 100.0 + 0.5);
+
double Y = psCShape->padfY[j];
- double Z = 0.0;
+ long YL = (long)(Y * 100.0 + 0.5);
- long* L1 = (long *)&(psCShape->padfZ[j]);
- long* L2 = L1 +1;
+ int ZL = 0;
- // Ein Test auf NaN (also einen unbestimmten Knoten)
- if (*L1 == 0x00000000L && *L2 == 0x7FF80000L) Z = NoZ;
- else Z = psCShape->padfZ[j];
+ if (ShapeType == SHPT_ARCZ || ShapeType == SHPT_POLYGONZ)
+ {
+ long* L1 = (long *)&(psCShape->padfZ[j]);
+ long* L2 = L1 +1;
- if (ShapeType == SHPT_ARC || ShapeType == SHPT_ARCM || ShapeType == SHPT_POLYGON || ShapeType == SHPT_POLYGONM)
+ // Ein Test auf NaN (also einen unbestimmten Knoten)
+ if (*L1 == 0x00000000L && *L2 == 0x7FF80000L)
+ {
+ ZL = NoZ;
+ }
+ else
+ {
+ double Z = psCShape->padfZ[j];
+ if (Z <= NoZ) ZL = NoZ;
+ else ZL = (int)(Z * 100.0 + 0.5);
+ }
+ }
+ else
{
- if (Typ == "DAMM") Z = DammZ;
- else if (Typ == "GRABEN") Z = GrabenZ;
- else Z = 0.0;
+ if (Typ == "DAMM") ZL = DammZ;
+ else if (Typ == "GRABEN") ZL = GrabenZ;
+ else ZL = 0;
}
- long XL = (long)(X * 100.0 + 0.5);
- long YL = (long)(Y * 100.0 + 0.5);
- int ZL = Z;
- if (Z != NoZ) ZL = (int)(Z * 100.0 + 0.5);
Linie->AddPoint(XL, YL, ZL);
}
Modified: trunk/src/file.h
===================================================================
--- trunk/src/file.h 2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/file.h 2009-11-02 07:45:14 UTC (rev 146)
@@ -30,8 +30,10 @@
bool LoadDGMTIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel);
bool LoadDGMGRD(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel);
bool LoadDGMXYZ(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel);
+bool LoadDGMXML(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel);
bool LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYZList *XyList, bool NoProjWarn, int DebugLevel);
bool LoadDGM2DM(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel);
+bool LoadDGMASCIITIN(std::string FileName, TNodeList *NodeList, TElementList *ElementList, TXYZList *XyList, int DebugLevel);
bool LoadProfile(std::string FileName, TProfilList* ProfilList, TGewaesserAchseList* GewaesserAchseList, double VonKmD, double BisKmD, bool NoProjWarn, int DebugLevel);
bool LoadLinien(std::string FileName, TProfilList* SperrenList, TProfilList* GrabenList, TProfilList* Rohre1List, TProfilList* Rohre2List, bool NoProjWarn, int DebugLevel);
Modified: trunk/src/tools.cpp
===================================================================
--- trunk/src/tools.cpp 2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/tools.cpp 2009-11-02 07:45:14 UTC (rev 146)
@@ -1579,6 +1579,8 @@
{
write_fortschritt ("->Übertragen der Wasserstände gestartet\n");
+ NodeList->ClearWsp();
+
TNodeList* Temp1NodeList = new TNodeList;
TNodeList* Temp2NodeList = new TNodeList;
@@ -1696,17 +1698,17 @@
if (Edge->Node1 == Node && Edge->Node2->Wsp == NoWsp && (false == Sperre || Edge->Node2->Z < Wsp))
{
Temp2NodeList->AddUnique(Edge->Node2);
- if (DebugLevel >= 8)
+ if (DebugLevel >= 9)
{
- write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld)\n", Station / 10000.0, Edge->Node2->X, Edge->Node2->Y);
+ write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld,%.3f)\n", Station / 10000.0, Edge->Node2->X, Edge->Node2->Y, Wsp / 100.0);
}
}
if (Edge->Node2 == Node && Edge->Node1->Wsp == NoWsp && (false == Sperre || Edge->Node1->Z < Wsp))
{
Temp2NodeList->AddUnique(Edge->Node1);
- if (DebugLevel >= 8)
+ if (DebugLevel >= 9)
{
- write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld)\n", Station / 10000.0, Edge->Node1->X, Edge->Node1->Y);
+ write_fortschritt("möglicher nasser Knoten bei Profil %.4f: (%ld,%ld,%.3f)\n", Station / 10000.0, Edge->Node1->X, Edge->Node1->Y, Wsp / 100.0);
}
}
}
@@ -1751,7 +1753,7 @@
if (DebugLevel >= 9)
{
- write_fortschritt("nasser Knoten bei Profil %.4f: (%ld,%ld)\n", Station / 10000.0, Node->X, Node->Y);
+ write_fortschritt("nasser Knoten bei Profil %.4f: (%ld,%ld,%.2f)\n", Station / 10000.0, Node->X, Node->Y, Wsp / 100.0);
}
}
@@ -2711,6 +2713,7 @@
}
else if (Edge->Node2->Wsp <= Edge->Node2->Z && Edge->Node1->Wsp != NoWsp && Edge->Node1->Wsp > Edge->Node1->Z && Edge->Node1->Wsp > Edge->Node2->Z)
{
+ // Der bisher trockene Knoten hatte schon einen Wasserstand, er bekommt nun einen neuen
Edge->Node2->Wsp = Edge->Node2->Z + 1;
// Hier jetzt neue potentielle Kanten aufnehmen
Modified: trunk/src/wsplgen.h
===================================================================
--- trunk/src/wsplgen.h 2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/wsplgen.h 2009-11-02 07:45:14 UTC (rev 146)
@@ -10,7 +10,7 @@
// Read the file COPYING coming with WSPLGEN for details.
//
-const char Version[] = "1.3.0";
+const char Version[] = "1.3.1";
// In der Datei wsplgen.h wird jetzt keine Historie mehr gespeichert.
// Diese ist nun in der Datei NEWS zu finden
Modified: trunk/src/xy.cpp
===================================================================
--- trunk/src/xy.cpp 2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/xy.cpp 2009-11-02 07:45:14 UTC (rev 146)
@@ -1450,6 +1450,21 @@
}
//---------------------------------------------------------------------
+void TNodeList::ClearWsp(void)
+{
+ write_fortschritt("->Vorbereiten der Wasserstände gestartet\n");
+
+ for (iterator i = begin(); i != end(); i++)
+ {
+ TNode* Node = *i;
+
+ Node->Wsp = NoWsp;
+ }
+
+ write_fortschritt("<-Vorbereiten der Wasserstände beendet\n");
+}
+
+//---------------------------------------------------------------------
// TElementList
//---------------------------------------------------------------------
@@ -2603,7 +2618,7 @@
{
if (vorprofil->PointList->size() != nachprofil->PointList->size())
{
- dump_error(__FILE__, __LINE__, "Angeglichene Profile ('%.2f' und '%.2f') haben verschieden viele Stützstellen\n", vorprofil->Station / 10000.0, nachprofil->Station / 10000.0);
+ dump_error(__FILE__, __LINE__, "Angeglichene Profile ('%.4f' und '%.4f') haben verschieden viele Stützstellen\n", vorprofil->Station / 10000.0, nachprofil->Station / 10000.0);
}
TPointList::iterator V = vorprofil->PointList->begin();
Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h 2009-11-02 07:38:27 UTC (rev 145)
+++ trunk/src/xy.h 2009-11-02 07:45:14 UTC (rev 146)
@@ -248,6 +248,7 @@
int GetMaxZ(int DebugLevel);
void Scale(void);
void ReScale(void);
+ void ClearWsp(void);
};
//----------------------------------------------------------------------------
More information about the Wsplgen-commits
mailing list