博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用dxflib读写cad文件
阅读量:5973 次
发布时间:2019-06-19

本文共 9956 字,大约阅读时间需要 33 分钟。

本篇主要在qt做一个例子读取cad文件数据,使用的开源库是。用到的DL_CreationAdapter,DL_Dxf。DL_Dxf是用来读取.dxf文件的类,DL_CreatinAdapter是一个容器,当DL_Dxf加载.dxf文件后,就会响应DL_CreationAdapter这个类,读取cad数据。

我们来看看他的工作原理:

//自己声明一个类继承DL_CreationAdapterclass MyDxfFilter : public DL_CreationAdapter {//重写虚函数来把度出来的数据保存到自己设计好的数据结构中 virtual void addLine(const DL_LineData& d); ...}void MyDxfFilter::addLine(const DL_LineData& d) { std::cout << "Line: " << d.x1 << "/" << d.y1 << " " << d.x2 << "/" << d.y2 << std::endl;}MyDxfFilter f;DL_Dxf dxf;//读取.dxf文件if (!dxf.in("drawing.dxf", &f)) { std::cerr << "drawing.dxf could not be opened.\n";}

在这段程序中,当dxf.in("drawing.dxf", &f)读取.dxf文件成功了,如果文件中有很多line,那么f对象会一直递归调用虚函数接口addLine(),直到所有的line都读完。

重这个特征,我们就可以把所有我们要读取的数据都出来了!
直接上程序!:
entitiesDatas.h

#ifndef ENTITIESDATAS_H#define ENTITIESDATAS_H#include 
#include "dl_dxf.h"#include "dl_creationadapter.h"#include "dl_attributes.h"#include "dl_codes.h"#include "dl_entities.h"#include "dl_exception.h"#include "dl_global.h"#include "dl_writer.h"#include "dl_writer_ascii.h"#include
#include
class EntitiesDatas:public DL_CreationAdapter{public:// explicit EntitiesDatas(); virtual void EntitiesDatas::addPoint(const DL_PointData &d){ points.append(d); qDebug()<<"^^^^^^^^^^^^^^^^^^^^^^^^^^^^add point"; } virtual void EntitiesDatas::addLine(const DL_LineData &d){ lines.append(d); qDebug()<<"~~~~~~~~~~~~~~~~~~~~~~~~~~add line"; } virtual void EntitiesDatas::addArc(const DL_ArcData &d){ arcs.append(d); qDebug()<<"#######################add arc"; } virtual void EntitiesDatas::addCircle(const DL_CircleData &d){ circles.append(d); qDebug()<<"!!!!!!!!!!!!!!!!!!!!!!!!add circle"; } virtual void EntitiesDatas::addEllipse(const DL_EllipseData &d){ ellipses.append(d); qDebug()<<"%%%%%%%%%%%%%%%%%%%%%%add ellipse"; } virtual void EntitiesDatas::addText(const DL_TextData &d){ texts.append(d); qDebug()<<"add text"; } virtual void EntitiesDatas::addDimAngular(const DL_DimensionData &d, const DL_DimAngularData &d1){ qDebug()<<"***********add angular"; }// virtual EntitiesDatas::addDimLinear(const DL_DimensionData &d, const DL_DimLinearData &d1){// qDebug()<<"___________________________add deim linear";// } virtual void EntitiesDatas::addMText(const DL_MTextData &d){ mtexts.append(d); qDebug()<<"&&&&&&&&&&add mtext"; } virtual void EntitiesDatas::addXLine(const DL_XLineData &){ qDebug()<<"++++++++++++++add xline"; } virtual void EntitiesDatas::addRay(const DL_RayData &){ qDebug()<<"/add ray"; } virtual void EntitiesDatas::addPolyline(const DL_PolylineData &d){ qDebug()<<"eeeeeeeeeeeeeeeeeeeeeeeeeee add polyline"; polylines.append(d); } virtual void EntitiesDatas::addSpline(const DL_SplineData &){ qDebug()<<".....................................add spline data"; } virtual void EntitiesDatas::addComment(const std::string &){ qDebug()<<",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,add comment"; } virtual void EntitiesDatas::addVertex(const DL_VertexData &d){ vertices.append(d); qDebug()<<"hhhhhhhhhhhhhhhhhhhhhhhh add vertex"; } virtual void EntitiesDatas::addLayer(const DL_LayerData &d){ qDebug()<<"ggggggggggggggggggg add layer"; qDebug()<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>add xdata string"; } virtual void EntitiesDatas::addXRecord(const std::string &){ qDebug()<<",.,.,.,.,.,.,.,.,.,.,.,.,.,.,add repcord"; } virtual void EntitiesDatas::addTrace(const DL_TraceData &){ qDebug()<<"mmmmmmmmmmmmmm add trace"; } virtual void EntitiesDatas::endEntity(){ qDebug()<<"end entity***********************"; qDebug()<<"attribute ***************** "<
getAttributes().getColor(); } virtual void EntitiesDatas::endSequence(){ qDebug()<<"end sequence +++++++++++++++++++++"; } virtual void EntitiesDatas::setAttributes(const DL_Attributes &attrib){ qDebug()<<"set attribute ()()()()()()()()()()()()()()()"; } virtual void EntitiesDatas::addHatch(const DL_HatchData &d){ qDebug()<<"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn add hatch"; hatches.append(d); } virtual void EntitiesDatas::addHatchEdge(const DL_HatchEdgeData &d){ qDebug()<<"MMMMMMMMMMMMMMMMKMMMMM add hat edge data"; hatchedges.append(d); if(this->getAttributes().getColor()==1){ QString color="#ef3312"; hatchcolors.append(color); } else if(this->getAttributes().getColor()==2){ QString color="#efef33"; hatchcolors.append(color); } else if(this->getAttributes().getColor()==3){ QString color="#12ef33"; hatchcolors.append(color); } else { QString color="#efefef"; hatchcolors.append(color); } }// virtual void EntitiesDatas::att QList
points; QList
lines;// QList
arcs; QList
circles;// QList
ellipses; QList
texts; QList
dimangulars; QList
dimlines; QList
radias; QList
vertices;// QList
polylines;// QList
mtexts;// QList
hatches;// QList
hatchedges;// QList
hatchcolors;};#endif // ENTITIESDATAS_H

