[Wsplgen-commits] r91 - trunk/src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Wed Jul 18 23:27:06 CEST 2007


Author: mrchip
Date: 2007-07-18 23:27:05 +0200 (Wed, 18 Jul 2007)
New Revision: 91

Modified:
   trunk/src/file.cpp
   trunk/src/parameter.cpp
   trunk/src/parameter.h
   trunk/src/tools.cpp
   trunk/src/tools.h
   trunk/src/wsplgen.cpp
   trunk/src/wsplgen.h
   trunk/src/xy.h
Log:
Die Profile k?\195?\182nnen jetzt automatisch an die Gew?\195?\164sseracjhse angepasst werden. Vorsicht bei bei der Verwendung des Parameters Strecke !!!

Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/file.cpp	2007-07-18 21:27:05 UTC (rev 91)
@@ -2485,6 +2485,24 @@
 
 	if (NodeList == 0)		dump_error(__FILE__, __LINE__, "Die Knotenliste ist nicht definiert\n");
 
+	write_fortschritt("->Umnumerierung der Knoten gestartet\n");
+
+	for (unsigned int i=0; i<NodeList->size(); i++)
+	{
+		if (DebugLevel >= 9 || (DebugLevel >= 1 && i % 5000 == 0) || (i > 0 && i % 50000 == 0))
+		{
+			write_fortschritt("%d von %d Knoten umnumeriert\n", i, NodeList->size());
+		}
+
+		TNode *Node = (*NodeList)[i];
+
+		Node->Nr = i + 1;
+	}
+
+	write_fortschritt("%d von %d Knoten umnumeriert\n", NodeList->size(), NodeList->size());
+
+	write_fortschritt("<-Umnumerierung der Knoten beendet\n");
+
 	FILE *fh = fopen (FileName.c_str(), "w");
 	if (fh == NULL)
 	{
@@ -2989,12 +3007,9 @@
 				y[AnzPolyPoints] = (*m)->Y / 100.0;
 
 				if (DebugLevel == 9)
-                {
-					if (DebugLevel == 9)
-                    {
-	                    write_fortschritt("%.2f %.2f\n", x[AnzPolyPoints], y[AnzPolyPoints]);
-                    }
-                }
+				{
+					write_fortschritt("%.2f %.2f\n", x[AnzPolyPoints], y[AnzPolyPoints]);
+				}
 
 				AnzPolyPoints++;
 			}
@@ -3003,7 +3018,10 @@
 			x[AnzPolyPoints] = (*m)->X / 100.0;
 			y[AnzPolyPoints] = (*m)->Y / 100.0;
 
-            write_fortschritt("%.2f %.2f\n\n", x[AnzPolyPoints], y[AnzPolyPoints]);
+			if (DebugLevel == 9)
+			{
+				write_fortschritt("%.2f %.2f\n", x[AnzPolyPoints], y[AnzPolyPoints]);
+			}
 
 			AnzPolyPoints++;
 		}

Modified: trunk/src/parameter.cpp
===================================================================
--- trunk/src/parameter.cpp	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/parameter.cpp	2007-07-18 21:27:05 UTC (rev 91)
@@ -72,6 +72,8 @@
 	IsSetAusgabe = false;
 	FileNameAusgabe = "WSPLGEN.SHP";
 
+    IsSetAutoRenumber = false;
+
 	if (argc == 0 || argv == 0)
 	{
 		write_error(1201, "Es wurden keine Parameter übergeben.\nWenigstens die Parameter -DGM=<DGM-Datei>, -PRO=<Profil-Datei> und -WSP=<Wasserstands-Datei>\nmüssen angegeben werden.\n");
@@ -550,6 +552,23 @@
 
 			continue;
 		}
