bool FGAerodynamics::Load(Element *element) { string parameter, axis, scratch; string scratch_unit=""; string fname="", file=""; Element *temp_element, *axis_element, *function_element; string separator = "/"; fname = element->GetAttributeValue("file"); if (!fname.empty()) { file = FDMExec->GetFullAircraftPath() + separator + fname; document = LoadXMLDocument(file); if (document == 0L) return false; } else { document = element; } FGModel::Load(document); // Perform base class Pre-Load DetermineAxisSystem(); // Detemine if Lift/Side/Drag, etc. is used. Debug(2); if ((temp_element = document->FindElement("alphalimits"))) { scratch_unit = temp_element->GetAttributeValue("unit"); if (scratch_unit.empty()) scratch_unit = "RAD"; alphaclmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD"); alphaclmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD"); } if ((temp_element = document->FindElement("hysteresis_limits"))) { scratch_unit = temp_element->GetAttributeValue("unit"); if (scratch_unit.empty()) scratch_unit = "RAD"; alphahystmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD"); alphahystmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD"); } if ((temp_element = document->FindElement("aero_ref_pt_shift_x"))) { function_element = temp_element->FindElement("function"); AeroRPShift = new FGFunction(PropertyManager, function_element); } axis_element = document->FindElement("axis"); while (axis_element) { AeroFunctionArray ca; axis = axis_element->GetAttributeValue("name"); function_element = axis_element->FindElement("function"); while (function_element) { string current_func_name = function_element->GetAttributeValue("name"); try { ca.push_back( new FGFunction(PropertyManager, function_element) ); } catch (string const str) { cerr << endl << fgred << "Error loading aerodynamic function in " << current_func_name << ":" << str << " Aborting." << reset << endl; return false; } function_element = axis_element->FindNextElement("function"); } AeroFunctions[AxisIdx[axis]] = ca; axis_element = document->FindNextElement("axis"); } PostLoad(document, PropertyManager); // Perform base class Post-Load return true; }
bool FGAerodynamics::Load(Element *document) { string parameter, axis, scratch; string scratch_unit=""; Element *temp_element, *axis_element, *function_element; Name = "Aerodynamics Model: " + document->GetAttributeValue("name"); // Perform base class Pre-Load if (!FGModel::Load(document)) return false; DetermineAxisSystem(document); // Determine if Lift/Side/Drag, etc. is used. Debug(2); if ((temp_element = document->FindElement("alphalimits"))) { scratch_unit = temp_element->GetAttributeValue("unit"); if (scratch_unit.empty()) scratch_unit = "RAD"; alphaclmin0 = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD"); alphaclmax0 = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD"); alphaclmin = alphaclmin0; alphaclmax = alphaclmax0; } if ((temp_element = document->FindElement("hysteresis_limits"))) { scratch_unit = temp_element->GetAttributeValue("unit"); if (scratch_unit.empty()) scratch_unit = "RAD"; alphahystmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD"); alphahystmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD"); } if ((temp_element = document->FindElement("aero_ref_pt_shift_x"))) { function_element = temp_element->FindElement("function"); AeroRPShift = new FGFunction(PropertyManager, function_element); } axis_element = document->FindElement("axis"); while (axis_element) { AeroFunctionArray ca; AeroFunctionArray ca_atCG; axis = axis_element->GetAttributeValue("name"); function_element = axis_element->FindElement("function"); while (function_element) { string current_func_name = function_element->GetAttributeValue("name"); bool apply_at_cg = false; if (function_element->HasAttribute("apply_at_cg")) { if (function_element->GetAttributeValue("apply_at_cg") == "true") apply_at_cg = true; } if (!apply_at_cg) { try { ca.push_back( new FGFunction(PropertyManager, function_element) ); } catch (string const str) { cerr << endl << fgred << "Error loading aerodynamic function in " << current_func_name << ":" << str << " Aborting." << reset << endl; return false; } } else { try { ca_atCG.push_back( new FGFunction(PropertyManager, function_element) ); } catch (string const str) { cerr << endl << fgred << "Error loading aerodynamic function in " << current_func_name << ":" << str << " Aborting." << reset << endl; return false; } } function_element = axis_element->FindNextElement("function"); } AeroFunctions[AxisIdx[axis]] = ca; AeroFunctionsAtCG[AxisIdx[axis]] = ca_atCG; axis_element = document->FindNextElement("axis"); } PostLoad(document, PropertyManager); // Perform base class Post-Load return true; }