void MainWindow::LoadFile() { if (FileFormatPluginList.size()) { QString FileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", FileFormatPluginList[0]->getFormatDescription()); //test(); // Create a progress dialog. QProgressDialog dialog; dialog.setLabelText(QString("Загрузка данных из файла")); // Create a QFutureWatcher and connect signals and slots. QFutureWatcher<void> futureWatcher; QTimer timer; connect(&timer, SIGNAL(timeout()), this, SLOT(updateProgress())); timer.start(1000); QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset())); QObject::connect(&dialog, SIGNAL(canceled()), SLOT(cancelOperation())); QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel())); QObject::connect(this, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int))); //extern void FileFormatPluginList[0]->getDataFromChannel(channel,(qint8*)data); QFuture<void> future = QtConcurrent::run(FileFormatPluginList[0], &FileReadInterface::LoadFile, FileName); // Start the computation. futureWatcher.setFuture(future); // Display the dialog and start the event loop. dialog.exec(); futureWatcher.waitForFinished(); dialog.setValue(100); dialog.hide(); timer.stop(); cube= FileFormatPluginList[0]->getCube(); QList<double> list = cube->GetListOfChannels(); foreach(double l , list) { ui->ChannelListWidget->addItem(QString("%1").arg(l)); }
bool NXMAccessManager::loggedIn() const { if (m_LoginState == LOGIN_CHECKING) { QProgressDialog progress; progress.setLabelText(tr("Verifying Nexus login")); progress.show(); while (m_LoginState == LOGIN_CHECKING) { QCoreApplication::processEvents(); QThread::msleep(100); } progress.hide(); } return m_LoginState == LOGIN_VALID; }
bool AirportsData::import(QProgressDialog &progress, MainObject *mainObject){ QHash<QString, QString> airports; QString msg; QTime tm; int ms; progress.setValue(0); progress.setWindowTitle("Scanning Airport Directories"); progress.setRange(0, 50000); int c = 0; int found = 0; int air_added = 0; ms = tm.restart(); // Removing cache file, if exists() if (QFile::exists(mainObject->data_file("airports.txt"))) { outLog("*** FGx airportsdata reload: cache file exists!"); QFile::remove(mainObject->data_file("airports.txt")); outLog("*** FGx airportsdata reload: REMOVED AIRPORTS CACHE FILE"); } //= Cache File QFile cacheFile( mainObject->data_file("airports.txt") ); if(!cacheFile.open(QIODevice::WriteOnly | QIODevice::Text)){ //qDebug() << "TODO Open error cachce file="; return true; } QTextStream out(&cacheFile); msg = "FGx airportsdata reload: Scanning apt.dat.gz in " + mainObject->X->fgroot() + "/Airports/apt.dat.gz"; outLog(msg); airports = getAirportNameMap(mainObject); //================================================ //* Lets Loop the directories //* Get out aiports path from setings and get the the subdir also QDirIterator loopAirportsFiles( mainObject->X->airports_path(), QDirIterator::Subdirectories ); QString xFileName; msg = "FGx airportsdata reload: Scanning XML files in "+mainObject->X->airports_path(); outLog(msg); progress.setWindowTitle(msg); progress.setRange(0, 50000); // Check the fgfs additional argument list, // and/or any additional scenery path inputs // *** take care NOT to duplicate *** QStringList fgfs_args = mainObject->X->get_fgfs_args(); int i, ind; QDir d; QString path; #ifdef Q_OS_WIN QChar psep(';'); #else QChar psep(':'); #endif // AIIIIII, found the doubler !, said yves very very loud - well done said pete ;-) for (i = 0; i < fgfs_args.size(); i++) { msg = fgfs_args.at(i); ind = msg.indexOf(QChar('"')); if (ind == 0) msg = msg.mid(1,msg.length()-2); if (msg.indexOf("--fg-scenery=") == 0) { // got a scenery folder to scan msg = msg.mid(13); ind = msg.indexOf(QChar('"')); if (ind == 0) msg = msg.mid(1,msg.length()-2); QStringList path_list = msg.split(psep); int pathnumber = 0; for( QStringList::ConstIterator entry = path_list.begin(); entry != path_list.end(); entry++) { path = *entry; pathnumber = pathnumber + 1; if (d.exists(path)) { // we have a PATH to check, but we are ONLY checking 'Airports' if ( !(path.indexOf(QChar('/')) == (path.size()-1)) && !(path.indexOf(QChar('\\')) == (path.size()-1)) ) path.append("/"); path.append("Airports"); // XML is only in here if (!d.exists(path)) continue; QDirIterator loopFiles( path, QDirIterator::Subdirectories ); while (loopFiles.hasNext()) { //= Get file handle if there is one xFileName = loopFiles.next(); //= Check if file entry is a *.threshold.xml - cos this is what we want if(xFileName.endsWith(".threshold.xml") ){ //= Split out "CODE.threshold.xml" with a "." QFileInfo fileInfoThreshold(xFileName); QString airport_code = fileInfoThreshold.fileName().split(".").at(0); //* Update progress if(c % 100 == 0){ progress.setValue(c); progress.setLabelText(xFileName); progress.repaint(); } QString airport_name(""); if(airports.contains(airport_code)){ airport_name = airports.value(airport_code); } QStringList cols; // missing in middle is description ?? cols << airport_code << airport_name << fileInfoThreshold.absoluteDir().absolutePath() << QString::number(pathnumber); out << cols.join("\t").append("\n"); air_added++; found++; } if(progress.wasCanceled()){ progress.hide(); return true; } c++; } } } } } cacheFile.close(); msg.sprintf("*** FGx airportsdata reload: Walked %d files, found %d threshold.xml, appended %d to cache", c, found, air_added); outLog(msg+", in "+getElapTimeStg(tm.elapsed())); progress.hide(); return false; }
void qCSF::doAction() { //m_app should have already been initialized by CC when plugin is loaded! //(--> pure internal check) assert(m_app); if (!m_app) return; if ( !m_app->haveOneSelection() ) { m_app->dispToConsole("Select only one cloud!", ccMainAppInterface::ERR_CONSOLE_MESSAGE); return; } const ccHObject::Container& selectedEntities = m_app->getSelectedEntities(); ccHObject* ent = selectedEntities[0]; assert(ent); if (!ent || !ent->isA(CC_TYPES::POINT_CLOUD)) { m_app->dispToConsole("Select a real point cloud!", ccMainAppInterface::ERR_CONSOLE_MESSAGE); return; } //to get the point cloud from selected entity. ccPointCloud* pc = static_cast<ccPointCloud*>(ent); //Convert CC point cloud to CSF type unsigned count = pc->size(); wl::PointCloud csfPC; try { csfPC.reserve(count); } catch (const std::bad_alloc&) { m_app->dispToConsole("Not enough memory!", ccMainAppInterface::ERR_CONSOLE_MESSAGE); return; } for (unsigned i = 0; i < count; i++) { const CCVector3* P = pc->getPoint(i); wl::Point tmpPoint; //tmpPoint.x = P->x; //tmpPoint.y = P->y; //tmpPoint.z = P->z; tmpPoint.x = P->x; tmpPoint.y = -P->z; tmpPoint.z = P->y; csfPC.push_back(tmpPoint); } //initial dialog parameters static bool csf_postprocessing = false; static double cloth_resolution = 2; static double class_threshold = 0.5; static int csf_rigidness = 2; static int MaxIteration = 500; static bool ExportClothMesh = false; // display the dialog { ccCSFDlg csfDlg(m_app->getMainWindow()); csfDlg.postprocessingcheckbox->setChecked(csf_postprocessing); csfDlg.rig1->setChecked(csf_rigidness == 1); csfDlg.rig2->setChecked(csf_rigidness == 2); csfDlg.rig3->setChecked(csf_rigidness == 3); csfDlg.MaxIterationSpinBox->setValue(MaxIteration); csfDlg.cloth_resolutionSpinBox->setValue(cloth_resolution); csfDlg.class_thresholdSpinBox->setValue(class_threshold); csfDlg.exportClothMeshCheckBox->setChecked(ExportClothMesh); if (!csfDlg.exec()) { return; } //save the parameters for next time csf_postprocessing = csfDlg.postprocessingcheckbox->isChecked(); if (csfDlg.rig1->isChecked()) csf_rigidness = 1; else if (csfDlg.rig2->isChecked()) csf_rigidness = 2; else csf_rigidness = 3; MaxIteration = csfDlg.MaxIterationSpinBox->value(); cloth_resolution = csfDlg.cloth_resolutionSpinBox->value(); class_threshold = csfDlg.class_thresholdSpinBox->value(); ExportClothMesh = csfDlg.exportClothMeshCheckBox->isChecked(); } //display the progress dialog QProgressDialog pDlg; pDlg.setWindowTitle("CSF"); pDlg.setLabelText("Computing...."); pDlg.setCancelButton(0); pDlg.show(); QApplication::processEvents(); QElapsedTimer timer; timer.start(); //instantiation a CSF class CSF csf(csfPC); // setup parameter csf.params.k_nearest_points = 1; csf.params.bSloopSmooth = csf_postprocessing; csf.params.time_step = 0.65; csf.params.class_threshold = class_threshold; csf.params.cloth_resolution = cloth_resolution; csf.params.rigidness = csf_rigidness; csf.params.iterations = MaxIteration; //to do filtering std::vector<int> groundIndexes, offGroundIndexes; ccMesh* clothMesh = 0; if (!csf.do_filtering(groundIndexes, offGroundIndexes, ExportClothMesh, clothMesh, m_app)) { m_app->dispToConsole("Process failed", ccMainAppInterface::ERR_CONSOLE_MESSAGE); return; } m_app->dispToConsole(QString("[CSF] %1% of points classified as ground points").arg((groundIndexes.size() * 100.0) / count, 0, 'f', 2), ccMainAppInterface::STD_CONSOLE_MESSAGE); m_app->dispToConsole(QString("[CSF] Timing: %1 s.").arg(timer.elapsed() / 1000.0, 0, 'f', 1), ccMainAppInterface::STD_CONSOLE_MESSAGE); //extract ground subset ccPointCloud* groundpoint = 0; { CCLib::ReferenceCloud groundpc(pc); if (groundpc.reserve(static_cast<unsigned>(groundIndexes.size()))) { for (unsigned j = 0; j < groundIndexes.size(); ++j) { groundpc.addPointIndex(groundIndexes[j]); } groundpoint = pc->partialClone(&groundpc); } } if (!groundpoint) { m_app->dispToConsole("Failed to extract the ground subset (not enough memory)", ccMainAppInterface::WRN_CONSOLE_MESSAGE); } //extract off-ground subset ccPointCloud* offgroundpoint = 0; { CCLib::ReferenceCloud offgroundpc(pc); if (offgroundpc.reserve(static_cast<unsigned>(offGroundIndexes.size()))) { for (unsigned k = 0; k < offGroundIndexes.size(); ++k) { offgroundpc.addPointIndex(offGroundIndexes[k]); } offgroundpoint = pc->partialClone(&offgroundpc); } } if (!offgroundpoint) { m_app->dispToConsole("Failed to extract the off-ground subset (not enough memory)", ccMainAppInterface::WRN_CONSOLE_MESSAGE); if (!groundpoint) { //nothing to do! return; } } pDlg.hide(); QApplication::processEvents(); //hide the original cloud pc->setEnabled(false); //we add new group to DB/display ccHObject* cloudContainer = new ccHObject(pc->getName() + QString("_csf")); if (groundpoint) { groundpoint->setVisible(true); groundpoint->setName("ground points"); cloudContainer->addChild(groundpoint); } if (offgroundpoint) { offgroundpoint->setVisible(true); offgroundpoint->setName("off-ground points"); cloudContainer->addChild(offgroundpoint); } if (clothMesh) { clothMesh->computePerVertexNormals(); clothMesh->showNormals(true); cloudContainer->addChild(clothMesh); } m_app->addToDB(cloudContainer); m_app->refreshAll(); }
bool AircraftData::import(QProgressDialog &progress, MainObject *mainObject){ int c = 0; int found = 0; progress.setRange(0, 2000); progress.setWindowTitle("Scanning Aircraft Directories"); progress.show(); progress.repaint(); //= Cache File QFile cacheFile( mainObject->data_file("aircraft.txt") ); if(!cacheFile.open(QIODevice::WriteOnly | QIODevice::Text)){ //qDebug() << "TODO Open error cachce file="; return true; } QTextStream out(&cacheFile); //= Get files Entries from Aircaft/ directory QDir aircraftDir( mainObject->X->aircraft_path() ); aircraftDir.setFilter( QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot); QStringList entries = aircraftDir.entryList(); progress.setRange(0, entries.size() + 20); for( QStringList::ConstIterator entry=entries.begin(); entry!=entries.end(); ++entry ){ // Filter out default dir names, should be a QDir name filter? if (*entry != "Instruments" && *entry != "Instruments-3d" && *entry != "Generic") { progress.setValue(c); progress.setLabelText(*entry); progress.repaint(); //** get the List of *-set.xml files in dir QDir dir( mainObject->X->aircraft_path(*entry) ); QStringList filters; filters << "*-set.xml"; QStringList list_xml = dir.entryList(filters); if(list_xml.count() > 0){ // << Scan MOdels QString directory; QString description; QString author; QString fdm; QString xml_file; QString aero; //** Add Path Node directory = QString(*entry); //** Add Models for (int i = 0; i < list_xml.size(); ++i){ xml_file = QString(list_xml.at(i)); aero = QString(xml_file); aero.chop(8); //*=parse the Xml file - f&*& long winded QString file_path = mainObject->X->aircraft_path(*entry); file_path.append("/"); file_path.append(list_xml.at(i)); QFile xmlFile( file_path); if (xmlFile.open(QIODevice::ReadOnly | QIODevice::Text)){ /* The file content is converted to UTF-8. Some files are Windows, encoding and throw error with QxmlQuery etc Its a hack and don't quite understand whats happening.. said pedro */ QString xmlString = QString(xmlFile.readAll()).toUtf8(); QXmlQuery query; query.setFocus(xmlString); //query.setFocus(&xmlFile); << Because file is not QTF8 using sting instead query.setQuery("PropertyList/sim"); if (query.isValid()){ QString res; query.evaluateTo(&res); xmlFile.close(); QDomDocument dom; dom.setContent("" + res + ""); QDomNodeList nodes = dom.elementsByTagName("sim"); QDomNode n = nodes.at(0); description = n.firstChildElement("description").text(); author = n.firstChildElement("author").text().trimmed().replace(("\n"),""); fdm = n.firstChildElement("flight-model").text(); } /* !query.isValid() */ } /* xmlFile.open() */ QStringList lines; lines << directory << aero << xml_file << description << fdm << author << file_path; out << lines.join("\t") << "\n"; found++; if(progress.wasCanceled()){ //qDebug() << "Progress cancelled!"; progress.hide(); return true; } c++; } } /* list_xml.count() > 0 */ } /* entry != INstruments etc */ } /* loop entries.() */ cacheFile.close(); return false; }