DXF文件读取

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
objectNumber.Add(Entity);//添加新的实体 } else {
objectNumber.Add(Entity);//第一个实体的顶点开始位置肯定是在顶点序列的第 0 个位 置
objectNumber.Add(Entity);//为后面的实体先开辟个值来记录, } continue; }
v1[0]=vertexArray.GetAt(tempSequence.a+objectNumber.GetAt(i).VertexNumber).x; v1[1]=vertexArray.GetAt(tempSequence.a+objectNumber.GetAt(i).VertexNumber).y; v1[2]=vertexArray.GetAt(tempSequence.a+objectNumber.GetAt(i).VertexNumber).z;
fscanf(fp, "%s\n ",str2); fscanf(fp, "%f\n ",&tempY);
fscanf(fp, "%s\n ",str2); fscanf(fp, "%f\n ",&tempZ);
tempVertex.x=tempX;//max.max; tempVertex.y=tempY;//max.max; tempVertex.z=tempZ;//max.max; vertexArray.Add(tempVertex); if (objectNumber.GetSize()>0) {
int a,b,c,d; }; //结构 SEQUENCE 用来存储实体的面的组成,记录的是 4 个顶点在顶点序列《vertexArray》中的位置
struct ENTITY {
int VertexNumber;//实体顶点在顶点序列中开始开始的位置 int SequenceNumber;//实体在面系列中开始的位置 }; class CLoadDXF { public: void ShowDXF(float x,float y,float z,float size,float R,float G,float B); void OnFileInput(char* filename); CLoadDXF(); virtual ~CLoadDXF(); private: void norm(GLfloat v1[], GLfloat v2[], GLfloat v3[], GLfloat *nor);
v3[0]=vertexArray.GetAt(tempSequence.c+objectNumber.GetAt(i).VertexNumber).x; v3[1]=vertexArray.GetAt(tempSequence.c+objectNumber.GetAt(i).VertexNumber).y; v3[2]=vertexArray.GetAt(tempSequence.c+objectNumber.GetAt(i).VertexNumber).z;
j=objectNumber.GetAt(i).SequenceNumber; if (i==(objectNumber.GetSize()-2)) {
while (j<sequenceArray.GetSize()) {
tempSequence.a=sequenceArray.GetAt(j).a-1; tempSequence.b=sequenceArray.GetAt(j).b-1; tempSequence.c=sequenceArray.GetAt(j).c-1; tempSequence.d=sequenceArray.GetAt(j).d-1;
//在显示模型时,第三个是应该废弃不要去引用的
while(!feof(fp)&&!ferror(fp)) {
fscanf(fp, "%s\n",str); if (strcmp(str,"POLYLINE")==0)//根据 POLYLINE 来判断是否是新实体 {
ENTITY Entity; Entity.VertexNumber=0; Entity.SequenceNumber=0; if (objectNumber.GetSize()>0) {
void CLoadDXF::ShowDXF(float x, float y, float z, float size, float R, float G, float B) {
VERTEX tempVertex; SEQUENCE tempSequence; float v1[3],v2[3],v3[3],v4[3];//用来求法向量
if(strcmp(str, "VERTEX") ==0) {
while (1) {
fscanf(fp, "%s\n",str); if (strcmp(str,"AcDbPolyFaceMeshVertex")==0)//读取顶点,记录到顶点序列中 {
fscanf(fp, "%s\n ",str2); fscanf(fp, "%f\n ",&tempX);
fp=fopen(filename, "r"); //示例:假如有两个实体,第二个实体开始的面是第 8 个,顶点是第 90 个,那么就会有 //objectNumber.GetSize==3 //objectNumber.GetAt(0).VertexNumber==0 //objectNumber.GetAt(0).SequenceNumber==0
};
//CLoadDXF.cpp #include <afxtempl.h> CArray<VERTEX,VERTEX> vertexArray;//顶点坐标系列 CArray<SEQUENCE,SEQUENCE> sequenceArray;//面系列 CArray<ENTITY,ENTITY>objectNumber;//新实体开始的顶点位置 //例如有两个实体 ,第一个实体 的顶点开始 在第 0 个顶点,第 二个实体的顶 点开始在 第 8 个,则 objectNumber.GetAt(0)==0,objectNumber.GetAt(0)==8
v2[0]=vertexArray.GetAt(tempSequence.b+objectNumber.GetAt(i).VertexNumber).x; v2[1]=vertexArray.GetAt(tempSequence.b+objectNumber.GetAt(i).VertexNumber).y; v2[2]=vertexArray.GetAt(tempSequence.b+objectNumber.GetAt(i).VertexNumber).z;
fscanf(fp, "%s\n",str1); fscanf(fp, "%f\n",&tempZ);
fscanf(fp, "%s\n",str1); fscanf(fp, "%f\n",&tempD);
tempSequence.a=abs(tempX); tempSequence.b=abs(tempY); tempSequence.c=abs(tempZ); tempSequence.d=abs(tempD);
temp.VertexNumber=objectNumber.GetAt(objectNumber.GetSize()-1).VertexNumber; objectNumber.SetAt((objectNumber.GetSize()-1),temp);
} break; } }
}
} fclose(fp); }
DXF 文件读取
作者:不忍之刃 He_zhiyuan
EMAIL:cb2688he2688@ 2010-10-14
近来因为要做个项目,涉及到要做个 DXF 文件的读取。网上搜索 DXF 文件的文件结构, 还搜索到一篇讲读取 DXF 文件的文章,相信来搜索读取 DXF 方面的人,一定会搜索到这篇 文章的。但这篇文章里面附的源代码是有问题的。我用 AUTOCAD 可以导出 3 种版本的 DXF
glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属实性 glDisable(GL_TEXTURE_2D); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);//启动双面光照 glPushMatrix(); glTranslatef( x, y, z); glScaled(size,size,size); glColor3f(R,G,B); int i,j; for (i=0;i<(objectNumber.GetSize()-1);i++) {
鉴于这么多,我自己写了个类来实现 DXF 文件的读取。且使用了 OPENGL 来做显示模 型。列出如下:
//CLoadDXF.h #include <math.h> struct VERTEX {
float x,y,z; }; //结构 VERTEX 用来存储点的坐标 struct SEQUENCE {
CLoadDXF::LoadDXF() { }
CLoadDXF::~CLoadDXF() {
}
void CLoadDXF::OnFileInput(char *filename) {
// TODO: Add your command handler code here FILE *fp,*fp2; float tempX,tempY,tempZ,tempD; char str1[20],str2[20],str[20]; VERTEX tempVertex; SEQUENCE tempSequence;
sequenceArray.Add(tempSequence); if (objectNumber.GetSize()>0) {
ENTITY temp;
temp.SequenceNumber=objectNumber.GetAt(objectNumber.GetSize()-1).SequenceNumber+1;//记录当前实 体的顶点数目
} break; } if (strcmp(str,"128")==0)//记录实体面的顶点在顶点序列中的位置 { fscanf(fp, "%s\n",str1); fscanf(fp, "%f\n",&tempX);
fscanf(fp, "%s\n",str1); fscanf(fp, "%f\n",&tempY);
文件
。我先用 AUTOCAD 画个简单的长方体,
然后用记事本打开导出来的三种版本的文件,发现很不一样,跟那篇文章里面描述的也不一 样,用那篇文章里面源代码的方法是没办法读取的。然后我又用 3DMAX 导出 DXF 文件, 才有正常的实体的“顶点”系列,实体的面系列,“面”里面记录的面上各个顶点在顶点系 列中的位置。但我用 3DMAX 导出来的 DXF 文件里面,面是有 4 个顶点组成的四边形,而 不是三角面片,所以这也跟那篇文章讲的不一样。
//objectNumber.GetAt(0).VertexNumber==90 //objectNumber.GetAt(0).VertexNumber==8
//objectNumber.GetAt(0).VertexNumber==0 //objectNumber.GetAt(0).VertexNumber==0
ENTITY temp;
temp.VertexNumber=objectNumber.GetAt(objectNumber.GetSize() -1).VertexNumber+1;// 记 录 当 前实 体 的 顶点数目
temp.SequenceNumber=objectNumber.GetAt(objectNumber.GetSize()-1).SequenceNumber; objectNumber.SetAt((objectNumber.GetSize()-1),temp);
相关文档
最新文档