SbBox3f ViewProviderDatum::getRelevantBoundBox () const { std::vector<App::DocumentObject *> objs; // Probe body first PartDesign::Body* body = PartDesign::Body::findBodyOf ( this->getObject() ); if (body) { objs = body->getFullModel (); } else { // Probe if we belongs to some group App::DocumentObjectGroup* group = App::DocumentObjectGroup::getGroupOfObject ( this->getObject () ); if(group) { objs = group->getObjects (); } else { // Fallback to whole document objs = this->getObject ()->getDocument ()->getObjects (); } } Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(this->getActiveView())->getViewer(); SoGetBoundingBoxAction bboxAction(viewer->getSoRenderManager()->getViewportRegion()); SbBox3f bbox = getRelevantBoundBox (bboxAction, objs); if ( bbox.getVolume () < Precision::Confusion() ) { bbox.extendBy ( defaultBoundBox () ); } return bbox; }
void TextureMapping::on_fileChooser_fileNameSelected(const QString& s) { QImage image; if (!image.load(s)) { QMessageBox::warning(this, tr("No image"), tr("The specified file is not a valid image file.")); return; } if (!this->grp) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { Gui::MDIView* mdi = doc->getActiveView(); if (mdi && mdi->isDerivedFrom(View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* view = static_cast<View3DInventor*>(mdi)->getViewer(); this->grp = static_cast<SoGroup *>(view->getSceneGraph()); this->grp->ref(); this->grp->insertChild(this->tex,1); if (ui->checkEnv->isChecked()) this->grp->insertChild(this->env,2); } } } if (!this->grp) { QMessageBox::warning(this, tr("No 3d view"), tr("No active 3d view found.")); return; } SoSFImage texture; Gui::BitmapFactory().convert(image, texture); this->tex->image = texture; //this->tex->filename = (const char*)s.toUtf8(); App::GetApplication().Config()["TextureImage"] = (const char*)s.toUtf8(); }
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); }
//should return a configuration? frontdir,upDir mapped in DPG std::pair<Base::Vector3d,Base::Vector3d> TaskProjGroup::get3DViewDir() { std::pair<Base::Vector3d,Base::Vector3d> result; Base::Vector3d viewDir(0.0,-1.0,0.0); //default to front Base::Vector3d viewUp(0.0,0.0,1.0); //default to top std::list<MDIView*> mdis = Gui::Application::Instance->activeDocument()->getMDIViews(); Gui::View3DInventor *view; Gui::View3DInventorViewer *viewer = nullptr; for (auto& m: mdis) { //find the 3D viewer view = dynamic_cast<Gui::View3DInventor*>(m); if (view) { viewer = view->getViewer(); break; } } if (!viewer) { Base::Console().Log("LOG - TaskProjGroup could not find a 3D viewer\n"); return std::make_pair( viewDir, viewUp); } SbVec3f dvec = viewer->getViewDirection(); SbVec3f upvec = viewer->getUpDirection(); viewDir = Base::Vector3d(dvec[0], dvec[1], dvec[2]); viewUp = Base::Vector3d(upvec[0],upvec[1],upvec[2]); viewDir *= -1.0; //Inventor dir is opposite TD dir, Inventor up is same as TD up viewDir = DrawUtil::closestBasis(viewDir); viewUp = DrawUtil::closestBasis(viewUp); result = std::make_pair(viewDir,viewUp); return result; }
void NaviCubeImplementation::rotateView(int axis,float rotAngle) { SbRotation viewRot = m_View3DInventorViewer->getCameraOrientation(); SbVec3f up; viewRot.multVec(SbVec3f(0,1,0),up); SbVec3f out; viewRot.multVec(SbVec3f(0,0,1),out); SbVec3f& u = up; SbVec3f& o = out; SbVec3f right (u[1]*o[2]-u[2]*o[1], u[2]*o[0]-u[0]*o[2], u[0]*o[1]-u[1]*o[0]); SbVec3f direction; switch (axis) { default : return; case DIR_UP : direction = up; break; case DIR_OUT : direction = out; break; case DIR_RIGHT : direction = right; break; } SbRotation rot(direction, -rotAngle*M_PI/180.0); SbRotation newViewRot = viewRot * rot; m_View3DInventorViewer->setCameraOrientation(newViewRot); }
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 MeshSelection::stopSelection() { Gui::View3DInventorViewer* viewer = getViewer(); if (viewer) { stopInteractiveCallback(viewer); viewer->navigationStyle()->stopSelection(); } }
void CmdTestWidgetShape::activated(int iMsg) { SandboxGui::SoWidgetShape* shape = new SandboxGui::SoWidgetShape; shape->setWidget(new QCalendarWidget()); Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); static_cast<SoGroup*>(viewer->getSceneGraph())->addChild(shape); }
void DrawSketchHandler::unsetCursor(void) { Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); viewer->getWidget()->setCursor(oldCursor); } }
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 MeshSelection::deselectTriangle() { this->addToSelection = false; Gui::View3DInventorViewer* viewer = this->getViewer(); if (viewer) { viewer->setEditingCursor(QCursor(Qt::OpenHandCursor)); stopInteractiveCallback(viewer); startInteractiveCallback(viewer, pickFaceCallback); } }
void MeshSelection::selectTriangle() { this->addToSelection = true; Gui::View3DInventorViewer* viewer = this->getViewer(); if (viewer) { stopInteractiveCallback(viewer); viewer->navigationStyle()->stopSelection(); startInteractiveCallback(viewer, pickFaceCallback); viewer->setEditingCursor(QCursor(Qt::PointingHandCursor)); } }
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 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 DrawSketchHandler::setCursor(const QPixmap &p,int x,int y) { Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); oldCursor = viewer->getWidget()->cursor(); QCursor cursor(p, x, y); actCursor = cursor; viewer->getWidget()->setCursor(cursor); } }
float SoZoomTranslation::getScaleFactor() { // Dividing by 5 seems to work well Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); if (mdi && mdi->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer *viewer = static_cast<Gui::View3DInventor *>(mdi)->getViewer(); this->scale = viewer->getCamera()->getViewVolume(viewer->getCamera()->aspectRatio.getValue()).getWorldToScreenScale(SbVec3f(0.f, 0.f, 0.f), 0.1f) / 5; return this->scale; } else { return this->scale; } }
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(); }
bool CmdInspectElement::isActive(void) { App::Document* doc = App::GetApplication().getActiveDocument(); if (!doc || doc->countObjectsOfType(Inspection::Feature::getClassTypeId()) == 0) return false; Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); return !viewer->isEditing(); } return false; }
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); }
bool CmdFemDefineNodesSet::isActive(void) { // Check for the selected mesh feature (all Mesh types) if (getSelection().countObjectsOfType(Fem::FemMeshObject::getClassTypeId()) != 1) return false; Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); return !viewer->isEditing(); } return false; }
bool ViewProviderMeshNode::handleEvent(const SoEvent * const ev,Gui::View3DInventorViewer &Viewer) { if ( m_bEdit ) { unsetEdit(); std::vector<SbVec2f> clPoly = Viewer.getPickedPolygon(); if ( clPoly.size() < 3 ) return true; if ( clPoly.front() != clPoly.back() ) clPoly.push_back(clPoly.front()); // get the normal of the front clipping plane SbVec3f b,n; Viewer.getNearPlane(b, n); Base::Vector3f cPoint(b[0],b[1],b[2]), cNormal(n[0],n[1],n[2]); SoCamera* pCam = Viewer.getCamera(); SbViewVolume vol = pCam->getViewVolume (); // create a tool shape from these points std::vector<MeshCore::MeshGeomFacet> aFaces; bool ok = ViewProviderMesh::createToolMesh( clPoly, vol, cNormal, aFaces ); // Get the attached mesh property Mesh::PropertyMeshKernel& meshProp = ((Mesh::Feature*)pcObject)->Mesh; // Get the facet indices inside the tool mesh std::vector<unsigned long> indices; MeshCore::MeshKernel cToolMesh; cToolMesh = aFaces; MeshCore::MeshFacetGrid cGrid(meshProp.getValue().getKernel()); MeshCore::MeshAlgorithm cAlg(meshProp.getValue().getKernel()); cAlg.GetFacetsFromToolMesh(cToolMesh, cNormal, cGrid, indices); meshProp.deleteFacetIndices( indices ); // update open edge display if needed // if ( pcOpenEdge ) // { // showOpenEdges(false); // showOpenEdges(true); // } Viewer.render(); if ( !ok ) // note: the mouse grabbing needs to be released //QMessageBox::warning(Viewer.getWidget(),"Invalid polygon","The picked polygon seems to have self-overlappings.\n\nThis could lead to strange rersults."); Base::Console().Message("The picked polygon seems to have self-overlappings. This could lead to strange results."); } return false; }
void StdCmdEdit::activated(int iMsg) { Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); if (viewer->isEditingViewProvider()) { doCommand(Command::Gui,"Gui.activeDocument().resetEdit()"); } else { if (Selection().getCompleteSelection().size() > 0) { SelectionSingleton::SelObj obj = Selection().getCompleteSelection()[0]; doCommand(Command::Gui,"Gui.activeDocument().setEdit(\"%s\",0)",obj.FeatName); } } } }
void MeshSelection::pickFaceCallback(void * ud, SoEventCallback * n) { // handle only mouse button events if (n->getEvent()->isOfType(SoMouseButtonEvent::getClassTypeId())) { const SoMouseButtonEvent * mbe = static_cast<const SoMouseButtonEvent*>(n->getEvent()); Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); // Mark all incoming mouse button events as handled, especially, to deactivate the selection node n->getAction()->setHandled(); if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::DOWN) { const SoPickedPoint * point = n->getPickedPoint(); if (point == NULL) { Base::Console().Message("No facet picked.\n"); return; } n->setHandled(); // By specifying the indexed mesh node 'pcFaceSet' we make sure that the picked point is // really from the mesh we render and not from any other geometry Gui::ViewProvider* vp = static_cast<Gui::ViewProvider*>(view->getViewProviderByPath(point->getPath())); if (!vp || !vp->getTypeId().isDerivedFrom(ViewProviderMesh::getClassTypeId())) return; ViewProviderMesh* mesh = static_cast<ViewProviderMesh*>(vp); MeshSelection* self = reinterpret_cast<MeshSelection*>(ud); std::list<ViewProviderMesh*> views = self->getViewProviders(); if (std::find(views.begin(), views.end(), mesh) == views.end()) return; const SoDetail* detail = point->getDetail(/*mesh->getShapeNode()*/); if (detail && detail->getTypeId() == SoFaceDetail::getClassTypeId()) { // get the boundary to the picked facet unsigned long uFacet = static_cast<const SoFaceDetail*>(detail)->getFaceIndex(); if (self->addToSelection) { if (self->addComponent) mesh->selectComponent(uFacet); else mesh->selectFacet(uFacet); } else { if (self->removeComponent) mesh->deselectComponent(uFacet); else mesh->deselectFacet(uFacet); } } } } }
MyPaintable(Gui::View3DInventorViewer* v) :view(v), img(v->getGLWidget()->size(), QImage::Format_ARGB32) { img.fill(qRgba(255, 255, 255, 0)); { QPainter p(&img); p.setPen(Qt::white); p.drawText(200,200,QString::fromLatin1("Render to QImage")); } img = QGLWidget::convertToGLFormat(img); fbo = new QGLFramebufferObject(v->getGLWidget()->size()); fbo->bind(); //glClear(GL_COLOR_BUFFER_BIT); fbo->release(); { QPainter p(fbo); p.setPen(Qt::white); p.drawText(200,200,QString::fromLatin1("Render to QGLFramebufferObject")); p.end(); //img = fbo->toImage(); //img = QGLWidget::convertToGLFormat(img); } //fbo->bind(); //glEnable(GL_DEPTH_TEST); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glDepthRange(0.1,1.0); //glEnable(GL_LINE_SMOOTH); //SoGLRenderAction a(SbViewportRegion(128,128)); //a.apply(v->getSceneManager()->getSceneGraph()); //fbo->release(); //img = fbo->toImage(); //img = QGLWidget::convertToGLFormat(img); view->getSoRenderManager()->scheduleRedraw(); }
void NaviCubeImplementation::setHilite(int hilite) { if (hilite != m_HiliteId) { m_HiliteId = hilite; //cerr << "m_HiliteFace " << m_HiliteId << endl; m_View3DInventorViewer->getSoRenderManager()->scheduleRedraw(); } }
void FaceColors::on_boxSelection_clicked() { Gui::View3DInventor* view = qobject_cast<Gui::View3DInventor*>(Gui::getMainWindow()->activeWindow()); if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); if (!viewer->isSelecting()) { viewer->startSelection(Gui::View3DInventorViewer::Rubberband); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), Private::selectionCallback, this); // avoid that the selection node handles the event otherwise the callback function won't be // called immediately SoNode* root = viewer->getSceneGraph(); static_cast<Gui::SoFCUnifiedSelection*>(root)->selectionRole.setValue(false); d->view = viewer; } } }
void MeshSelection::prepareBrushSelection(bool add,SoEventCallbackCB *cb) { // a rubberband to select a rectangle area of the meshes Gui::View3DInventorViewer* viewer = this->getViewer(); if (viewer) { stopInteractiveCallback(viewer); startInteractiveCallback(viewer, cb); // set cross cursor Gui::BrushSelection* brush = new Gui::BrushSelection(); brush->setClosed(true); brush->setColor(1.0f,0.0f,0.0f); brush->setLineWidth(3.0f); viewer->navigationStyle()->startSelection(brush); QBitmap cursor = QBitmap::fromData(QSize(CROSS_WIDTH, CROSS_HEIGHT), cross_bitmap); QBitmap mask = QBitmap::fromData(QSize(CROSS_WIDTH, CROSS_HEIGHT), cross_mask_bitmap); QCursor custom(cursor, mask, CROSS_HOT_X, CROSS_HOT_Y); viewer->setComponentCursor(custom); this->addToSelection = add; } }
void MeshSelection::prepareBrushSelection(bool add) { // a rubberband to select a rectangle area of the meshes Gui::View3DInventorViewer* viewer = this->getViewer(); if (viewer) { stopInteractiveCallback(viewer); startInteractiveCallback(viewer, selectGLCallback); // set cross cursor DrawingPlane* brush = new DrawingPlane(); //brush->setColor(1.0f,0.0f,0.0f); //brush->setLineWidth(3.0f); viewer->navigationStyle()->startSelection(brush); SoQtCursor::CustomCursor custom; custom.dim.setValue(16, 16); custom.hotspot.setValue(7, 7); custom.bitmap = cross_bitmap; custom.mask = cross_mask_bitmap; viewer->setComponentCursor(SoQtCursor(&custom)); this->addToSelection = add; } }
Teapots(Gui::View3DInventorViewer* v) :view(v) { const SbViewportRegion vp = view->getSoRenderManager()->getViewportRegion(); SbVec2s size = vp.getViewportSizePixels(); rubberBandIsShown = false; // makeCurrent(); fbObject = new QGLFramebufferObject(size[0],size[1], QGLFramebufferObject::Depth); //initializeGL(); resizeGL(size[0],size[1]); rubberBandIsShown = true; rubberBandCorner1.setX(200); rubberBandCorner1.setY(200); rubberBandCorner2.setX(800); rubberBandCorner2.setY(600); view->getSoRenderManager()->scheduleRedraw(); }
static void selectionCallback(void * ud, SoEventCallback * cb) { Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(cb->getUserData()); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), selectionCallback, ud); SoNode* root = view->getSceneGraph(); static_cast<Gui::SoFCUnifiedSelection*>(root)->selectionRole.setValue(true); std::vector<SbVec2f> picked = view->getGLPolygon(); SoCamera* cam = view->getSoRenderManager()->getCamera(); SbViewVolume vv = cam->getViewVolume(); Gui::ViewVolumeProjection proj(vv); Base::Polygon2d polygon; if (picked.size() == 2) { SbVec2f pt1 = picked[0]; SbVec2f pt2 = picked[1]; polygon.Add(Base::Vector2d(pt1[0], pt1[1])); polygon.Add(Base::Vector2d(pt1[0], pt2[1])); polygon.Add(Base::Vector2d(pt2[0], pt2[1])); polygon.Add(Base::Vector2d(pt2[0], pt1[1])); } else { for (std::vector<SbVec2f>::const_iterator it = picked.begin(); it != picked.end(); ++it) polygon.Add(Base::Vector2d((*it)[0],(*it)[1])); } FaceColors* self = reinterpret_cast<FaceColors*>(ud); self->d->view = 0; if (self->d->obj && self->d->obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { cb->setHandled(); const TopoDS_Shape& shape = static_cast<Part::Feature*>(self->d->obj)->Shape.getValue(); self->d->addFacesToSelection(view, proj, polygon, shape); view->redraw(); } }