1-第一个pyautocad程序

2020年03月03日 星期二

要应用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对数据的处理能力绘制复杂的、需要重复操作的图形,导出相关的数据至文件。

1.1 安装

​ 安装python模块通用的方法是在windows的cmd命令行窗口中输入

easy_install -U XX

 pip install XX

这里XX即模块名。我们需要安装两个模块pyautocad和comtypes,值得注意的是若安装pyautocad模块时若使用pip或easy_install方法则comtypes模块是会自动安装的。 pyautocad有专门网站来讲解其用法:pyautocad.readthedocs.io,还可以从上下载pdf或html格式的帮助文件。对于没有接触过这个模块的而言建议先阅读该文件。

1.2 运行​

​ 对于运行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。

1.3 第一个程序

按照惯例,第一个程序是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。

helloworld

对于cad操作而言,更为重要的是绘制图形。后续将慢慢详细展开。

下一篇:2-对象结构与数据类型


2020年3月3日 星期二 天气阴

精选博客

新旧坐标转换的问题

主要谈谈坐标转换问题……

继 续 阅 读

关于几个长辈的故事

晚上10点妈打电话过来。这么晚接起电话总让人会有些担忧。无非两种事,一是介绍对象,二是亲人去世。是的,八点多爷爷过世了。说起来这是个可以预期的事,毕竟在国庆90虚岁生日后摔了一跤后已经躺床上差不多一个多月了。那会,爷爷和来吃饭的自己的亲妹妹说,大概这是他们俩最后一次见面了。而至此,外公外婆,爷爷奶奶皆已去了另外一个世界。对于爸妈而言是一件更为悲伤的事(如同机器猫里说道:再也没有比他们更大的了。……

继 续 阅 读

振型分解反应谱应用

在本文中主要讲两个问题: (1)抗规中振型分解反应谱法的推导; (2)考虑扭转耦联是怎么回事。 振型分解法中得到了以下公式:……

继 续 阅 读