From 4f7c9fd59bbeb605826a3680e652fba4668eff2a Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Tue, 16 Jan 2024 20:12:41 +0200 Subject: [PATCH] Fix export to DXF AAMA/ASTM on Windows with Qt 6. --- src/libs/vdxf/libdxfrw/libdxfrw.cpp | 126 +++++++++++++++------------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/src/libs/vdxf/libdxfrw/libdxfrw.cpp b/src/libs/vdxf/libdxfrw/libdxfrw.cpp index 4e9739c2d..8c8a2ea9c 100644 --- a/src/libs/vdxf/libdxfrw/libdxfrw.cpp +++ b/src/libs/vdxf/libdxfrw/libdxfrw.cpp @@ -109,75 +109,87 @@ auto dxfRW::read(DRW_Interface *interface_, bool ext) -> bool auto dxfRW::write(DRW_Interface *interface_, DRW::Version ver, bool bin) -> bool { - bool isOk = false; std::ofstream filestr; - filestr.exceptions(std::ifstream::failbit | std::ifstream::badbit); version = ver; binFile = bin; iface = interface_; - try + if (binFile) { - if (binFile) - { - filestr.open(fileName.c_str(), std::ios_base::out | std::ios::binary | std::ios::trunc); - // write sentinel - filestr << "AutoCAD Binary DXF\r\n" << static_cast(26) << '\0'; - writer = std::make_unique(&filestr); - DRW_DBG("dxfRW::read binary file\n"); - } - else - { - filestr.open(fileName.c_str(), std::ios_base::out | std::ios::trunc); - writer = std::make_unique(&filestr); - std::string comm = std::string("dxfrw ") + std::string(DRW_VERSION); - writer->writeString(999, comm); - } - this->header = DRW_Header(); - iface->writeHeader(header); - writer->writeString(0, "SECTION"); - entCount = FIRSTHANDLE; - header.write(writer, version); - writer->writeString(0, "ENDSEC"); - if (ver > DRW::AC1009) - { - writer->writeString(0, "SECTION"); - writer->writeString(2, "CLASSES"); - writer->writeString(0, "ENDSEC"); - } - writer->writeString(0, "SECTION"); - writer->writeString(2, "TABLES"); - writeTables(); - writer->writeString(0, "ENDSEC"); - writer->writeString(0, "SECTION"); - writer->writeString(2, "BLOCKS"); - writeBlocks(); - writer->writeString(0, "ENDSEC"); + filestr.open(fileName.c_str(), std::ios_base::out | std::ios::binary | std::ios::trunc); - writer->writeString(0, "SECTION"); - writer->writeString(2, "ENTITIES"); - iface->writeEntities(); - writer->writeString(0, "ENDSEC"); - - if (version > DRW::AC1009) + if (!filestr.is_open()) { - writer->writeString(0, "SECTION"); - writer->writeString(2, "OBJECTS"); - writeObjects(); - writer->writeString(0, "ENDSEC"); + errorString = "Error opening file!"; + writer.reset(); + return false; } - writer->writeString(0, "EOF"); - filestr.flush(); - filestr.close(); + + // write sentinel + filestr << "AutoCAD Binary DXF\r\n" << static_cast(26) << '\0'; + writer = std::make_unique(&filestr); + DRW_DBG("dxfRW::read binary file\n"); } - catch (std::ofstream::failure &writeErr) + else { - errorString = writeErr.what(); - writer.reset(); - return isOk; + filestr.open(fileName.c_str(), std::ios_base::out | std::ios::trunc); + + if (!filestr.is_open()) + { + errorString = "Error opening file!"; + writer.reset(); + return false; + } + + writer = std::make_unique(&filestr); + std::string const comm = std::string("dxfrw ") + std::string(DRW_VERSION); + writer->writeString(999, comm); } - isOk = true; + + this->header = DRW_Header(); + iface->writeHeader(header); + writer->writeString(0, "SECTION"); + entCount = FIRSTHANDLE; + header.write(writer, version); + writer->writeString(0, "ENDSEC"); + if (ver > DRW::AC1009) + { + writer->writeString(0, "SECTION"); + writer->writeString(2, "CLASSES"); + writer->writeString(0, "ENDSEC"); + } + writer->writeString(0, "SECTION"); + writer->writeString(2, "TABLES"); + writeTables(); + writer->writeString(0, "ENDSEC"); + writer->writeString(0, "SECTION"); + writer->writeString(2, "BLOCKS"); + writeBlocks(); + writer->writeString(0, "ENDSEC"); + + writer->writeString(0, "SECTION"); + writer->writeString(2, "ENTITIES"); + iface->writeEntities(); + writer->writeString(0, "ENDSEC"); + + if (version > DRW::AC1009) + { + writer->writeString(0, "SECTION"); + writer->writeString(2, "OBJECTS"); + writeObjects(); + writer->writeString(0, "ENDSEC"); + } + writer->writeString(0, "EOF"); + filestr.flush(); + + if (filestr.fail()) + { + errorString = "Error writing to file!"; + return false; + } + + filestr.close(); writer.reset(); - return isOk; + return true; } auto dxfRW::writeEntity(DRW_Entity *ent) -> bool