Class to handle plot settings object entries.
This commit is contained in:
parent
c6bd3ae727
commit
0db9e1f728
|
@ -125,8 +125,7 @@ void dx_iface::writeHeader(DRW_Header &data){
|
||||||
|
|
||||||
void dx_iface::writeBlocks(){
|
void dx_iface::writeBlocks(){
|
||||||
//write each block
|
//write each block
|
||||||
for (std::list<dx_ifaceBlock*>::iterator it=cData.blocks.begin(); it != cData.blocks.end(); ++it){
|
for (auto *bk : cData.blocks){
|
||||||
dx_ifaceBlock* bk = *it;
|
|
||||||
dxfW->writeBlock(bk);
|
dxfW->writeBlock(bk);
|
||||||
//and write each entity in block
|
//and write each entity in block
|
||||||
for (std::list<DRW_Entity*>::const_iterator it=bk->ent.begin(); it!=bk->ent.end(); ++it)
|
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));
|
dxfW->writeDimstyle(&(*it));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dx_iface::writeObjects()
|
||||||
|
{
|
||||||
|
// default implementation for new DRW_Interface method
|
||||||
|
}
|
||||||
|
|
||||||
void dx_iface::writeAppId(){
|
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));
|
dxfW->writeAppId(&(*it));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ public:
|
||||||
virtual void writeTextstyles() override;
|
virtual void writeTextstyles() override;
|
||||||
virtual void writeVports() override;
|
virtual void writeVports() override;
|
||||||
virtual void writeDimstyles() override;
|
virtual void writeDimstyles() override;
|
||||||
|
virtual void writeObjects() override;
|
||||||
virtual void writeAppId() override;
|
virtual void writeAppId() override;
|
||||||
|
|
||||||
void AddEntity(DRW_Entity* e);
|
void AddEntity(DRW_Entity* e);
|
||||||
|
|
|
@ -156,7 +156,8 @@ BAD_READ_CLASSES, /*!< error in classes read process. */
|
||||||
BAD_READ_TABLES, /*!< error in tables read process. */
|
BAD_READ_TABLES, /*!< error in tables read process. */
|
||||||
BAD_READ_BLOCKS, /*!< error in block read process. */
|
BAD_READ_BLOCKS, /*!< error in block read process. */
|
||||||
BAD_READ_ENTITIES, /*!< error in entities 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 {
|
enum class DebugLevel {
|
||||||
|
@ -301,7 +302,7 @@ public:
|
||||||
/*!< convert to unitary vector */
|
/*!< convert to unitary vector */
|
||||||
void unitize(){
|
void unitize(){
|
||||||
double dist;
|
double dist;
|
||||||
dist = sqrt(x*x + y*y + z*z);
|
dist = hypot(hypot(x, y), z);
|
||||||
if (dist > 0.0) {
|
if (dist > 0.0) {
|
||||||
x= x/dist;
|
x= x/dist;
|
||||||
y= y/dist;
|
y= y/dist;
|
||||||
|
|
|
@ -607,7 +607,7 @@ void DRW_MText::parseCode(int code, dxfReader *reader){
|
||||||
text = reader->toUtf8String(text);
|
text = reader->toUtf8String(text);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
haveXAxis = true;
|
hasXAxisVec = true;
|
||||||
DRW_Text::parseCode(code, reader);
|
DRW_Text::parseCode(code, reader);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -681,7 +681,7 @@ void DRW_MText::parseCode(int code, dxfReader *reader){
|
||||||
}
|
}
|
||||||
|
|
||||||
void DRW_MText::updateAngle(){
|
void DRW_MText::updateAngle(){
|
||||||
if (haveXAxis) {
|
if (hasXAxisVec) {
|
||||||
angle = atan2(secPoint.y, secPoint.x)*180/M_PI;
|
angle = atan2(secPoint.y, secPoint.x)*180/M_PI;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -739,7 +739,7 @@ public:
|
||||||
|
|
||||||
DRW_MText()
|
DRW_MText()
|
||||||
: interlin(1),
|
: interlin(1),
|
||||||
haveXAxis(false)//if true needed to recalculate angle
|
hasXAxisVec(false)//if true needed to recalculate angle
|
||||||
{
|
{
|
||||||
eType = DRW::MTEXT;
|
eType = DRW::MTEXT;
|
||||||
alignV = static_cast<VAlign>(TopLeft);
|
alignV = static_cast<VAlign>(TopLeft);
|
||||||
|
@ -753,7 +753,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
double interlin; /*!< width factor, code 44 */
|
double interlin; /*!< width factor, code 44 */
|
||||||
private:
|
private:
|
||||||
bool haveXAxis;
|
bool hasXAxisVec;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Class to handle vertex
|
//! Class to handle vertex
|
||||||
|
|
|
@ -40,6 +40,13 @@ void DRW_Header::addComment(const std::string &c){
|
||||||
}
|
}
|
||||||
|
|
||||||
void DRW_Header::parseCode(int code, dxfReader *reader){
|
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) {
|
switch (code) {
|
||||||
case 9:
|
case 9:
|
||||||
curr = new DRW_Variant();
|
curr = new DRW_Variant();
|
||||||
|
|
|
@ -105,7 +105,7 @@ public:
|
||||||
private:
|
private:
|
||||||
std::string comments;
|
std::string comments;
|
||||||
std::string name;
|
std::string name;
|
||||||
DRW_Variant* curr;
|
DRW_Variant* curr {nullptr};
|
||||||
int version; //to use on read
|
int version; //to use on read
|
||||||
|
|
||||||
duint32 linetypeCtrl;
|
duint32 linetypeCtrl;
|
||||||
|
|
|
@ -24,7 +24,7 @@ QT_WARNING_DISABLE_GCC("-Wsuggest-final-types")
|
||||||
QT_WARNING_DISABLE_GCC("-Wsuggest-final-methods")
|
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
|
* Inherit your class which takes care of the entities in the
|
||||||
* processed DXF file from this interface.
|
* processed DXF file from this interface.
|
||||||
*
|
*
|
||||||
|
@ -179,6 +179,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void addComment(const char *) { }
|
virtual void addComment(const char *) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called for PLOTSETTINGS object definition.
|
||||||
|
*/
|
||||||
|
virtual void addPlotSettings(const DRW_PlotSettings *) {}
|
||||||
|
|
||||||
virtual void writeHeader(DRW_Header &) { }
|
virtual void writeHeader(DRW_Header &) { }
|
||||||
virtual void writeBlocks() { }
|
virtual void writeBlocks() { }
|
||||||
virtual void writeBlockRecords() { }
|
virtual void writeBlockRecords() { }
|
||||||
|
@ -188,6 +193,7 @@ public:
|
||||||
virtual void writeTextstyles() { }
|
virtual void writeTextstyles() { }
|
||||||
virtual void writeVports() { }
|
virtual void writeVports() { }
|
||||||
virtual void writeDimstyles() { }
|
virtual void writeDimstyles() { }
|
||||||
|
virtual void writeObjects() {}
|
||||||
virtual void writeAppId() { }
|
virtual void writeAppId() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -588,3 +588,28 @@ void DRW_ImageDef::parseCode(int code, dxfReader *reader){
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -35,7 +35,8 @@ namespace DRW {
|
||||||
VPORT,
|
VPORT,
|
||||||
BLOCK_RECORD,
|
BLOCK_RECORD,
|
||||||
APPID,
|
APPID,
|
||||||
IMAGEDEF
|
IMAGEDEF,
|
||||||
|
PLOTSETTINGS
|
||||||
};
|
};
|
||||||
|
|
||||||
//pending VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD,
|
//pending VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD,
|
||||||
|
@ -591,6 +592,38 @@ public:
|
||||||
std::map<std::string,std::string> reactors;
|
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 entries
|
||||||
/*!
|
/*!
|
||||||
* Class to handle AppId symbol table entries
|
* Class to handle AppId symbol table entries
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
DRW_dbg *DRW_dbg::instance{nullptr};
|
DRW_dbg *DRW_dbg::instance{nullptr};
|
||||||
|
|
||||||
/*********private clases*************/
|
/*********private classes*************/
|
||||||
|
|
||||||
class print_debug : public DRW::DebugPrinter {
|
class print_debug : public DRW::DebugPrinter {
|
||||||
public:
|
public:
|
||||||
|
@ -76,6 +76,14 @@ void DRW_dbg::print(const std::string &s){
|
||||||
currentPrinter->printS(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){
|
void DRW_dbg::print(int i){
|
||||||
currentPrinter->printI(i);
|
currentPrinter->printI(i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,8 @@ public:
|
||||||
Level getLevel() const;
|
Level getLevel() const;
|
||||||
static DRW_dbg *getInstance();
|
static DRW_dbg *getInstance();
|
||||||
void print(const std::string &s);
|
void print(const std::string &s);
|
||||||
|
void print(signed char i);
|
||||||
|
void print(unsigned char i);
|
||||||
void print(int i);
|
void print(int i);
|
||||||
void print(unsigned int i);
|
void print(unsigned int i);
|
||||||
void print(long long int i);
|
void print(long long int i);
|
||||||
|
|
|
@ -70,6 +70,10 @@ bool dxfReader::readRec(int *codeData) {
|
||||||
readDouble();
|
readDouble();
|
||||||
else if (code < 481)
|
else if (code < 481)
|
||||||
readString();
|
readString();
|
||||||
|
else if( 999 == code && m_bIgnoreComments) {
|
||||||
|
readString();
|
||||||
|
return readRec( codeData);
|
||||||
|
}
|
||||||
else if (code > 998 && code < 1009) //skip not used at the v2012
|
else if (code > 998 && code < 1009) //skip not used at the v2012
|
||||||
readString();
|
readString();
|
||||||
else if (code < 1060) //TODO this is a floating point double precision??
|
else if (code < 1060) //TODO this is a floating point double precision??
|
||||||
|
|
|
@ -53,6 +53,7 @@ public:
|
||||||
void setVersion(const std::string &v, bool dxfFormat){decoder.setVersion(v, dxfFormat);}
|
void setVersion(const std::string &v, bool dxfFormat){decoder.setVersion(v, dxfFormat);}
|
||||||
void setCodePage(const std::string &c){decoder.setCodePage(c, true);}
|
void setCodePage(const std::string &c){decoder.setCodePage(c, true);}
|
||||||
std::string getCodePage() const { return decoder.getCodePage();}
|
std::string getCodePage() const { return decoder.getCodePage();}
|
||||||
|
void setIgnoreComments(const bool bValue) {m_bIgnoreComments = bValue;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool readCode(int *code) = 0; //return true if successful (not EOF)
|
virtual bool readCode(int *code) = 0; //return true if successful (not EOF)
|
||||||
|
@ -74,6 +75,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(dxfReader)
|
Q_DISABLE_COPY(dxfReader)
|
||||||
DRW_TextCodec decoder;
|
DRW_TextCodec decoder;
|
||||||
|
bool m_bIgnoreComments {false};
|
||||||
};
|
};
|
||||||
|
|
||||||
class dxfReaderBinary : public dxfReader {
|
class dxfReaderBinary : public dxfReader {
|
||||||
|
|
|
@ -49,7 +49,7 @@ dxfRW::dxfRW(const char* name)
|
||||||
dimstyleStd(),
|
dimstyleStd(),
|
||||||
applyExt(false),
|
applyExt(false),
|
||||||
writingBlock(),
|
writingBlock(),
|
||||||
elParts(128), //parts munber when convert ellipse to polyline
|
elParts(128), //parts number when convert ellipse to polyline
|
||||||
blockMap(),
|
blockMap(),
|
||||||
imageDef(),
|
imageDef(),
|
||||||
currHandle()
|
currHandle()
|
||||||
|
@ -80,17 +80,16 @@ void dxfRW::setDebug(DRW::DebugLevel lvl){
|
||||||
|
|
||||||
bool dxfRW::read(DRW_Interface *interface_, bool ext){
|
bool dxfRW::read(DRW_Interface *interface_, bool ext){
|
||||||
drw_assert(fileName.empty() == false);
|
drw_assert(fileName.empty() == false);
|
||||||
bool isOk = false;
|
|
||||||
applyExt = ext;
|
applyExt = ext;
|
||||||
std::ifstream filestr;
|
std::ifstream filestr;
|
||||||
if ( interface_ == nullptr )
|
if (nullptr == interface_) {
|
||||||
return isOk;
|
return setError(DRW::BAD_UNKNOWN);
|
||||||
|
}
|
||||||
DRW_DBG("dxfRW::read 1def\n");
|
DRW_DBG("dxfRW::read 1def\n");
|
||||||
filestr.open (fileName.c_str(), std::ios_base::in | std::ios::binary);
|
filestr.open (fileName.c_str(), std::ios_base::in | std::ios::binary);
|
||||||
if (!filestr.is_open())
|
if (!filestr.is_open() || !filestr.good()) {
|
||||||
return isOk;
|
return setError(DRW::BAD_OPEN);
|
||||||
if (!filestr.good())
|
}
|
||||||
return isOk;
|
|
||||||
|
|
||||||
char line[22];
|
char line[22];
|
||||||
char line2[22] = "AutoCAD Binary DXF\r\n";
|
char line2[22] = "AutoCAD Binary DXF\r\n";
|
||||||
|
@ -113,7 +112,7 @@ bool dxfRW::read(DRW_Interface *interface_, bool ext){
|
||||||
reader = new dxfReaderAscii(&filestr);
|
reader = new dxfReaderAscii(&filestr);
|
||||||
}
|
}
|
||||||
|
|
||||||
isOk = processDxf();
|
bool isOk = processDxf();
|
||||||
filestr.close();
|
filestr.close();
|
||||||
delete reader;
|
delete reader;
|
||||||
reader = nullptr;
|
reader = nullptr;
|
||||||
|
@ -211,6 +210,52 @@ bool dxfRW::writeEntity(DRW_Entity *ent) {
|
||||||
if (version > DRW::AC1014) {
|
if (version > DRW::AC1014) {
|
||||||
writer->writeInt16(370, DRW_LW_Conv::lineWidth2dxfInt(ent->lWeight));
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1813,6 +1858,8 @@ bool dxfRW::writeObjects() {
|
||||||
imageDef.pop_back();
|
imageDef.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iface->writeObjects();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1865,51 +1912,101 @@ bool dxfRW::writeExtData(const std::vector<DRW_Variant*> &ed){
|
||||||
|
|
||||||
bool dxfRW::processDxf() {
|
bool dxfRW::processDxf() {
|
||||||
DRW_DBG("dxfRW::processDxf() start processing dxf\n");
|
DRW_DBG("dxfRW::processDxf() start processing dxf\n");
|
||||||
int code;
|
int code = -1;
|
||||||
bool more = true;
|
bool inSection = false;
|
||||||
std::string sectionstr;
|
|
||||||
// section = secUnknown;
|
reader->setIgnoreComments( false);
|
||||||
while (reader->readRec(&code)) {
|
while (reader->readRec(&code)) {
|
||||||
DRW_DBG(code); DRW_DBG(" processDxf\n");
|
DRW_DBG(code); DRW_DBG(" code\n");
|
||||||
if (code == 999) {
|
/* 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());
|
header.addComment( reader->getString());
|
||||||
} else if (code == 0) {
|
continue;
|
||||||
sectionstr = reader->getString();
|
|
||||||
DRW_DBG(sectionstr); DRW_DBG(" processDxf\n");
|
case 0:
|
||||||
if (sectionstr == "EOF") {
|
// 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
|
return true; //found EOF terminate
|
||||||
}
|
}
|
||||||
if (sectionstr == "SECTION") {
|
}
|
||||||
more = reader->readRec(&code);
|
else {
|
||||||
DRW_DBG(code); DRW_DBG(" processDxf\n");
|
// in case SECTION was unknown or not supported
|
||||||
if (!more)
|
if ("ENDSEC" == reader->getString()) {
|
||||||
return false; //wrong dxf file
|
inSection = false;
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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)
|
/* if (!more)
|
||||||
return true;*/
|
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 true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return setError(DRW::BAD_UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
/********* Header Section *********/
|
/********* Header Section *********/
|
||||||
|
|
||||||
bool dxfRW::processHeader() {
|
bool dxfRW::processHeader() {
|
||||||
|
@ -1925,9 +2022,14 @@ bool dxfRW::processHeader() {
|
||||||
iface->addHeader(&header);
|
iface->addHeader(&header);
|
||||||
return true; //found ENDSEC terminate
|
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 *********/
|
/********* Tables Section *********/
|
||||||
|
@ -1945,8 +2047,9 @@ bool dxfRW::processTables() {
|
||||||
if (sectionstr == "TABLE") {
|
if (sectionstr == "TABLE") {
|
||||||
more = reader->readRec(&code);
|
more = reader->readRec(&code);
|
||||||
DRW_DBG(code); DRW_DBG("\n");
|
DRW_DBG(code); DRW_DBG("\n");
|
||||||
if (!more)
|
if (!more) {
|
||||||
return false; //wrong dxf file
|
return setError(DRW::BAD_READ_TABLES); //wrong dxf file
|
||||||
|
}
|
||||||
if (code == 2) {
|
if (code == 2) {
|
||||||
sectionstr = reader->getString();
|
sectionstr = reader->getString();
|
||||||
DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n");
|
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() {
|
bool dxfRW::processLType() {
|
||||||
|
@ -2003,7 +2107,8 @@ bool dxfRW::processLType() {
|
||||||
} else if (reading)
|
} else if (reading)
|
||||||
ltype.parseCode(code, reader);
|
ltype.parseCode(code, reader);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processLayer() {
|
bool dxfRW::processLayer() {
|
||||||
|
@ -2028,7 +2133,8 @@ bool dxfRW::processLayer() {
|
||||||
} else if (reading)
|
} else if (reading)
|
||||||
layer.parseCode(code, reader);
|
layer.parseCode(code, reader);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processDimStyle() {
|
bool dxfRW::processDimStyle() {
|
||||||
|
@ -2053,7 +2159,8 @@ bool dxfRW::processDimStyle() {
|
||||||
} else if (reading)
|
} else if (reading)
|
||||||
dimSty.parseCode(code, reader);
|
dimSty.parseCode(code, reader);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processTextStyle(){
|
bool dxfRW::processTextStyle(){
|
||||||
|
@ -2078,7 +2185,8 @@ bool dxfRW::processTextStyle(){
|
||||||
} else if (reading)
|
} else if (reading)
|
||||||
TxtSty.parseCode(code, reader);
|
TxtSty.parseCode(code, reader);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processVports(){
|
bool dxfRW::processVports(){
|
||||||
|
@ -2103,7 +2211,8 @@ bool dxfRW::processVports(){
|
||||||
} else if (reading)
|
} else if (reading)
|
||||||
vp.parseCode(code, reader);
|
vp.parseCode(code, reader);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processAppId(){
|
bool dxfRW::processAppId(){
|
||||||
|
@ -2128,7 +2237,8 @@ bool dxfRW::processAppId(){
|
||||||
} else if (reading)
|
} else if (reading)
|
||||||
vp.parseCode(code, reader);
|
vp.parseCode(code, reader);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
/********* Block Section *********/
|
/********* Block Section *********/
|
||||||
|
@ -2149,7 +2259,8 @@ bool dxfRW::processBlocks() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_BLOCKS);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processBlock() {
|
bool dxfRW::processBlock() {
|
||||||
|
@ -2177,7 +2288,8 @@ bool dxfRW::processBlock() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_BLOCKS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2187,69 +2299,74 @@ bool dxfRW::processEntities(bool isblock) {
|
||||||
DRW_DBG("dxfRW::processEntities\n");
|
DRW_DBG("dxfRW::processEntities\n");
|
||||||
int code;
|
int code;
|
||||||
if (!reader->readRec(&code)){
|
if (!reader->readRec(&code)){
|
||||||
return false;
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
bool next = true;
|
bool next = true;
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
nextentity = reader->getString();
|
nextentity = reader->getString();
|
||||||
} else if (!isblock) {
|
} 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 {
|
do {
|
||||||
if (nextentity == "ENDSEC" || nextentity == "ENDBLK") {
|
if (nextentity == "ENDSEC" || nextentity == "ENDBLK") {
|
||||||
return true; //found ENDSEC or ENDBLK terminate
|
return true; //found ENDSEC or ENDBLK terminate
|
||||||
} else if (nextentity == "POINT") {
|
} else if (nextentity == "POINT") {
|
||||||
processPoint();
|
processed = processPoint();
|
||||||
} else if (nextentity == "LINE") {
|
} else if (nextentity == "LINE") {
|
||||||
processLine();
|
processed = processLine();
|
||||||
} else if (nextentity == "CIRCLE") {
|
} else if (nextentity == "CIRCLE") {
|
||||||
processCircle();
|
processed = processCircle();
|
||||||
} else if (nextentity == "ARC") {
|
} else if (nextentity == "ARC") {
|
||||||
processArc();
|
processed = processArc();
|
||||||
} else if (nextentity == "ELLIPSE") {
|
} else if (nextentity == "ELLIPSE") {
|
||||||
processEllipse();
|
processed = processEllipse();
|
||||||
} else if (nextentity == "TRACE") {
|
} else if (nextentity == "TRACE") {
|
||||||
processTrace();
|
processed = processTrace();
|
||||||
} else if (nextentity == "SOLID") {
|
} else if (nextentity == "SOLID") {
|
||||||
processSolid();
|
processed = processSolid();
|
||||||
} else if (nextentity == "INSERT") {
|
} else if (nextentity == "INSERT") {
|
||||||
processInsert();
|
processed = processInsert();
|
||||||
} else if (nextentity == "LWPOLYLINE") {
|
} else if (nextentity == "LWPOLYLINE") {
|
||||||
processLWPolyline();
|
processed = processLWPolyline();
|
||||||
} else if (nextentity == "POLYLINE") {
|
} else if (nextentity == "POLYLINE") {
|
||||||
processPolyline();
|
processed = processPolyline();
|
||||||
} else if (nextentity == "TEXT") {
|
} else if (nextentity == "TEXT") {
|
||||||
processText();
|
processed = processText();
|
||||||
} else if (nextentity == "MTEXT") {
|
} else if (nextentity == "MTEXT") {
|
||||||
processMText();
|
processed = processMText();
|
||||||
} else if (nextentity == "HATCH") {
|
} else if (nextentity == "HATCH") {
|
||||||
processHatch();
|
processed = processHatch();
|
||||||
} else if (nextentity == "SPLINE") {
|
} else if (nextentity == "SPLINE") {
|
||||||
processSpline();
|
processed = processSpline();
|
||||||
} else if (nextentity == "3DFACE") {
|
} else if (nextentity == "3DFACE") {
|
||||||
process3dface();
|
processed = process3dface();
|
||||||
} else if (nextentity == "VIEWPORT") {
|
} else if (nextentity == "VIEWPORT") {
|
||||||
processViewport();
|
processed = processViewport();
|
||||||
} else if (nextentity == "IMAGE") {
|
} else if (nextentity == "IMAGE") {
|
||||||
processImage();
|
processed = processImage();
|
||||||
} else if (nextentity == "DIMENSION") {
|
} else if (nextentity == "DIMENSION") {
|
||||||
processDimension();
|
processed = processDimension();
|
||||||
} else if (nextentity == "LEADER") {
|
} else if (nextentity == "LEADER") {
|
||||||
processLeader();
|
processed = processLeader();
|
||||||
} else if (nextentity == "RAY") {
|
} else if (nextentity == "RAY") {
|
||||||
processRay();
|
processed = processRay();
|
||||||
} else if (nextentity == "XLINE") {
|
} else if (nextentity == "XLINE") {
|
||||||
processXline();
|
processed = processXline();
|
||||||
} else {
|
} else {
|
||||||
if (reader->readRec(&code)){
|
if (!reader->readRec(&code)) {
|
||||||
if (code == 0)
|
return setError(DRW::BAD_READ_ENTITIES); //end of file without ENDSEC
|
||||||
nextentity = reader->getString();
|
|
||||||
} else
|
|
||||||
return false; //end of file without ENDSEC
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (next);
|
if (code == 0) {
|
||||||
return true;
|
nextentity = reader->getString();
|
||||||
|
}
|
||||||
|
processed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (processed);
|
||||||
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processEllipse() {
|
bool dxfRW::processEllipse() {
|
||||||
|
@ -2272,7 +2389,8 @@ bool dxfRW::processEllipse() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processTrace() {
|
bool dxfRW::processTrace() {
|
||||||
|
@ -2295,7 +2413,8 @@ bool dxfRW::processTrace() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processSolid() {
|
bool dxfRW::processSolid() {
|
||||||
|
@ -2318,7 +2437,8 @@ bool dxfRW::processSolid() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::process3dface() {
|
bool dxfRW::process3dface() {
|
||||||
|
@ -2339,7 +2459,8 @@ bool dxfRW::process3dface() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processViewport() {
|
bool dxfRW::processViewport() {
|
||||||
|
@ -2360,7 +2481,8 @@ bool dxfRW::processViewport() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processPoint() {
|
bool dxfRW::processPoint() {
|
||||||
|
@ -2381,7 +2503,8 @@ bool dxfRW::processPoint() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processLine() {
|
bool dxfRW::processLine() {
|
||||||
|
@ -2402,7 +2525,8 @@ bool dxfRW::processLine() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processRay() {
|
bool dxfRW::processRay() {
|
||||||
|
@ -2423,7 +2547,8 @@ bool dxfRW::processRay() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processXline() {
|
bool dxfRW::processXline() {
|
||||||
|
@ -2444,7 +2569,8 @@ bool dxfRW::processXline() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processCircle() {
|
bool dxfRW::processCircle() {
|
||||||
|
@ -2467,7 +2593,8 @@ bool dxfRW::processCircle() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processArc() {
|
bool dxfRW::processArc() {
|
||||||
|
@ -2490,7 +2617,8 @@ bool dxfRW::processArc() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processInsert() {
|
bool dxfRW::processInsert() {
|
||||||
|
@ -2511,7 +2639,8 @@ bool dxfRW::processInsert() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processLWPolyline() {
|
bool dxfRW::processLWPolyline() {
|
||||||
|
@ -2534,7 +2663,8 @@ bool dxfRW::processLWPolyline() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processPolyline() {
|
bool dxfRW::processPolyline() {
|
||||||
|
@ -2560,7 +2690,8 @@ bool dxfRW::processPolyline() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processVertex(DRW_Polyline *pl) {
|
bool dxfRW::processVertex(DRW_Polyline *pl) {
|
||||||
|
@ -2586,7 +2717,8 @@ bool dxfRW::processVertex(DRW_Polyline *pl) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processText() {
|
bool dxfRW::processText() {
|
||||||
|
@ -2607,7 +2739,8 @@ bool dxfRW::processText() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processMText() {
|
bool dxfRW::processMText() {
|
||||||
|
@ -2629,7 +2762,8 @@ bool dxfRW::processMText() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processHatch() {
|
bool dxfRW::processHatch() {
|
||||||
|
@ -2650,7 +2784,8 @@ bool dxfRW::processHatch() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2672,7 +2807,8 @@ bool dxfRW::processSpline() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2694,7 +2830,8 @@ bool dxfRW::processImage() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2753,7 +2890,8 @@ bool dxfRW::processDimension() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dxfRW::processLeader() {
|
bool dxfRW::processLeader() {
|
||||||
|
@ -2774,7 +2912,8 @@ bool dxfRW::processLeader() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
return setError(DRW::BAD_READ_ENTITIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2783,30 +2922,37 @@ bool dxfRW::processLeader() {
|
||||||
bool dxfRW::processObjects() {
|
bool dxfRW::processObjects() {
|
||||||
DRW_DBG("dxfRW::processObjects\n");
|
DRW_DBG("dxfRW::processObjects\n");
|
||||||
int code;
|
int code;
|
||||||
if (!reader->readRec(&code)){
|
if (!reader->readRec(&code) || 0 != code){
|
||||||
return false;
|
return setError(DRW::BAD_READ_OBJECTS); //first record in objects must be 0
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (next);
|
bool processed = false;
|
||||||
return true;
|
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() {
|
bool dxfRW::processImageDef() {
|
||||||
|
@ -2827,6 +2973,41 @@ bool dxfRW::processImageDef() {
|
||||||
break;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2844,3 +3025,18 @@ std::string dxfRW::toHexStr(int n){
|
||||||
return Convert.str();
|
return Convert.str();
|
||||||
#endif
|
#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);
|
||||||
|
}
|
||||||
|
|
|
@ -71,9 +71,12 @@ public:
|
||||||
DRW_ImageDef *writeImage(DRW_Image *ent, const std::string &name);
|
DRW_ImageDef *writeImage(DRW_Image *ent, const std::string &name);
|
||||||
bool writeLeader(DRW_Leader *ent);
|
bool writeLeader(DRW_Leader *ent);
|
||||||
bool writeDimension(DRW_Dimension *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;
|
std::string ErrorString() const;
|
||||||
|
DRW::Version getVersion() const;
|
||||||
|
DRW::error getError() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(dxfRW)
|
Q_DISABLE_COPY(dxfRW)
|
||||||
|
@ -116,6 +119,7 @@ private:
|
||||||
bool processImageDef();
|
bool processImageDef();
|
||||||
bool processDimension();
|
bool processDimension();
|
||||||
bool processLeader();
|
bool processLeader();
|
||||||
|
bool processPlotSettings();
|
||||||
|
|
||||||
// bool writeHeader();
|
// bool writeHeader();
|
||||||
bool writeEntity(DRW_Entity *ent);
|
bool writeEntity(DRW_Entity *ent);
|
||||||
|
@ -124,9 +128,13 @@ private:
|
||||||
bool writeObjects();
|
bool writeObjects();
|
||||||
bool writeExtData(const std::vector<DRW_Variant*> &ed);
|
bool writeExtData(const std::vector<DRW_Variant*> &ed);
|
||||||
static std::string toHexStr(int n);//RLZ removeme
|
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:
|
private:
|
||||||
DRW::Version version;
|
DRW::Version version;
|
||||||
|
DRW::error error {DRW::BAD_NONE};
|
||||||
std::string fileName;
|
std::string fileName;
|
||||||
std::string codePage;
|
std::string codePage;
|
||||||
bool binFile;
|
bool binFile;
|
||||||
|
@ -141,7 +149,7 @@ private:
|
||||||
bool dimstyleStd;
|
bool dimstyleStd;
|
||||||
bool applyExt;
|
bool applyExt;
|
||||||
bool writingBlock;
|
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::unordered_map<std::string,int> blockMap;
|
||||||
std::vector<DRW_ImageDef*> imageDef; /*!< imageDef list */
|
std::vector<DRW_ImageDef*> imageDef; /*!< imageDef list */
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
* This manual documents the use of <b>libdxfrw</b>.
|
* This manual documents the use of <b>libdxfrw</b>.
|
||||||
*
|
*
|
||||||
* With libdxfrw you can read and write several parts of a dxf files.<p>
|
* 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,
|
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user