+		else if (Parameter.substr(0, 13) == "-AUTORENUMBER" || Parameter.substr(0, 13) == "-autorenumber")
+		{
+			///////////////////////////////////////////////
+			// AUTORENUMBER
+			///////////////////////////////////////////////
+			if (IsSetDebug) write_fortschritt("Parameter -AUTORENUMBER erkannt.\n");
+
+			if (IsSetAutoRenumber)
+			{
+				write_warning(1106, "Der Parameter -AUTORENUMBER wurde mehrfach angegeben.\n");
+				continue;
+			}
+
+			IsSetAutoRenumber = true;
+
+			write_fortschritt("Stationierung der Profile wird an die Spur angepasst\n");
+		}
 		else if (Parameter.substr(0, 8) == "-AUSGABE" || Parameter.substr(0, 8) == "-ausgabe")
 		{
 			if (IsSetDebug) write_fortschritt("Parameter -AUSGABE erkannt.\n");
@@ -661,6 +680,12 @@
 		write_warning(1123, "Parameter -ACHSE wird ignoriert, da der Parameter -GEL den Wert NOSPERRE hat\n");
 	}
 
+	if (false == IsSetAchse && true == IsSetAutoRenumber)
+	{
+		write_warning(1125, "Parameter -AUTORENUMBER wird ignoriert, da keine Gewässerachse angegeben wurde\n");
+        IsSetAutoRenumber = false;
+	}
+
 	write_fortschritt("<-Auswertung der Kommandozeilen-Parameter beendet\n");
 }
 

Modified: trunk/src/parameter.h
===================================================================
--- trunk/src/parameter.h	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/parameter.h	2007-07-18 21:27:05 UTC (rev 91)
@@ -74,6 +74,8 @@
 
 		bool		IsSetAusgabe;
 		std::string	FileNameAusgabe;
+
+		bool		IsSetAutoRenumber;
 };
 
 //---------------------------------------------------------------------------

Modified: trunk/src/tools.cpp
===================================================================
--- trunk/src/tools.cpp	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/tools.cpp	2007-07-18 21:27:05 UTC (rev 91)
@@ -2569,4 +2569,122 @@
 	write_fortschritt("<-Ermittlung der Überschwemmungsgrenzen beendet\n");
 }
 
+//---------------------------------------------------------------------
+TProfilList* Renumber(TProfilList* ProfilList, TGewaesserAchseList *GewaesserAchseList, int DebugLevel)
+{
+	write_fortschritt("->Umnumerierung der Profile gestartet\n");
 
+	TProfilList* NewProfilList = new TProfilList;
+
+	for (TProfilList::iterator i = ProfilList->begin(); i != ProfilList->end(); i++)
+	{
+    	TProfil* Profil = *i;
+
+        TProfil* NewProfil = 0;
+
+		bool FoundSchnitt = false;
+
+		for (TGewaesserAchseList::iterator j = GewaesserAchseList->begin(); j != GewaesserAchseList->end(); j++)
+		{
+			TGewaesserAchse* GewaesserAchse = *j;
+
+			double SpurStation = 0.0;
+			TPoint *S0 = 0;
+			TPoint *S1 = 0;
+			for (TPointList::iterator k = GewaesserAchse->PointList->begin(); k != GewaesserAchse->PointList->end(); k++)
+			{
+				S0 = S1;
+				S1 = *k;
+
+				if (k == GewaesserAchse->PointList->begin())	continue;
+
+				long S0x = S0->X;
+				long S0y = S0->Y;
+				long S1x = S1->X;
+				long S1y = S1->Y;
+
+				long SDx = (S1x - S0x);
+				long SDy = (S1y - S0y);
+
+				if (SDx == 0L && SDy == 0L)
+				{
+					write_warning (8888, "Die Spurpunkte (%ld, %ld) und (%ld, %ld) liegen zu dicht zusammen", S0x, S0y, S1x, S1y);
+					continue;
+				}
+
+				TPoint *P0 = 0;
+				TPoint *P1 = 0;
+        		for (TPointList::iterator m = Profil->PointList->begin(); m != Profil->PointList->end(); m++)
+                {
+					P0 = P1;
+					P1 = *m;
+
+					if (m == Profil->PointList->begin())	continue;
+
+					long P0x = P0->X;
+					long P0y = P0->Y;
+					long P1x = P1->X;
+					long P1y = P1->Y;
+
+					long PDx = P1x - P0x;
+					long PDy = P1y - P0y;
+
+					if (PDx == 0L && PDy == 0L)
+					{
+						write_warning (8888, "Die Profilpunkte (%ld, %ld) und (%ld, %ld) liegen zu dicht zusammen", P0x, P0y, P1x, P1y);
+						continue;
+					}
+
+					double X = 0.0;
+					double Y = 0.0;
+
+					bool Schnitt = Calc2Schnitt(P0x, P0y, P1x, P1y, S0x, S0y, S1x, S1y, &X, &Y);
+
+					if (Schnitt == true)
+					{
+						double TDx = S0x - X;
+						double TDy = S0y - Y;
+
+						double TDistance = sqrt(TDx*TDx+TDy*TDy);
+
+						if (DebugLevel >= 8)
+                        {
+							// Länge durch 100 (cm nach m) und Station durch 1000.0 (m nach km)
+                        	write_fortschritt("Profil %.4f wird zu %.4f\n", Profil->Station / 10000.0, (int)(SpurStation + TDistance) / 100.0 / 1000.0);
+                        }
+
+						NewProfil = new TProfil (Profil);
+						NewProfil->Station = (int)((SpurStation + TDistance) / 10.0); // durch von cm nach dm
+
+						FoundSchnitt = true;
+
+                        break;
+					}
+				}
+				if (FoundSchnitt)
+				{
+    		    	break;
+	            }
+                else
+                {
+        	    	double SDistance = sqrt(SDx*SDx+SDy*SDy);
+	        	    SpurStation = SpurStation + SDistance;
+                }
+			}
+			if (FoundSchnitt)
+            {
+	            break;
+            }
+		}
+
+        if (0 == NewProfil)	NewProfil = new TProfil (Profil);
+        NewProfilList->insert(NewProfil);
+	}
+
+	write_fortschritt("<-Umnumerierung der Profile beendet\n");
+
+    delete ProfilList;
+
+    return (NewProfilList);
+}
+

