FGColumnVector3 Element::FindElementTripletConvertTo( const string& target_units) { FGColumnVector3 triplet; Element* item; double value=0.0; string supplied_units = GetAttributeValue("unit"); if (!supplied_units.empty()) { if (convert.find(supplied_units) == convert.end()) { std::stringstream error; error << ReadFrom() << "Supplied unit: \"" << supplied_units << "\" does not exist (typo?)." << endl; throw std::runtime_error(error.str()); } if (convert[supplied_units].find(target_units) == convert[supplied_units].end()) { std::stringstream error; error << ReadFrom() << "Supplied unit: \"" << supplied_units << "\" cannot be converted to " << target_units << endl; throw std::runtime_error(error.str()); } } item = FindElement("x"); if (!item) item = FindElement("roll"); if (item) { value = item->GetDataAsNumber(); if (!supplied_units.empty()) value *= convert[supplied_units][target_units]; triplet(1) = DisperseValue(item, value, supplied_units, target_units); } else { triplet(1) = 0.0; } item = FindElement("y"); if (!item) item = FindElement("pitch"); if (item) { value = item->GetDataAsNumber(); if (!supplied_units.empty()) value *= convert[supplied_units][target_units]; triplet(2) = DisperseValue(item, value, supplied_units, target_units); } else { triplet(2) = 0.0; } item = FindElement("z"); if (!item) item = FindElement("yaw"); if (item) { value = item->GetDataAsNumber(); if (!supplied_units.empty()) value *= convert[supplied_units][target_units]; triplet(3) = DisperseValue(item, value, supplied_units, target_units); } else { triplet(3) = 0.0; } return triplet; }
double Element::FindElementValueAsNumberConvertFromTo( const string& el, const string& supplied_units, const string& target_units) { Element* element = FindElement(el); if (!element) { cerr << "Attempting to get non-existent element " << el << endl; exit(-1); } if (!supplied_units.empty()) { if (convert.find(supplied_units) == convert.end()) { cerr << element->ReadFrom() << "Supplied unit: \"" << supplied_units << "\" does not exist (typo?)." << endl; exit(-1); } if (convert[supplied_units].find(target_units) == convert[supplied_units].end()) { cerr << element->ReadFrom() << "Supplied unit: \"" << supplied_units << "\" cannot be converted to " << target_units << endl; exit(-1); } } double value = element->GetDataAsNumber(); if (!supplied_units.empty()) { value *= convert[supplied_units][target_units]; } value = DisperseValue(element, value, supplied_units, target_units); return value; }
double Element::FindElementValueAsNumberConvertTo(const string& el, const string& target_units) { Element* element = FindElement(el); if (!element) { std::stringstream error; error << ReadFrom() << "Attempting to get non-existent element " << el << endl; throw std::runtime_error(error.str()); } string supplied_units = element->GetAttributeValue("unit"); if (!supplied_units.empty()) { if (convert.find(supplied_units) == convert.end()) { std::stringstream error; error << element->ReadFrom() << "Supplied unit: \"" << supplied_units << "\" does not exist (typo?)." << endl; throw std::runtime_error(error.str()); } if (convert[supplied_units].find(target_units) == convert[supplied_units].end()) { std::stringstream error; error << element->ReadFrom() << "Supplied unit: \"" << supplied_units << "\" cannot be converted to " << target_units << endl; throw std::runtime_error(error.str()); } } double value = element->GetDataAsNumber(); // Sanity check for angular values if ((supplied_units == "RAD") && (fabs(value) > 2 * M_PI)) { cerr << element->ReadFrom() << "The value " << value << " RAD is outside the range [ -2*M_PI RAD ; +2*M_PI RAD ]" << endl; } if ((supplied_units == "DEG") && (fabs(value) > 360.0)) { cerr << element->ReadFrom() << "The value " << value << " DEG is outside the range [ -360 DEG ; +360 DEG ]" << endl; } if (!supplied_units.empty()) { value *= convert[supplied_units][target_units]; } if ((target_units == "RAD") && (fabs(value) > 2 * M_PI)) { cerr << element->ReadFrom() << "The value " << value << " RAD is outside the range [ -2*M_PI RAD ; +2*M_PI RAD ]" << endl; } if ((target_units == "DEG") && (fabs(value) > 360.0)) { cerr << element->ReadFrom() << "The value " << value << " DEG is outside the range [ -360 DEG ; +360 DEG ]" << endl; } value = DisperseValue(element, value, supplied_units, target_units); return value; }
double Element::FindElementValueAsNumber(const string& el) { Element* element = FindElement(el); if (element) { double value = element->GetDataAsNumber(); value = DisperseValue(element, value); return value; } else { cerr << ReadFrom() << "Attempting to get non-existent element " << el << endl; exit(-1); } }
double Element::FindElementValueAsNumber(const string& el) { Element* element = FindElement(el); if (element) { double value = element->GetDataAsNumber(); value = DisperseValue(element, value); return value; } else { std::stringstream error; error << ReadFrom() << "Attempting to get non-existent element " << el << endl; throw std::runtime_error(error.str()); } }