📄 fgxmlelement.cpp
字号:
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double Element::GetDataAsNumber(void){ if (data_lines.size() == 1) { return atof(data_lines[0].c_str()); } else if (data_lines.size() == 0) { return HUGE_VAL; } else { cerr << "Attempting to get single data value from multiple lines in element " << name << endl; return HUGE_VAL; }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%unsigned int Element::GetNumElements(string element_name){ unsigned int number_of_elements=0; Element* el=FindElement(element_name); while (el) { number_of_elements++; el=FindNextElement(element_name); } return number_of_elements;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Element* Element::FindElement(string el){ if (el.empty() && children.size() >= 1) { element_index = 1; return children[0]; } for (unsigned int i=0; i<children.size(); i++) { if (el == children[i]->GetName()) { element_index = i+1; return children[i]; } } element_index = 0; return 0L;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Element* Element::FindNextElement(string el){ if (el.empty()) { if (element_index < children.size()) { return children[element_index++]; } else { element_index = 0; return 0L; } } for (unsigned int i=element_index; i<children.size(); i++) { if (el == children[i]->GetName()) { element_index = i+1; return children[i]; } } element_index = 0; return 0L;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double Element::FindElementValueAsNumber(string el){ Element* element = FindElement(el); if (element) { return element->GetDataAsNumber(); } else { cerr << "Attempting to get single data value from multiple lines" << endl; return 0; }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%string Element::FindElementValue(string el){ Element* element = FindElement(el); if (element) { return element->GetDataLine(); } else { return ""; }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double Element::FindElementValueAsNumberConvertTo(string el, string target_units){ Element* element = FindElement(el); if (!element) { cerr << "Attempting to get non-existent element " << el << endl; exit(0); } string supplied_units = element->GetAttributeValue("unit"); if (!supplied_units.empty()) { if (convert.find(supplied_units) == convert.end()) { cerr << endl << "Supplied unit: \"" << supplied_units << "\" does not exist (typo?). Add new unit" << " conversion in FGXMLElement.cpp." << endl; exit(-1); } if (convert[supplied_units].find(target_units) == convert[supplied_units].end()) { cerr << endl << "Supplied unit: \"" << supplied_units << "\" cannot be converted to " << target_units << ". Add new unit conversion in FGXMLElement.cpp or fix typo" << endl; exit(-1); } } double value = element->GetDataAsNumber(); if (!supplied_units.empty()) { value *= convert[supplied_units][target_units]; } return value;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double Element::FindElementValueAsNumberConvertFromTo( string el, string supplied_units, string target_units){ Element* element = FindElement(el); if (!element) { cerr << "Attempting to get non-existent element " << el << endl; exit(0); } if (!supplied_units.empty()) { if (convert.find(supplied_units) == convert.end()) { cerr << endl << "Supplied unit: \"" << supplied_units << "\" does not exist (typo?). Add new unit" << " conversion in FGXMLElement.cpp." << endl; exit(-1); } if (convert[supplied_units].find(target_units) == convert[supplied_units].end()) { cerr << endl << "Supplied unit: \"" << supplied_units << "\" cannot be converted to " << target_units << ". Add new unit conversion in FGXMLElement.cpp or fix typo" << endl; exit(-1); } } double value = element->GetDataAsNumber(); if (!supplied_units.empty()) { value *= convert[supplied_units][target_units]; } return value;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FGColumnVector3 Element::FindElementTripletConvertTo( 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()) { cerr << endl << "Supplied unit: \"" << supplied_units << "\" does not exist (typo?). Add new unit" << " conversion in FGXMLElement.cpp." << endl; exit(-1); } if (convert[supplied_units].find(target_units) == convert[supplied_units].end()) { cerr << endl << "Supplied unit: \"" << supplied_units << "\" cannot be converted to " << target_units << ". Add new unit conversion in FGXMLElement.cpp or fix typo" << endl; exit(-1); } } item = FindElement("x"); if (!item) item = FindElement("roll"); if (item) { value = item->GetDataAsNumber(); if (!supplied_units.empty()) value *= convert[supplied_units][target_units]; } else { value = 0.0; cerr << "Could not find an X triplet item for this column vector." << endl; } triplet(1) = value; item = FindElement("y"); if (!item) item = FindElement("pitch"); if (item) { value = item->GetDataAsNumber(); if (!supplied_units.empty()) value *= convert[supplied_units][target_units]; } else { value = 0.0; cerr << "Could not find a Y triplet item for this column vector." << endl; } triplet(2) = value; item = FindElement("z"); if (!item) item = FindElement("yaw"); if (item) { value = item->GetDataAsNumber(); if (!supplied_units.empty()) value *= convert[supplied_units][target_units]; } else { value = 0.0; cerr << "Could not find a Z triplet item for this column vector." << endl; } triplet(3) = value; return triplet;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void Element::Print(unsigned int level){ unsigned int i, spaces; level+=2; for (spaces=0; spaces<=level; spaces++) cout << " "; // format output cout << "Element Name: " << name; for (i=0; i<attributes.size(); i++) { cout << " " << attribute_key[i] << " = " << attributes[attribute_key[i]]; } cout << endl; for (i=0; i<data_lines.size(); i++) { for (spaces=0; spaces<=level; spaces++) cout << " "; // format output cout << data_lines[i] << endl; } for (i=0; i<children.size(); i++) { children[i]->Print(level); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void Element::AddAttribute(string name, string value){ attribute_key.push_back(name); attributes[name] = value;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void Element::AddData(string d){ unsigned int string_start = (unsigned int)d.find_first_not_of(" \t"); if (string_start > 0) { d.erase(0,string_start); } data_lines.push_back(d);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} // end namespace JSBSim
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -