------------- Copyright (C) 2002 -------------
This program is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
+ the terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details.
- You should have received a copy of the GNU General Public License along with
+ You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
- Further information about the GNU General Public License can also be found on
+ Further information about the GNU Lesser General Public License can also be found on
the world wide web at http://www.gnu.org.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
namespace JSBSim {
+bool FGPropertyManager::suppress_warning = true;
+std::vector<SGPropertyNode_ptr> FGPropertyManager::tied_properties;
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGPropertyManager::Unbind(void)
+{
+ vector<SGPropertyNode_ptr>::iterator it;
+
+ for (it = tied_properties.begin();it < tied_properties.end();it++)
+ (*it)->untie();
+
+ tied_properties.clear();
+}
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGPropertyManager::mkPropertyName(string name, bool lowercase) {
else if( isspace(name[i]) )
name[i]='-';
}
- /*
- for(i=0;i<name.length();i++) {
- if( name[i] == '/' )
- name.erase(i,1);
- }
- */
+
return name;
}
FGPropertyManager::GetNode (const string &path, bool create)
{
SGPropertyNode* node=this->getNode(path.c_str(), create);
- if (node == 0 && !suppress_warning)
- cout << "FGPropertyManager::GetNode() No node found for "
- << path << endl;
+ if (node == 0 && !suppress_warning) {
+ cerr << "FGPropertyManager::GetNode() No node found for " << path << endl;
+ }
return (FGPropertyManager*)node;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
bool FGPropertyManager::HasNode (const string &path)
{
// Checking if a node exists shouldn't write a warning if it doesn't exist
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-string FGPropertyManager::GetName( void ) {
+string FGPropertyManager::GetName( void )
+{
return string( getName() );
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+string FGPropertyManager::GetPrintableName( void )
+{
+ string temp_string(getName());
+ size_t initial_location=0;
+ size_t found_location;
+
+ found_location = temp_string.rfind("/");
+ if (found_location != string::npos)
+ temp_string = temp_string.substr(found_location);
+
+ found_location = temp_string.find('_',initial_location);
+ while (found_location != string::npos) {
+ temp_string.replace(found_location,1," ");
+ initial_location = found_location+1;
+ found_location = temp_string.find('_',initial_location);
+ }
+ return temp_string;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
string FGPropertyManager::GetFullyQualifiedName(void) {
vector<string> stack;
stack.push_back( getDisplayName(true) );
}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string FGPropertyManager::GetRelativeName( const string &path )
+{
+ string temp_string = GetFullyQualifiedName();
+ size_t len = path.length();
+ if ( (len > 0) && (temp_string.substr(0,len) == path) ) {
+ temp_string = temp_string.erase(0,len);
+ }
+ return temp_string;
+}
+
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
SGPropertyNode * node = getNode(name.c_str());
if (node == 0)
- cout <<
- "Attempt to set archive flag for non-existant property "
+ cerr <<
+ "Attempt to set archive flag for non-existent property "
<< name << endl;
else
node->setAttribute(SGPropertyNode::ARCHIVE, state);
{
SGPropertyNode * node = getNode(name.c_str());
if (node == 0)
- cout <<
+ cerr <<
"Attempt to set read flag for non-existant property "
<< name << endl;
else
{
SGPropertyNode * node = getNode(name.c_str());
if (node == 0)
- cout <<
+ cerr <<
"Attempt to set write flag for non-existant property "
<< name << endl;
else
void FGPropertyManager::Untie (const string &name)
{
if (!untie(name.c_str()))
- cout << "Failed to untie property " << name << endl;
+ cerr << "Failed to untie property " << name << endl;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGPropertyManager::Tie (const string &name, bool *pointer, bool useDefault)
{
- if (!tie(name.c_str(), SGRawValuePointer<bool>(pointer), useDefault))
- cout << "Failed to tie property " << name << " to a pointer" << endl;
- else if (debug_lvl & 0x20)
- cout << name << endl;
+ SGPropertyNode* property = getNode(name.c_str(), true);
+ if (!property) {
+ cerr << "Could not get or create property " << name << endl;
+ return;
+ }
+
+ if (!property->tie(SGRawValuePointer<bool>(pointer), useDefault))
+ cerr << "Failed to tie property " << name << " to a pointer" << endl;
+ else {
+ tied_properties.push_back(property);
+ if (debug_lvl & 0x20) cout << name << endl;
+ }
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGPropertyManager::Tie (const string &name, int *pointer,
bool useDefault )
{
- if (!tie(name.c_str(), SGRawValuePointer<int>(pointer), useDefault))
- cout << "Failed to tie property " << name << " to a pointer" << endl;
- else if (debug_lvl & 0x20)
- cout << name << endl;
+ SGPropertyNode* property = getNode(name.c_str(), true);
+ if (!property) {
+ cerr << "Could not get or create property " << name << endl;
+ return;
+ }
+
+ if (!property->tie(SGRawValuePointer<int>(pointer), useDefault))
+ cerr << "Failed to tie property " << name << " to a pointer" << endl;
+ else {
+ tied_properties.push_back(property);
+ if (debug_lvl & 0x20) cout << name << endl;
+ }
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGPropertyManager::Tie (const string &name, long *pointer,
bool useDefault )
{
- if (!tie(name.c_str(), SGRawValuePointer<long>(pointer), useDefault))
- cout << "Failed to tie property " << name << " to a pointer" << endl;
- else if (debug_lvl & 0x20)
- cout << name << endl;
+ SGPropertyNode* property = getNode(name.c_str(), true);
+ if (!property) {
+ cerr << "Could not get or create property " << name << endl;
+ return;
+ }
+
+ if (!property->tie(SGRawValuePointer<long>(pointer), useDefault))
+ cerr << "Failed to tie property " << name << " to a pointer" << endl;
+ else {
+ tied_properties.push_back(property);
+ if (debug_lvl & 0x20) cout << name << endl;
+ }
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGPropertyManager::Tie (const string &name, float *pointer,
bool useDefault )
{
- if (!tie(name.c_str(), SGRawValuePointer<float>(pointer), useDefault))
- cout << "Failed to tie property " << name << " to a pointer" << endl;
- else if (debug_lvl & 0x20)
- cout << name << endl;
+ SGPropertyNode* property = getNode(name.c_str(), true);
+ if (!property) {
+ cerr << "Could not get or create property " << name << endl;
+ return;
+ }
+
+ if (!property->tie(SGRawValuePointer<float>(pointer), useDefault))
+ cerr << "Failed to tie property " << name << " to a pointer" << endl;
+ else {
+ tied_properties.push_back(property);
+ if (debug_lvl & 0x20) cout << name << endl;
+ }
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGPropertyManager::Tie (const string &name, double *pointer, bool useDefault)
{
- if (!tie(name.c_str(), SGRawValuePointer<double>(pointer), useDefault))
- cout << "Failed to tie property " << name << " to a pointer" << endl;
- else if (debug_lvl & 0x20)
- cout << name << endl;
+ SGPropertyNode* property = getNode(name.c_str(), true);
+ if (!property) {
+ cerr << "Could not get or create property " << name << endl;
+ return;
+ }
+
+ if (!property->tie(SGRawValuePointer<double>(pointer), useDefault))
+ cerr << "Failed to tie property " << name << " to a pointer" << endl;
+ else {
+ tied_properties.push_back(property);
+ if (debug_lvl & 0x20) cout << name << endl;
+ }
}
} // namespace JSBSim