int ccEntityPickerDlg::SelectEntity(const ccHObject::Container& entities, int selectedIndex/*=0*/, QWidget* parent/*=0*/, QString label/*=QString()*/) { ccEntityPickerDlg epDlg(entities,selectedIndex,parent,label); if (!epDlg.exec()) return -1; return epDlg.getSelectedIndex(); }
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!"); } } }