summaryrefslogtreecommitdiff
path: root/lib_dxf/intern/dxfwriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib_dxf/intern/dxfwriter.cpp')
-rw-r--r--lib_dxf/intern/dxfwriter.cpp319
1 files changed, 319 insertions, 0 deletions
diff --git a/lib_dxf/intern/dxfwriter.cpp b/lib_dxf/intern/dxfwriter.cpp
new file mode 100644
index 0000000..fcd9fe7
--- /dev/null
+++ b/lib_dxf/intern/dxfwriter.cpp
@@ -0,0 +1,319 @@
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011 Rallaz, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <stdlib.h>
+#include <fstream>
+#include <string>
+#include <algorithm>
+#include "dxfwriter.h"
+
+#ifdef DRW_DBG
+#include <iostream> // for debug
+#define DBG( a ) std::cerr << a
+#else
+#define DBG( a )
+#endif
+
+// RLZ TODO change std::endl to x0D x0A (13 10)
+/*bool dxfWriter::readRec(int *codeData, bool skip) {
+ * // std::string text;
+ * int code;
+ *
+ * #ifdef DRW_DBG
+ * count = count+2; //DBG
+ * #endif
+ *
+ * if (!readCode(&code))
+ * return false;
+ * codeData = code;
+ *
+ * if (code < 10)
+ * readString();
+ * else if (code < 60)
+ * readDouble();
+ * else if (code < 80)
+ * readInt();
+ * else if (code > 89 && code < 100) //TODO this is an int 32b
+ * readInt32();
+ * else if (code == 100 || code == 102 || code == 105)
+ * readString();
+ * else if (code > 109 && code < 150) //skip not used at the v2012
+ * readDouble();
+ * else if (code > 159 && code < 170) //skip not used at the v2012
+ * readInt64();
+ * else if (code < 180)
+ * readInt();
+ * else if (code > 209 && code < 240) //skip not used at the v2012
+ * readDouble();
+ * else if (code > 269 && code < 290) //skip not used at the v2012
+ * readInt();
+ * else if (code < 300) //TODO this is a boolean indicator, int in Binary?
+ * readBool();
+ * else if (code < 370)
+ * readString();
+ * else if (code < 390)
+ * readInt();
+ * else if (code < 400)
+ * readString();
+ * else if (code < 410)
+ * readInt();
+ * else if (code < 420)
+ * readString();
+ * else if (code < 430) //TODO this is an int 32b
+ * readInt32();
+ * else if (code < 440)
+ * readString();
+ * else if (code < 450) //TODO this is an int 32b
+ * readInt32();
+ * else if (code < 460) //TODO this is long??
+ * readInt();
+ * else if (code < 470) //TODO this is a floating point double precision??
+ * readDouble();
+ * else if (code < 481)
+ * readString();
+ * else if (code > 998 && code < 1009) //skip not used at the v2012
+ * readString();
+ * else if (code < 1060) //TODO this is a floating point double precision??
+ * readDouble();
+ * else if (code < 1071)
+ * readInt();
+ * else if (code == 1071) //TODO this is an int 32b
+ * readInt32();
+ * else if (skip)
+ * //skip safely this dxf entry ( ok for ascii dxf)
+ * readString();
+ * else
+ * //break in binary files because the conduct is unpredictable
+ * return false;
+ *
+ * return (filestr->good());
+ * }*/
+
+bool dxfWriter::writeUtf8String( int code, std::string text )
+{
+ std::string t = encoder.fromUtf8( text );
+
+ return writeString( code, t );
+}
+
+
+bool dxfWriter::writeUtf8Caps( int code, std::string text )
+{
+ std::string strname = text;
+ std::transform( strname.begin(), strname.end(), strname.begin(), ::toupper );
+ std::string t = encoder.fromUtf8( strname );
+
+ return writeString( code, t );
+}
+
+
+bool dxfWriterBinary::writeString( int code, std::string text )
+{
+ char bufcode[2];
+
+ bufcode[0] = code & 0xFF;
+ bufcode[1] = code >> 8;
+ filestr->write( bufcode, 2 );
+ *filestr << text << '\0';
+ return filestr->good();
+}
+
+
+/*bool dxfWriterBinary::readCode(int *code) {
+ * unsigned short *int16p;
+ * char buffer[2];
+ * filestr->read(buffer,2);
+ * int16p = (unsigned short *) buffer;
+ * //exist a 32bits int (code 90) with 2 bytes???
+ * if ((*code == 90) && (*int16p>2000)){
+ * DBG(*code); DBG(" de 16bits\n");
+ * filestr->seekg(-4, std::ios_base::cur);
+ * filestr->read(buffer,2);
+ * int16p = (unsigned short *) buffer;
+ * }
+ * code = *int16p;
+ * DBG(*code); DBG("\n");
+ *
+ * return (filestr->good());
+ * }*/
+
+/*bool dxfWriterBinary::readString() {
+ * std::getline(*filestr, strData, '\0');
+ * DBG(strData); DBG("\n");
+ * return (filestr->good());
+ * }*/
+
+/*bool dxfWriterBinary::readString(std::string *text) {
+ * std::getline(*filestr, *text, '\0');
+ * DBG(*text); DBG("\n");
+ * return (filestr->good());
+ * }*/
+
+bool dxfWriterBinary::writeInt16( int code, int data )
+{
+ char bufcode[2];
+ char buffer[2];
+
+ bufcode[0] = code & 0xFF;
+ bufcode[1] = code >> 8;
+ buffer[0] = data & 0xFF;
+ buffer[1] = data >> 8;
+ filestr->write( bufcode, 2 );
+ filestr->write( buffer, 2 );
+ return filestr->good();
+}
+
+
+bool dxfWriterBinary::writeInt32( int code, int data )
+{
+ char buffer[4];
+
+ buffer[0] = code & 0xFF;
+ buffer[1] = code >> 8;
+ filestr->write( buffer, 2 );
+
+ buffer[0] = data & 0xFF;
+ buffer[1] = data >> 8;
+ buffer[2] = data >> 16;
+ buffer[3] = data >> 24;
+ filestr->write( buffer, 4 );
+ return filestr->good();
+}
+
+
+bool dxfWriterBinary::writeInt64( int code, unsigned long long int data )
+{
+ char buffer[8];
+
+ buffer[0] = code & 0xFF;
+ buffer[1] = code >> 8;
+ filestr->write( buffer, 2 );
+
+ buffer[0] = data & 0xFF;
+ buffer[1] = data >> 8;
+ buffer[2] = data >> 16;
+ buffer[3] = data >> 24;
+ buffer[4] = data >> 32;
+ buffer[5] = data >> 40;
+ buffer[6] = data >> 48;
+ buffer[7] = data >> 56;
+ filestr->write( buffer, 8 );
+ return filestr->good();
+}
+
+
+bool dxfWriterBinary::writeDouble( int code, double data )
+{
+ char bufcode[2];
+ char buffer[8];
+
+ bufcode[0] = code & 0xFF;
+ bufcode[1] = code >> 8;
+ filestr->write( bufcode, 2 );
+
+ unsigned char* val;
+ val = (unsigned char*) &data;
+
+ for( int i = 0; i<8; i++ )
+ {
+ buffer[i] = val[i];
+ }
+
+ filestr->write( buffer, 8 );
+ return filestr->good();
+}
+
+
+// saved as int or add a bool member??
+bool dxfWriterBinary::writeBool( int code, bool data )
+{
+ char buffer[1];
+ char bufcode[2];
+
+ bufcode[0] = code & 0xFF;
+ bufcode[1] = code >> 8;
+ filestr->write( bufcode, 2 );
+ buffer[0] = data;
+ filestr->write( buffer, 1 );
+ return filestr->good();
+}
+
+
+bool dxfWriterAscii::writeString( int code, std::string text )
+{
+ *filestr << code << std::endl << text << std::endl;
+ /* std::getline(*filestr, strData, '\0');
+ * DBG(strData); DBG("\n");*/
+ return filestr->good();
+}
+
+
+/*bool dxfWriterAscii::readCode(int *code) {
+ * std::string text;
+ * std::getline(*filestr, text);
+ * code = atoi(text.c_str());
+ * DBG(*code); DBG("\n");
+ * return (filestr->good());
+ * }*/
+/*bool dxfWriterAscii::readString(std::string *text) {
+ * std::getline(*filestr, *text);
+ * if (text->at(text->size()-1) == '\r')
+ * text->erase(text->size()-1);
+ * return (filestr->good());
+ * }*/
+
+/*bool dxfWriterAscii::readString() {
+ * std::getline(*filestr, strData);
+ * if (strData.at(strData.size()-1) == '\r')
+ * strData.erase(strData.size()-1);
+ * DBG(strData); DBG("\n");
+ * return (filestr->good());
+ * }*/
+
+bool dxfWriterAscii::writeInt16( int code, int data )
+{
+// *filestr << code << "\r\n" << data << "\r\n";
+ *filestr << code << std::endl << data << std::endl;
+ return filestr->good();
+}
+
+
+bool dxfWriterAscii::writeInt32( int code, int data )
+{
+ return writeInt16( code, data );
+}
+
+
+bool dxfWriterAscii::writeInt64( int code, unsigned long long int data )
+{
+ *filestr << code << std::endl << data << std::endl;
+ return filestr->good();
+}
+
+
+bool dxfWriterAscii::writeDouble( int code, double data )
+{
+ std::streamsize prec = filestr->precision();
+
+ filestr->precision( 12 );
+ *filestr << code << std::endl << data << std::endl;
+ filestr->precision( prec );
+ return filestr->good();
+}
+
+
+// saved as int or add a bool member??
+bool dxfWriterAscii::writeBool( int code, bool data )
+{
+ *filestr << code << std::endl << data << std::endl;
+ return filestr->good();
+}