对于所有用cad画图的画图狗而言,单单绘制一个圆似乎并不是什么难事。点击命令栏,点击工具栏,直接输入快捷键。。。当看到这个标题时,画图狗们可能会嘲笑说Are you kidding me?!这个话题值得写一篇公众号?!!
作为非资深画图狗的小编来说,徒手画圈圈当然不在话下。但是,难道AutoCAD只提供给我们这样机械的操作?!是否能够有我们尚未发现领域值得我们去钻研一番?今天,小编就用画圈圈这个案例,和大家共同探讨一下在AutoCAD上做二次开发的N多种可能性。
一、LISP
LISP是一种通用高级计算机程序语言,长期以来垄断人工智能领域的应用。LISP作为因应人工智能而设计的语言,是第一个声明式系内函数式程序设计语言,有别于命令式系内过程式的C、Fortran和面向对象的Java、C#等结构化程序设计语言。
AutoLISP是由Autodesk公司开发的一种LISP程序语言,LISP是List Processor的缩写。通过autolisp编程,可以节省工程师很多时间。AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。
其中,仅利用AutoLisp语言进行二次开发绘制圆形,就有多种方法:
(一) COMMAND命令
通过cad界面下的tool-》autolisp-》visual lisp editor 打开AutoLisp二次开发的IDE。Lisp提供的一种特别简单的编程方法就是使用“command”命令。
在command命令下,只需要将你鼠标的操作流程在cad界面下序列化成为一串代码,就能够一次性完成一连串的操作。其缺点就是一次只能运行一个命令。
其绘制圆的代码如下:
(defun c:cir()
(setq point1 (getpoint)) ;define center point of the circle
(command “circle” point1 100 “”);command
)
将lisp文件保存,并拖入cad或通过netload命令加载,只需要简单的两行代码,就可完成一个圆的绘制。
(二) ENTMAKE命令
在lisp语言的视角下,每个cad图元都是一连串属性的集合。这种属性的集合被定义为实体组。每个实体组都拥有一串代码。让我们读取一个普通的圆的实体组代码:
((-1 . <Entity name: 7ff422e04d60>) (0 . “CIRCLE”) (330 . <Entity name: 7ff422e039f0>) (5 . “266”) (100 . “AcDbEntity”) (67 . 0) (410 . “Model”) (8 . “0”) (100 . “AcDbCircle”) (10 17.5337 30.5646 0.0) (40 . 100.0) (210 0.0 0.0 1.0))
其中,(0 . “CIRCLE”)代表实体组为圆,(10 17.5337 30.5646 0.0) 代表圆心。。。。只要阅读相关说明,就能读取每个实体组代码的含义。那么,我们是否能够在cad中利用相关的实体组来生成一个圆呢?entmake命令可以达到这个目的。
以下是利用entmake命令绘制圆的代码:
(defun c:cir()
(entmake ‘( (0 . “CIRCLE”) ;define circle
(62 . 1) ;define color
(10 0.0 0.0 0.0) ;define center
(40 . 50.0) ; define radius
)
)
)
还是先加载lisp,输入命令,大功告成。
(三)反应器
反应器是AutoCAD和用户的应用程序之间的简单链接,它允许用函数来响应发生在AutoCAD内的事件。例如可以创建反应器来通知用户的应用程序某个图元被删除。此时应用程序就会执行一些动作去响应这个事件。在窗体上的按钮是一个事件驱动程序的简单例子,它使用事件和响应来执行动作。当选择该按钮时,它就激活事件,就象信号或广播。该事件被反应器侦查到并通过使用被称为回调过程来执行作为结果的动作。
以下是利用反应器绘制圆的代码:
(defun c:cir()
(setq thisdrawing (vla-get-activedocument (vlax-get-acad-object))) ;get drawing object
(setq mspace (vla-get-modelspace thisdrawing));get model space
(setq pt1 (vlax-3d-point (getpoint “nCenter point: “)));define center of circle
(vla-AddCircle mspace pt1 50) ;add circle
)
二、VBA
Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。VBA同时也是AutoCAD的集成开发环境,VBA的加入扩展了AutoCAD的集成用户化能力。AutoCAD的开发环境也是一个可视化开发环境。
但是当我们尝试在AutoCAD中打开VBA的IDE时,却往往提示无相关程序。这是因为自AutoCAD2010以后,AutoCAD就取消了VBA的IDE界面。如果希望利用VBA来进行AutoCAD的二次开发,需要安装AutoCADVBAenabler,下载地址如下:
(1)http://www.autodesk.com/vba-download
(2)http://www.cad8.net/thread-12322-1-1.html
当安装完成后,重复之前的操作或者在cad命令行输入vbaide,于是就出现了如图所示cad界面下的VBA的IDE
这个界面和Excel中的VBA界面如出一辙。
是不是有点一筹莫展的感觉,输入F2,如下图所示,就会出现关于AutoCAD的VBA二次开发各个函数的路径。
下面就是利用VBA在AutoCAD中绘制圆形的代码:
Sub addcir()
Dim point1(0 To 2) As Double ‘define point1
Dim cir As AcadCircle ‘define circle object
point1(0) = 0 ‘define coordinate of point1
point1(1) = 0
point1(2) = 0
Set cir = ThisDrawing.ModelSpace.AddCircle(point1, 100)
End Sub
以下是绘制过程:
大功告成!
三、C#.NET
之于之前提及的VBA,VLisp,它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++,而这门语言非常的难学;VBA和VLisp虽然简单易上手,但它们对于开发大型的程序好象无能为力。那究竟有没有一种语言能结合它们的优点而尽量避免它们的缺点呢? 回答是肯定的,那就是微软新推出的21世纪编程语言C#。C#是通过AutoCAD ActiveX 这座桥梁来和AutoCAD之间进行通讯的。AutoCAD ActiveX 使用户能够从 AutoCAD 的内部或外部以编程方式来操作 AutoCAD。它是通过将 AutoCAD 对象显示到“外部世界”来做到这一点的。一旦这些对象被显示,许多不同的编程语言和环境就可以访问它们。关于AutoCAD ActiveX 的情况,大家可以参考AutoCAD自带的帮助。
关于C#对AutoCAD二次开发环境的说明:
由于AutoCAD的开发框架的不断升级,不同版本的CAD需要对应不同版本的netframework框架,相应的对应不同的Visual Studio。各个开发版本要求如下:
小编的开发环境是Visual Studio 2010版本以及AutoCAD 2012。
开发流程:
(1)在VS中创建类库。
(2)引用cad内部程序集,包括acdbmgd.dll、acmgd.dll、AcCui.dll和accoremgd.dll等。需要注意添加完引用后需要右键单击引用属性,将复制本地调整为false。
(3)设置目标框架与调试方法。选中项目右键属性。选择合适的外部程序(acad.exe)和合适的框架。
以下是利用C#.net绘制圆形的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace Autodesk
{
public class Class1
{
[CommandMethod(“Drawcir”)]
//定义画圆函数
public void Drawcir()
{
//获取当前活动图形数据库
Database db = HostApplicationServices.WorkingDatabase;
//定义圆心
Point3d stPoint = new Point3d(0, 0, 0);
//定义圆
Circle cir= new Circle(stPoint,Vector3d.ZAxis,100);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
//将圆添加至块表。该方法具有返回值,可返回实体对象的id
btr.AppendEntity(cir);
//将对象添加到事务处理中
tr.AddNewlyCreatedDBObject(cir, true);
//提交事务处理
tr.Commit();
}
}
}
}
需要特别注意其中橙色的添加引用的几段代码。
代码编写完成,在项目右键生成,相应的项目路径的bin文件夹下会生成该项目的dll文件。在cad中利用netload命令加载相关dll文件,就可以得到相关成果。
四、番外篇
除了以上各种方法外,CAD也还提供了C++,VB等二次开发的方式。下图所示为各种语言开发CAD的能力与学习的难度。
用编程的学习效率和易用性来说,各种编程语言各有所长所短。大家可以根据自己的需要,来选择不同的手段来进行相关的二次开发。单从各位手中珍藏的N多CAD插件来说,掌握一门AutoCAD的二次开发语言的效用显得不言而喻。用自己写的插件时的爽快感,比用探索者神马的,可大太多了!
参考文献:Wilson Wu 基于.NET的CAD二次开发(入门篇)结构乌托邦https://mp.weixin.qq.com/s/i2Ql_5-yI0Lv7ZpfByCYOw
往期精选: