辅助函数,用来进行辅助计算。
三、用Delphi3进行AutoCAD二次开发
-- --在AutoCADR14版的在线帮助中,对于AutoCADActiveXAutomation的使用有完整的说明,并有不少例子,但都是通过 VisualBasic来实现的。考虑到ActiveXAutomation的语言独立性,完全可以用Delphi来很好的实现它。下面我就在实现过程中的一些问题谈谈个人的体会。
----1、获取AutoCAD的Application和Document对象的实例。
----获取 AutoCAD的Application和Document对象的实例是对AutoCAD进行Automation开发的基础。在
VB中,可以通过 CreateObject和GetObject两个函数来取得实例句柄,而在Delphi中,相应的函数就变为CreateOleObject和 GetActiveOleObject。请看下面的程序:
procedureTForm1.FormCreate(Sender:TObject);
var
obj_Acad,obj_Doc: OleVariant;
begin
try
obj_Acad:=GetActiveOleObject('AutoCAD.Application.14');
except
obj_Acad:=CreateOleObject('AutoCAD.Application.14');
end;
obj_Acad.Visible:=True;
obj_Doc:=obj_Acad.ActiveDocument;
end;
-- --在上面的程序段中,在第三行定义了两个变量,分别为obj_Doc和obj_Acad,变量类型为OleVariant。OleVariant是 Delphi为提供完全OLE支持而提供的一种特殊的数据类型,可以用它来存储任何类型的数据。但大量的使用OleVariant会大大影响程序的运行速度,故此只有在必要时才使用它。
----从第五行开始连接AutoCAD.Application。首先,用函数 GetActiveOleObject来读取一个AutoCAD.Application的实例。当AutoCAD有实例处于运行状态时,这个函数会取到当前运行的AutoCAD的实例句柄,并把它赋值给obj_Acad;而当AutoCAD没有实例处于运行状态时,这个函数会抛出一个异常。此时,程序自动进入except开头的异常处理模块。
----在异常模块里,程序用函数CreateOleObject生成一个AutoCAD.Application的实例,并把它的实例句柄赋值给obj_Acad,从而完成与AutoCAD.Application连接的过程。
----接下来,利用AutoCAD.Application的Visibl
e属性把AutoCAD的窗口显示出来。然后,把活动
文档的对象句柄赋值给变量obj_Doc。这样,就完成了Application和Document对象实例的获取。
----另外,为了支持OleVariant数据类型,必须在Delphi的单元中(Unit)引入comObj单元和ActiveX单元。
----2、用
Delphi在AutoCAD的模型空间进行简单的图形绘制。
----有了Application和Document对象实例的句柄后,就可以对AutoCAD进行图形绘制了。在此,有一个技术点,即AutoCAD模型空间点的定义。
----在AutoCAD的模型空间中,点是按照三维坐标进行定义的,即一个点由三个双精度数组成的数组来定义。但由于Delphi是通过Automation和AutoCAD进行通讯的,所以不能直接向AutoCAD传双精度数。
----对于这一点,可以通过在程序中生成双精度的OleVariant数组来解决,如下所示:
var
pnt_Start: OleVariant;
pnt_End: OleVariant;
......
begin
pnt_Start:=VarArrayCreate([0,2],VT_R8);
pnt_End:=VarArrayCreate([0,2],VT_R8);
----VarArrayCreate函数中需要两个参数,第一个是需生成的数组的维数,第二个是数组中数据的类型,常量VT_R8代表8字节的实型数。相应的常量定义可以在单元ActiveX中找到。
----下面是用Delphi在AutoCAD模型空间里画一个圆心为(5.0,5.0,0),半径为2.5的圆的例子:
procedureTForm1.Button5Click(Sender:TObject);
var
obj_ModelSpace,obj_Acad: OleVariant;
pnt_Start: OleVariant;
begin
try
obj_Acad:=GetActiveOleObject
('AutoCAD.Application.14');
except
obj_Acad:=CreateOleObject('AutoCad.Application.14');
end;
obj_Acad.visible:=True;
obj_Model