已用ezfxf读取了一个dxf文件,请问如何用pyopenGL绘制出dxf文件中的模型,要可运行的程序。
可以将三点坐标参数转换为add_arc所需要的参数
代码如下,如有帮助,望采纳,一下,谢谢
以下是读取dxf文件 在这个程序中,读取了模型
void CJupiterView::OnFileInput()
{
// TODO: Add your command handler code here
FILE* fp,*fp2;
int i,k,j;
float tempX,tempY,tempZ;
float xMin,yMin,zMin,xMax,yMax,zMax,Max;
int lab;
char str1[20],str2[20],str[20],HT;
char myName[20];
int myNumber;
VERTEX tempVertex;
SEQUENCE tempSequence;
typedef struct {
float x,y,z,max;
}MAX;
MAX max;
HT=9;
objectNumber=getObjectNumber();
myData=new myVertex[objectNumber];
fp=fopen(FileName,"r");
i=0;
j=0;
k=0;
myNumber=-1;
strcpy(myName,"ObjectName");
while(! feof(fp) && ! ferror(fp))
{
fscanf(fp,"%s\n",str);
if(strcmp(str,"EXTMIN")==0) { fscanf(fp,"%s\n",str1); fscanf(fp,"%f\n",&xMin); fscanf(fp,"%s\n",str1); fscanf(fp,"%f\n",&yMin); fscanf(fp,"%s\n",str1); fscanf(fp,"%f\n",&zMin); } if(strcmp(str,"EXTMAX")==0)
{
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&xMax);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&yMax);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&zMax);
max.x=max(abs(xMax),abs(xMin));
max.y=max(abs(yMax),abs(yMin));
max.z=max(abs(zMax),abs(zMin));
max.max=max(max.x,max.y);
max.max=max(max.max,max.z);
}
if(strcmp(str,"VERTEX") ==0)
{
fscanf(fp,"%s\n",str1);
fscanf(fp,"%s\n",str1);
if(strcmp(myName,str1) != 0)
{
myNumber++;
strcpy(myName,str1);
strcpy((myData+myNumber)->obName,myName);
}
fscanf(fp,"%s\n",str2);
fscanf(fp,"%f\n",&tempX);
fscanf(fp,"%s\n",str2);
fscanf(fp,"%f\n",&tempY);
fscanf(fp,"%s\n",str2);
fscanf(fp,"%f\n",&tempZ);
fscanf(fp,"%d\n",&lab);
fscanf(fp,"%d\n",&lab);
if(lab == 192)
{
tempVertex.x=tempX / max.max;
tempVertex.y=tempY / max.max;
tempVertex.z=tempZ / max.max;
(myData+myNumber)->Vertex.Add(new CVertex(tempVertex));
}
if(lab == 128)
{
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&tempX);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&tempY);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&tempZ);
tempSequence.a=abs(tempX);
tempSequence.b=abs(tempY);
tempSequence.c=abs(tempZ);
(myData+myNumber)->Sequence.Add(new CSequence(tempSequence));
}
}
}
fclose(fp);
}
望采纳,谢谢
绘制 VERTEX, SEQUENCE和类CVertex, Csequence
。
typedef struct {
float x,y,z;
}VERTEX; 结构VERTEX用来存储点的坐标
typedef struct {
int a,b,c;
}SEQUENCE; 结构SEQUENCE用来存储实体的面的组成
typedef struct {
char obName[20]; 定义结构myVertex来存储实体的名字,点的坐标以及面的组成,
CObArray Vertex; 其中,点的坐标和面的组成是由聚合类CObArray定义的对象来
CObArray Sequence; 在存储的,我们可以把VERTEX结构和SEQUENCE结构加入到
}myVertex; 这两个对象中保存
class CVertex : public CObject
{ 因为CObArray类的对象中只能加入由CObject派生的对象,所以
protected: 我们还需要建立一个由CObject类派生的CVertex类。在CVertex类
CVertex(); 中有一个VERTEX结构的变量:m_vertex,信息实际上是存储在这
DECLARE_DYNCREATE(CVertex) 个变量中的。
virtual ~CVertex();
// Attributes
public: 我们还需要建立一个由CObject类派生的CVertex类。在CVertex类
CVertex(VERTEX& ver); 中有一个VERTEX结构的变量:m_vertex,信息实际上是存储在
这个变量中的,函数CVertex(VERTEX& ver)把VERTEX结构的变量
VERTEX m_vertex; 存入CObArray对象中。
};
class CSequence : public CObject
{ 这也是一个由CObject类派生的类,作用和刚才CVertex类一样,
protected: 只不过Csequence类是用来存储实体中面的组成(点序)的。
CSequence();
DECLARE_DYNCREATE(CSequence)
virtual ~CSequence();
public:
CSequence(SEQUENCE& sequ);
SEQUENCE m_sequence;
};
声明好结构与类后,我们还需要建立一个.CPP文件,来定义几个函数。
IMPLEMENT_DYNCREATE(CVertex,CObject)
CVertex::CVertex()
{
}
CVertex::~CVertex() 构造函数和销毁函数都是空的
{
}
CVertex::CVertex(VERTEX& ver)
{ 这个函数的作用是:把一个VERTEX结构的数据存入变量m_vertex中
m_vertex = ver; 它是这个类中最重要的一环。
}
IMPLEMENT_DYNCREATE(CSequence,CObject)
CSequence::CSequence()
{
} Csequence类的定义与CVertex类的定义差不多,只是其中的参数
m_sequence的类型和CVertex类中的参数my_vertex的类型不一样
CSequence::~CSequence()
{
}
CSequence::CSequence(SEQUENCE& sequ)
{
m_sequence=sequ;
}
然后用结构myVertex(如前所定义)定义一个指针*myData,目的在于根据模型中实体的
多少来给指针分配合适的内存,使之成为结构数组。
定义一个函数,用于确定模型中有多少个实体,函数的返回值就是实体的个数。
int CJupiterView::getObjectNumber()
{
char str1[10],str2[10];
char name[]="theFirst";
int num;
num=0;
FILE* fp;
fp=fopen("data.dxf","r"); 打开DXF文件,data.dxf
while(! feof(fp) && ! ferror(fp)) 这个函数是根据实体的名字来判断实体的个数的
{ 所以函数只读取实体的名字,一旦出现新的实体名字,
fscanf(fp,"%s\n",str1); 实体数就加一。
if(strcmp(str1,"VERTEX")==0)
{
fscanf(fp,"%s\n",str2); 打开DXF文件,data.dxf
fscanf(fp,"%s\n",str2) ;这个函数是根据实体的名字来判断实体的个数的
if(strcmp(name,str2) != 0) 所以函数只读取实体的名字,一旦出现新的实体名字,
{实体数就加一。
strcpy(name,str2);
num++;
}
}
}
fclose(fp);
return num;
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Site :
# @File : learn.py
# @Software: PyCharm
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import numpy as np
# 画圆
def circle(x, y, r, n):
theta = np.linspace(0, 2*np.pi, n)
x = x + r * np.cos(theta)
y = y + r * np.sin(theta)
return x, y
def plotfunc():
glClear(GL_COLOR_BUFFER_BIT) # 清除之前缓存
glPointSize(3.0) # 设置点大小
glColor3f(1.0, 0.0, 0.0) # 设置点颜色
glBegin(GL_POINTS) # 此次开始,设置此次画的几何图形
x, y = circle(0, 0, 1, 100)
for x_, y_ in zip(x, y):
glVertex2f(x_, y_)
glEnd() # 此次结束
glFlush() # 刷新屏幕
if __name__ == '__main__':
glutInit(sys.argv) #初始化
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) #设置显示模式
glutInitWindowPosition(100, 100) #窗口打开的位置,左上角坐标在屏幕坐标
glutInitWindowSize(900, 600) #窗口大小
glutCreateWindow(b"Function Plotter") #窗口名字,二进制
glutDisplayFunc(plotfunc) #设置当前窗口的显示回调
glClearColor(1.0, 1.0, 1.0, 1.0) # 设置背景颜色
gluOrtho2D(-5.0, 5.0, -5.0, 5.0) # 设置显示范围
glutMainLoop() # 启动循环