QvisDatabaseCorrelationWindow::QvisDatabaseCorrelationWindow( const QString &correlationName, const QString &caption) : QvisWindowBase(caption), createMode(true) { DatabaseCorrelation emptyCorrelation; emptyCorrelation.SetName(correlationName.toStdString()); CreateWidgets(emptyCorrelation); }
void DatabaseCorrelationList::SetFromNode(DataNode *parentNode) { if(parentNode == 0) return; DataNode *searchNode = parentNode->GetNode("DatabaseCorrelationList"); if(searchNode == 0) return; DataNode *node; DataNode **children; // Clear all the DatabaseCorrelations if we got any. bool clearedCorrelations = false; // Go through all of the children and construct a new // DatabaseCorrelation for each one of them. children = searchNode->GetChildren(); if(children != 0) { for(int i = 0; i < searchNode->GetNumChildren(); ++i) { if(children[i]->GetKey() == std::string("DatabaseCorrelation")) { if (!clearedCorrelations) { ClearCorrelations(); clearedCorrelations = true; } DatabaseCorrelation temp; temp.SetFromNode(children[i]); AddCorrelations(temp); } } } if((node = searchNode->GetNode("needPermission")) != 0) SetNeedPermission(node->AsBool()); if((node = searchNode->GetNode("defaultCorrelationMethod")) != 0) SetDefaultCorrelationMethod(node->AsInt()); if((node = searchNode->GetNode("whenToCorrelate")) != 0) { // Allow enums to be int or string in the config file if(node->GetNodeType() == INT_NODE) { int ival = node->AsInt(); if(ival >= 0 && ival < 3) SetWhenToCorrelate(WhenToCorrelate(ival)); } else if(node->GetNodeType() == STRING_NODE) { WhenToCorrelate value; if(WhenToCorrelate_FromString(node->AsString(), value)) SetWhenToCorrelate(value); } } }
void ViewerDatabaseCorrelationMethods::CreateNode(DataNode *parentNode, const std::map<std::string, std::string> &dbToSource, bool detailed) { // Create a copy of the database correlation list. DatabaseCorrelationList dbcl(*GetViewerState()->GetDatabaseCorrelationList()); dbcl.ClearCorrelations(); for(int i = 0; i < GetViewerState()->GetDatabaseCorrelationList()->GetNumCorrelations(); ++i) { const DatabaseCorrelation &corr = GetViewerState()->GetDatabaseCorrelationList()->GetCorrelations(i); // Let's only save out correlations that have more than 1 db. if(corr.GetNumDatabases() > 1) { // Map database names to source names. const stringVector &dbNames = corr.GetDatabaseNames(); stringVector sourceIds; for(size_t j = 0; j < dbNames.size(); ++j) { std::map<std::string, std::string>::const_iterator pos = dbToSource.find(dbNames[j]); if(pos == dbToSource.end()) sourceIds.push_back(dbNames[j]); else sourceIds.push_back(pos->second); } // Create a copy of the correlation but override its database // names with source ids. Also, note that we're not using a // copy constructor because we want most of the correlation // information to be absent so we can repopulate it on session read // in case a new database is chosen. DatabaseCorrelation modCorr; if(corr.GetMethod() != DatabaseCorrelation::UserDefinedCorrelation) { modCorr.SetName(corr.GetName()); modCorr.SetNumStates(corr.GetNumStates()); modCorr.SetMethod(corr.GetMethod()); } else { // A user-defined correlation should be saved mostly as-is. modCorr = corr; } modCorr.SetDatabaseNames(sourceIds); // Add the modified correlation to the list. dbcl.AddCorrelations(modCorr); } } // Add the database correlation list information to the session. dbcl.CreateNode(parentNode, detailed, false); }
void ViewerDatabaseCorrelationMethods::UpdateDatabaseCorrelation(const std::string &cName) { DatabaseCorrelation *c = GetViewerState()->GetDatabaseCorrelationList()->FindCorrelation(cName); if(c != 0) { DatabaseCorrelation *replacementCorrelation = CreateDatabaseCorrelation( c->GetName(), c->GetDatabaseNames(), (int)c->GetMethod()); if(replacementCorrelation != 0) { // Copy over the old database correlation. *c = *replacementCorrelation; } } }
DatabaseCorrelation * DatabaseCorrelationList::FindCorrelation(const std::string &name) const { DatabaseCorrelation *retval = 0; for(size_t i = 0; i < correlations.size(); ++i) { DatabaseCorrelation *c = (DatabaseCorrelation *)correlations[i]; if(name == c->GetName()) { retval = c; break; } } return retval; }
DatabaseCorrelation * ViewerDatabaseCorrelationMethods::CreateDatabaseCorrelation(const std::string &name, const stringVector &dbs, int method, int nStates) { if(dbs.size() < 1) { GetViewerMessaging()->Error( TR("VisIt cannot create a database correlation that does " "not use any databases.")); return 0; } // // Create a new correlation and set its basic attributes. // DatabaseCorrelation *correlation = new DatabaseCorrelation; correlation->SetName(name); DatabaseCorrelation::CorrelationMethod m = (DatabaseCorrelation::CorrelationMethod)method; correlation->SetMethod(m); if(nStates != -1 && (m == DatabaseCorrelation::IndexForIndexCorrelation || m == DatabaseCorrelation::StretchedIndexCorrelation)) { correlation->SetNumStates(nStates); } // Add the different databases to the correlation. for(size_t i = 0; i < dbs.size(); ++i) { // // Split the database name into host and database components // and expand it too. // std::string host, db; std::string correlationDB(dbs[i]); GetViewerFileServer()->ExpandDatabaseName(correlationDB, host, db); // // Get the metadata for the database. // const avtDatabaseMetaData *md = GetViewerFileServer()->GetMetaData(host, db); // // We might need to re-acqure metadata if we are doing // time or cycle correlations and times or cycles are not // all accurate and valid // if(md) { const bool forceReadAllCyclesAndTimes = true; if ((m == DatabaseCorrelation::TimeCorrelation && md->AreAllTimesAccurateAndValid() == false) || (m == DatabaseCorrelation::CycleCorrelation && md->AreAllCyclesAccurateAndValid() == false)) { md = GetViewerFileServer()->GetMetaData(host, db, forceReadAllCyclesAndTimes); } } if(md) { // // Issue warning messages if we're doing time or cycle // correlations and the metadata cannot be trusted. // if(m == DatabaseCorrelation::TimeCorrelation) { bool accurate = true; for(int j = 0; j < md->GetNumStates() && accurate; ++j) accurate &= md->IsTimeAccurate(j); if(!accurate) { GetViewerMessaging()->Warning( TR("The times for %1 may not be accurate so the new " "correlation %2 might not work as expected."). arg(correlationDB). arg(name)); } } else if(m == DatabaseCorrelation::CycleCorrelation) { bool accurate = true; for(int j = 0; j < md->GetNumStates() && accurate; ++j) accurate &= md->IsCycleAccurate(j); if(!accurate) { GetViewerMessaging()->Warning( TR("The cycles for %1 may not be accurate so the new " "correlation %2 might not work as expected."). arg(correlationDB). arg(name)); } } // // Add the database to the new correlation. // correlation->AddDatabase(correlationDB, md->GetNumStates(), md->GetTimes(), md->GetCycles()); } else { delete correlation; correlation = 0; GetViewerMessaging()->Error( TR("VisIt could not retrieve metadata for %1 so the " "correlation %2 could not be created."). arg(correlationDB). arg(name)); break; } } return correlation; }
void QvisDatabaseCorrelationWindow::CreateWidgets( const DatabaseCorrelation &correlation) { QWidget *central = new QWidget(this); setCentralWidget(central); QVBoxLayout *topLayout = new QVBoxLayout(central); topLayout->setMargin(10); topLayout->setSpacing(5); // Create the name line edit. QGridLayout *gLayout = new QGridLayout(); topLayout->addLayout(gLayout); correlationNameLineEdit = new QLineEdit(central); correlationNameLineEdit->setText(correlation.GetName().c_str()); correlationNameLineEdit->setEnabled(createMode); QLabel *nameLabel = new QLabel(tr("Name"), central); nameLabel->setEnabled(createMode); gLayout->addWidget(nameLabel, 0, 0); gLayout->addWidget(correlationNameLineEdit, 0, 1); // Create the correlation method combobox. correlationMethodComboBox = new QComboBox(central); correlationMethodComboBox->addItem(tr("Padded index")); correlationMethodComboBox->addItem(tr("Stretched index")); correlationMethodComboBox->addItem(tr("Time")); correlationMethodComboBox->addItem(tr("Cycle")); int method = (int)correlation.GetMethod(); correlationMethodComboBox->setCurrentIndex(method); gLayout->addWidget(correlationMethodComboBox, 1, 1); gLayout->addWidget(new QLabel(tr("Correlation method"), central), 1, 0); topLayout->addSpacing(10); // Create the widgets that let us add sources to the database correlation. QGridLayout *srcLayout = new QGridLayout(); topLayout->addLayout(srcLayout); srcLayout->setSpacing(5); const int S[] = {1, 5, 1, 1, 5}; int i; for(i = 0; i < 5; ++i) srcLayout->setRowStretch(i, S[i]); srcLayout->addWidget(new QLabel(tr("Sources"), central), 0, 0); srcLayout->addWidget(new QLabel(tr("Correlated sources"), central), 0, 2); // // Simplify the source names. // NameSimplifier simplifier; const stringVector &sources = GetViewerState()->GetGlobalAttributes()->GetSources(); for(i = 0; i < sources.size(); ++i) simplifier.AddName(sources[i]); stringVector shortSources; simplifier.GetSimplifiedNames(shortSources); std::map<std::string, std::string> shortToLong, longToShort; for(i = 0; i < sources.size(); ++i) { shortToLong[shortSources[i]] = sources[i]; longToShort[sources[i]] = shortSources[i]; } // Create and populate the list of sources. sourcesListBox = new QListWidget(central); sourcesListBox->setSelectionMode(QAbstractItemView::MultiSelection); for(i = 0; i < sources.size(); ++i) { if(!correlation.UsesDatabase(sources[i])) sourcesListBox->addItem(shortSources[i].c_str()); } if(sources.size() > 0) sourcesListBox->setCurrentItem(0); connect(sourcesListBox, SIGNAL(currentRowChanged(int)), this, SLOT(setAddButtonEnabled(int))); srcLayout->addWidget(sourcesListBox, 1, 0, 5, 1); // Create and populate the list of correlated sources. correlatedSourcesListBox = new QListWidget(central); correlatedSourcesListBox->setSelectionMode(QAbstractItemView::MultiSelection); const stringVector &dbs = correlation.GetDatabaseNames(); for(i = 0; i < correlation.GetNumDatabases(); ++i) correlatedSourcesListBox->addItem(longToShort[dbs[i]].c_str()); if(dbs.size() > 0) correlatedSourcesListBox->setCurrentRow(0); connect(correlatedSourcesListBox, SIGNAL(currentRowChanged(int)), this, SLOT(setRemoveButtonEnabled(int))); srcLayout->addWidget(correlatedSourcesListBox, 1, 2, 5, 1); // Create the add and remove buttons. addButton = new QPushButton("-->", central); connect(addButton, SIGNAL(clicked()), this, SLOT(addSources())); srcLayout->addWidget(addButton, 2, 1); removeButton = new QPushButton("<--", central); connect(removeButton, SIGNAL(clicked()), this, SLOT(removeSources())); srcLayout->addWidget(removeButton, 3, 1); UpdateAddRemoveButtonsEnabledState(); // Add the action and cancel buttons. //topLayout->addSpacing(10); QHBoxLayout *actionButtonLayout = new QHBoxLayout(); topLayout->addLayout(actionButtonLayout); QPushButton *actionButton = new QPushButton( createMode?tr("Create database correlation") : tr("Alter database correlation"), central); connect(actionButton, SIGNAL(clicked()), this, SLOT(actionClicked())); actionButtonLayout->addWidget(actionButton); actionButtonLayout->addStretch(10); QPushButton *cancelButton = new QPushButton(tr("Cancel"), central); connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked())); actionButtonLayout->addWidget(cancelButton); }