读取
import dxfgrabber
inputFilePath='e:/test3-11/Drawing2.dxf' #输入文件的路径
dxf = dxfgrabber.readfile(inputFilePath)
#按图层访问
# for layer in dxf.layers:
# #print(layer.name,layer.color,layer.linetype)
# print("图层名:",layer.name)
lineNum=0
arcNum=0
#按图元访问
for e in dxf.entities:
if e.dxftype == 'LINE':
print ("Line",lineNum,e.start,e.end)
lineNum+=1
for e in dxf.entities:
if e.dxftype == 'ARC':
print ("arc",arcNum,e.center,e.radius,e.start_angle,e.end_angle)
arcNum+=1
怎么显示?
显示
python下的OpenGL:
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def drawFunc():
glClear(GL_COLOR_BUFFER_BIT)
glRotatef(1, 0, 1, 0)
glutWireTeapot(0.5)
glFlush()
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
glutCreateWindow("teaPot")
glutDisplayFunc(drawFunc)#回调函数
glutIdleFunc(drawFunc)#回调函数
glutMainLoop()
运行结果:
完善点以后长这样:
import dxfgrabber
import math
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
inputFilePath='e:/test3-11/Drawing1.dxf' #输入文件的路径
#供读取的数据结构
class Line:
def __init__(self,id,start,end):
self.id=id
self.start=start
self.end=end
LINELIST=[]
class Arc:
def __init__(self,id,center,radius,startAngle,endAngle) -> None:
self.id=id
self.center=center
self.radius=radius
self.start_angle=startAngle
self.end_angle=endAngle
pass
ARCLIST=[]
#读取
dxf = dxfgrabber.readfile(inputFilePath)
lineNum=0
arcNum=0
for e in dxf.entities:
if e.dxftype == 'LINE':
LINELIST.append(Line(lineNum,e.start,e.end))
lineNum+=1
elif e.dxftype=='ARC':
ARCLIST.append(Arc(arcNum,e.center,e.radius,e.start_angle,e.end_angle))
arcNum+=1
#显示——OpenGL
def init():
glClearColor(0.3, 0.3, 0.3, 1.0)
gluOrtho2D(0, 400.0, 0, 400)#窗口坐标系的大小,左下角是原点
def drawFunc():
glClear(GL_COLOR_BUFFER_BIT)
#绘制所有直线
glBegin(GL_LINES)
for line in LINELIST:
glVertex2f(line.start[0],line.start[1])
glVertex2f(line.end[0],line.end[1])
glEnd()
#用描点的形式绘制所有弧线
glBegin(GL_POINTS)
for arc in ARCLIST:
start_angle=arc.start_angle/180.0*math.pi
end_angle=arc.end_angle/180*math.pi
#认为开始的弧度小,结束的弧度大
if start_angle>end_angle:
temp=start_angle
start_angle=end_angle
end_angle=temp
dAngle=end_angle-start_angle
#pointNum=int(end_angle-start_angle)#一个角度一个点
pointNum=500#一个弧500个点
for i in range(0,pointNum):
x=arc.center[0]+arc.radius*math.cos(start_angle+dAngle*i/pointNum)
y=arc.center[1]+arc.radius*math.sin(start_angle+dAngle*i/pointNum)
glVertex2f(x,y)
glEnd()
glFlush()
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
glutCreateWindow("teaPot")
glutDisplayFunc(drawFunc)#回调函数
glutIdleFunc(drawFunc)#回调函数
init()
glutMainLoop()
很明显这个圆弧画的不正常
拿个简单的来测试一下
更不正常,互补……
再来一个
突然又正常了……
又一次
也许,起始角度数大于结束角度数,就会颠倒。为什么?哪里不对?
观察CAD绘制圆弧的过程,发现——圆弧都是从起点到终点,顺时针转的;所以,dAngle只取正值就行了
import dxfgrabber
import math
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
inputFilePath='e:/test3-11/Drawing1.dxf' #输入文件的路径
#供读取的数据结构
class Line:
def __init__(self,id,start,end):
self.id=id
self.start=start
self.end=end
LINELIST=[]
class Arc:
def __init__(self,id,center,radius,startAngle,endAngle) -> None:
self.id=id
self.center=center
self.radius=radius
self.start_angle=startAngle
self.end_angle=endAngle
pass
ARCLIST=[]
#读取
dxf = dxfgrabber.readfile(inputFilePath)
lineNum=0
arcNum=0
for e in dxf.entities:
if e.dxftype == 'LINE':
LINELIST.append(Line(lineNum,e.start,e.end))
lineNum+=1
elif e.dxftype=='ARC':
ARCLIST.append(Arc(arcNum,e.center,e.radius,e.start_angle,e.end_angle))
arcNum+=1
#显示——OpenGL
def init():
glClearColor(0.3, 0.3, 0.3, 1.0)
gluOrtho2D(0, 400.0, 0, 400)#窗口坐标系的大小,左下角是原点
def drawFunc():
glClear(GL_COLOR_BUFFER_BIT)
#绘制所有直线
glBegin(GL_LINES)
for line in LINELIST:
glVertex2f(line.start[0],line.start[1])
glVertex2f(line.end[0],line.end[1])
glEnd()
#用描点的形式绘制所有弧线
glBegin(GL_POINTS)
for arc in ARCLIST:
start_angle=arc.start_angle/180.0*math.pi
end_angle=arc.end_angle/180*math.pi
#CAD里,圆弧都是从起点到终点,顺时针转的;所以,这里只取正值
dAngle=abs(end_angle-start_angle)
pointNum=500#一个弧500个点
for i in range(0,pointNum):
x=arc.center[0]+arc.radius*math.cos(start_angle+dAngle*i/pointNum)
y=arc.center[1]+arc.radius*math.sin(start_angle+dAngle*i/pointNum)
glVertex2f(x,y)
glEnd()
glFlush()
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
glutCreateWindow("teaPot")
glutDisplayFunc(drawFunc)#回调函数
glutIdleFunc(drawFunc)#回调函数
init()
glutMainLoop()
好像正常了
可能,电脑快到头了。程序稍微多一点,就卡了起来。
原来它只有物理4核……一直以为有8核来着……4核心8线程啊……