ccGraphicalSegmentationTool::ccGraphicalSegmentationTool(QWidget* parent) : ccOverlayDialog(parent) , Ui::GraphicalSegmentationDlg() , m_somethingHasChanged(false) , m_state(0) , m_segmentationPoly(0) , m_polyVertices(0) , m_rectangularSelection(false) , m_deleteHiddenParts(false) { // Set QDialog background as transparent (DGM: doesn't work over an OpenGL context) //setAttribute(Qt::WA_NoSystemBackground); setupUi(this); connect(inButton, SIGNAL(clicked()), this, SLOT(segmentIn())); connect(outButton, SIGNAL(clicked()), this, SLOT(segmentOut())); connect(razButton, SIGNAL(clicked()), this, SLOT(reset())); connect(validButton, SIGNAL(clicked()), this, SLOT(apply())); connect(validAndDeleteButton, SIGNAL(clicked()), this, SLOT(applyAndDelete())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancel())); connect(pauseButton, SIGNAL(toggled(bool)), this, SLOT(pauseSegmentationMode(bool))); //selection modes connect(actionSetPolylineSelection, SIGNAL(triggered()), this, SLOT(doSetPolylineSelection())); connect(actionSetRectangularSelection, SIGNAL(triggered()), this, SLOT(doSetRectangularSelection())); //import/export options connect(actionUseExistingPolyline, SIGNAL(triggered()), this, SLOT(doActionUseExistingPolyline())); connect(actionExportSegmentationPolyline, SIGNAL(triggered()), this, SLOT(doExportSegmentationPolyline())); //add shortcuts addOverridenShortcut(Qt::Key_Space); //space bar for the "pause" button addOverridenShortcut(Qt::Key_Escape); //escape key for the "cancel" button addOverridenShortcut(Qt::Key_Return); //return key for the "apply" button addOverridenShortcut(Qt::Key_Delete); //delete key for the "apply and delete" button addOverridenShortcut(Qt::Key_Tab); //tab key to switch between rectangular and polygonal selection modes addOverridenShortcut(Qt::Key_I); //'I' key for the "segment in" button addOverridenShortcut(Qt::Key_O); //'O' key for the "segment out" button connect(this, SIGNAL(shortcutTriggered(int)), this, SLOT(onShortcutTriggered(int))); QMenu* selectionModeMenu = new QMenu(this); selectionModeMenu->addAction(actionSetPolylineSelection); selectionModeMenu->addAction(actionSetRectangularSelection); selectionModelButton->setDefaultAction(actionSetPolylineSelection); selectionModelButton->setMenu(selectionModeMenu); QMenu* importExportMenu = new QMenu(this); importExportMenu->addAction(actionUseExistingPolyline); importExportMenu->addAction(actionExportSegmentationPolyline); loadSaveToolButton->setMenu(importExportMenu); m_polyVertices = new ccPointCloud("vertices"); m_segmentationPoly = new ccPolyline(m_polyVertices); m_segmentationPoly->setForeground(true); m_segmentationPoly->setColor(ccColor::green); m_segmentationPoly->showColors(true); m_segmentationPoly->set2DMode(true); allowPolylineExport(false); }
ccGraphicalSegmentationTool::ccGraphicalSegmentationTool(QWidget* parent) : QDialog(parent) , Ui::GraphicalSegmentationDlg() , m_somethingHasChanged(false) , m_state(0) , m_segmentationPoly(0) , m_polyVertices(0) , m_associatedWin(0) , m_rectangularSelection(false) , m_deleteHiddenPoints(false) { // Set QDialog background as transparent (DGM: doesn't work over an OpenGL context) //setAttribute(Qt::WA_NoSystemBackground); setupUi(this); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); connect(inButton, SIGNAL(clicked()), this, SLOT(segmentIn())); connect(outButton, SIGNAL(clicked()), this, SLOT(segmentOut())); connect(razButton, SIGNAL(clicked()), this, SLOT(reset())); connect(validButton, SIGNAL(clicked()), this, SLOT(apply())); connect(validAndDeleteButton, SIGNAL(clicked()), this, SLOT(applyAndDelete())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancel())); connect(pauseButton, SIGNAL(toggled(bool)), this, SLOT(pauseSegmentationMode(bool))); //selection modes connect(actionSetPolylineSelection, SIGNAL(triggered()), this, SLOT(doSetPolylineSelection())); connect(actionSetRectangularSelection, SIGNAL(triggered()), this, SLOT(doSetRectangularSelection())); QMenu* selectionModeMenu = new QMenu(this); selectionModeMenu->addAction(actionSetPolylineSelection); selectionModeMenu->addAction(actionSetRectangularSelection); selectionModelButton->setDefaultAction(actionSetPolylineSelection); selectionModelButton->setMenu(selectionModeMenu); m_polyVertices = new ccPointCloud(); m_segmentationPoly = new ccPolyline(m_polyVertices); m_segmentationPoly->setForeground(true); m_segmentationPoly->setColor(ccColor::green); m_segmentationPoly->showColors(true); m_segmentationPoly->set2DMode(true); }
void ccGraphicalSegmentationTool::onShortcutTriggered(int key) { switch(key) { case Qt::Key_Space: pauseButton->toggle(); return; case Qt::Key_I: inButton->click(); return; case Qt::Key_O: outButton->click(); return; case Qt::Key_Return: validButton->click(); return; case Qt::Key_Delete: validAndDeleteButton->click(); return; case Qt::Key_Escape: cancelButton->click(); return; case Qt::Key_Tab: if (m_rectangularSelection) doSetPolylineSelection(); else doSetRectangularSelection(); return; default: //nothing to do break; } }
void ccGraphicalSegmentationTool::doActionUseExistingPolyline() { MainWindow* mainWindow = MainWindow::TheInstance(); if (mainWindow) { ccHObject* root = mainWindow->dbRootObject(); ccHObject::Container polylines; if (root) { root->filterChildren(polylines,true,CC_TYPES::POLY_LINE); } if (!polylines.empty()) { ccEntityPickerDlg epDlg(polylines,0,this); if (!epDlg.exec()) return; int index = epDlg.getSelectedIndex(); assert(index >= 0 && index < static_cast<int>(polylines.size())); assert(polylines[index]->isA(CC_TYPES::POLY_LINE)); ccPolyline* poly = static_cast<ccPolyline*>(polylines[index]); CCLib::GenericIndexedCloudPersist* vertices = poly->getAssociatedCloud(); bool mode3D = !poly->is2DMode(); //viewing parameters (for conversion from 3D to 2D) const double* MM = m_associatedWin->getModelViewMatd(); //viewMat const double* MP = m_associatedWin->getProjectionMatd(); //projMat const GLdouble half_w = static_cast<GLdouble>(m_associatedWin->width())/2; const GLdouble half_h = static_cast<GLdouble>(m_associatedWin->height())/2; int VP[4]; m_associatedWin->getViewportArray(VP); //force polygonal selection mode doSetPolylineSelection(); m_segmentationPoly->clear(); m_polyVertices->clear(); //duplicate polyline 'a minima' (only points and indexes + closed state) if ( m_polyVertices->reserve(vertices->size()) && m_segmentationPoly->reserve(poly->size())) { for (unsigned i=0; i<vertices->size(); ++i) { CCVector3 P = *vertices->getPoint(i); if (mode3D) { GLdouble xp,yp,zp; gluProject(P.x,P.y,P.z,MM,MP,VP,&xp,&yp,&zp); P.x = static_cast<PointCoordinateType>(xp-half_w); P.y = static_cast<PointCoordinateType>(yp-half_h); P.z = 0; } m_polyVertices->addPoint(P); } for (unsigned j=0; j<poly->size(); ++j) m_segmentationPoly->addPointIndex(poly->getPointGlobalIndex(j)); m_segmentationPoly->setClosed(poly->isClosed()); if (m_segmentationPoly->isClosed()) { //stop m_state &= (~RUNNING); } if (m_associatedWin) m_associatedWin->updateGL(); } else { ccLog::Error("Not enough memory!"); } } else { ccLog::Error("No polyline in DB!"); } } }
void ccGraphicalSegmentationTool::doActionUseExistingPolyline() { MainWindow* mainWindow = MainWindow::TheInstance(); if (mainWindow) { ccHObject* root = mainWindow->dbRootObject(); ccHObject::Container polylines; if (root) { root->filterChildren(polylines,true,CC_TYPES::POLY_LINE); } if (!polylines.empty()) { ccEntityPickerDlg epDlg(polylines,false,0,this); if (!epDlg.exec()) return; int index = epDlg.getSelectedIndex(); assert(index >= 0 && index < static_cast<int>(polylines.size())); assert(polylines[index]->isA(CC_TYPES::POLY_LINE)); ccPolyline* poly = static_cast<ccPolyline*>(polylines[index]); //look for an asociated viewport ccHObject::Container viewports; if (poly->filterChildren(viewports,false,CC_TYPES::VIEWPORT_2D_OBJECT,true) == 1) { //shall we apply this viewport? if (QMessageBox::question( m_associatedWin ? m_associatedWin->asWidget() : 0, "Associated viewport", "The selected polyline has an associated viewport: do you want to apply it?", QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { m_associatedWin->setViewportParameters(static_cast<cc2DViewportObject*>(viewports.front())->getParameters()); m_associatedWin->redraw(false); } } CCLib::GenericIndexedCloudPersist* vertices = poly->getAssociatedCloud(); bool mode3D = !poly->is2DMode(); //viewing parameters (for conversion from 3D to 2D) ccGLCameraParameters camera; m_associatedWin->getGLCameraParameters(camera); const double half_w = camera.viewport[2] / 2.0; const double half_h = camera.viewport[3] / 2.0; //force polygonal selection mode doSetPolylineSelection(); m_segmentationPoly->clear(); m_polyVertices->clear(); allowPolylineExport(false); //duplicate polyline 'a minima' (only points and indexes + closed state) if ( m_polyVertices->reserve(vertices->size()) && m_segmentationPoly->reserve(poly->size())) { for (unsigned i=0; i<vertices->size(); ++i) { CCVector3 P = *vertices->getPoint(i); if (mode3D) { CCVector3d Q2D; camera.project(P, Q2D); P.x = static_cast<PointCoordinateType>(Q2D.x-half_w); P.y = static_cast<PointCoordinateType>(Q2D.y-half_h); P.z = 0; } m_polyVertices->addPoint(P); } for (unsigned j=0; j<poly->size(); ++j) { m_segmentationPoly->addPointIndex(poly->getPointGlobalIndex(j)); } m_segmentationPoly->setClosed(poly->isClosed()); if (m_segmentationPoly->isClosed()) { //stop m_state &= (~RUNNING); allowPolylineExport(m_segmentationPoly->size() > 1); } if (m_associatedWin) m_associatedWin->redraw(true, false); } else { ccLog::Error("Not enough memory!"); } } else { ccLog::Error("No polyline in DB!"); } } }