void ccPointListPickingDlg::linkWithCloud(ccPointCloud* cloud) { m_associatedCloud = cloud; m_lastPreviousID = 0; if (m_associatedCloud) { //find default container m_orderedLabelsContainer = 0; ccHObject::Container groups; m_associatedCloud->filterChildren(groups,true,CC_TYPES::HIERARCHY_OBJECT); for (ccHObject::Container::const_iterator it=groups.begin(); it!=groups.end(); ++it) { if ((*it)->getName() == s_pickedPointContainerName) { m_orderedLabelsContainer = *it; break; } } std::vector<cc2DLabel*> previousPickedPoints; unsigned count = getPickedPoints(previousPickedPoints); //find highest unique ID among the VISIBLE labels for (unsigned i=0;i<count;++i) { if (previousPickedPoints[i]->getUniqueID() > m_lastPreviousID) m_lastPreviousID = previousPickedPoints[i]->getUniqueID(); } } showGlobalCoordsCheckBox->setEnabled(cloud ? cloud->isShifted() : false); updateList(); }
void ccPointListPickingDlg::removeLastEntry() { if (!m_associatedCloud) return; //get all labels std::vector<cc2DLabel*> labels; unsigned count = getPickedPoints(labels); if (count==0) return; ccHObject* lastVisibleLabel = labels.back(); if (lastVisibleLabel->getUniqueID() <= m_lastPreviousID) { //old label: hide it and add it to the 'to be deleted' list (will be restored if process s cancelled) lastVisibleLabel->setVisible(false); m_toBeDeleted->addChild(lastVisibleLabel,false); } else { if (m_orderedLabelsContainer) //m_orderedLabelsContainer->removeChild(lastVisibleLabel); MainWindow::TheInstance()->db()->removeElement(lastVisibleLabel); else m_associatedCloud->removeChild(lastVisibleLabel); } updateList(); if (m_associatedWin) m_associatedWin->redraw(); }
void ccPointListPickingDlg::exportToASCII(ExportFormat format) { if (!m_associatedCloud) return; //get all labels std::vector<cc2DLabel*> labels; unsigned i,count = getPickedPoints(labels); if (count==0) return; QSettings settings; settings.beginGroup("PointListPickingDlg"); QString filename = settings.value("filename", "picking_list.txt").toString(); settings.endGroup(); filename = QFileDialog::getSaveFileName(this, "Export to ASCII", filename, CC_FILE_TYPE_FILTERS[ASCII]); if (filename.isEmpty()) return; settings.beginGroup("PointListPickingDlg"); settings.setValue("filename", filename); settings.endGroup(); FILE* fp = fopen(qPrintable(filename),"wt"); if (!fp) { ccConsole::Error(QString("Failed to open file '%1' for saving!").arg(filename)); return; } //starting index int startIndex = startIndexSpinBox->value(); for (i=0;i<count;++i) { const cc2DLabel::PickedPoint& PP = labels[i]->getPoint(0); const CCVector3* P = PP.cloud->getPoint(PP.index); switch(format) { case PLP_ASCII_EXPORT_XYZ: fprintf(fp,"%f,%f,%f\n",P->x,P->y,P->z); break; case PLP_ASCII_EXPORT_IXYZ: fprintf(fp,"%i,%f,%f,%f\n",i+startIndex,P->x,P->y,P->z); break; } } fclose(fp); ccConsole::Print(QString("File '%1' successfully saved!").arg(filename)); }
void ccPointListPickingDlg::updateList() { //get all labels std::vector<cc2DLabel*> labels; unsigned count = getPickedPoints(labels); revertToolButton->setEnabled(count); validToolButton->setEnabled(count); exportToolButton->setEnabled(count); countLineEdit->setText(QString::number(count)); tableWidget->setRowCount(count); if (!count) return; //starting index int startIndex = startIndexSpinBox->value(); int precision = m_associatedWin ? m_associatedWin->getDisplayParameters().displayedNumPrecision : 6; bool showAbsolute = showGlobalCoordsCheckBox->isEnabled() && showGlobalCoordsCheckBox->isChecked(); for (unsigned i = 0; i < count; ++i) { const cc2DLabel::PickedPoint& PP = labels[i]->getPoint(0); const CCVector3* P = PP.cloud->getPoint(PP.index); CCVector3d Pd = (showAbsolute ? PP.cloud->toGlobal3d(*P) : CCVector3d::fromArray(P->u)); //point index in list tableWidget->setVerticalHeaderItem(i, new QTableWidgetItem(QString("%1").arg(i + startIndex))); //update name as well if ( labels[i]->getUniqueID() > m_lastPreviousID || labels[i]->getName().startsWith(s_defaultLabelBaseName) ) //DGM: we don't change the name of old labels that have a non-default name { labels[i]->setName(s_defaultLabelBaseName + QString::number(i+startIndex)); } //point absolute index (in cloud) tableWidget->setItem(i, 0, new QTableWidgetItem(QString("%1").arg(PP.index))); for (unsigned j = 0; j < 3; ++j) tableWidget->setItem(i, j + 1, new QTableWidgetItem(QString("%1").arg(Pd.u[j], 0, 'f', precision))); } tableWidget->scrollToBottom(); }
void ccPointListPickingDlg::exportToNewPolyline() { if (!m_associatedCloud) return; //get all labels std::vector<cc2DLabel*> labels; unsigned count = getPickedPoints(labels); if (count > 1) { //we create an "independent" polyline ccPointCloud* vertices = new ccPointCloud("vertices"); ccPolyline* polyline = new ccPolyline(vertices); if (!vertices->reserve(count) || !polyline->reserve(count)) { ccLog::Error("Not enough memory!"); delete vertices; delete polyline; return; } for (unsigned i = 0; i < count; ++i) { const cc2DLabel::PickedPoint& PP = labels[i]->getPoint(0); vertices->addPoint(*PP.cloud->getPoint(PP.index)); } polyline->addPointIndex(0, count); polyline->setVisible(true); vertices->setEnabled(false); polyline->setGlobalShift(m_associatedCloud->getGlobalShift()); polyline->setGlobalScale(m_associatedCloud->getGlobalScale()); polyline->addChild(vertices); polyline->setDisplay_recursive(m_associatedCloud->getDisplay()); MainWindow::TheInstance()->addToDB(polyline); } else { ccLog::Error("Pick at least two points!"); } }
void ccPointListPickingDlg::exportToNewCloud() { if (!m_associatedCloud) return; //get all labels std::vector<cc2DLabel*> labels; unsigned count = getPickedPoints(labels); if (count != 0) { ccPointCloud* cloud = new ccPointCloud(); if (cloud->reserve(count)) { cloud->setName("Picking list"); for (unsigned i=0; i<count; ++i) { const cc2DLabel::PickedPoint& PP = labels[i]->getPoint(0); const CCVector3* P = PP.cloud->getPoint(PP.index); cloud->addPoint(*P); } cloud->setDisplay(m_associatedCloud->getDisplay()); cloud->setGlobalShift(m_associatedCloud->getGlobalShift()); cloud->setGlobalScale(m_associatedCloud->getGlobalScale()); MainWindow::TheInstance()->db()->addElement(cloud); } else { ccLog::Error("Can't export picked points as point cloud: not enough memory!"); delete cloud; cloud = 0; } } else { ccLog::Error("Pick some points first!"); } }
void ccPointListPickingDlg::updateList() { //get all labels std::vector<cc2DLabel*> labels; unsigned count = getPickedPoints(labels); revertToolButton->setEnabled(count); validToolButton->setEnabled(count); exportToolButton->setEnabled(count); countLineEdit->setText(QString::number(count)); tableWidget->setRowCount(count); if (!count) return; //starting index int startIndex = startIndexSpinBox->value(); int precision = ccGui::Parameters().displayedNumPrecision; for (unsigned i=0;i<count;++i) { const cc2DLabel::PickedPoint& PP = labels[i]->getPoint(0); const CCVector3* P = PP.cloud->getPoint(PP.index); //point index in list tableWidget->setVerticalHeaderItem(i,new QTableWidgetItem(QString("%1").arg(i+startIndex))); //update name as well labels[i]->setName(QString("Point #%1").arg(i+startIndex)); //point absolute index (in cloud) tableWidget->setItem(i,0,new QTableWidgetItem(QString("%1").arg(PP.index))); for (unsigned j=0;j<3;++j) tableWidget->setItem(i,j+1,new QTableWidgetItem(QString("%1").arg(P->u[j],0,'f',precision))); } tableWidget->scrollToBottom(); }
void ccPointListPickingDlg::exportToASCII(ExportFormat format) { if (!m_associatedCloud) return; //get all labels std::vector<cc2DLabel*> labels; unsigned count = getPickedPoints(labels); if (count == 0) return; QSettings settings; settings.beginGroup("PointListPickingDlg"); QString filename = settings.value("filename", "picking_list.txt").toString(); settings.endGroup(); filename = QFileDialog::getSaveFileName(this, "Export to ASCII", filename, AsciiFilter::GetFileFilter()); if (filename.isEmpty()) return; settings.beginGroup("PointListPickingDlg"); settings.setValue("filename", filename); settings.endGroup(); FILE* fp = fopen(qPrintable(filename),"wt"); if (!fp) { ccLog::Error(QString("Failed to open file '%1' for saving!").arg(filename)); return; } //if a global shift exists, ask the user if it should be applied CCVector3d shift = m_associatedCloud->getGlobalShift(); double scale = m_associatedCloud->getGlobalScale(); if (shift.norm2() != 0 || scale != 1.0) { if (QMessageBox::warning( this, "Apply global shift", "Do you want to apply global shift/scale to exported points?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ) == QMessageBox::No) { //reset shift shift = CCVector3d(0,0,0); scale = 1.0; } } //starting index int startIndex = startIndexSpinBox->value(); for (unsigned i=0; i<count; ++i) { assert(labels[i]->size() == 1); const cc2DLabel::PickedPoint& PP = labels[i]->getPoint(0); const CCVector3* P = PP.cloud->getPoint(PP.index); if (format == PLP_ASCII_EXPORT_IXYZ) fprintf(fp,"%i,",i+startIndex); fprintf(fp,"%.12f,%.12f,%.12f\n", static_cast<double>(P->x)/scale - shift.x, static_cast<double>(P->y)/scale - shift.y, static_cast<double>(P->z)/scale - shift.z); } fclose(fp); ccLog::Print(QString("[I/O] File '%1' saved successfully").arg(filename)); }