dxfreader.h

#ifndef DXFREADER_H#define DXFREADER_H#include 
#include "entitiesdatas.h"#include "dl_dxf.h"#include "dl_creationadapter.h"#include "dl_attributes.h"#include "dl_codes.h"#include "dl_entities.h"#include "dl_exception.h"#include "dl_global.h"#include "dl_writer.h"#include "dl_writer_ascii.h"#include
#include "entitiesdatas.h"#include
class DXFReader : public QObject{ Q_OBJECTpublic: explicit DXFReader(QObject *parent = 0); //line Q_INVOKABLE int getLineLength(); Q_INVOKABLE double getLinex1(int index); Q_INVOKABLE double getLinex2(int index); Q_INVOKABLE double getLiney1(int index); Q_INVOKABLE double getLiney2(int index); //circle Q_INVOKABLE int getCircleLength(); Q_INVOKABLE double getCirclex(int index); Q_INVOKABLE double getCircley(int index); Q_INVOKABLE double getCircleRadius(int index); //mtext Q_INVOKABLE int getMTextLength(); Q_INVOKABLE double getMTextx(int index); Q_INVOKABLE double getMTexty(int index); Q_INVOKABLE QString getMTextStr(int index); Q_INVOKABLE double getMTextSize(int index); //ploy line Q_INVOKABLE int getPolyLineLength(); Q_INVOKABLE double getVertex1x(int index); Q_INVOKABLE double getVertex2x(int index); Q_INVOKABLE double getVertex3x(int index); Q_INVOKABLE double getVertex4x(int index); Q_INVOKABLE double getVertex1y(int index); Q_INVOKABLE double getVertex2y(int index); Q_INVOKABLE double getVertex3y(int index); Q_INVOKABLE double getVertex4y(int index); //hatch edge and hatch color Q_INVOKABLE int getHatchLength(); Q_INVOKABLE QString getHatchColor(int index); Q_INVOKABLE double getHatchx(int index); Q_INVOKABLE double getHatchy(int index); Q_INVOKABLE double getHatchRadius(int index);signals:public slots:private: EntitiesDatas f; DL_Dxf dxf;};#endif // DXFREADER_H

dxfreader.cpp

#include "dxfreader.h"#include "math.h"#include "QtMath"DXFReader::DXFReader(QObject *parent) : QObject(parent){    //初始化第一个dxf文件    if (!dxf.in("c:/aa.dxf", &f)) {     qDebug()<<"can not read datas";    }else {        qDebug()<<"success";    }}//lineint DXFReader::getLineLength(){    return f.lines.count();}double DXFReader::getLinex1(int index){    return f.lines.at(index).x1;}double DXFReader::getLinex2(int index){    return f.lines.at(index).x2;}double DXFReader::getLiney1(int index){    return f.lines.at(index).y1;}double DXFReader::getLiney2(int index){    return f.lines.at(index).y2;}//circleint DXFReader::getCircleLength(){    return f.circles.count();}double DXFReader::getCirclex(int index){    return f.circles.at(index).cx;}double DXFReader::getCircley(int index){    return f.circles.at(index).cy;}double DXFReader::getCircleRadius(int index){    return f.circles.at(index).radius;}//mtextint DXFReader::getMTextLength(){    return f.mtexts.count();}double DXFReader::getMTextx(int index){    return f.mtexts.at(index).ipx;}double DXFReader::getMTexty(int index){    return f.mtexts.at(index).ipy;}QString DXFReader::getMTextStr(int index){    return QString::fromStdString(f.mtexts.at(index).text);}double DXFReader::getMTextSize(int index){    return f.mtexts.at(index).height*3/4;}//ploy lineint DXFReader::getPolyLineLength(){    return f.polylines.count();}double DXFReader::getVertex1x(int index){    return f.vertices.at(index*4).x;}double DXFReader::getVertex2x(int index){    return f.vertices.at(index*4+1).x;}double DXFReader::getVertex3x(int index){    return f.vertices.at(index*4+2).x;}double DXFReader::getVertex4x(int index){    return f.vertices.at(index*4+3).x;}double DXFReader::getVertex1y(int index){    return f.vertices.at(index*4).y;}double DXFReader::getVertex2y(int index){    return f.vertices.at(index*4+1).y;}double DXFReader::getVertex3y(int index){    return f.vertices.at(index*4+2).y;}double DXFReader::getVertex4y(int index){    return f.vertices.at(index*4+3).y;}//hatch edge and hatch colorint DXFReader::getHatchLength(){    return f.hatchedges.count();}double DXFReader::getHatchx(int index){    return f.hatchedges.at(index).cx;}double DXFReader::getHatchy(int index){    return f.hatchedges.at(index).cy;}QString DXFReader::getHatchColor(int index){    return f.hatchcolors.at(index);}double DXFReader::getHatchRadius(int index){    return f.hatchedges.at(index).radius;}

上面程序我是设计成暴露给qml使用的数据,一边使用qml中的canvas来绘制cad数据

看看都出来的数据效果图:

clipboard.png

clipboard.png

到这里,这个实现方法有个缺点,就是使用了qml 中的canvas绘制数据,当把canvas进行缩放的时候,onpaint事件被响应,但是数据很多,所以缩放越大,消耗内存就越大,搞得有点卡顿,不过这方法的有点就是方便,省了很多时间。

关于dxflib的搭建,很简单,只需要在官网下载dxflib源码,用qt编译出dxflib.lib文件,然后用自己喜欢的方式放到指定目录,就可以使用了。

转载地址:http://tddox.baihongyu.com/

你可能感兴趣的文章
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
Shell编程基础
查看>>
Shell之Sed常用用法
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
博客搬家了
查看>>
Python中使用ElementTree解析xml
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
mysql多实例实例化数据库
查看>>
javascript 操作DOM元素样式
查看>>
HBase 笔记3
查看>>