您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > AutoCAD多段线定点坐标获取Python脚本
AutoCAD多段线定点坐标获取Python脚本先前已经讨论过使用Python操作AutoCAD的方法,Python的确是最适合编写批处理脚本的语言,但是AutoCAD中只提供Autolisp和VBA的支持,尽管有VBA就有COM在,但是pywin32处理com时会有一点冲突,使得输入的坐标list类型不能正常的转化为AutoCAD坐标,故在先前的方案中python操作AutoCAD的能力受到了很大限制,基本不能用来在AutoCAD直接绘图,只可进行一些不涉及坐标的操作,例如打印操作等。先前也提出了一些对策,这里总结一下,一个继续使用CPython+dxflibrary,后者是为blend开发的库文件,读者可以google一下python+dxflibrary+blend得之,实际上它仅有一个py文件,编写脚本时可以调用该py文件完成一些基本绘图操作生成dxf,该dxf的版本较旧,没记错的话估计还是r12版本,但本着够用就好,反正基本的直线,圆圈,多段线,文字的功能都有。另一个方案使用.Net平台下的ironpython,后者在AutoCAD2007后引入,.Net如今已是AutoCAD下重要的开发平台,基于.Net可以使用C#、VB.Net等开发,也包括ironpython,不过后者先要用C#写一个库用来引导,这个在through-the-interface的官方博客里可以找到。不过对比VBA来说,AutoCAD中.Net的API模型就要复杂得多,很多简单的应用都要事务操作,这一点一直让偶很不爽。今天偶然搜到使用comtypes库操作AutoCAD的例子,所以对源程序改动了一下做实验,顺利通过。这里的例子是使用python调用AutoCAD的COM对象,获取AutoCAD中的多段线的点坐标,然后通过COM将坐标绘制成表格显示,这些步骤都是在CAD中完成。以后就可以通过此法来写AutoCAD的脚本了,优越之处无需多说,这里使用的测试平台是AutoCAD2010,Python2.5.4,comtypes0.6.2,WindowsVista。补充一点:单位里的机器使用的平台是AutoCAD2004,Python2.5.4,comtypes0.6.2,WindowsXP。运行代码时会发生错误,经过摸索,发现问题集中在C:\Python25\Lib\site-packages\comtypes\tools目录下tlbparser.py文件第304、305行:-------------------------------------------------ifdocisnotNone:itf.doc=str(doc.split(\0)[0])-------------------------------------------------这里不能正确处理AutoCAD返回的中文字符,出现ASCII错误,偶在这里改为-------------------------------------------------------------ifdocisnotNone:itf.doc=str(doc.split(\0)[0].split()[0])-------------------------------------------------------------滤去空格后的中文字符,至今未发生问题,可供参考。附使用pywin32+dxflibrary的版本:##-*-coding:gb2312-*-##Author:TonyStinger##Date:2010-7-3###本程序获取cad中一系列坐标##importwin32com.client#acad=win32com.client.Dispatch(AutoCAD.Application)##doc=acad.ActiveDocument#Documentobject##ms=doc.ModelSpace#Modelspacecollection##count=ms.Count#Numberofitemsinmodelspace##utility=doc.Utility##input=raw_input(在Autocad中获取坐标...[point(p)/pline(l)])##points=[]##ifinputin['P','p']:#points.append(['x','y','z'])#whileTrue:#try:#pt=utility.GetPoint()#promptstr=point+str(len(points)+1)+:+str(pt)#utility.prompt(promptstr)#printpt#points.append(pt)#except:#break#elifinputin['L','l']:#points.append(['x','y'])#whileTrue:#try:#ent=utility.GetEntity()#coord=ent[0].Coordinates#promptstr=point:+str(coord)#utility.prompt(promptstr)#foriinrange(len(coord)/2):#pt=[coord[i*2],coord[i*2+1]]#printpt#points.append(pt)#except:#break#else:#exit()##input=raw_input(是否保存到csv文件?[Y/N])##ifinputin['Y','y']:#importcsv#writer=csv.writer(open(points.csv,wb))#writer.writerows(points)##input=raw_input(是否到出dxf文件?[Y/N])##ifinputin['Y','y']:###读取数据##importcsv##reader=csv.reader(open(points.csv,rb))##points=[]##forrowinreader:##points.append(row)###绘制表格#importdxfLibrary#dxf=dxfLibrary.Drawing()#dxf.styles.append(dxfLibrary.Style(name='Standard',font='Standard',bigFont='Standard'))##vspace=6.4#垂直间距#hspace=[0]#水平间距#foriinrange(len(points[0])):#hspace.append(hspace[-1]+max(max(map(len,map(str,zip(*points)[i])))*2.2,8)+4)###绘制表格底线#dxf.append(dxfLibrary.Line(points=[(0,0,0),(hspace[-1],0,0)]))##绘制表格线及内容#forrowIndexinrange(len(points)):#dxf.append(dxfLibrary.Line(points=[(0,(rowIndex+1)*6.4,0),(hspace[-1],(rowIndex+1)*6.4,0)]))#forcolIndexinrange(len(points[rowIndex])):#ifpoints[rowIndex][colIndex]!='':#dxf.append(dxfLibrary.Text(points[::-1][rowIndex][colIndex],point=(hspace[colIndex]+2,rowIndex*6.4+1.5,0),height=4,style='sepd_table'))##绘制表格侧线#forcolIndexinrange(len(hspace)):#dxf.append(dxfLibrary.Line(points=[(hspace[colIndex],0,0),(hspace[colIndex],len(points)*6.4,0)]))##dxf.saveas('table.dxf')使用comtypes的版本:##-*-coding:gb2312-*-##Author:TonyStinger##Date:2010-7-3##Update:2010-7-17###本程序获取cad中一系列坐标##本程序使用comtypes在AutoCAD内调用COM操作##importcomtypes.client#acad=comtypes.client.GetActiveObject(AutoCAD.Application)#importarray##doc=acad.ActiveDocument#Documentobject#ms=doc.ModelSpace#Modelspacecollection#utility=doc.Utility##input=str(utility.GetString(True,在Autocad中获取坐标...[point(p)/pline(l)]))##points=[]##ifinputin['P','p']:#points.append(['x','y','z'])#whileTrue:#try:#pt=utility.GetPoint()#promptstr=point+str(len(points)+1)+:+str(pt)#utility.prompt(promptstr)#printpt#points.append(pt)#except:#break#elifinputin['L','l']:#points.append(['x','y'])#whileTrue:#try:#ent=utility.GetEntity()#coord=ent[0].Coordinates#promptstr=point:+str(coord)#utility.prompt(promptstr)#foriinrange(len(coord)/2):#pt=[coord[i*2],coord[i*2+1]]#printpt#points.append(pt)#except:#break#else:#exit()##input=str(utility.GetString(True,是否保存到csv文件?[Y/N]))##ifinputin['Y','y','']:#importcsv#file=open(points.csv,wb)#writer=csv.writer(file)#writer.writerows(points)#file.close()##input=str(utility.GetString(True,是否在CAD中绘制表格?[Y/N]))##ifinputin['Y','y','']:##设置字体#fontStyle=doc.TextStyles.Add('Standard')#doc.ActiveTextStyle=fontStyle###获取基点坐标#utility.prompt(输入基点坐标!)#basePt=utility.GetPoint()##vspace=6.4#垂直间距#hspace=[0]#水平间距#foriinrange(len(points[0])):#hspace.append(hspace[-1]+max(max(map(len,map(str,zip(*points)[i])))*2.2,8)+4)###绘制表格底线#ms.AddLine(array.array('d',[basePt[0]+0,basePt[1]+0,0]),array.array('d',[basePt[0]+hspace[-1],basePt[1]+0,0]))##绘制表格线及内容#forrowIndexinrange(len(p
本文标题:AutoCAD多段线定点坐标获取Python脚本
链接地址:https://www.777doc.com/doc-4443967 .html