使用delphi开发AutoCAD的入门级问题(整理添加中)
本帖最后由 作者 于 2004-12-25 21:50:00 编辑 <br /><br /> 用Delphi开发AutoCAD的人很少,资料也很难找,我集中开个帖子,望高手不吝赐教,以惠后来人。以下未特殊说明均指Delphi7+AutoCAD2004中文版1、引入AutoCAD类型库的目的是什么?<BR>2、引入AutoCAD类型库的正确步骤是什么?<BR>(1)对于AutoCAD2004中文版,project->import type library,初始情况下AutoCAD类型库并不在列表内,需要add的文件是不是 "C:\Program Files\Common Files\Autodesk Shared\acax16chs.tlb"?<BR>(2)add后列表内高亮出现AutoCAD 2004类型库(Version 1.1),选install还是create unit?<BR>(3)如果选install,弹出package dclusr窗口,是否compile?<BR>(4)引入类型库是否只需进行一次,以后新建Application时只要uses AutoCAD_tlb就行了? 1、目的是可以前期绑定变量,如果不是的话,就要把cad应用程序变量定义为变体类型,那在编程的时候就没有帮助提示了!
2、只要看到cad类型库就行了,两个都可以,选install是安装包文件,选create unti是将cad类型库存盘为delphi单元文件.pas,以后在uses语句中引用这个文件就可以用cad的类型了,例如:var app:acadapplication; app. 输入点号后就有帮助提示了,跟vb一样的! 本帖最后由 作者 于 2004-12-28 9:44:40 编辑 <br /><br /> 下面为一个最基本的范例,可以运行,但有不少问题,请赐教
unit Unit1;
interface
uses<BR> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<BR> Dialogs, StdCtrls,AutoCAD_TLB,ComObj; //除了缺省的,引用了AutoCAD_TLB和ComObj
type<BR> TForm1 = class(TForm)<BR> Button1: TButton;<BR> procedure Button1Click(Sender: TObject);<BR> private<BR> { Private declarations }<BR> public<BR> { Public declarations }<BR> end;
var<BR> Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);<BR>var<BR> Acad, vPoint: OleVariant;<BR> Mspace : IAcadModelSpace; //1、对象类型为何比VBA的多出一个"I"?统统以此类推?<BR> Circle : IAcadCircle;<BR>begin<BR> try<BR> acad:=getActiveOleObject('AutoCAD.Application.16');<BR> except<BR> acad:=CreateOleObject('AutoCAD.Application.16'); //2、如果AutoCAD未运行的话会出错,提示如下图,为什么这个语句并没有起作用?<BR> end;<BR> vPoint := VarArrayCreate(, VarDouble ); //3、原例VarDouble为VT_R8,编译通不过,VT_R8在哪定义的?<BR> vPoint := 2.0; vPoint := 4.0; vPoint := 0.0;<BR> acad.visible:=True; //4、为什么没有象希望的将AutoCAD窗口提到最前面?<BR> Mspace := IDispatch(Acad.ActiveDocument.ModelSpace) as IAcadModelspace;<BR> Circle := IDispatch(Mspace.AddCircle(vPoint, 10.0)) as IAcadCircle;<BR> Circle.Update;<BR>end;
end.
1、第一个问题不好意思,我还是刚开始学CAD二次开发,对CAD的类型不太了解!
2、你的except语句少了一个冒号啊,不知道是不是这个原因!
3、你是想定义一个数组吧?为什么不一开始用array of double 来声明呢?
4、你说你编译通不过,怎么可以往下执行呢?
我回去再看看!我还没用DELPHI连接过CAD呢!让我试试看!最近忙得不可开交,我画图画疯啦,晕! laoliu09真乃热心人!
找了本深入一点的delphi书,好多问题涉及com矫妫局饰侍馐俏业膁elphi水平不够。
1、查看AutoCAD_TLB会明白不少
2、还不懂
3、如果要使用VT_R8,应当uses ActiveX
4、最痛苦的是这个问题解决不了。
另外说一句,上述代码完全实现了有关AutoCAD对象的代码提示。
不好意思,我记错了,except后面没有冒号,你是在调试阶段运行你的程序的吧?那发生错误的时候是会这样提示的,只要按F9就可以退出程序了,我也试过的!当你的程序正确,直接运行.exe文件时就不会出现这个问题了!!!
另外,希望你连接成功CAD的时候把连接的方法告诉我,我的水平也有限啊!
我有时间就试试看!最近实在太忙啦!呵呵!
验证了一下,问题2的确只有在调试期间才会出现,不知为什么。
问题4是这样的:如果通过本程序启动AutoCAD,可以实现CAD窗口在最上方,但是如果之前AutoCAD已经运行起来了,如何能够将CAD窗口置前呢?
说明一下,贴出的代码已经实现了与AutoCAD的连接和设计期间代码提示,应该没有什么错误,只是有一些我不太理解的问题而已。 迄今为止最为规范,最为完美的Delphi连接AutoCAD样板代码(by lazybones):
unit Unit1;
interface
uses<BR> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<BR> Dialogs, StdCtrls, ComObj, AutoCAD_TLB;
type<BR> TForm1 = class(TForm)<BR> Button1: TButton;<BR> procedure Button1Click(Sender: TObject);<BR> private<BR> { Private declarations }<BR> public<BR> { Public declarations }<BR> end;
var<BR> Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);<BR>var<BR> acad:AcadApplication;<BR> line:Acadline;<BR> vpoint1,vpoint2:OleVariant;<BR>begin<BR> try<BR> acad:=GetActiveOleObject('AutoCAD.Application.16') as AcadApplication;<BR> except<BR> acad:=CreateOleObject('AutoCAD.Application.16') as AcadApplication;<BR> end;<BR> vpoint1:=varArrayCreate(,varDouble);<BR> vpoint2:=varArrayCreate(,varDouble);<BR> vpoint1:=100.0; vpoint1:=100.0; vpoint1:=0.0;<BR> vpoint2:=0.0; vpoint2:=0.0; vpoint2:=0.0;<BR> acad.Visible:=True;<BR> line:=acad.ActiveDocument.ModelSpace.Addline(vpoint1,vpoint2);<BR> line.Update;<BR>end;
end.<BR>
以上代码虽短,但因为涉及COM等高级编程内容,实际还是蛮复杂的。
在此基础上可以开始进一步的编程了,有关AutoCAD ActiveX Automation对象体系结构,各种对象的属性、方法、事件参见C:\Program Files\Common Files\Autodesk Shared\CHS\acadauto.chm,具体使用上与VBA应当没有太大差别。
支持!支持!以后还有好主意的话,可要拿来分享啊!
我爱编程!共同提高吧!
呵呵!