void PropertyPartShape::Save (Base::Writer &writer) const { if(!writer.isForceXML()) { //See SaveDocFile(), RestoreDocFile() if (writer.getMode("BinaryBrep")) { writer.Stream() << writer.ind() << "<Part file=\"" << writer.addFile("PartShape.bin", this) << "\"/>" << std::endl; } else { writer.Stream() << writer.ind() << "<Part file=\"" << writer.addFile("PartShape.brp", this) << "\"/>" << std::endl; } } }
void PropertyPartShape::SaveDocFile (Base::Writer &writer) const { // If the shape is empty we simply store nothing. The file size will be 0 which // can be checked when reading in the data. if (_Shape.getShape().IsNull()) return; TopoDS_Shape myShape = _Shape.getShape(); if (writer.getMode("BinaryBrep")) { TopoShape shape; shape.setShape(myShape); shape.exportBinary(writer.Stream()); } else { bool direct = App::GetApplication().GetParameterGroupByPath ("User parameter:BaseApp/Preferences/Mod/Part/General")->GetBool("DirectAccess", true); if (!direct) { // create a temporary file and copy the content to the zip stream // once the tmp. filename is known use always the same because otherwise // we may run into some problems on the Linux platform static Base::FileInfo fi(App::Application::getTempFileName()); if (!BRepTools_Write(myShape,(Standard_CString)fi.filePath().c_str())) { // Note: Do NOT throw an exception here because if the tmp. file could // not be created we should not abort. // We only print an error message but continue writing the next files to 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("Shape of '%s' cannot be written to BRep file '%s'\n", obj->Label.getValue(),fi.filePath().c_str()); } else { Base::Console().Error("Cannot save BRep file '%s'\n", fi.filePath().c_str()); } std::stringstream ss; ss << "Cannot save BRep file '" << fi.filePath() << "'"; writer.addError(ss.str()); } Base::ifstream file(fi, std::ios::in | std::ios::binary); if (file) { //unsigned long ulSize = 0; std::streambuf* buf = file.rdbuf(); //if (buf) { // unsigned long ulCurr; // ulCurr = buf->pubseekoff(0, std::ios::cur, std::ios::in); // ulSize = buf->pubseekoff(0, std::ios::end, std::ios::in); // buf->pubseekoff(ulCurr, std::ios::beg, std::ios::in); //} // read in the ASCII file and write back to the stream //std::strstreambuf sbuf(ulSize); //file >> &sbuf; //writer.Stream() << &sbuf; writer.Stream() << buf; } file.close(); // remove temp file fi.deleteFile(); } else { BRepTools_Write(myShape, writer.Stream()); } } }