CC_FILE_ERROR BinFilter::loadFile(const char* filename, ccHObject& container, bool alwaysDisplayLoadDialog/*=true*/, bool* coordinatesShiftEnabled/*=0*/, double* coordinatesShift/*=0*/) { ccLog::Print("[BIN] Opening file '%s'...",filename); //opening file QFile in(filename); if (!in.open(QIODevice::ReadOnly)) return CC_FERR_READING; uint32_t firstBytes = 0; if (in.read((char*)&firstBytes,4)<0) return CC_FERR_READING; bool v1 = (strncmp((char*)&firstBytes,"CCB2",4) != 0); if (v1) { return LoadFileV1(in,container,static_cast<unsigned>(firstBytes),alwaysDisplayLoadDialog); //firstBytes == number of scans for V1 files! } else { if (alwaysDisplayLoadDialog) { QProgressDialog pDlg(QString("Loading: %1").arg(QFileInfo(filename).fileName()),QString(),0,0/*static_cast<int>(in.size())*/); pDlg.setWindowTitle("BIN file"); pDlg.show(); //concurrent call in a separate thread s_file = ∈ s_container = &container; QFuture<CC_FILE_ERROR> future = QtConcurrent::run(_LoadFileV2); while (!future.isFinished()) { #if defined(CC_WINDOWS) ::Sleep(500); #else usleep(500 * 1000); #endif if (alwaysDisplayLoadDialog) { pDlg.setValue(pDlg.value()+1); //pDlg.setValue(static_cast<int>(in.pos())); //DGM: in fact, the file reading part is just half of the work! QApplication::processEvents(); } } s_file = 0; s_container = 0; return future.result(); } else { return BinFilter::LoadFileV2(in,container); } } }
CC_FILE_ERROR BinFilter::loadFile(QString filename, ccHObject& container, LoadParameters& parameters) { ccLog::Print(QString("[BIN] Opening file '%1'...").arg(filename)); //opening file QFile in(filename); if (!in.open(QIODevice::ReadOnly)) return CC_FERR_READING; uint32_t firstBytes = 0; if (in.read((char*)&firstBytes,4) < 0) return CC_FERR_READING; bool v1 = (strncmp((char*)&firstBytes,"CCB",3) != 0); if (v1) { return LoadFileV1(in, container, static_cast<unsigned>(firstBytes), parameters); //firstBytes == number of scans for V1 files! } else { //Since ver 2.5.2, the 4th character of the header corresponds to 'load flags' int flags = 0; { QChar c(reinterpret_cast<char*>(&firstBytes)[3]); bool ok; flags = QString(c).toInt(&ok); if (!ok || flags > 8) { ccLog::Error(QString("Invalid file header (4th byte is '%1'?!)").arg(c)); return CC_FERR_WRONG_FILE_TYPE; } } //if (sizeof(PointCoordinateType) == 8 && strncmp((char*)&firstBytes,"CCB3",4) != 0) //{ // QMessageBox::information(0, QString("Wrong version"), QString("This file has been generated with the standard 'float' version!\nAt this time it cannot be read with the 'double' version."),QMessageBox::Ok); // return CC_FERR_WRONG_FILE_TYPE; //} //else if (sizeof(PointCoordinateType) == 4 && strncmp((char*)&firstBytes,"CCB2",4) != 0) //{ // QMessageBox::information(0, QString("Wrong version"), QString("This file has been generated with the new 'double' version!\nAt this time it cannot be read with the standard 'float' version."),QMessageBox::Ok); // return CC_FERR_WRONG_FILE_TYPE; //} if (parameters.alwaysDisplayLoadDialog) { ccProgressDialog pDlg(false, parameters.parentWidget); pDlg.setMethodTitle(QObject::tr("BIN file")); pDlg.setInfo(QObject::tr("Loading: %1").arg(QFileInfo(filename).fileName())); pDlg.setRange(0, 0); pDlg.show(); //concurrent call in a separate thread s_file = ∈ s_container = &container; s_flags = flags; QFuture<CC_FILE_ERROR> future = QtConcurrent::run(_LoadFileV2); while (!future.isFinished()) { #if defined(CC_WINDOWS) ::Sleep(500); #else usleep(500 * 1000); #endif pDlg.setValue(pDlg.value()+1); //pDlg.setValue(static_cast<int>(in.pos())); //DGM: in fact, the file reading part is just half of the work! QApplication::processEvents(); } s_file = 0; s_container = 0; return future.result(); } else { return BinFilter::LoadFileV2(in,container,flags); } } }