00001
00006 #include "StructureParser.h"
00007
00008 #include "../Koordinaten.h"
00009 #include "../Konstanten.h"
00010 #include "../Spur.h"
00011 #include "../Kreuzung.h"
00012 #include "../Generator.h"
00013
00014 #include <stdio.h>
00015 #include <stdlib.h>
00016 #include <qstring.h>
00017
00018
00025 StructureParser::StructureParser()
00026 {
00027
00028 }
00029
00030
00031
00032
00033
00046 StructureParser::StructureParser( Spur **spurenArray, long int *spurenPosition, Liste *generatorListe, Liste *kreuzungsListe, Liste *fahrzeugeListe )
00047 {
00048 spurenArray_ = spurenArray;
00049 spurenPosition_ = spurenPosition;
00050 generatorListe_ = generatorListe;
00051 kreuzungsListe_ = kreuzungsListe;
00052 fahrzeugeListe_ = fahrzeugeListe;
00053 durchlauf_ = 0;
00054 }
00055
00056
00057
00058
00059
00073 bool StructureParser::startElement( const QString&, const QString&, const QString &qName, const QXmlAttributes &qAttr )
00074 {
00075
00076 if( qName == "spur" )
00077 {
00078 int ausrichtung = 0, richtung = 0, vMax = 0;
00079 long int id = 0;
00080 double laenge = 0, x = 0, y = 0, z = 0;
00081 Koordinaten *coords = new Koordinaten();
00082
00083 idSpur = "unbekannt";
00084
00085 for( int i = 0; i < qAttr.count(); i++)
00086 {
00087 if( qAttr.localName( i ) == "id" )
00088 {
00089 id = atoi( (const char*)qAttr.value( i ) );
00090 idSpur = (const char*)qAttr.value( i );
00091 if( id == 0 )
00092 {
00093 Fehler *fehler = new Fehler("Eine SpurenID ist leer. Bitte überprüfen Sie die XML-Datei.");
00094 throw( fehler );
00095 }
00096 }
00097
00098
00099 if( qAttr.localName( i ) == "laenge" )
00100 {
00101 laenge = atof( (const char*)qAttr.value( i ) )/10;
00102 if( laenge == 0 )
00103 {
00104 string text = "Die Länge der Spur #"; text += idSpur; text += " ist leer. Bitte überprüfen Sie die XML-Datei.";
00105 Fehler *fehler = new Fehler( text );
00106 throw( fehler );
00107 }
00108 }
00109
00110
00111 if( qAttr.localName( i ) == "ausrichtung" )
00112 {
00113 if( strcmp((const char*)qAttr.value( i ),"HOR") == 0 )
00114 ausrichtung = HOR;
00115 else
00116 {
00117 if( strcmp((const char*)qAttr.value( i ),"VER") == 0 )
00118 ausrichtung = VER;
00119 else
00120 {
00121 string text = "Die Ausrichtung der Spur #"; text += idSpur; text += " hat keinen gültigen Wert. Bitte überprüfen Sie die XML-Datei.";
00122 Fehler *fehler = new Fehler( text );
00123 throw( fehler );
00124 }
00125 }
00126 }
00127
00128 if( qAttr.localName( i ) == "richtung" )
00129 {
00130 if ( strcmp( (const char*)qAttr.value( i ),"LTOR") == 0 || strcmp( (const char*)qAttr.value( i ), "UP") == 0 )
00131 richtung = LTOR;
00132 else
00133 {
00134 if ( strcmp( (const char*)qAttr.value( i ),"RTOL") == 0 || strcmp( (const char*)qAttr.value( i ), "DOWN") == 0 )
00135 richtung = RTOL;
00136 else
00137 {
00138 string text = "Die Richtung der Spur #"; text += idSpur; text += " hat keinen gültigen Wert. Bitte überprüfen Sie die XML-Datei.";
00139 Fehler *fehler = new Fehler( text );
00140 throw( fehler );
00141 }
00142 }
00143 }
00144
00145
00146 if( qAttr.localName( i ) == "x" )
00147 x = atof( (const char*)qAttr.value( i ) );
00148
00149 if( qAttr.localName( i ) == "y" )
00150 y = atof( (const char*)qAttr.value( i ) );
00151
00152 if( qAttr.localName( i ) == "z" )
00153 z = atof( (const char*)qAttr.value( i ) );
00154
00155
00156 if( qAttr.localName( i ) == "maximaleGeschwindigkeit" )
00157 {
00158 vMax = atoi( (const char*)qAttr.value( i ) );
00159 if( vMax == 0 )
00160 {
00161 string text = "Die maximale Geschindigkeit der Spur #"; text += idSpur; text += " ist leer. Bitte überprüfen Sie die XML-Datei.";
00162 Fehler *fehler = new Fehler( text );
00163 throw( fehler );
00164 }
00165 }
00166 }
00167
00168 coords->x = x;
00169 coords->y = y;
00170 coords->z = z;
00171
00172
00173 spurenArray_[durchlauf_] = new Spur( id, laenge, vMax );
00174
00175 spurenArray_[durchlauf_]->setzeKoordinaten( *coords );
00176 spurenArray_[durchlauf_]->setzeRichtung( richtung );
00177 spurenArray_[durchlauf_]->setzeAusrichtung( ausrichtung );
00178
00179
00180 spurenPosition_[id] = durchlauf_;
00181
00182
00183 durchlauf_++;
00184 }
00185
00186
00187
00188
00189 if( qName == "nachfolger" )
00190 {
00191 long int id = 0;
00192 const char *idNachfolger = "unbekannt";
00193 int richtung = 0;
00194 double wahrscheinlichkeit = 0;
00195
00196 for( int i = 0; i < qAttr.count(); i++)
00197 {
00198 if( qAttr.localName( i ) == "id" )
00199 {
00200 id = atoi( (const char*)qAttr.value( i ) );
00201 idNachfolger = (const char*)qAttr.value( i );
00202 if( id == 0 )
00203 {
00204 string text = "Die ID eines Nachfolgers ist leer. Bitte überprüfen Sie die XML-Datei.";
00205 Fehler *fehler = new Fehler( text );
00206 throw( fehler );
00207 }
00208 }
00209
00210
00211
00212 if( qAttr.localName( i ) == "richtung" )
00213 {
00214 if( strcmp((const char*)qAttr.value( i ),"LINKS") == 0 )
00215 richtung = LINKS;
00216 else
00217 {
00218 if( strcmp((const char*)qAttr.value( i ),"MITTE") == 0 )
00219 richtung = MITTE;
00220 else
00221 {
00222 if( strcmp((const char*)qAttr.value( i ),"RECHTS") == 0 )
00223 richtung = RECHTS;
00224 else
00225 {
00226 string text = "Die Abbiegerichtung eines Nachfolgers ist leer. Bitte überprüfen Sie die XML-Datei.";
00227 Fehler *fehler = new Fehler( text );
00228 throw( fehler );
00229 }
00230 }
00231 }
00232 }
00233
00234
00235
00236 if( qAttr.localName( i ) == "wahrscheinlichkeit" )
00237 {
00238 wahrscheinlichkeit = atof( (const char*)qAttr.value( i ) );
00239 if( wahrscheinlichkeit == 0 )
00240 {
00241 string text = "Die Abbiegewahrscheinlichkeit eines Nachfolgers ist leer. Bitte überprüfen Sie die XML-Datei.";
00242 Fehler *fehler = new Fehler( text );
00243 throw( fehler );
00244 }
00245 }
00246 }
00247
00248 spurenArray_[durchlauf_-1]->setzeNaechstesVerbindungselement( richtung, id, wahrscheinlichkeit);
00249 }
00250
00251
00252
00253
00254 if( qName == "generator" )
00255 {
00256 for( int i = 0; i < qAttr.count(); i++)
00257 {
00258 if( qAttr.localName( i ) == "id" )
00259 {
00260 generator_generatorId = atoi( (const char*)qAttr.value( i ) );
00261 idGenerator = (const char*)qAttr.value( i );
00262 if( idGenerator == 0 )
00263 {
00264 Fehler *fehler = new Fehler("Eine GeneratorID ist leer. Bitte überprüfen Sie die XML-Datei.");
00265 throw( fehler );
00266 }
00267 }
00268
00269
00270 if( qAttr.localName( i ) == "spurID" )
00271 {
00272 generator_spurId = atoi( (const char*)qAttr.value( i ) );
00273 if( generator_spurId == 0 )
00274 {
00275 string text = "Die SpurenID des Generators #"; text += idGenerator; text += " ist leer. Bitte überprüfen Sie die XML-Datei.";
00276 Fehler *fehler = new Fehler( text );
00277 throw( fehler );
00278 }
00279 }
00280
00281
00282 if( qAttr.localName( i ) == "fahrzeugAnzahl" )
00283 {
00284 generator_anzahl = atoi( (const char*)qAttr.value( i ) );
00285 if( generator_anzahl == 0 )
00286 {
00287 string text = "Die Anzahl der zu generierenden Fahrzeuge des Generators #"; text += idGenerator; text += " ist leer. Bitte überprüfen Sie die XML-Datei.";
00288 Fehler *fehler = new Fehler( text );
00289 throw( fehler );
00290 }
00291 }
00292
00293
00294 if( qAttr.localName( i ) == "erstellzeit" )
00295 {
00296 generator_zeit = atof( (const char*)qAttr.value( i ) );
00297 if( generator_zeit == 0 )
00298 {
00299 string text = "Die Erstellzeit des Generators #"; text += idGenerator; text += " ist leer. Bitte überprüfen Sie die XML-Datei.";
00300 Fehler *fehler = new Fehler( text );
00301 throw( fehler );
00302
00303 }
00304 }
00305 }
00306
00307
00308 generator = new Generator( spurenArray_[ spurenPosition_[generator_spurId] ], generator_generatorId );
00309
00310 generator->setzeFahrzeugliste( fahrzeugeListe_ );
00311 generator->setzeAnzahlFahrzeuge( generator_anzahl );
00312 generator->setzeTaktZeit( generator_zeit );
00313
00314 generatorListe_->datenHinzufuegen( generator );
00315 }
00316
00317
00318
00319
00320
00321 if( qName == "fahrzeug" )
00322 {
00323 int typ = 0, ttl = 0;
00324 double laenge = 0, aPos = 0, aNeg = 0, vMax = 0, r = 0, g = 0, b = 0;
00325 Koordinaten *color = new Koordinaten();
00326
00327 for( int i = 0; i < qAttr.count(); i++)
00328 {
00329 if( qAttr.localName( i ) == "typ" )
00330 {
00331 if( strcmp((const char*)qAttr.value( i ),"PKW") == 0 )
00332 typ = PKW;
00333 else
00334 {
00335 if( strcmp((const char*)qAttr.value( i ),"BUS") == 0 )
00336 typ = BUS;
00337 else
00338 {
00339 if( strcmp((const char*)qAttr.value( i ),"LKW") == 0 )
00340 typ = LKW;
00341 else
00342 {
00343 if( strcmp((const char*)qAttr.value( i ),"BIKE") == 0 )
00344 typ = BIKE;
00345 else
00346 {
00347 string text = "Ein Fahrzeug eines Generators hat keinen gültigen Typ. Bitte überprüfen Sie die XML-Datei.";
00348 Fehler *fehler = new Fehler( text );
00349 throw( fehler );
00350 }
00351 }
00352 }
00353 }
00354 }
00355
00356
00357 if( qAttr.localName( i ) == "laenge" )
00358 {
00359 laenge = atof( (const char*)qAttr.value( i ) );
00360 if( laenge == 0 )
00361 {
00362 string text = "Die Fahrzeuglänge eines Generators ist leer. Bitte überprüfen Sie die XML-Datei.";
00363 Fehler *fehler = new Fehler( text );
00364 throw( fehler );
00365 }
00366 }
00367
00368
00369 if( qAttr.localName( i ) == "lebensdauer" )
00370 {
00371 ttl = atoi( (const char*)qAttr.value( i ) );
00372 if( ttl == 0 )
00373 {
00374 string text = "Die Fahrzeuglebensdauer eines Generators ist leer. Bitte überprüfen Sie die XML-Datei.";
00375 Fehler *fehler = new Fehler( text );
00376 throw( fehler );
00377 }
00378 }
00379
00380
00381 if( qAttr.localName( i ) == "beschleunigungPositiv" )
00382 {
00383 aPos = atof( (const char*)qAttr.value( i ) );
00384 if( aPos == 0 )
00385 {
00386 string text = "Die Fahrzeugbeschleunigung eines Generators ist leer. Bitte überprüfen Sie die XML-Datei.";
00387 Fehler *fehler = new Fehler( text );
00388 throw( fehler );
00389 }
00390 }
00391
00392
00393 if( qAttr.localName( i ) == "beschleunigungNegativ" )
00394 {
00395 aNeg = atof( (const char*)qAttr.value( i ) );
00396 if( aNeg == 0 )
00397 {
00398 string text = "Die Fahrzeugverzögerung eines Generators ist leer. Bitte überprüfen Sie die XML-Datei.";
00399 Fehler *fehler = new Fehler( text );
00400 throw( fehler );
00401 }
00402 if( aNeg > 0 )
00403 {
00404 string text = "Die Fahrzeugverzögerung eines Generators muss negativ sein. Bitte überprüfen Sie die XML-Datei.";
00405 Fehler *fehler = new Fehler( text );
00406 throw( fehler );
00407 }
00408 }
00409
00410
00411 if( qAttr.localName( i ) == "hoechstgeschwindigkeit" )
00412 {
00413 vMax = atoi( (const char*)qAttr.value( i ) );
00414 if( vMax == 0 )
00415 {
00416 string text = "Die Fahrzeughöchstgeschwindigkeit eines Generators ist leer. Bitte überprüfen Sie die XML-Datei.";
00417 Fehler *fehler = new Fehler( text );
00418 throw( fehler );
00419 }
00420 }
00421
00422
00423 if( qAttr.localName( i ) == "rot" )
00424 {
00425 r = atof( (const char*)qAttr.value( i ) );
00426 if( r > 255 )
00427 {
00428 string text = "Der Rotanteil der Fahrzeugfarbe eines Generators größer als 255. Bitte überprüfen Sie die XML-Datei.";
00429 Fehler *fehler = new Fehler( text );
00430 throw( fehler );
00431 }
00432 }
00433
00434 if( qAttr.localName( i ) == "gruen" )
00435 {
00436 g = atof( (const char*)qAttr.value( i ) );
00437 if( g > 255 )
00438 {
00439 string text = "Der Grünanteil der Fahrzeugfarbe eines Generators größer als 255. Bitte überprüfen Sie die XML-Datei.";
00440 Fehler *fehler = new Fehler( text );
00441 throw( fehler );
00442 }
00443 }
00444
00445 if( qAttr.localName( i ) == "blau" )
00446 {
00447 b = atof( (const char*)qAttr.value( i ) );
00448 if( b > 255 )
00449 {
00450 string text = "Der Blauanteil der Fahrzeugfarbe eines Generators größer als 255. Bitte überprüfen Sie die XML-Datei.";
00451 Fehler *fehler = new Fehler( text );
00452 throw( fehler );
00453 }
00454 }
00455
00456 color->x = r;
00457 color->y = g;
00458 color->z = b;
00459 }
00460
00461
00462 generator->setzeFahrzeugeigenschaften( typ, aPos, aNeg, ttl, laenge, *color, vMax );
00463 }
00464
00465
00466
00467
00468 if( qName == "fahrtenbucheintrag" )
00469 {
00470 int richtung = 0;
00471
00472 for( int i = 0; i < qAttr.count(); i++)
00473 {
00474
00475 if( qAttr.localName( i ) == "richtung" )
00476 {
00477 if( strcmp((const char*)qAttr.value( i ),"LINKS") == 0 )
00478 richtung = LINKS;
00479 else
00480 {
00481 if( strcmp((const char*)qAttr.value( i ),"MITTE") == 0 )
00482 richtung = MITTE;
00483 else
00484 {
00485 if( strcmp((const char*)qAttr.value( i ),"RECHTS") == 0 )
00486 richtung = RECHTS;
00487 else
00488 {
00489 Fehler *fehler = new Fehler( "Ein Fahrtenbucheintrag eines Generators ist nicht korrekt. Bitte überprüfen Sie die XML-Datei.");
00490 fehler->ergaenzeMeldung( (char*) generator->gibId() );
00491 throw(fehler);
00492 }
00493 }
00494 }
00495 }
00496 }
00497
00498
00499 generator->wegpunktHinzufuegen( richtung );
00500 }
00501
00502
00503
00504 if( qName == "kreuzung" )
00505 {
00506 long int id = 0, nL = 0, nM = 0, nR = 0, oL = 0, oM = 0, oR = 0, sL = 0, sM = 0, sR = 0, wL = 0, wM = 0, wR = 0;
00507 const char *idKreuzung = "unbekannt";
00508 int ampelAlgo = 1;
00509
00510 for( int i = 0; i < qAttr.count(); i++)
00511 {
00512 if( qAttr.localName( i ) == "nordenLinks" )
00513 nL = atoi( (const char*)qAttr.value( i ) );
00514 if( qAttr.localName( i ) == "nordenMitte" )
00515 nM = atoi( (const char*)qAttr.value( i ) );
00516 if( qAttr.localName( i ) == "nordenRechts" )
00517 nR = atoi( (const char*)qAttr.value( i ) );
00518
00519
00520 if( qAttr.localName( i ) == "ostenLinks" )
00521 oL = atoi( (const char*)qAttr.value( i ) );
00522 if( qAttr.localName( i ) == "ostenMitte" )
00523 oM = atoi( (const char*)qAttr.value( i ) );
00524 if( qAttr.localName( i ) == "ostenRechts" )
00525 oR = atoi( (const char*)qAttr.value( i ) );
00526
00527
00528 if( qAttr.localName( i ) == "suedenLinks" )
00529 sL = atoi( (const char*)qAttr.value( i ) );
00530 if( qAttr.localName( i ) == "suedenMitte" )
00531 sM = atoi( (const char*)qAttr.value( i ) );
00532 if( qAttr.localName( i ) == "suedenRechts" )
00533 sR = atoi( (const char*)qAttr.value( i ) );
00534
00535
00536 if( qAttr.localName( i ) == "westenLinks" )
00537 wL = atoi( (const char*)qAttr.value( i ) );
00538 if( qAttr.localName( i ) == "westenMitte" )
00539 wM = atoi( (const char*)qAttr.value( i ) );
00540 if( qAttr.localName( i ) == "westenRechts" )
00541 wR = atoi( (const char*)qAttr.value( i ) );
00542
00543
00544 if( qAttr.localName( i ) == "id" )
00545 {
00546 id = atoi( (const char*)qAttr.value( i ) );
00547 idKreuzung = (const char*)qAttr.value( i );
00548 if( id == 0 )
00549 {
00550 Fehler *fehler = new Fehler("Eine KreuzungsID ist leer. Bitte überprüfen Sie die XML-Datei.");
00551 throw( fehler );
00552 }
00553 }
00554
00555
00556 if( qAttr.localName( i ) == "ampelalgorithmus")
00557 {
00558 ampelAlgo = atoi( (const char*)qAttr.value( i ) );
00559 if( ampelAlgo == 0 )
00560 {
00561 string text = "Der Ampelalgorithmus der Kreuzung #"; text += idKreuzung; text += " ist nicht gesetzt. Bitte überprüfen Sie die XML-Datei.";
00562 Fehler *fehler = new Fehler( text );
00563 throw( fehler );
00564 }
00565 }
00566
00567 }
00568
00569
00570 Kreuzung *kreuzung = new Kreuzung( id );
00571
00572 if( nL != 0 )
00573 kreuzung->setzeSpur( NORD, LINKS, spurenArray_[ spurenPosition_[nL] ] );
00574 if( nM != 0 )
00575 kreuzung->setzeSpur( NORD, MITTE, spurenArray_[ spurenPosition_[nM] ] );
00576 if( nR != 0 )
00577 kreuzung->setzeSpur( NORD, RECHTS, spurenArray_[ spurenPosition_[nR] ] );
00578 if( oL != 0 )
00579 kreuzung->setzeSpur( OST, LINKS, spurenArray_[ spurenPosition_[oL] ] );
00580 if( oM != 0 )
00581 kreuzung->setzeSpur( OST, MITTE, spurenArray_[ spurenPosition_[oM] ] );
00582 if( oR != 0 )
00583 kreuzung->setzeSpur( OST, RECHTS, spurenArray_[ spurenPosition_[oR] ] );
00584 if( sL != 0 )
00585 kreuzung->setzeSpur( SUED, LINKS, spurenArray_[ spurenPosition_[sL] ] );
00586 if( sM != 0 )
00587 kreuzung->setzeSpur( SUED, MITTE, spurenArray_[ spurenPosition_[sM] ] );
00588 if( sR != 0 )
00589 kreuzung->setzeSpur( SUED, RECHTS, spurenArray_[ spurenPosition_[sR] ] );
00590 if( wL != 0 )
00591 kreuzung->setzeSpur( WEST, LINKS, spurenArray_[ spurenPosition_[wL] ] );
00592 if( wM != 0 )
00593 kreuzung->setzeSpur( WEST, MITTE, spurenArray_[ spurenPosition_[wM] ] );
00594 if( wR != 0 )
00595 kreuzung->setzeSpur( WEST, RECHTS, spurenArray_[ spurenPosition_[wR] ] );
00596
00597 try
00598 {
00599 kreuzung->setzeAmpelalgorithmus( ampelAlgo );
00600 }
00601 catch(Fehler f)
00602 {
00603 string text = "Der Ampelalgorithmus der Kreuzung #"; text += idKreuzung; text += " hat keinen gültigen Wert. Bitte überprüfen Sie die XML-Datei.";
00604 Fehler *fehler = new Fehler( text );
00605 throw( fehler );
00606 }
00607
00608 kreuzungsListe_->datenHinzufuegen( kreuzung );
00609 }
00610
00611 return TRUE;
00612 }
00613
00614
00615
00616
00617
00618
00619
00620
00627 StructureCounter::StructureCounter()
00628 {
00629 countSpuren_ = 0;
00630 }
00631
00632
00633
00634
00635
00646 bool StructureCounter::endElement( const QString&, const QString&, const QString &qName )
00647 {
00648 if( qName == "spur" )
00649 countSpuren_ += 1;
00650
00651 return TRUE;
00652 }
00653
00654
00655
00656
00657
00666 int StructureCounter::gibAnzahlSpuren()
00667 {
00668 return countSpuren_;
00669 }
00670
00671
00672
00673
00674
00681 StructureGetter::StructureGetter()
00682 {
00683 maxID_ = 0;
00684 }
00685
00686
00687
00688
00689
00701 bool StructureGetter::startElement( const QString&, const QString&, const QString &qName, const QXmlAttributes &qAttr )
00702 {
00703 if( qName == "spur" )
00704 {
00705 long int id = 0;
00706
00707 for( int i = 0; i < qAttr.count(); i++)
00708 {
00709 if( qAttr.localName( i ) == "id" )
00710 id = atol( (const char*)qAttr.value( i ) );
00711 }
00712
00713
00714 if( id > maxID_ )
00715 maxID_ = id;
00716 }
00717
00718 return TRUE;
00719 }
00720
00721
00722
00723
00724
00733 long int StructureGetter::gibMaxId()
00734 {
00735 return maxID_;
00736 }
00737