Class to handle plot settings object entries.

This commit is contained in:
Roman Telezhynskyi 2021-11-23 14:43:26 +02:00
parent c6bd3ae727
commit 0db9e1f728
17 changed files with 445 additions and 148 deletions

View File

@ -125,8 +125,7 @@ void dx_iface::writeHeader(DRW_Header &data){
void dx_iface::writeBlocks(){
//write each block
for (std::list<dx_ifaceBlock*>::iterator it=cData.blocks.begin(); it != cData.blocks.end(); ++it){
dx_ifaceBlock* bk = *it;
for (auto *bk : cData.blocks){
dxfW->writeBlock(bk);
//and write each entity in block
for (std::list<DRW_Entity*>::const_iterator it=bk->ent.begin(); it!=bk->ent.end(); ++it)
@ -169,8 +168,13 @@ void dx_iface::writeDimstyles(){
dxfW->writeDimstyle(&(*it));
}
void dx_iface::writeObjects()
{
// default implementation for new DRW_Interface method
}
void dx_iface::writeAppId(){
for (std::list<DRW_AppId>::iterator it=cData.appIds.begin(); it != cData.appIds.end(); ++it)
for (auto it=cData.appIds.begin(); it != cData.appIds.end(); ++it)
dxfW->writeAppId(&(*it));
}

View File

@ -116,6 +116,7 @@ public:
virtual void writeTextstyles() override;
virtual void writeVports() override;
virtual void writeDimstyles() override;
virtual void writeObjects() override;
virtual void writeAppId() override;
void AddEntity(DRW_Entity* e);

View File

@ -156,7 +156,8 @@ BAD_READ_CLASSES, /*!< error in classes read process. */
BAD_READ_TABLES, /*!< error in tables read process. */
BAD_READ_BLOCKS, /*!< error in block read process. */
BAD_READ_ENTITIES, /*!< error in entities read process. */
BAD_READ_OBJECTS /*!< error in objects read process. */
BAD_READ_OBJECTS, /*!< error in objects read process. */
BAD_READ_SECTION, /*!< error in sections read process. */
};
enum class DebugLevel {
@ -301,7 +302,7 @@ public:
/*!< convert to unitary vector */
void unitize(){
double dist;
dist = sqrt(x*x + y*y + z*z);
dist = hypot(hypot(x, y), z);
if (dist > 0.0) {
x= x/dist;
y= y/dist;

View File

@ -607,7 +607,7 @@ void DRW_MText::parseCode(int code, dxfReader *reader){
text = reader->toUtf8String(text);
break;
case 11:
haveXAxis = true;
hasXAxisVec = true;
DRW_Text::parseCode(code, reader);
break;
case 3:
@ -681,7 +681,7 @@ void DRW_MText::parseCode(int code, dxfReader *reader){
}
void DRW_MText::updateAngle(){
if (haveXAxis) {
if (hasXAxisVec) {
angle = atan2(secPoint.y, secPoint.x)*180/M_PI;
}
}

View File

@ -739,7 +739,7 @@ public:
DRW_MText()
: interlin(1),
haveXAxis(false)//if true needed to recalculate angle
hasXAxisVec(false)//if true needed to recalculate angle
{
eType = DRW::MTEXT;
alignV = static_cast<VAlign>(TopLeft);
@ -753,7 +753,7 @@ protected:
public:
double interlin; /*!< width factor, code 44 */
private:
bool haveXAxis;
bool hasXAxisVec;
};
//! Class to handle vertex

View File

@ -40,6 +40,13 @@ void DRW_Header::addComment(const std::string &c){
}
void DRW_Header::parseCode(int code, dxfReader *reader){
if (nullptr == curr && 9 != code) {
DRW_DBG("invalid header code: ");
DRW_DBG(code);
DRW_DBG("\n");
return;
}
switch (code) {
case 9:
curr = new DRW_Variant();

View File

@ -105,7 +105,7 @@ public:
private:
std::string comments;
std::string name;
DRW_Variant* curr;
DRW_Variant* curr {nullptr};
int version; //to use on read
duint32 linetypeCtrl;

View File

@ -24,7 +24,7 @@ QT_WARNING_DISABLE_GCC("-Wsuggest-final-types")
QT_WARNING_DISABLE_GCC("-Wsuggest-final-methods")
/**
* Abstract class (interface) for comunicate dxfReader with the application.
* Abstract class (interface) for communicate dxfReader with the application.
* Inherit your class which takes care of the entities in the
* processed DXF file from this interface.
*
@ -179,6 +179,11 @@ public:
*/
virtual void addComment(const char *) { }
/**
* Called for PLOTSETTINGS object definition.
*/
virtual void addPlotSettings(const DRW_PlotSettings *) {}
virtual void writeHeader(DRW_Header &) { }
virtual void writeBlocks() { }
virtual void writeBlockRecords() { }
@ -188,6 +193,7 @@ public:
virtual void writeTextstyles() { }
virtual void writeVports() { }
virtual void writeDimstyles() { }
virtual void writeObjects() {}
virtual void writeAppId() { }
};

View File

@ -588,3 +588,28 @@ void DRW_ImageDef::parseCode(int code, dxfReader *reader){
break;
}
}
void DRW_PlotSettings::parseCode(int code, dxfReader *reader){
switch (code) {
case 5:
handle = static_cast<duint32>(reader->getHandleString());
break;
case 6:
plotViewName = reader->getUtf8String();
break;
case 40:
marginLeft = reader->getDouble();
break;
case 41:
marginBottom = reader->getDouble();
break;
case 42:
marginRight = reader->getDouble();
break;
case 43:
marginTop = reader->getDouble();
break;
default:
break;
}
}

View File

@ -35,7 +35,8 @@ namespace DRW {
VPORT,
BLOCK_RECORD,
APPID,
IMAGEDEF
IMAGEDEF,
PLOTSETTINGS
};
//pending VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD,
@ -591,6 +592,38 @@ public:
std::map<std::string,std::string> reactors;
};
//! Class to handle plotsettings entries
/*!
* Class to handle plot settings object entries
* @author baranovskiykonstantin@gmail.com
*/
class DRW_PlotSettings : public DRW_TableEntry {
SETOBJFRIENDS
public:
DRW_PlotSettings() {
reset();
}
void reset(){
tType = DRW::PLOTSETTINGS;
marginLeft = 0.0;
marginBottom = 0.0;
marginRight = 0.0;
marginTop = 0.0;
DRW_TableEntry::reset();
}
protected:
void parseCode(int code, dxfReader *reader);
public:
UTF8STRING plotViewName {}; /*!< Plot view name, code 6 */
double marginLeft {0.0}; /*!< Size, in millimeters, of unprintable margin on left side of paper, code 40 */
double marginBottom {0.0}; /*!< Size, in millimeters, of unprintable margin on bottom side of paper, code 41 */
double marginRight {0.0}; /*!< Size, in millimeters, of unprintable margin on right side of paper, code 42 */
double marginTop {0.0}; /*!< Size, in millimeters, of unprintable margin on top side of paper, code 43 */
};
//! Class to handle AppId entries
/*!
* Class to handle AppId symbol table entries

View File

@ -17,7 +17,7 @@
DRW_dbg *DRW_dbg::instance{nullptr};
/*********private clases*************/
/*********private classes*************/
class print_debug : public DRW::DebugPrinter {
public:
@ -76,6 +76,14 @@ void DRW_dbg::print(const std::string &s){
currentPrinter->printS(s);
}
void DRW_dbg::print(signed char i){
currentPrinter->printI(i);
}
void DRW_dbg::print(unsigned char i){
currentPrinter->printUI(i);
}
void DRW_dbg::print(int i){
currentPrinter->printI(i);
}

View File

@ -46,6 +46,8 @@ public:
Level getLevel() const;
static DRW_dbg *getInstance();
void print(const std::string &s);
void print(signed char i);
void print(unsigned char i);
void print(int i);
void print(unsigned int i);
void print(long long int i);

View File

@ -70,6 +70,10 @@ bool dxfReader::readRec(int *codeData) {
readDouble();
else if (code < 481)
readString();
else if( 999 == code && m_bIgnoreComments) {
readString();
return readRec( codeData);
}
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??

View File

@ -53,6 +53,7 @@ public:
void setVersion(const std::string &v, bool dxfFormat){decoder.setVersion(v, dxfFormat);}
void setCodePage(const std::string &c){decoder.setCodePage(c, true);}
std::string getCodePage() const { return decoder.getCodePage();}
void setIgnoreComments(const bool bValue) {m_bIgnoreComments = bValue;}
protected:
virtual bool readCode(int *code) = 0; //return true if successful (not EOF)
@ -74,6 +75,7 @@ protected:
private:
Q_DISABLE_COPY(dxfReader)
DRW_TextCodec decoder;
bool m_bIgnoreComments {false};
};
class dxfReaderBinary : public dxfReader {

View File

@ -49,7 +49,7 @@ dxfRW::dxfRW(const char* name)
dimstyleStd(),
applyExt(false),
writingBlock(),
elParts(128), //parts munber when convert ellipse to polyline
elParts(128), //parts number when convert ellipse to polyline
blockMap(),
imageDef(),
currHandle()
@ -80,17 +80,16 @@ void dxfRW::setDebug(DRW::DebugLevel lvl){
bool dxfRW::read(DRW_Interface *interface_, bool ext){
drw_assert(fileName.empty() == false);
bool isOk = false;
applyExt = ext;
std::ifstream filestr;
if ( interface_ == nullptr )
return isOk;
if (nullptr == interface_) {
return setError(DRW::BAD_UNKNOWN);
}
DRW_DBG("dxfRW::read 1def\n");
filestr.open (fileName.c_str(), std::ios_base::in | std::ios::binary);
if (!filestr.is_open())
return isOk;
if (!filestr.good())
return isOk;
if (!filestr.is_open() || !filestr.good()) {
return setError(DRW::BAD_OPEN);
}
char line[22];
char line2[22] = "AutoCAD Binary DXF\r\n";
@ -113,7 +112,7 @@ bool dxfRW::read(DRW_Interface *interface_, bool ext){
reader = new dxfReaderAscii(&filestr);
}
isOk = processDxf();
bool isOk = processDxf();
filestr.close();
delete reader;
reader = nullptr;
@ -211,6 +210,52 @@ bool dxfRW::writeEntity(DRW_Entity *ent) {
if (version > DRW::AC1014) {
writer->writeInt16(370, DRW_LW_Conv::lineWidth2dxfInt(ent->lWeight));
}
if (version >= DRW::AC1014) {
writeAppData(ent->appData);
}
return true;
}
bool dxfRW::writeAppData(const std::list<std::list<DRW_Variant>>& appData) {
for(const auto& group : appData) {
//Search for application name
bool found = false;
for(const auto& data : group) {
if(data.code == 102 && data.type == DRW_Variant::STRING) {
writer->writeString(102, "{" + *(data.content.s));
found = true;
break;
}
}
if(found) {
for(const auto& data : group) {
if(data.code == 102) {
continue;
}
switch(data.type) {
case DRW_Variant::STRING:
writer->writeString(data.code, *(data.content.s));
break;
case DRW_Variant::INTEGER:
writer->writeInt32(data.code, data.content.i);
break;
case DRW_Variant::DOUBLE:
writer->writeDouble(data.code, data.content.i);
break;
default:
break;
}
}
writer->writeString(102, "}");
}
}
return true;
}
@ -1813,6 +1858,8 @@ bool dxfRW::writeObjects() {
imageDef.pop_back();
}
iface->writeObjects();
return true;
}
@ -1865,51 +1912,101 @@ bool dxfRW::writeExtData(const std::vector<DRW_Variant*> &ed){
bool dxfRW::processDxf() {
DRW_DBG("dxfRW::processDxf() start processing dxf\n");
int code;
bool more = true;
std::string sectionstr;
// section = secUnknown;
int code = -1;
bool inSection = false;
reader->setIgnoreComments( false);
while (reader->readRec(&code)) {
DRW_DBG(code); DRW_DBG(" processDxf\n");
if (code == 999) {
DRW_DBG(code); DRW_DBG(" code\n");
/* at this level we should only get:
999 - Comment
0 - SECTION or EOF
2 - section name
everything else between "2 - section name" and "0 - ENDSEC" is handled in process() methods
*/
switch (code) {
case 999: // when DXF was created by libdxfrw, first record is a comment with dxfrw version info
header.addComment( reader->getString());
} else if (code == 0) {
sectionstr = reader->getString();
DRW_DBG(sectionstr); DRW_DBG(" processDxf\n");
if (sectionstr == "EOF") {
continue;
case 0:
// ignore further comments, as libdxfrw doesn't support comments in sections
reader->setIgnoreComments( true);
if (!inSection) {
std::string sectionstr {reader->getString()};
if ("SECTION" == sectionstr) {
DRW_DBG(sectionstr); DRW_DBG(" new section\n");
inSection = true;
continue;
}
if ("EOF" == sectionstr) {
return true; //found EOF terminate
}
if (sectionstr == "SECTION") {
more = reader->readRec(&code);
DRW_DBG(code); DRW_DBG(" processDxf\n");
if (!more)
return false; //wrong dxf file
if (code == 2) {
sectionstr = reader->getString();
DRW_DBG(sectionstr); DRW_DBG(" processDxf\n");
//found section, process it
if (sectionstr == "HEADER") {
processHeader();
} else if (sectionstr == "CLASSES") {
// processClasses();
} else if (sectionstr == "TABLES") {
processTables();
} else if (sectionstr == "BLOCKS") {
processBlocks();
} else if (sectionstr == "ENTITIES") {
processEntities(false);
} else if (sectionstr == "OBJECTS") {
processObjects();
}
else {
// in case SECTION was unknown or not supported
if ("ENDSEC" == reader->getString()) {
inSection = false;
}
}
break;
case 2:
if (inSection) {
bool processed {false};
std::string sectionname {reader->getString()};
DRW_DBG(sectionname); DRW_DBG(" process section\n");
if ("HEADER" == sectionname) {
processed = processHeader();
}
else if ("TABLES" == sectionname) {
processed = processTables();
}
else if ("BLOCKS" == sectionname) {
processed = processBlocks();
}
else if ("ENTITIES" == sectionname) {
processed = processEntities(false);
}
else if ("OBJECTS" == sectionname) {
processed = processObjects();
}
else {
//TODO handle CLASSES
DRW_DBG("section unknown or not supported\n");
continue;
}
if (!processed) {
DRW_DBG(" failed\n");
return setError(DRW::BAD_READ_SECTION);
}
inSection = false;
}
continue;
default:
// landing here means an unknown or not supported SECTION
inSection = false;
break;
}
/* if (!more)
return true;*/
}
if (0 == code && "EOF" == reader->getString()) {
// in case the final EOF has no newline we end up here!
// this is caused by filestr->good() which is false for missing newline on EOF
return true;
}
return setError(DRW::BAD_UNKNOWN);
}
/********* Header Section *********/
bool dxfRW::processHeader() {
@ -1925,9 +2022,14 @@ bool dxfRW::processHeader() {
iface->addHeader(&header);
return true; //found ENDSEC terminate
}
} else header.parseCode(code, reader);
DRW_DBG("unexpected 0 code in header!\n");
return setError(DRW::BAD_READ_HEADER);
}
return true;
header.parseCode(code, reader);
}
return setError(DRW::BAD_READ_HEADER);
}
/********* Tables Section *********/
@ -1945,8 +2047,9 @@ bool dxfRW::processTables() {
if (sectionstr == "TABLE") {
more = reader->readRec(&code);
DRW_DBG(code); DRW_DBG("\n");
if (!more)
return false; //wrong dxf file
if (!more) {
return setError(DRW::BAD_READ_TABLES); //wrong dxf file
}
if (code == 2) {
sectionstr = reader->getString();
DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n");
@ -1976,7 +2079,8 @@ bool dxfRW::processTables() {
}
}
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
bool dxfRW::processLType() {
@ -2003,7 +2107,8 @@ bool dxfRW::processLType() {
} else if (reading)
ltype.parseCode(code, reader);
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
bool dxfRW::processLayer() {
@ -2028,7 +2133,8 @@ bool dxfRW::processLayer() {
} else if (reading)
layer.parseCode(code, reader);
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
bool dxfRW::processDimStyle() {
@ -2053,7 +2159,8 @@ bool dxfRW::processDimStyle() {
} else if (reading)
dimSty.parseCode(code, reader);
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
bool dxfRW::processTextStyle(){
@ -2078,7 +2185,8 @@ bool dxfRW::processTextStyle(){
} else if (reading)
TxtSty.parseCode(code, reader);
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
bool dxfRW::processVports(){
@ -2103,7 +2211,8 @@ bool dxfRW::processVports(){
} else if (reading)
vp.parseCode(code, reader);
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
bool dxfRW::processAppId(){
@ -2128,7 +2237,8 @@ bool dxfRW::processAppId(){
} else if (reading)
vp.parseCode(code, reader);
}
return true;
return setError(DRW::BAD_READ_TABLES);
}
/********* Block Section *********/
@ -2149,7 +2259,8 @@ bool dxfRW::processBlocks() {
}
}
}
return true;
return setError(DRW::BAD_READ_BLOCKS);
}
bool dxfRW::processBlock() {
@ -2177,7 +2288,8 @@ bool dxfRW::processBlock() {
break;
}
}
return true;
return setError(DRW::BAD_READ_BLOCKS);
}
@ -2187,69 +2299,74 @@ bool dxfRW::processEntities(bool isblock) {
DRW_DBG("dxfRW::processEntities\n");
int code;
if (!reader->readRec(&code)){
return false;
return setError(DRW::BAD_READ_ENTITIES);
}
bool next = true;
if (code == 0) {
nextentity = reader->getString();
} else if (!isblock) {
return false; //first record in entities is 0
return setError(DRW::BAD_READ_ENTITIES); //first record in entities is 0
}
bool processed {false};
do {
if (nextentity == "ENDSEC" || nextentity == "ENDBLK") {
return true; //found ENDSEC or ENDBLK terminate
} else if (nextentity == "POINT") {
processPoint();
processed = processPoint();
} else if (nextentity == "LINE") {
processLine();
processed = processLine();
} else if (nextentity == "CIRCLE") {
processCircle();
processed = processCircle();
} else if (nextentity == "ARC") {
processArc();
processed = processArc();
} else if (nextentity == "ELLIPSE") {
processEllipse();
processed = processEllipse();
} else if (nextentity == "TRACE") {
processTrace();
processed = processTrace();
} else if (nextentity == "SOLID") {
processSolid();
processed = processSolid();
} else if (nextentity == "INSERT") {
processInsert();
processed = processInsert();
} else if (nextentity == "LWPOLYLINE") {
processLWPolyline();
processed = processLWPolyline();
} else if (nextentity == "POLYLINE") {
processPolyline();
processed = processPolyline();
} else if (nextentity == "TEXT") {
processText();
processed = processText();
} else if (nextentity == "MTEXT") {
processMText();
processed = processMText();
} else if (nextentity == "HATCH") {
processHatch();
processed = processHatch();
} else if (nextentity == "SPLINE") {
processSpline();
processed = processSpline();
} else if (nextentity == "3DFACE") {
process3dface();
processed = process3dface();
} else if (nextentity == "VIEWPORT") {
processViewport();
processed = processViewport();
} else if (nextentity == "IMAGE") {
processImage();
processed = processImage();
} else if (nextentity == "DIMENSION") {
processDimension();
processed = processDimension();
} else if (nextentity == "LEADER") {
processLeader();
processed = processLeader();
} else if (nextentity == "RAY") {
processRay();
processed = processRay();
} else if (nextentity == "XLINE") {
processXline();
processed = processXline();
} else {
if (reader->readRec(&code)){
if (code == 0)
nextentity = reader->getString();
} else
return false; //end of file without ENDSEC
if (!reader->readRec(&code)) {
return setError(DRW::BAD_READ_ENTITIES); //end of file without ENDSEC
}
} while (next);
return true;
if (code == 0) {
nextentity = reader->getString();
}
processed = true;
}
} while (processed);
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processEllipse() {
@ -2272,7 +2389,8 @@ bool dxfRW::processEllipse() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processTrace() {
@ -2295,7 +2413,8 @@ bool dxfRW::processTrace() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processSolid() {
@ -2318,7 +2437,8 @@ bool dxfRW::processSolid() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::process3dface() {
@ -2339,7 +2459,8 @@ bool dxfRW::process3dface() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processViewport() {
@ -2360,7 +2481,8 @@ bool dxfRW::processViewport() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processPoint() {
@ -2381,7 +2503,8 @@ bool dxfRW::processPoint() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processLine() {
@ -2402,7 +2525,8 @@ bool dxfRW::processLine() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processRay() {
@ -2423,7 +2547,8 @@ bool dxfRW::processRay() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processXline() {
@ -2444,7 +2569,8 @@ bool dxfRW::processXline() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processCircle() {
@ -2467,7 +2593,8 @@ bool dxfRW::processCircle() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processArc() {
@ -2490,7 +2617,8 @@ bool dxfRW::processArc() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processInsert() {
@ -2511,7 +2639,8 @@ bool dxfRW::processInsert() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processLWPolyline() {
@ -2534,7 +2663,8 @@ bool dxfRW::processLWPolyline() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processPolyline() {
@ -2560,7 +2690,8 @@ bool dxfRW::processPolyline() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processVertex(DRW_Polyline *pl) {
@ -2586,7 +2717,8 @@ bool dxfRW::processVertex(DRW_Polyline *pl) {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processText() {
@ -2607,7 +2739,8 @@ bool dxfRW::processText() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processMText() {
@ -2629,7 +2762,8 @@ bool dxfRW::processMText() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processHatch() {
@ -2650,7 +2784,8 @@ bool dxfRW::processHatch() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
@ -2672,7 +2807,8 @@ bool dxfRW::processSpline() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
@ -2694,7 +2830,8 @@ bool dxfRW::processImage() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
@ -2753,7 +2890,8 @@ bool dxfRW::processDimension() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
bool dxfRW::processLeader() {
@ -2774,7 +2912,8 @@ bool dxfRW::processLeader() {
break;
}
}
return true;
return setError(DRW::BAD_READ_ENTITIES);
}
@ -2783,30 +2922,37 @@ bool dxfRW::processLeader() {
bool dxfRW::processObjects() {
DRW_DBG("dxfRW::processObjects\n");
int code;
if (!reader->readRec(&code)){
return false;
}
bool next = true;
if (code == 0) {
nextentity = reader->getString();
} else {
return false; //first record in objects is 0
}
do {
if (nextentity == "ENDSEC") {
return true; //found ENDSEC terminate
} else if (nextentity == "IMAGEDEF") {
processImageDef();
} else {
if (reader->readRec(&code)){
if (code == 0)
nextentity = reader->getString();
} else
return false; //end of file without ENDSEC
if (!reader->readRec(&code) || 0 != code){
return setError(DRW::BAD_READ_OBJECTS); //first record in objects must be 0
}
} while (next);
return true;
bool processed = false;
nextentity = reader->getString();
do {
if ("ENDSEC" == nextentity) {
return true; //found ENDSEC terminate
}
if ("IMAGEDEF" == nextentity) {
processed = processImageDef();
}
else if ("PLOTSETTINGS" == nextentity) {
processed = processPlotSettings();
}
else {
if (!reader->readRec(&code)) {
return setError(DRW::BAD_READ_OBJECTS); //end of file without ENDSEC
}
if (code == 0) {
nextentity = reader->getString();
}
processed = true;
}
}
while (processed);
return setError(DRW::BAD_READ_OBJECTS);
}
bool dxfRW::processImageDef() {
@ -2827,6 +2973,41 @@ bool dxfRW::processImageDef() {
break;
}
}
return setError(DRW::BAD_READ_OBJECTS);
}
bool dxfRW::processPlotSettings() {
DRW_DBG("dxfRW::processPlotSettings");
int code;
DRW_PlotSettings ps;
while (reader->readRec(&code)) {
DRW_DBG(code); DRW_DBG("\n");
switch (code) {
case 0: {
nextentity = reader->getString();
DRW_DBG(nextentity); DRW_DBG("\n");
iface->addPlotSettings(&ps);
return true; //found new entity or ENDSEC, terminate
}
default:
ps.parseCode(code, reader);
break;
}
}
return setError(DRW::BAD_READ_OBJECTS);
}
bool dxfRW::writePlotSettings(DRW_PlotSettings *ent) {
writer->writeString(0, "PLOTSETTINGS");
writer->writeString(5, toHexStr(++entCount));
writer->writeString(100, "AcDbPlotSettings");
writer->writeUtf8String(6, ent->plotViewName);
writer->writeDouble(40, ent->marginLeft);
writer->writeDouble(41, ent->marginBottom);
writer->writeDouble(42, ent->marginRight);
writer->writeDouble(43, ent->marginTop);
return true;
}
@ -2844,3 +3025,18 @@ std::string dxfRW::toHexStr(int n){
return Convert.str();
#endif
}
DRW::Version dxfRW::getVersion() const {
return version;
}
DRW::error dxfRW::getError() const
{
return error;
}
bool dxfRW::setError(const DRW::error lastError)
{
error = lastError;
return (DRW::BAD_NONE == error);
}

View File

@ -71,9 +71,12 @@ public:
DRW_ImageDef *writeImage(DRW_Image *ent, const std::string &name);
bool writeLeader(DRW_Leader *ent);
bool writeDimension(DRW_Dimension *ent);
void setEllipseParts(int parts){elParts = parts;} /*!< set parts munber when convert ellipse to polyline */
void setEllipseParts(int parts){elParts = parts;} /*!< set parts number when convert ellipse to polyline */
bool writePlotSettings(DRW_PlotSettings *ent);
std::string ErrorString() const;
DRW::Version getVersion() const;
DRW::error getError() const;
private:
Q_DISABLE_COPY(dxfRW)
@ -116,6 +119,7 @@ private:
bool processImageDef();
bool processDimension();
bool processLeader();
bool processPlotSettings();
// bool writeHeader();
bool writeEntity(DRW_Entity *ent);
@ -124,9 +128,13 @@ private:
bool writeObjects();
bool writeExtData(const std::vector<DRW_Variant*> &ed);
static std::string toHexStr(int n);//RLZ removeme
bool writeAppData(const std::list<std::list<DRW_Variant>> &appData);
bool setError(const DRW::error lastError);
private:
DRW::Version version;
DRW::error error {DRW::BAD_NONE};
std::string fileName;
std::string codePage;
bool binFile;
@ -141,7 +149,7 @@ private:
bool dimstyleStd;
bool applyExt;
bool writingBlock;
int elParts; /*!< parts munber when convert ellipse to polyline */
int elParts; /*!< parts number when convert ellipse to polyline */
std::unordered_map<std::string,int> blockMap;
std::vector<DRW_ImageDef*> imageDef; /*!< imageDef list */

View File

@ -5,9 +5,9 @@
* This manual documents the use of <b>libdxfrw</b>.
*
* With libdxfrw you can read and write several parts of a dxf files.<p>
* Dxf files can be written in assci and binary form, both are supported.<p>
* Dxf files can be written in ascii and binary form, both are supported.<p>
*
* the complete documentation and examples are pending to free time,
* but to start see DRW_Interface, dxfRW clases
* but to start see DRW_Interface, dxfRW classes
*/