Modified: trunk/src/tools.h
===================================================================
--- trunk/src/tools.h	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/tools.h	2007-07-18 21:27:05 UTC (rev 91)
@@ -75,6 +75,7 @@
 void 					GetWspFromNodeListToGradient(TNodeList* NodeList, TProfilList* GradientenList, double AvgDistance, int DebugLevel);
 void 					GetWspFromNodeListToRohr(TNodeList* NodeList, TProfilList* RohreList, double AvgDistance, int DebugLevel);
 void 					NassTrockenBerechnung(TNodeList *NodeList, TEdgeList *edgelist, TErgebnisPolygonList* ErgebnisPolygone, TProfilList* RohreList, TProfilList* GradientenList, double AvgDistance, int Von, int Bis, int Diff, int DebugLevel);
+TProfilList* 			Renumber(TProfilList* ProfilList, TGewaesserAchseList *GewaesserAchseList, int DebugLevel);
 
 //---------------------------------------------------------------------------
 template<class TClass> int IsInside(TClass *p, double x, double y)

Modified: trunk/src/wsplgen.cpp
===================================================================
--- trunk/src/wsplgen.cpp	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/wsplgen.cpp	2007-07-18 21:27:05 UTC (rev 91)
@@ -104,7 +104,7 @@
 	TElementList *ElementList = new TElementList;
 
 	// Hier werden die Gewaesserachsen drin verwaltet
-	TGewaesserAchseList GewaesserAchseList;
+	TGewaesserAchseList* GewaesserAchseList = new TGewaesserAchseList;
 
 	// Hier drin werden die Ergebnis Polygone drin verwaltet
 	TErgebnisPolygonList *ErgebnisPolygone = new TErgebnisPolygonList();
@@ -139,14 +139,19 @@
 		delete WspProfilList;
 		WspProfilList = 0; 
 
-		// if (Parameter.DebugLevel >= 5) SaveProfile("debug_output_02_Profile_ORIGINAL_mit_WSP.shp", &ProfilList, Parameter.DebugLevel);
-
 		// Jetzt die Gewässerachse einlesen, wenn es notwendig ist
-		if (Parameter.Sperre)
+		if (Parameter.Sperre || Parameter.IsSetAutoRenumber)
 		{
-			LoadAchse(Parameter.FileNameAchse, &GewaesserAchseList, Parameter.DebugLevel);
+			LoadAchse(Parameter.FileNameAchse, GewaesserAchseList, Parameter.DebugLevel);
 		}
 
