void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader) { Base::FileInfo fi(_cValue.c_str()); if (fi.exists() && !fi.isWritable()) { // This happens when an object is being restored and tries to reference the // same file of another object (e.g. for copy&paste of objects inside the same document). return; } Base::ofstream to(fi, std::ios::out | std::ios::binary); if (!to) { std::stringstream str; str << "PropertyFileIncluded::RestoreDocFile(): " << "File '" << _cValue << "' in transient directory cannot be created."; throw Base::FileSystemError(str.str()); } // copy plain data aboutToSetValue(); unsigned char c; while (reader.get((char&)c)) { to.put((char)c); } to.close(); // set read-only after restoring the file fi.setPermissions(Base::FileInfo::ReadOnly); hasSetValue(); }
void PropertyPythonObject::RestoreDocFile(Base::Reader &reader) { aboutToSetValue(); std::string buffer; char c; while (reader.get(c)) { buffer.push_back(c); } this->fromString(buffer); hasSetValue(); }
void PropertyPartShape::RestoreDocFile(Base::Reader &reader) { Base::FileInfo brep(reader.getFileName()); if (brep.hasExtension("bin")) { TopoShape shape; shape.importBinary(reader); setValue(shape); } else { bool direct = App::GetApplication().GetParameterGroupByPath ("User parameter:BaseApp/Preferences/Mod/Part/General")->GetBool("DirectAccess", true); if (!direct) { BRep_Builder builder; // create a temporary file and copy the content from the zip stream Base::FileInfo fi(App::Application::getTempFileName()); // read in the ASCII file and write back to the file stream Base::ofstream file(fi, std::ios::out | std::ios::binary); unsigned long ulSize = 0; if (reader) { std::streambuf* buf = file.rdbuf(); reader >> buf; file.flush(); ulSize = buf->pubseekoff(0, std::ios::cur, std::ios::in); } file.close(); // Read the shape from the temp file, if the file is empty the stored shape was already empty. // If it's still empty after reading the (non-empty) file there must occurred an error. TopoDS_Shape shape; if (ulSize > 0) { if (!BRepTools::Read(shape, (Standard_CString)fi.filePath().c_str(), builder)) { // Note: Do NOT throw an exception here because if the tmp. created file could // not be read it's NOT an indication for an invalid input stream 'reader'. // We only print an error message but continue reading the next files from the // stream... App::PropertyContainer* father = this->getContainer(); if (father && father->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* obj = static_cast<App::DocumentObject*>(father); Base::Console().Error("BRep file '%s' with shape of '%s' seems to be empty\n", fi.filePath().c_str(),obj->Label.getValue()); } else { Base::Console().Warning("Loaded BRep file '%s' seems to be empty\n", fi.filePath().c_str()); } } } // delete the temp file fi.deleteFile(); setValue(shape); } else {
void PropertyVectorList::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; str >> uCt; std::vector<Base::Vector3d> values(uCt); if (reader.getFileVersion() > 0) { for (std::vector<Base::Vector3d>::iterator it = values.begin(); it != values.end(); ++it) { str >> it->x >> it->y >> it->z; } } else {
void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader) { Base::ofstream to(Base::FileInfo(_cValue.c_str())); if (!to) throw Base::Exception("PropertyFileIncluded::RestoreDocFile() " "File in document transient dir deleted"); // copy plain data aboutToSetValue(); unsigned char c; while (reader.get((char&)c)) { to.put((const char)c); } to.close(); hasSetValue(); }
void Document::importObjects(const std::vector<App::DocumentObject*>& obj, Base::Reader& reader, const std::map<std::string, std::string>& nameMapping) { // 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 name = xmlReader.getAttribute("name"); std::map<std::string, std::string>::const_iterator jt = nameMapping.find(name); if (jt != nameMapping.end()) name = jt->second; Gui::ViewProvider* pObj = this->getViewProviderByName(name.c_str()); if (pObj) pObj->Restore(xmlReader); xmlReader.readEndElement("ViewProvider"); if (it == obj.end()) break; } xmlReader.readEndElement("ViewProviderData"); } xmlReader.readEndElement("Document"); // In the file GuiDocument.xml new data files might be added if (!xmlReader.getFilenames().empty()) xmlReader.readFiles(static_cast<zipios::ZipInputStream&>(reader.getStream())); }
void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader) { Base::FileInfo fi(_cValue.c_str()); Base::ofstream to(fi, std::ios::out | std::ios::binary); if (!to) { std::stringstream str; str << "PropertyFileIncluded::RestoreDocFile(): " << "File '" << _cValue << "' in transient directory doesn't exist."; throw Base::Exception(str.str()); } // copy plain data aboutToSetValue(); unsigned char c; while (reader.get((char&)c)) { to.put((const char)c); } to.close(); // set read-only after restoring the file fi.setPermissions(Base::FileInfo::ReadOnly); hasSetValue(); }
/** * Restores the properties of the view providers. */ void Document::RestoreDocFile(Base::Reader &reader) { // We must create an XML parser to read from the input stream Base::XMLReader xmlReader("GuiDocument.xml", reader); xmlReader.FileVersion = reader.getFileVersion(); int i,Cnt; 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"); Cnt = xmlReader.getAttributeAsInteger("Count"); for (i=0 ;i<Cnt ;i++) { xmlReader.readElement("ViewProvider"); std::string name = xmlReader.getAttribute("name"); bool expanded = false; if (xmlReader.hasAttribute("expanded")) { const char* attr = xmlReader.getAttribute("expanded"); if (strcmp(attr,"1") == 0) { expanded = true; } } ViewProvider* pObj = getViewProviderByName(name.c_str()); if (pObj) // check if this feature has been registered pObj->Restore(xmlReader); if (pObj && expanded) { Gui::ViewProviderDocumentObject* vp = static_cast<Gui::ViewProviderDocumentObject*>(pObj); this->signalExpandObject(*vp, Gui::Expand); } xmlReader.readEndElement("ViewProvider"); } xmlReader.readEndElement("ViewProviderData"); // read camera settings xmlReader.readElement("Camera"); const char* ppReturn = xmlReader.getAttribute("settings"); std::string sMsg = "SetCamera "; sMsg += ppReturn; if (strcmp(ppReturn, "") != 0) { // non-empty attribute try { const char** pReturnIgnore=0; std::list<MDIView*> mdi = getMDIViews(); for (std::list<MDIView*>::iterator it = mdi.begin(); it != mdi.end(); ++it) { if ((*it)->onHasMsg("SetCamera")) (*it)->onMsg(sMsg.c_str(), pReturnIgnore); } } catch (const Base::Exception& e) { Base::Console().Error("%s\n", e.what()); } } } xmlReader.readEndElement("Document"); // In the file GuiDocument.xml new data files might be added if (!xmlReader.getFilenames().empty()) xmlReader.readFiles(static_cast<zipios::ZipInputStream&>(reader.getStream())); // reset modified flag setModified(false); }