| 350 | //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 351 | |
| 352 | bool FGPropulsion::Load(Element* el) |
| 353 | { |
| 354 | FGModelLoader ModelLoader(this); |
| 355 | |
| 356 | Debug(2); |
| 357 | ReadingEngine = false; |
| 358 | double FuelDensity = 6.0; |
| 359 | |
| 360 | Name = "Propulsion Model: " + el->GetAttributeValue("name"); |
| 361 | |
| 362 | // Perform base class Pre-Load |
| 363 | if (!FGModel::Upload(el, true)) |
| 364 | return false; |
| 365 | |
| 366 | // Process tank definitions first to establish the number of fuel tanks |
| 367 | |
| 368 | Element* tank_element = el->FindElement("tank"); |
| 369 | unsigned int numTanks = 0; |
| 370 | |
| 371 | while (tank_element) { |
| 372 | Tanks.push_back(make_shared<FGTank>(FDMExec, tank_element, numTanks)); |
| 373 | const auto& tank = Tanks.back(); |
| 374 | if (tank->GetType() == FGTank::ttFUEL) |
| 375 | FuelDensity = tank->GetDensity(); |
| 376 | else if (tank->GetType() != FGTank::ttOXIDIZER) { |
| 377 | FGXMLLogging log(tank_element, LogLevel::ERROR); |
| 378 | log << "Unknown tank type specified.\n"; |
| 379 | return false; |
| 380 | } |
| 381 | numTanks++; |
| 382 | tank_element = el->FindNextElement("tank"); |
| 383 | } |
| 384 | |
| 385 | ReadingEngine = true; |
| 386 | Element* engine_element = el->FindElement("engine"); |
| 387 | unsigned int numEngines = 0; |
| 388 | |
| 389 | while (engine_element) { |
| 390 | if (!ModelLoader.Open(engine_element)) return false; |
| 391 | |
| 392 | try { |
| 393 | // Locate the thruster definition |
| 394 | Element* thruster_element = engine_element->FindElement("thruster"); |
| 395 | if (!thruster_element) { |
| 396 | XMLLogException err(engine_element); |
| 397 | err << "No thruster definition supplied with engine definition."; |
| 398 | throw err; |
| 399 | } |
| 400 | if (!ModelLoader.Open(thruster_element)) { |
| 401 | XMLLogException err(thruster_element); |
| 402 | err << "Cannot open the thruster element."; |
| 403 | throw err; |
| 404 | } |
| 405 | |
| 406 | if (engine_element->FindElement("piston_engine")) { |
| 407 | Element *element = engine_element->FindElement("piston_engine"); |
| 408 | Engines.push_back(make_shared<FGPiston>(FDMExec, element, numEngines, in)); |
| 409 | } else if (engine_element->FindElement("turbine_engine")) { |
nothing calls this directly
no test coverage detected