+		// Jetzt die Profile umnummerieren, wenn es notwendig ist
+		if (Parameter.IsSetAutoRenumber)
+		{
+			// In Renumber wird die alte durch eine neue ProfilList ersetzt
+			ProfilList = Renumber(ProfilList, GewaesserAchseList, Parameter.DebugLevel);
+		}
+
 		// Jetzt die Gräben und Dämme und Rohre und Gradienten einlesen, wenn es notwendig ist
 		if (Parameter.IsSetLin)
 		{
@@ -241,22 +246,26 @@
 		// werden die Profile entsprechend fein interpoliert
 		// Dabei muss der Faktor zwischen Kantenlänge in Metern
 		// und Station in Centimetern beachtet werden
-		ProfilList->InterpoliereProfile(AvgDistance * 4.0);
+		ProfilList->InterpoliereProfile(AvgDistance * 2.0);
 
 //		if (ProfilList->size() < 200) ProfilList->InterpoliereProfile(AvgDistance * 4.0);
 //		if (ProfilList->size() < 200) ProfilList->InterpoliereProfile(AvgDistance * 2.0);
 //		if (ProfilList->size() < 200) ProfilList->InterpoliereProfile(AvgDistance * 1.0);
 
 		// Jetzt die Stützstellen auffüllen
-		ProfilList->FillProfile(AvgDistance / 2.0, -1, Parameter.DebugLevel);
+		ProfilList->FillProfile(AvgDistance / 4.0, -1, Parameter.DebugLevel);
 
 		// Mal wieder Zwischenergebnisse produzieren
 		std::string ProfilFileName = ExchangeFileExt(Parameter.FileNameAusgabe, "_interpolierte_profile.shp");
 		SaveProfile(ProfilFileName, ProfilList, Parameter.DebugLevel);
 
 		// Jetzt eine neue Knotenliste aus den Profilen generienen
-		BuildProfilNodeList(ProfilList, NodeList, &GewaesserAchseList, SperrenList, ProfilNodeList, AvgDistance * 2.0, Parameter.Sperre, Parameter.DebugLevel);
+		BuildProfilNodeList(ProfilList, NodeList, GewaesserAchseList, SperrenList, ProfilNodeList, AvgDistance * 2.0, Parameter.Sperre, Parameter.DebugLevel);
 
+		write_fortschritt("->Freigeben des Speichers der Gewässerachsen gestartet\n");
+		delete GewaesserAchseList;
+		write_fortschritt("<-Freigeben des Speichers der Gewässerachsen beendet\n");
+
 		std::string ProfilKnotenFileName = ExchangeFileExt(Parameter.FileNameAusgabe, "_profilknoten.shp");
 		SaveNodes(ProfilKnotenFileName, ProfilNodeList, Parameter.DebugLevel);
 

Modified: trunk/src/wsplgen.h
===================================================================
--- trunk/src/wsplgen.h	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/wsplgen.h	2007-07-18 21:27:05 UTC (rev 91)
@@ -10,8 +10,14 @@
 // Read the file COPYING coming with WSPLGEN for details.
 //
 
-const char Version[] = "1.1.1";
+const char Version[] = "1.1.2";
 
+// Parameter AUTORENUMBER wurde eingeführt
+
+// const char Version[] = "1.1.1";
+
+// 2DM-Netze werden vor dem Speichern umnumeriert
+
 // Es wird die Umhüllung bei TINs gelesen und benutzt um inaktive Kanten zu eleminieren
 
 // Falls das Begrenzungpolygon nicht beschnitten werden muss,

Modified: trunk/src/xy.h
===================================================================
--- trunk/src/xy.h	2007-07-15 18:01:23 UTC (rev 90)
+++ trunk/src/xy.h	2007-07-18 21:27:05 UTC (rev 91)
@@ -411,7 +411,6 @@
 class TGewaesserAchse
 {
 	public:
-//		int				ID;
 
 		long		 	MinX;
 		long		 	MaxX;



More information about the Wsplgen-commits mailing list