void ViewProviderMeasureDistance::measureDistanceCallback(void * ud, SoEventCallback * n) { const SoMouseButtonEvent * mbe = static_cast<const SoMouseButtonEvent*>(n->getEvent()); Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); PointMarker *pm = reinterpret_cast<PointMarker*>(ud); // Mark all incoming mouse button events as handled, especially, to deactivate the selection node n->getAction()->setHandled(); if (mbe->getButton() == SoMouseButtonEvent::BUTTON2 && mbe->getState() == SoButtonEvent::UP) { n->setHandled(); view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), measureDistanceCallback, ud); pm->deleteLater(); } else if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::DOWN) { const SoPickedPoint * point = n->getPickedPoint(); if (point == NULL) { Base::Console().Message("No point picked.\n"); return; } n->setHandled(); pm->addPoint(point->getPoint()); if (pm->countPoints() == 2) { QEvent *e = new QEvent(QEvent::User); QApplication::postEvent(pm, e); // leave mode view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), measureDistanceCallback, ud); pm->deleteLater(); } } }
void TaskCreateNodeSet::DefineNodesCallback(void * ud, SoEventCallback * n) { // show the wait cursor because this could take quite some time Gui::WaitCursor wc; TaskCreateNodeSet *taskBox = static_cast<TaskCreateNodeSet *>(ud); // When this callback function is invoked we must in either case leave the edit mode Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), DefineNodesCallback,ud); n->setHandled(); SbBool clip_inner; std::vector<SbVec2f> clPoly = view->getGLPolygon(&clip_inner); if (clPoly.size() < 3) return; if (clPoly.front() != clPoly.back()) clPoly.push_back(clPoly.front()); SoCamera* cam = view->getSoRenderManager()->getCamera(); SbViewVolume vv = cam->getViewVolume(); Gui::ViewVolumeProjection proj(vv); Base::Polygon2D polygon; for (std::vector<SbVec2f>::const_iterator it = clPoly.begin(); it != clPoly.end(); ++it) polygon.Add(Base::Vector2D((*it)[0],(*it)[1])); taskBox->DefineNodes(polygon,proj,clip_inner); }
void ViewProviderPoints::clipPointsCallback(void * ud, SoEventCallback * n) { // When this callback function is invoked we must in either case leave the edit mode Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), clipPointsCallback); n->setHandled(); std::vector<SbVec2f> clPoly = view->getGLPolygon(); if (clPoly.size() < 3) return; if (clPoly.front() != clPoly.back()) clPoly.push_back(clPoly.front()); std::vector<Gui::ViewProvider*> views = view->getViewProvidersOfType(ViewProviderPoints::getClassTypeId()); for (std::vector<Gui::ViewProvider*>::iterator it = views.begin(); it != views.end(); ++it) { ViewProviderPoints* that = static_cast<ViewProviderPoints*>(*it); if (that->getEditingMode() > -1) { that->finishEditing(); that->cut(clPoly, *view); } } view->redraw(); }
void TaskCreateNodeSet::Poly(void) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); Gui::MDIView* view = doc->getActiveView(); if (view->getTypeId().isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = ((Gui::View3DInventor*)view)->getViewer(); viewer->setEditing(true); viewer->startSelection(Gui::View3DInventorViewer::Clip); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), DefineNodesCallback,this); } }
void MeshFillHole::finishEditing() { Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(parent()); Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(false); //viewer->setRedirectToSceneGraph(false); viewer->removeEventCallback(SoEvent::getClassTypeId(), MeshFillHole::fileHoleCallback, this); myConnection.disconnect(); this->deleteLater(); static_cast<SoGroup*>(viewer->getSceneGraph())->removeChild(myBridgeRoot); }
void MeshFaceAddition::finishEditing() { Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(parent()); Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(false); viewer->setRedirectToSceneGraph(false); viewer->removeViewProvider(faceView); //faceView->mesh->finishEditing(); viewer->removeEventCallback(SoEvent::getClassTypeId(), MeshFaceAddition::addFacetCallback, this); this->deleteLater(); }
void CmdInspectElement::activated(int iMsg) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(doc->getActiveView()); if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(true); viewer->setRedirectToSceneGraph(true); viewer->setEditingCursor(QCursor(Gui::BitmapFactory().pixmap("mesh_pipette"),4,29)); viewer->addEventCallback(SoButtonEvent::getClassTypeId(), InspectionGui::ViewProviderInspection::inspectCallback); } }
void MeshFaceAddition::startEditing(MeshGui::ViewProviderMesh* vp) { Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(parent()); Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(true); viewer->setRedirectToSceneGraph(true); faceView->mesh = vp; faceView->attach(vp->getObject()); viewer->addViewProvider(faceView); //faceView->mesh->startEditing(); viewer->addEventCallback(SoEvent::getClassTypeId(), MeshFaceAddition::addFacetCallback, this); }
void CmdPointsPolyCut::activated(int iMsg) { std::vector<App::DocumentObject*> docObj = Gui::Selection().getObjectsOfType(Points::Feature::getClassTypeId()); for (std::vector<App::DocumentObject*>::iterator it = docObj.begin(); it != docObj.end(); ++it) { if (it == docObj.begin()) { Gui::Document* doc = getActiveGuiDocument(); Gui::MDIView* view = doc->getActiveView(); if (view->getTypeId().isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = ((Gui::View3DInventor*)view)->getViewer(); viewer->setEditing(true); viewer->startSelection(Gui::View3DInventorViewer::Lasso); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), PointsGui::ViewProviderPoints::clipPointsCallback); } else { return; } } Gui::ViewProvider* pVP = getActiveGuiDocument()->getViewProvider( *it ); pVP->startEditing(); } }
void MeshFillHole::startEditing(MeshGui::ViewProviderMesh* vp) { this->myMesh = static_cast<Mesh::Feature*>(vp->getObject()); Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(parent()); Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(true); //viewer->setRedirectToSceneGraph(true); viewer->addEventCallback(SoEvent::getClassTypeId(), MeshFillHole::fileHoleCallback, this); myConnection = App::GetApplication().signalChangedObject.connect( boost::bind(&MeshFillHole::slotChangedObject, this, _1, _2)); myBoundariesRoot->removeAllChildren(); myBoundariesRoot->addChild(viewer->getHeadlight()); myBoundariesRoot->addChild(viewer->getCamera()); myBoundariesRoot->addChild(myBoundariesGroup); myBoundaryRoot->removeAllChildren(); myBoundaryRoot->addChild(viewer->getHeadlight()); myBoundaryRoot->addChild(viewer->getCamera()); createPolygons(); static_cast<SoGroup*>(viewer->getSceneGraph())->addChild(myBridgeRoot); }
void CmdFemDefineNodesSet::activated(int iMsg) { std::vector<App::DocumentObject*> docObj = Gui::Selection().getObjectsOfType(Fem::FemMeshObject::getClassTypeId()); for (std::vector<App::DocumentObject*>::iterator it = docObj.begin(); it != docObj.end(); ++it) { if (it == docObj.begin()) { Gui::Document* doc = getActiveGuiDocument(); Gui::MDIView* view = doc->getActiveView(); if (view->getTypeId().isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = ((Gui::View3DInventor*)view)->getViewer(); viewer->setEditing(true); viewer->startSelection(Gui::View3DInventorViewer::Clip); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), DefineNodesCallback); } else { return; } } //Gui::ViewProvider* pVP = getActiveGuiDocument()->getViewProvider(*it); //if (pVP->isVisible()) // pVP->startEditing(); } }
void DefineNodesCallback(void * ud, SoEventCallback * n) { Fem::FemAnalysis *Analysis; if(getConstraintPrerequisits(&Analysis)) return; // show the wait cursor because this could take quite some time Gui::WaitCursor wc; // When this callback function is invoked we must in either case leave the edit mode Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), DefineNodesCallback,ud); n->setHandled(); SbBool clip_inner; std::vector<SbVec2f> clPoly = view->getGLPolygon(&clip_inner); if (clPoly.size() < 3) return; if (clPoly.front() != clPoly.back()) clPoly.push_back(clPoly.front()); SoCamera* cam = view->getCamera(); SbViewVolume vv = cam->getViewVolume(); Gui::ViewVolumeProjection proj(vv); Base::Polygon2D polygon; for (std::vector<SbVec2f>::const_iterator it = clPoly.begin(); it != clPoly.end(); ++it) polygon.Add(Base::Vector2D((*it)[0],(*it)[1])); std::vector<App::DocumentObject*> docObj = Gui::Selection().getObjectsOfType(Fem::FemMeshObject::getClassTypeId()); if(docObj.size() !=1) return; const SMESHDS_Mesh* data = const_cast<SMESH_Mesh*>(dynamic_cast<Fem::FemMeshObject*>(docObj[0])->FemMesh.getValue().getSMesh())->GetMeshDS(); SMDS_NodeIteratorPtr aNodeIter = data->nodesIterator(); Base::Vector3f pt2d; std::set<int> IntSet; for (int i=0;aNodeIter->more();) { const SMDS_MeshNode* aNode = aNodeIter->next(); Base::Vector3f vec(aNode->X(),aNode->Y(),aNode->Z()); pt2d = proj(vec); if (polygon.Contains(Base::Vector2D(pt2d.x, pt2d.y)) == true) IntSet.insert(aNode->GetID()); } std::stringstream set; set << "["; for(std::set<int>::const_iterator it=IntSet.begin();it!=IntSet.end();++it) if(it==IntSet.begin()) set << *it ; else set << "," << *it ; set << "]"; Gui::Command::openCommand("Place robot"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.addObject('Fem::FemSetNodesObject','NodeSet')"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.ActiveObject.Nodes = %s",set.str().c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().NodeSet]",Analysis->getNameInDocument(),Analysis->getNameInDocument()); ////Gui::Command::updateActive(); Gui::Command::commitCommand(); //std::vector<Gui::ViewProvider*> views = view->getViewProvidersOfType(ViewProviderMesh::getClassTypeId()); //if (!views.empty()) { // Gui::Application::Instance->activeDocument()->openCommand("Cut"); // for (std::vector<Gui::ViewProvider*>::iterator it = views.begin(); it != views.end(); ++it) { // ViewProviderMesh* that = static_cast<ViewProviderMesh*>(*it); // if (that->getEditingMode() > -1) { // that->finishEditing(); // that->cutMesh(clPoly, *view, clip_inner); // } // } // Gui::Application::Instance->activeDocument()->commitCommand(); // view->render(); //} }
void ViewProviderInspection::inspectCallback(void * ud, SoEventCallback * n) { Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); const SoEvent* ev = n->getEvent(); if (ev->getTypeId() == SoMouseButtonEvent::getClassTypeId()) { const SoMouseButtonEvent * mbe = static_cast<const SoMouseButtonEvent *>(ev); // Mark all incoming mouse button events as handled, especially, to deactivate the selection node n->getAction()->setHandled(); n->setHandled(); if (mbe->getButton() == SoMouseButtonEvent::BUTTON2 && mbe->getState() == SoButtonEvent::UP) { n->setHandled(); // context-menu QMenu menu; QAction* fl = menu.addAction(QObject::tr("Annotation")); fl->setCheckable(true); fl->setChecked(addflag); QAction* cl = menu.addAction(QObject::tr("Leave info mode")); QAction* id = menu.exec(QCursor::pos()); if (fl == id) { addflag = fl->isChecked(); } else if (cl == id) { // post an event to a proxy object to make sure to avoid problems // when opening a modal dialog QApplication::postEvent( new ViewProviderProxyObject(view->getGLWidget()), new QEvent(QEvent::User)); view->setEditing(false); view->getWidget()->setCursor(QCursor(Qt::ArrowCursor)); view->setRedirectToSceneGraph(false); view->setRedirectToSceneGraphEnabled(false); view->removeEventCallback(SoButtonEvent::getClassTypeId(), inspectCallback); } } else if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { const SoPickedPoint * point = n->getPickedPoint(); if (point == NULL) { Base::Console().Message("No point picked.\n"); return; } n->setHandled(); // check if we have picked one a node of the view provider we are insterested in Gui::ViewProvider* vp = static_cast<Gui::ViewProvider*>(view->getViewProviderByPath(point->getPath())); if (vp && vp->getTypeId().isDerivedFrom(ViewProviderInspection::getClassTypeId())) { ViewProviderInspection* that = static_cast<ViewProviderInspection*>(vp); QString info = that->inspectDistance(point); Gui::getMainWindow()->setPaneText(1,info); if (addflag) ViewProviderProxyObject::addFlag(view, info, point); else Gui::ToolTip::showText(QCursor::pos(), info); } else { // the nearest picked point was not part of the view provider SoRayPickAction action(view->getViewportRegion()); action.setPickAll(TRUE); action.setPoint(mbe->getPosition()); action.apply(view->getSceneManager()->getSceneGraph()); const SoPickedPointList& pps = action.getPickedPointList(); for (int i=0; i<pps.getLength(); ++i) { const SoPickedPoint * point = pps[i]; vp = static_cast<Gui::ViewProvider*>(view->getViewProviderByPath(point->getPath())); if (vp && vp->getTypeId().isDerivedFrom(ViewProviderInspection::getClassTypeId())) { ViewProviderInspection* that = static_cast<ViewProviderInspection*>(vp); QString info = that->inspectDistance(point); Gui::getMainWindow()->setPaneText(1,info); if (addflag) ViewProviderProxyObject::addFlag(view, info, point); else Gui::ToolTip::showText(QCursor::pos(), info); break; } } } } } // toggle between inspection and navigation mode else if (ev->getTypeId().isDerivedFrom(SoKeyboardEvent::getClassTypeId())) { const SoKeyboardEvent * const ke = static_cast<const SoKeyboardEvent *>(ev); if (ke->getState() == SoButtonEvent::DOWN && ke->getKey() == SoKeyboardEvent::ESCAPE) { SbBool toggle = view->isRedirectedToSceneGraph(); view->setRedirectToSceneGraph(!toggle); n->setHandled(); } } }