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); } }
/// set the feature in Noshow void Document::setHide(const char* name) { ViewProvider* pcProv = getViewProviderByName(name); if (pcProv && pcProv->getTypeId().isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) { ((ViewProviderDocumentObject*)pcProv)->Visibility.setValue(false); } }
void Document::importObjects(const std::vector<App::DocumentObject*>& obj, Base::Reader& reader) { // We must create an XML parser to read from the input stream Base::XMLReader xmlReader("GuiDocument.xml", reader); xmlReader.readElement("Document"); long scheme = xmlReader.getAttributeAsInteger("SchemaVersion"); // At this stage all the document objects and their associated view providers exist. // Now we must restore the properties of the view providers only. // // SchemeVersion "1" if (scheme == 1) { // read the viewproviders itself xmlReader.readElement("ViewProviderData"); int Cnt = xmlReader.getAttributeAsInteger("Count"); std::vector<App::DocumentObject*>::const_iterator it = obj.begin(); for (int i=0;i<Cnt&&it!=obj.end();++i,++it) { // The stored name usually doesn't match with the current name anymore // thus we try to match by type. This should work because the order of // objects should not have changed xmlReader.readElement("ViewProvider"); std::string type = xmlReader.getAttribute("type"); ViewProvider* pObj = getViewProvider(*it); while (pObj && type != pObj->getTypeId().getName()) { if (it != obj.end()) { ++it; pObj = getViewProvider(*it); } } if (pObj && type == pObj->getTypeId().getName()) pObj->Restore(xmlReader); xmlReader.readEndElement("ViewProvider"); if (it == obj.end()) break; } xmlReader.readEndElement("ViewProviderData"); } xmlReader.readEndElement("Document"); }
/** * Extracts the associated view providers of the objects of the associated object group group. */ void ViewProviderDocumentObjectGroup::getViewProviders(std::vector<ViewProviderDocumentObject*>& vp) const { App::DocumentObject* doc = getObject(); if (doc->getTypeId().isDerivedFrom(App::DocumentObjectGroup::getClassTypeId())) { Gui::Document* gd = Application::Instance->getDocument(doc->getDocument()); App::DocumentObjectGroup* grp = (App::DocumentObjectGroup*)doc; std::vector<App::DocumentObject*> obj = grp->getObjects(); for (std::vector<App::DocumentObject*>::iterator it = obj.begin(); it != obj.end(); ++it) { ViewProvider* v = gd->getViewProvider(*it); if (v && v->getTypeId().isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) vp.push_back((ViewProviderDocumentObject*)v); } } }
void Document::exportObjects(const std::vector<App::DocumentObject*>& obj, Base::Writer& writer) { writer.Stream() << "<?xml version='1.0' encoding='utf-8'?>" << std::endl; writer.Stream() << "<Document SchemaVersion=\"1\">" << std::endl; std::map<const App::DocumentObject*,ViewProvider*> views; for (std::vector<App::DocumentObject*>::const_iterator it = obj.begin(); it != obj.end(); ++it) { Document* doc = Application::Instance->getDocument((*it)->getDocument()); if (doc) { ViewProvider* vp = doc->getViewProvider(*it); if (vp) views[*it] = vp; } } // writing the view provider names itself writer.incInd(); // indention for 'ViewProviderData Count' writer.Stream() << writer.ind() << "<ViewProviderData Count=\"" << views.size() <<"\">" << std::endl; bool xml = writer.isForceXML(); //writer.setForceXML(true); writer.incInd(); // indention for 'ViewProvider name' std::map<const App::DocumentObject*,ViewProvider*>::const_iterator jt; for (jt = views.begin(); jt != views.end(); ++jt) { const App::DocumentObject* doc = jt->first; ViewProvider* obj = jt->second; writer.Stream() << writer.ind() << "<ViewProvider name=\"" << doc->getNameInDocument() << "\" type=\"" << obj->getTypeId().getName() << "\">" << std::endl; obj->Save(writer); writer.Stream() << writer.ind() << "</ViewProvider>" << std::endl; } writer.setForceXML(xml); writer.decInd(); // indention for 'ViewProvider name' writer.Stream() << writer.ind() << "</ViewProviderData>" << std::endl; writer.decInd(); // indention for 'ViewProviderData Count' writer.incInd(); // indention for camera settings writer.Stream() << writer.ind() << "<Camera settings=\"\"/>" << std::endl; writer.decInd(); // indention for camera settings writer.Stream() << "</Document>" << std::endl; }