//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 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 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 Command::adjustCameraPosition() { Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(doc->getActiveView()); Gui::View3DInventorViewer* viewer = view->getViewer(); SoCamera* camera = viewer->getSoRenderManager()->getCamera(); if (!camera || !camera->isOfType(SoOrthographicCamera::getClassTypeId())) return; // get scene bounding box SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion()); action.apply(viewer->getSceneGraph()); SbBox3f box = action.getBoundingBox(); if (box.isEmpty()) return; // get cirumscribing sphere and check if camera is inside SbVec3f cam_pos = camera->position.getValue(); SbVec3f box_cnt = box.getCenter(); SbSphere bs; bs.circumscribe(box); float radius = bs.getRadius(); float distance_to_midpoint = (box_cnt-cam_pos).length(); if (radius >= distance_to_midpoint) { // Move the camera to the edge of the bounding sphere, while still // pointing at the scene. SbVec3f direction = cam_pos - box_cnt; (void) direction.normalize(); // we know this is not a null vector camera->position.setValue(box_cnt + direction * radius); // New distance to mid point distance_to_midpoint = (camera->position.getValue() - box.getCenter()).length(); camera->nearDistance = distance_to_midpoint - radius; camera->farDistance = distance_to_midpoint + radius; camera->focalDistance = distance_to_midpoint; } } }
Py::Object interactiveFilletArc(const Py::Tuple& args) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { Gui::View3DInventor* view = qobject_cast<Gui::View3DInventor*>(doc->getActiveView()); if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); SoSeparator* scene = static_cast<SoSeparator*>(viewer->getSceneGraph()); SoSeparator* node = new SoSeparator(); SoBaseColor* rgb = new SoBaseColor(); rgb->rgb.setValue(1,1,0); node->addChild(rgb); SoCoordinate3* coords = new SoCoordinate3(); node->addChild(coords); node->addChild(new SoLineSet()); scene->addChild(node); ObjectObserver* obs = new ObjectObserver(doc->getDocument()->getActiveObject(), coords); obs->attachDocument(doc->getDocument()); } } return Py::None(); }
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 CmdPartDesignBody::activated(int iMsg) { Q_UNUSED(iMsg); if ( !PartDesignGui::assureModernWorkflow( getDocument() ) ) return; App::Part *actPart = PartDesignGui::getActivePart (); App::Part* partOfBaseFeature = nullptr; std::vector<App::DocumentObject*> features = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); App::DocumentObject* baseFeature = nullptr; bool viewAll = features.empty(); if (!features.empty()) { if (features.size() == 1) { baseFeature = features[0]; if ( baseFeature->isDerivedFrom ( PartDesign::Feature::getClassTypeId() ) && PartDesign::Body::findBodyOf ( baseFeature ) ) { // Prevent creating bodies based on features already belonging to other bodies QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Body can't be based on a PartDesign feature.")); baseFeature = nullptr; } else if (PartDesign::Body::findBodyOf ( baseFeature )){ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("%1 already belongs to a body, can't use it as base feature for another body.") .arg(QString::fromUtf8(baseFeature->Label.getValue()))); baseFeature = nullptr; } else if ( baseFeature->isDerivedFrom ( Part::BodyBase::getClassTypeId() ) ) { // Prevent creating bodies based on bodies QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Body can't be based on another body.")); baseFeature = nullptr; } else { partOfBaseFeature = App::Part::getPartOfObject(baseFeature); if (partOfBaseFeature != 0 && partOfBaseFeature != actPart){ //prevent cross-part mess QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Base feature (%1) belongs to other part.") .arg(QString::fromUtf8(baseFeature->Label.getValue()))); baseFeature = nullptr; }; } } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Body may be based no more than on one feature.")); return; } } openCommand("Add a Body"); std::string bodyName = getUniqueObjectName("Body"); // add the Body feature itself, and make it active doCommand(Doc,"App.activeDocument().addObject('PartDesign::Body','%s')", bodyName.c_str()); if (baseFeature) { if (partOfBaseFeature){ //withdraw base feature from Part, otherwise visibility mandess results doCommand(Doc,"App.activeDocument().%s.removeObject(App.activeDocument().%s)", partOfBaseFeature->getNameInDocument(), baseFeature->getNameInDocument()); } doCommand(Doc,"App.activeDocument().%s.BaseFeature = App.activeDocument().%s", bodyName.c_str(), baseFeature->getNameInDocument()); } addModule(Gui,"PartDesignGui"); // import the Gui module only once a session doCommand(Gui::Command::Gui, "Gui.activeView().setActiveObject('%s', App.activeDocument().%s)", PDBODYKEY, bodyName.c_str()); // Make the "Create sketch" prompt appear in the task panel doCommand(Gui,"Gui.Selection.clearSelection()"); doCommand(Gui,"Gui.Selection.addSelection(App.ActiveDocument.%s)", bodyName.c_str()); if (actPart) { doCommand(Doc,"App.activeDocument().%s.addObject(App.ActiveDocument.%s)", actPart->getNameInDocument(), bodyName.c_str()); } // The method 'SoCamera::viewBoundingBox' is still declared as protected in Coin3d versions // older than 4.0. #if COIN_MAJOR_VERSION >= 4 // if no part feature was there then auto-adjust the camera if (viewAll) { Gui::Document* doc = Gui::Application::Instance->getDocument(getDocument()); Gui::View3DInventor* view = doc ? qobject_cast<Gui::View3DInventor*>(doc->getActiveView()) : nullptr; if (view) { SoCamera* camera = view->getViewer()->getCamera(); SbViewportRegion vpregion = view->getViewer()->getViewportRegion(); float aspectratio = vpregion.getViewportAspectRatio(); float size = Gui::ViewProviderOrigin::defaultSize(); SbBox3f bbox; bbox.setBounds(-size,-size,-size,size,size,size); camera->viewBoundingBox(bbox, aspectratio, 1.0f); } } #endif updateActive(); }