新旧坐标转换的问题
主要谈谈坐标转换问题……
要应用Python在CAD中需要两方面的知识,一是ActiveX Automation,这个是AutoCad中基础二次开发接口。ActiveX Automation标准是微软公司基于COM(组件对象模型)体系结构开发的一项技术,允许用户由一个Windows应用程序控制另一个Windows应用程序,实现数据共享,代替重复性的手工操作。用户可以选择合适的编程语言实现此功能,CAD中推荐采用的VBA(V……
在本科时候学过一门叫做《CAD二次开发》的课,这课应该是周一学的,一次性就是5节课。配套的书籍是清华出版社出的,讲的是用autolisp进行二次开发。这门课的考试方式是交一个大作业,就是编写的程序。当时做了一个绘制各国国旗的东西(参见绘制五星红旗,后来被一个学弟拿去作为他下一届的作业了,虽然我对于抄袭这种东西是向来不齿的)。理论上来说对于后来的工作起了一些帮助,例如在GAD那会儿也用这个编了好一些程序,甚至有些“不务正业”,后来也帮助同学解决了一些问题,如绘制弧形梁。但是为什么还是想着要抛弃autolisp呢?因为记也就这里用lisp语言,忆力实在没那么好了,好久不用以后再去看又得重新温习语法、数据格式等等;更重要的是确实用lisp写实在是有些繁琐,且不适合运算。趁着Python水平有所长进,想着用这个取代autolisp。而也确实已有人开发了相关模块。需要指出的是,这里的模块也可分为两个思路。一个是提供接口,即可以实时在Autocad中显示;另一种则是相当于写DXF格式的文件,如ezdxf模块。本文中所讲的是第一种。而对于第二种,自己也用过,以后有机会再讲(我想这种主要适用于与其他软件进行交互时,只需要直接生成所需要的图形)。
要应用Python在CAD中需要两方面的知识,一是ActiveX Automation,这个是AutoCad中基础二次开发接口。ActiveX Automation标准是微软公司基于COM(组件对象模型)体系结构开发的一项技术,允许用户由一个Windows应用程序控制另一个Windows应用程序,实现数据共享,代替重复性的手工操作。用户可以选择合适的编程语言实现此功能,CAD中推荐采用的VBA(Visual Basic for Applications);二是选用合适的Python模块。我采用的是pyautocad(参见pyautocad帮助文件)。需要指出的是pyautocad并不是太完善,其最新版本时0.2.0,但也已是2015年12月开发的了。一些数据格式不支持导致部分功能不能使用,所以更多的用途是在于:利用Python对数据的处理能力绘制复杂的、需要重复操作的图形,导出相关的数据至文件。
安装python模块通用的方法是在windows的cmd命令行窗口中输入
easy_install -U XX
或
pip install XX
这里XX即模块名。我们需要安装两个模块pyautocad和comtypes,值得注意的是若安装pyautocad模块时若使用pip或easy_install方法则comtypes模块是会自动安装的。 pyautocad有专门网站来讲解其用法:pyautocad.readthedocs.io,还可以从上下载pdf或html格式的帮助文件。对于没有接触过这个模块的而言建议先阅读该文件。
对于运行python编写的程序,和普通的没什么区别,只是需要打开至少一个CAD程序。
对于未安装有python的电脑而言编译成exe程序实用,其方法与一般Python程序编译无异。在cmd命令行窗口输入pyinstaller -F XX.py -w
来生成可执行文件(需要首先安装pyinstaller扩展包,后面的-w用于防止出现dos窗口)。(不过看起来文件挺大,相对于要完成的内容而言。)需要注意的是要将pyautocad包装入相同文件夹内。可以进一步的采用Autolisp语言startapp函数 (startapp "cad.exe"
)来执行编号的应用程序,从而可在cad里通过快捷键多次应用。
(defun c:函数名() ;;;自定义函数名
(startapp "cad.exe")
)
需要注意的是所编译的exe文件需要在cad支持的搜索路径里面。实践发现应用上述lisp执行时由于需要加载exe原因相对较慢。另外一个问题是所得到的程序相对很大,即使是采用虚拟环境只打包所需要的模块,也是有个好几十MPa。
按照惯例,第一个程序是HelloWorld。本程序也可以用于测试pyautocad能否运行。
# 版权©kiritanimirei.cn
# 2020年3月3日 星期二 天气阴
# 本程序用于在命令行输出HelloWorld
# 引入pyautocad模块
from pyautocad import Autocad
# 创建顶层实例对象
acad = Autocad(create_if_not_exists=True)
# 输出HelloWorld
U1 = acad.doc.Utility # 获得当前文档下Utility对象
U1.prompt( "HelloWorld\n" ) # 利用Utility对象下prompt命令输出
运行上述程序,将在cad命令栏输出 HelloWorld。
对于cad操作而言,更为重要的是绘制图形。后续将慢慢详细展开。