1、这是一份关于PyCad的帮助文件,PyCad是明经论坛.net板块版主雪山飞狐开发的基于IronPython和C#的用于AutoCAD的二次开发工具。主要受众群体为闷骚的Pyer,以及被Pyer们蛊惑来的Lisper和c#er们。该项目已经开源,并发布于GitHub。该项目目前只能用于AutoCad2012-2016,在可预期的未来会支持更多的cad版本和更多的cad平台。本文档作者:落魄山人使用python语言编写插件。相对lisp而言,可以使用.net的强大api,实现各种酷炫功能。相对c#及arx而言,python语言的语法简单,入门快。自带编辑器,自动编译,自动加载
2、。已经内置一些基本的根对象,可以直接使用。内置一些常用的函数及装饰器,简化代码编写。在项目地址直接下载NFox.Python.dll文件打开AutoCad,用netload命令加载NFox.Python.dll加载成功后,在命令行键入pye命令可打开编辑器c#部分是逐个加载debug或者release目录下的包用顶层包加载命令的编辑器会自动编译python代码,关闭编辑器后会自动加载到cad,可以直接在命令行运行你的自定义命令。在键入pye命令后打开编辑器,编辑器默认界面如下:PyCad工具帮助文档项目特点工具使用加载运行编辑器编辑器界面分为工具栏、
3、编辑区、项目管理器区、python命令行区工具栏四个按钮,分别为保存、全部保存、撤销、重做对应的功能分别为保存当前文档、保存全部文档、撤销编辑、重做编辑编辑区主要为编写代码的区域,可以自动提示、自动缩进(这个很重要,python是靠缩进来区分语句的作用域的)、自动行号等项目管理区主要为项目管理功能,项目管理区内鼠标右键,可以实现新建,删除等操作。项目管理器类似于vs的项目管理,一个文件夹表示一个项目(对应于python的概念为包),每个文件下的py文件为模块。为了更好的组织包的组织结构,项目里还可以有文件夹。python命令行其实是一个python的解释器,可以直接执行
4、python代码,并即时输出结果。主要用于调试某些单行代码,验证某些代码等等。pycad编辑器是一个全新的工具,为了便于使用以及入门,作者已经在编辑器中集成了一些基本的python模块以及示例代码。这里在默认的编辑器界面里的项目管理区可以看到,主要为两个项目,一个为pycad项目一个为pytest项目。pycad项目为作者已经写好的一些基本的python模块,封装了一些基本的对象。pytest项目有创建命令、lisp函数、面板的例程。在讲解具体的代码之前,还是说说关于python的包管理吧,也就是说python代码文件的组织结构是什么样的。在计算机程序的开发过程中,随着程
5、序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。使用模块有什么好处?最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我
6、们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。点这里查看Python的所有内置函数。你也许还想到,如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:工具使用小贴士python包管理引
7、入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。请注意,每一个包目录下面都会有一个_init_.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。_init_.py可以是空文件,也可以有Python代码,因为_init_.py本身就是一个模块,而它的模块名就是mycompany。类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:文件www.py的模块名就是mycompa
8、ny.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。mycompany.web也是一个模块,请指出该模块对应的.py文件。经过这个讲解,对于包管理应该是有一个了解了,同时对于pycad编辑器的项目管理也能看的懂了。在项目管理器里点击pytest,在左边的编辑区里会出现代码,看过上面关于包管理的介绍后,这里你会有疑问了,为啥这里会有代码呢?不是说这个pytest就是个文件夹吗?很好,这个问题很容易就会出现疑问,因为这里显示的其实是_init_.py的内容。通常呢,_init_.py文件是不建议写功
9、能代码的,要么偷懒为空文件,要么写一些初始化的代码来对包和包含的模块进行一些初始化的设置。但是作者偏偏在这个文件里写了具体的代码,怪我咯。pytest包的_init_.py文件的内容如下:pytest代码示例讲解pytest1frompycad.systemimport*2frompycad.runtimeimport*3importcmds45command()6defmylayer():7withdbtrans(True)astr:8tr.addlayer(1)第一、二行,导入模块,语法:fromxxximport
10、yyy,表示从xxx包里导入yyy模块,这里的yyy可以是*号,表示把xxx包里的模块全部导入。第一行和第三行的区别自行百度。第三行,导入模块,语法:importxxx,注意python的语句结尾是没有分号的,从c类语言转过来的选手们,都习惯在句末加分号。这个导入模块相当于c#里的using。第五行,装饰器语法,表示下面是定义一个命令,这个command是自定义的,具体代码见pycad.system包里的decorators模块里的command类。相同的还有lisp(),表示定义一个lisp函数;panel(),表示定义一个面板;showtime(),表示在调用函数
13、提交,所以dbtrans(True)的意思就是提交事务。第三个参数表示数据库,默认为不存在。第四个参数为文件名,默认不存在。第五个参数为是否创建数据库。dbtrans这个类返回的就是一个事务管理器实例。那么这个dbtrans到底神奇在哪里呢?答案是神奇在可以在使用with语句时调用,而我们写的其他函数也好,类也好却不能在with语句调用,原因就是这个类里定义了两个很神奇的函数,_enter_和_exit_,有了这两个函数,才能被with调用。至于为什么这么神奇,请自行百度。在python里看见左右两个下划线包起来的函数,有个专有名词叫魔术方法,请自行百度。addlayer这个函数是在dbtrans类里定义的一个方法,封装了添加图层的操作。其他的就没什么了,这个pytest包的_init_.py文件就讲解完毕。这个模块没啥说的,都是python的基本操作数据库的语法,自行百度吧。这三个都是写对话框用的,需要说明的是:importclrclr.AddReference(System.Windows.Forms)