Database: added "parameters" field in Statistics table. GUI: detecting if parameters in database are different from the Preferences, if so ask user to update them.

This commit is contained in:
matlabbe
2016-06-13 17:34:17 -04:00
parent 3edb133727
commit 38a7993a9b
14 changed files with 294 additions and 47 deletions
@@ -129,6 +129,7 @@ public:
QString loadCustomConfig(const QString & section, const QString & key);
rtabmap::ParametersMap getAllParameters() const;
void setParameter(const std::string & key, const std::string & value);
//General panel
int getGeneralLoggerLevel() const;
@@ -305,8 +306,6 @@ protected:
virtual void showEvent ( QShowEvent * event );
virtual void closeEvent(QCloseEvent *event);
void setParameter(const std::string & key, const std::string & value);
virtual QString getParamMessage();
virtual void readGuiSettings(const QString & filePath = QString());
+56 -1
View File
@@ -531,7 +531,18 @@ void DatabaseViewer::writeSettings()
settings.endGroup(); // DatabaseViewer
const ParametersMap & parameters = ui_->parameters_toolbox->getParameters();
ParametersMap parameters = ui_->parameters_toolbox->getParameters();
for(ParametersMap::iterator iter=parameters.begin(); iter!=parameters.end();)
{
if(!ui_->parameters_toolbox->getParameterWidget(iter->first.c_str()))
{
parameters.erase(iter++);
}
else
{
++iter;
}
}
Parameters::writeINI(path.toStdString(), parameters);
this->setWindowModified(false);
@@ -588,6 +599,50 @@ bool DatabaseViewer::openDatabase(const QString & path)
{
pathDatabase_ = UDirectory::getDir(path.toStdString()).c_str();
databaseFileName_ = UFile::getName(path.toStdString());
// look if there are saved parameters
ParametersMap parameters = dbDriver_->getLastParameters();
if(parameters.size())
{
const ParametersMap & currentParameters = ui_->parameters_toolbox->getParameters();
ParametersMap differentParameters;
for(ParametersMap::iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
{
ParametersMap::const_iterator jter = currentParameters.find(iter->first);
if(jter!=currentParameters.end() &&
ui_->parameters_toolbox->getParameterWidget(QString(iter->first.c_str())) != 0 &&
iter->second.compare(jter->second) != 0 &&
iter->first.compare(Parameters::kRtabmapWorkingDirectory()) != 0)
{
differentParameters.insert(*iter);
QString msg = tr("Parameter \"%1\": database=\"%2\" Preferences=\"%3\"")
.arg(iter->first.c_str())
.arg(iter->second.c_str())
.arg(jter->second.c_str());
UWARN(msg.toStdString().c_str());
}
}
if(differentParameters.size())
{
int r = QMessageBox::question(this,
tr("Update parameters..."),
tr("The database is using %1 different parameter(s) than "
"those currently set in Core parameters panel. Do you want "
"to use database's parameters?").arg(differentParameters.size()),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::Yes);
if(r == QMessageBox::Yes)
{
for(rtabmap::ParametersMap::const_iterator iter = differentParameters.begin(); iter!=differentParameters.end(); ++iter)
{
ui_->parameters_toolbox->updateParameter(iter->first, iter->second);
}
}
}
}
updateIds();
return true;
}
+50
View File
@@ -3597,6 +3597,56 @@ void MainWindow::openDatabase(const QString & path)
this->clearTheCache();
_openedDatabasePath = path;
// look if there are saved parameters
DBDriver * driver = DBDriver::create();
if(driver->openConnection(value, false))
{
ParametersMap parameters = driver->getLastParameters();
driver->closeConnection(false);
delete driver;
if(parameters.size())
{
ParametersMap currentParameters = _preferencesDialog->getAllParameters();
ParametersMap differentParameters;
for(ParametersMap::iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
{
ParametersMap::iterator jter = currentParameters.find(iter->first);
if(jter!=currentParameters.end() &&
iter->second.compare(jter->second) != 0 &&
iter->first.compare(Parameters::kRtabmapWorkingDirectory()) != 0)
{
differentParameters.insert(*iter);
QString msg = tr("Parameter \"%1\": database=\"%2\" Preferences=\"%3\"")
.arg(iter->first.c_str())
.arg(iter->second.c_str())
.arg(jter->second.c_str());
_ui->widget_console->appendMsg(msg);
UWARN(msg.toStdString().c_str());
}
}
if(differentParameters.size())
{
int r = QMessageBox::question(this,
tr("Update parameters..."),
tr("The database is using %1 different parameter(s) than "
"those currently set in Preferences. Do you want "
"to use database's parameters?").arg(differentParameters.size()),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::Yes);
if(r == QMessageBox::Yes)
{
for(rtabmap::ParametersMap::const_iterator iter = differentParameters.begin(); iter!=differentParameters.end(); ++iter)
{
_preferencesDialog->setParameter(iter->first.c_str(), iter->second.c_str());
}
}
}
}
}
this->post(new RtabmapEventCmd(RtabmapEventCmd::kCmdInit, value, 0, _preferencesDialog->getAllParameters()));
applyPrefSettings(_preferencesDialog->getAllParameters(), false);
}
+38 -32
View File
@@ -249,43 +249,49 @@ void ParametersToolBox::updateParameter(const std::string & key, const std::stri
QString group = QString::fromStdString(key).split("/").first();
if(!ignoredGroups_.contains(group))
{
UASSERT_MSG(parameters_.find(key) != parameters_.end(), uFormat("key=\"%s\"", key.c_str()).c_str());
parameters_.at(key) = value;
QWidget * widget = this->findChild<QWidget*>(key.c_str());
QString type = QString::fromStdString(Parameters::getType(key));
if(type.compare("string") == 0)
if(parameters_.find(key) == parameters_.end())
{
QString valueQt = QString::fromStdString(value);
if(valueQt.contains(';'))
UWARN("key=\"%s\" doesn't exist", key.c_str());
}
else
{
parameters_.at(key) = value;
QWidget * widget = this->findChild<QWidget*>(key.c_str());
QString type = QString::fromStdString(Parameters::getType(key));
if(type.compare("string") == 0)
{
// It's a list, just change the index
QStringList splitted = valueQt.split(':');
((QComboBox*)widget)->setCurrentIndex(splitted.first().toInt());
QString valueQt = QString::fromStdString(value);
if(valueQt.contains(';'))
{
// It's a list, just change the index
QStringList splitted = valueQt.split(':');
((QComboBox*)widget)->setCurrentIndex(splitted.first().toInt());
}
else
{
((QLineEdit*)widget)->setText(valueQt);
}
}
else
else if(type.compare("int") == 0)
{
((QLineEdit*)widget)->setText(valueQt);
((QSpinBox*)widget)->setValue(uStr2Int(value));
}
else if(type.compare("uint") == 0)
{
((QSpinBox*)widget)->setValue(uStr2Int(value));
}
else if(type.compare("double") == 0)
{
((QDoubleSpinBox*)widget)->setValue(uStr2Double(value));
}
else if(type.compare("float") == 0)
{
((QDoubleSpinBox*)widget)->setValue(uStr2Float(value));
}
else if(type.compare("bool") == 0)
{
((QCheckBox*)widget)->setChecked(uStr2Bool(value));
}
}
else if(type.compare("int") == 0)
{
((QSpinBox*)widget)->setValue(uStr2Int(value));
}
else if(type.compare("uint") == 0)
{
((QSpinBox*)widget)->setValue(uStr2Int(value));
}
else if(type.compare("double") == 0)
{
((QDoubleSpinBox*)widget)->setValue(uStr2Double(value));
}
else if(type.compare("float") == 0)
{
((QDoubleSpinBox*)widget)->setValue(uStr2Float(value));
}
else if(type.compare("bool") == 0)
{
((QCheckBox*)widget)->setChecked(uStr2Bool(value));
}
}
}
+2 -2
View File
@@ -2679,7 +2679,6 @@ void PreferencesDialog::selectSourceDatabase()
if(paths.size())
{
int r = QMessageBox::question(this, tr("Odometry in database..."), tr("Use odometry saved in database (if some saved)?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
_ui->source_checkBox_ignoreOdometry->setChecked(r != QMessageBox::Yes);
_ui->source_database_lineEdit_path->setText(paths.size()==1?paths.front():paths.join(";"));
_ui->source_spinBox_databaseStartPos->setValue(0);
@@ -2918,10 +2917,11 @@ void PreferencesDialog::selectSourceSvoPath()
void PreferencesDialog::setParameter(const std::string & key, const std::string & value)
{
UDEBUG("%s=%s", key.c_str(), value.c_str());
uInsert(_parameters, ParametersPair(key, value));
QWidget * obj = _ui->stackedWidget->findChild<QWidget*>(key.c_str());
if(obj)
{
uInsert(_parameters, ParametersPair(key, value));
QSpinBox * spin = qobject_cast<QSpinBox *>(obj);
QDoubleSpinBox * doubleSpin = qobject_cast<QDoubleSpinBox *>(obj);
QComboBox * combo = qobject_cast<QComboBox *>(obj);