lazybones 发表于 2004-12-25 10:27:00

使用delphi开发AutoCAD的入门级问题(整理添加中)

本帖最后由 作者 于 2004-12-25 21:50:00 编辑 <br /><br /> 用Delphi开发AutoCAD的人很少,资料也很难找,我集中开个帖子,望高手不吝赐教,以惠后来人。以下未特殊说明均指Delphi7+AutoCAD2004中文版



1、引入AutoCAD类型库的目的是什么?<BR>2、引入AutoCAD类型库的正确步骤是什么?<BR>(1)对于AutoCAD2004中文版,project-&gt;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就行了?

laoliu09 发表于 2004-12-25 21:11:00

1、目的是可以前期绑定变量,如果不是的话,就要把cad应用程序变量定义为变体类型,那在编程的时候就没有帮助提示了!


2、只要看到cad类型库就行了,两个都可以,选install是安装包文件,选create unti是将cad类型库存盘为delphi单元文件.pas,以后在uses语句中引用这个文件就可以用cad的类型了,例如:var app:acadapplication; app.        输入点号后就有帮助提示了,跟vb一样的!

lazybones 发表于 2004-12-25 22:37:00

本帖最后由 作者 于 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.


laoliu09 发表于 2004-12-27 16:29:00

1、第一个问题不好意思,我还是刚开始学CAD二次开发,对CAD的类型不太了解!


2、你的except语句少了一个冒号啊,不知道是不是这个原因!


3、你是想定义一个数组吧?为什么不一开始用array of double       来声明呢?


4、你说你编译通不过,怎么可以往下执行呢?


我回去再看看!我还没用DELPHI连接过CAD呢!让我试试看!最近忙得不可开交,我画图画疯啦,晕!

lazybones 发表于 2004-12-28 07:34:00

laoliu09真乃热心人!



找了本深入一点的delphi书,好多问题涉及com矫妫局饰侍馐俏业膁elphi水平不够。


1、查看AutoCAD_TLB会明白不少


2、还不懂


3、如果要使用VT_R8,应当uses ActiveX


4、最痛苦的是这个问题解决不了。


另外说一句,上述代码完全实现了有关AutoCAD对象的代码提示。


laoliu09 发表于 2004-12-28 08:32:00

不好意思,我记错了,except后面没有冒号,你是在调试阶段运行你的程序的吧?那发生错误的时候是会这样提示的,只要按F9就可以退出程序了,我也试过的!当你的程序正确,直接运行.exe文件时就不会出现这个问题了!!!


另外,希望你连接成功CAD的时候把连接的方法告诉我,我的水平也有限啊!


我有时间就试试看!最近实在太忙啦!呵呵!

lazybones 发表于 2004-12-28 10:09:00

验证了一下,问题2的确只有在调试期间才会出现,不知为什么。



问题4是这样的:如果通过本程序启动AutoCAD,可以实现CAD窗口在最上方,但是如果之前AutoCAD已经运行起来了,如何能够将CAD窗口置前呢?


说明一下,贴出的代码已经实现了与AutoCAD的连接和设计期间代码提示,应该没有什么错误,只是有一些我不太理解的问题而已。

lazybones 发表于 2004-12-28 11:04:00

迄今为止最为规范,最为完美的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>

lazybones 发表于 2004-12-28 15:04:00

以上代码虽短,但因为涉及COM等高级编程内容,实际还是蛮复杂的。


在此基础上可以开始进一步的编程了,有关AutoCAD ActiveX Automation对象体系结构,各种对象的属性、方法、事件参见C:\Program Files\Common Files\Autodesk Shared\CHS\acadauto.chm,具体使用上与VBA应当没有太大差别。

laoliu09 发表于 2004-12-28 16:19:00

支持!支持!以后还有好主意的话,可要拿来分享啊!


我爱编程!共同提高吧!


呵呵!

页: [1] 2 3
查看完整版本: 使用delphi开发AutoCAD的入门级问题(整理添加中)