bool Document::setEdit(Gui::ViewProvider* p, int ModNum) { if (d->_pcInEdit) resetEdit(); // is it really a ViewProvider of this document? if (d->_ViewProviderMap.find(dynamic_cast<ViewProviderDocumentObject*>(p)->getObject()) == d->_ViewProviderMap.end()) return false; View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView()); // if the currently active view is not te 3d view search for it and activate it if (!activeView) { activeView = dynamic_cast<View3DInventor *>(getViewOfViewProvider(p)); if (activeView) getMainWindow()->setActiveWindow(activeView); } if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) { d->_pcInEdit = p; Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog(); if (dlg) dlg->setDocumentName(this->getDocument()->getName()); if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit))); } else { return false; } return true; }
void Document::slotDeletedObject(const App::DocumentObject& Obj) { std::list<Gui::BaseView*>::iterator vIt; setModified(true); //Base::Console().Log("Document::slotDeleteObject() called\n"); // cycling to all views of the document ViewProvider* viewProvider = getViewProvider(&Obj); #if 0 // With this we can show child objects again if this method was called by undo viewProvider->onDelete(std::vector<std::string>()); #endif if (viewProvider && viewProvider->getTypeId().isDerivedFrom (ViewProviderDocumentObject::getClassTypeId())) { // go through the views for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); if (activeView) { if (d->_pcInEdit == viewProvider) resetEdit(); activeView->getViewer()->removeViewProvider(viewProvider); } } // removing from tree signalDeletedObject(*(static_cast<ViewProviderDocumentObject*>(viewProvider))); delete viewProvider; d->_ViewProviderMap.erase(&Obj); } }
PyObject* Application::sCreateViewer(PyObject * /*self*/, PyObject *args) { int num_of_views = 1; char* title = nullptr; // if one argument (int) is given if (PyArg_ParseTuple(args, "|is", &num_of_views, &title)) { if (num_of_views < 0) return NULL; else if (num_of_views==1) { View3DInventor* viewer = new View3DInventor(0, 0); if (title) viewer->setWindowTitle(QString::fromUtf8(title)); Gui::getMainWindow()->addWindow(viewer); return viewer->getPyObject(); } else { SplitView3DInventor* viewer = new SplitView3DInventor(num_of_views, 0, 0); if (title) viewer->setWindowTitle(QString::fromUtf8(title)); Gui::getMainWindow()->addWindow(viewer); return viewer->getPyObject(); } } return Py_None; }
void Document::slotChangedObject(const App::DocumentObject& Obj, const App::Property& Prop) { //Base::Console().Log("Document::slotChangedObject() called\n"); ViewProvider* viewProvider = getViewProvider(&Obj); if (viewProvider) { try { viewProvider->update(&Prop); } catch(const Base::MemoryException& e) { Base::Console().Error("Memory exception in '%s' thrown: %s\n",Obj.getNameInDocument(),e.what()); } catch(Base::Exception& e){ e.ReportException(); } catch(const std::exception& e){ Base::Console().Error("C++ exception in '%s' thrown: %s\n",Obj.getNameInDocument(),e.what()); } catch (...) { Base::Console().Error("Cannot update representation for '%s'.\n", Obj.getNameInDocument()); } // check for children if(viewProvider->getChildRoot()) { std::vector<App::DocumentObject*> children = viewProvider->claimChildren3D(); SoGroup* childGroup = viewProvider->getChildRoot(); // size not the same -> build up the list new if(childGroup->getNumChildren() != children.size()){ childGroup->removeAllChildren(); for(std::vector<App::DocumentObject*>::iterator it=children.begin();it!=children.end();++it){ ViewProvider* ChildViewProvider = getViewProvider(*it); if(ChildViewProvider) { SoSeparator* childRootNode = ChildViewProvider->getRoot(); childGroup->addChild(childRootNode); // cycling to all views of the document to remove the viewprovider from the viewer itself for (std::list<Gui::BaseView*>::iterator vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); if (activeView && viewProvider) { if (d->_pcInEdit == ChildViewProvider) resetEdit(); activeView->getViewer()->removeViewProvider(ChildViewProvider); } } } } } } if (viewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) signalChangedObject(static_cast<ViewProviderDocumentObject&>(*viewProvider), Prop); } // a property of an object has changed setModified(true); }
void DlgInspector::setDocument(Gui::Document* doc) { setNodeNames(doc); View3DInventor* view = qobject_cast<View3DInventor*>(doc->getActiveView()); if (view) { View3DInventorViewer* viewer = view->getViewer(); setNode(viewer->getSceneGraph()); ui->treeView->expandToDepth(3); } }
ViewProvider *Document::getInEdit(void) const { if (d->_pcInEdit) { // there is only one 3d view which is in edit mode View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView()); if (activeView && activeView->getViewer()->isEditingViewProvider()) return d->_pcInEdit; } return 0; }
//***************************************************************************************************** // Document //***************************************************************************************************** void Document::slotNewObject(const App::DocumentObject& Obj) { //Base::Console().Log("Document::slotNewObject() called\n"); std::string cName = Obj.getViewProviderName(); if (cName.empty()) { // handle document object with no view provider specified Base::Console().Log("%s has no view provider specified\n", Obj.getTypeId().getName()); return; } setModified(true); Base::BaseClass* base = static_cast<Base::BaseClass*>(Base::Type::createInstanceByName(cName.c_str(),true)); if (base) { // type not derived from ViewProviderDocumentObject!!! assert(base->getTypeId().isDerivedFrom(Gui::ViewProviderDocumentObject::getClassTypeId())); ViewProviderDocumentObject *pcProvider = static_cast<ViewProviderDocumentObject*>(base); d->_ViewProviderMap[&Obj] = pcProvider; try { // if succesfully created set the right name and calculate the view //FIXME: Consider to change argument of attach() to const pointer pcProvider->attach(const_cast<App::DocumentObject*>(&Obj)); pcProvider->updateView(); pcProvider->setActiveMode(); } catch(const Base::MemoryException& e){ Base::Console().Error("Memory exception in '%s' thrown: %s\n",Obj.getNameInDocument(),e.what()); } catch(Base::Exception &e){ e.ReportException(); } #ifndef FC_DEBUG catch(...){ Base::Console().Error("App::Document::_RecomputeFeature(): Unknown exception in Feature \"%s\" thrown\n",Obj.getNameInDocument()); } #endif std::list<Gui::BaseView*>::iterator vIt; // cycling to all views of the document for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); if (activeView) activeView->getViewer()->addViewProvider(pcProvider); } // adding to the tree signalNewObject(*pcProvider); } else { Base::Console().Warning("Gui::Document::slotNewObject() no view provider for the object %s found\n",cName.c_str()); } }
void DlgInspector::on_refreshButton_clicked() { View3DInventor* child = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow()); if (child) { View3DInventorViewer* viewer = child->getViewer(); setNode(viewer->getSceneGraph()); ui->treeView->expandToDepth(3); } else { SceneModel* model = static_cast<SceneModel*>(ui->treeView->model()); model->clear(); } }
Gui::MDIView* Document::getViewOfViewProvider(Gui::ViewProvider* vp) const { std::list<MDIView*> mdis = getMDIViews(); for (std::list<MDIView*>::const_iterator it = mdis.begin(); it != mdis.end(); ++it) { if ((*it)->getTypeId().isDerivedFrom(View3DInventor::getClassTypeId())) { View3DInventor* view = static_cast<View3DInventor*>(*it); if (view->getViewer()->hasViewProvider(vp)) return *it; } } return 0; }
void Document::removeAnnotationViewProvider(const char* name) { std::map<std::string,ViewProvider*>::iterator it = d->_ViewProviderMapAnnotation.find(name); std::list<Gui::BaseView*>::iterator vIt; // cycling to all views of the document for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); if (activeView) activeView->getViewer()->removeViewProvider(it->second); } delete it->second; d->_ViewProviderMapAnnotation.erase(it); }
void Document::resetEdit(void) { std::list<Gui::BaseView*>::iterator it; if (d->_pcInEdit) { for (it = d->baseViews.begin();it != d->baseViews.end();++it) { View3DInventor *activeView = dynamic_cast<View3DInventor *>(*it); if (activeView) activeView->getViewer()->resetEditingViewProvider(); } if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) signalResetEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit))); d->_pcInEdit = 0; } }
bool Document::setEdit(Gui::ViewProvider* p, int ModNum) { if (d->_pcInEdit) resetEdit(); View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView()); if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) { d->_pcInEdit = p; Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog(); if (dlg) dlg->setDocumentName(this->getDocument()->getName()); if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit))); } else return false; return true; }
void StdCmdAlignment::activated(int iMsg) { std::vector<App::DocumentObject*> sel = Gui::Selection().getObjectsOfType (App::GeoFeature::getClassTypeId()); ManualAlignment* align = ManualAlignment::instance(); QObject::connect(align, SIGNAL(emitCanceled()), align, SLOT(deleteLater())); QObject::connect(align, SIGNAL(emitFinished()), align, SLOT(deleteLater())); // Get the fixed and moving meshes FixedGroup fixedGroup; std::map<int, MovableGroup> groupMap; fixedGroup.addView(sel[0]); groupMap[0].addView(sel[1]); // add the fixed group align->setFixedGroup(fixedGroup); // create the model of movable groups MovableGroupModel model; model.addGroups(groupMap); align->setModel(model); Base::Type style = Base::Type::fromName("Gui::CADNavigationStyle"); Base::Vector3d upDir(0,1,0), viewDir(0,0,-1); Gui::Document* doc = Application::Instance->activeDocument(); if (doc) { View3DInventor* mdi = qobject_cast<View3DInventor*>(doc->getActiveView()); if (mdi) { View3DInventorViewer* viewer = mdi->getViewer(); SoCamera* camera = viewer->getCamera(); if (camera) { SbVec3f up(0,1,0), dir(0,0,-1); camera->orientation.getValue().multVec(dir, dir); viewDir.Set(dir[0],dir[1],dir[2]); camera->orientation.getValue().multVec(up, up); upDir.Set(up[0],up[1],up[2]); } style = viewer->navigationStyle()->getTypeId(); } } align->setMinPoints(1); align->startAlignment(style); align->setViewingDirections(viewDir,upDir, viewDir,upDir); Gui::Selection().clearSelection(); }
void DlgInspector::on_refreshButton_clicked() { Gui::Document* doc = Application::Instance->activeDocument(); if (doc) { setNodeNames(doc); View3DInventor* view = qobject_cast<View3DInventor*>(doc->getActiveView()); if (view) { View3DInventorViewer* viewer = view->getViewer(); setNode(viewer->getSceneGraph()); ui->treeView->expandToDepth(3); } } else { SceneModel* model = static_cast<SceneModel*>(ui->treeView->model()); model->clear(); } }
void Document::setAnnotationViewProvider(const char* name, ViewProvider *pcProvider) { std::list<Gui::BaseView*>::iterator vIt; // already in ? std::map<std::string,ViewProvider*>::iterator it = d->_ViewProviderMapAnnotation.find(name); if (it != d->_ViewProviderMapAnnotation.end()) removeAnnotationViewProvider(name); // add d->_ViewProviderMapAnnotation[name] = pcProvider; // cycling to all views of the document for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); if (activeView) activeView->getViewer()->addViewProvider(pcProvider); } }
void Document::createView(const Base::Type& typeId) { if (!typeId.isDerivedFrom(MDIView::getClassTypeId())) return; std::list<MDIView*> theViews = this->getMDIViewsOfType(typeId); if (typeId == View3DInventor::getClassTypeId()) { View3DInventor* firstView = 0; QGLWidget* shareWidget = 0; if (!theViews.empty()) { firstView = dynamic_cast<View3DInventor*>(theViews.front()); shareWidget = qobject_cast<QGLWidget*>(firstView->getViewer()->getGLWidget()); } View3DInventor* view3D = new View3DInventor(this, getMainWindow(), shareWidget); if (firstView) { std::string overrideMode = firstView->getViewer()->getOverrideMode(); view3D->getViewer()->setOverrideMode(overrideMode); } // attach the viewprovider std::map<const App::DocumentObject*,ViewProviderDocumentObject*>::const_iterator It1; for (It1=d->_ViewProviderMap.begin();It1!=d->_ViewProviderMap.end();++It1) view3D->getViewer()->addViewProvider(It1->second); std::map<std::string,ViewProvider*>::const_iterator It2; for (It2=d->_ViewProviderMapAnnotation.begin();It2!=d->_ViewProviderMapAnnotation.end();++It2) view3D->getViewer()->addViewProvider(It2->second); const char* name = getDocument()->Label.getValue(); QString title = QString::fromAscii("%1 : %2[*]") .arg(QString::fromUtf8(name)).arg(d->_iWinCount++); view3D->setWindowTitle(title); view3D->setWindowModified(this->isModified()); view3D->setWindowIcon(QApplication::windowIcon()); view3D->resize(400, 300); getMainWindow()->addWindow(view3D); } }