明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 33791|回复: 45

[ARX]利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)

  [复制链接]
发表于 2004-8-4 11:11:00 | 显示全部楼层 |阅读模式

利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)

--直线

大家好!从今天开始我向大家介绍如何利用AutoCAD 2005.NET API进行AutoCAD的二次开发。由于我只学过C#,因此在所讲的例子中一律使用C#。至于广大的vb.net程序员,我想编程的原理是一样的,并且因为vb.net和C#都属于.net语言,因此熟悉vb.net的朋友对理解C#程序是没有太大问题的(呵呵,如果有哪位愿意把相关的C#程序翻译成Vb.net程序,那就更好了)。

由于AutoCAD 2005.NET API是比较新的东西,我几乎没有找到比较系统的教程或参考,因此我会使用明经通道出版的《AutoCAD VBA 开发精彩实例教程》的实例来进行讲解。

好了,闲话少说,让我们直接进入 AutoCAD 2005.NET API的世界。

一、准备工作

这指的是如何添加相关的引用和命名空间。用AutoCAD 2005.NET API进行AutoCAD的二次开发,必须添加的引用是acdbmgd.dll和acmgd.dll,这可以在AutoCAD2005的安装目录下找到。还必须添加的是在visual studio.net的添加引用时在com选项下选择“AutoCAD 2005类型库”和“AutoCAD/ObjectDBX Common 16.0类型库”这两项。

然后在程序的开头加入以下命名空间:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Colors;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.Runtime;

using DBTransMan=Autodesk.AutoCAD.DatabaseServices.TransactionManager;

using Autodesk.AutoCAD.Interop;

using Autodesk.AutoCAD.Interop.Common;

这些命名空间是要在每一个程序中都要加入的。

二、第一个实例--创建直线

(1)在visual studio.net 中,新建一个类库工程,然后添加相关的引用及在程序的开头加入有关的命名空间(请参见一)。

(2)创建基准函数(AddLine)。基准函数就是与系统提供的方法一致的函数。其实现的步骤如下:

l 在程序文件中加入以下私有字段:

private Database db; //代表AutoCAD数据库对象

private DBTransMan tm; //代表AutoCAD事务处理管理器

private Transaction myT;// 代表AutoCAD事务处理

BlockTable bt; //代表AutoCAD块表

BlockTableRecord btr;// 代表AutoCAD块表记录对象

l 在类的构造函数部分加入以下代码:

db = HostApplicationServices.WorkingDatabase;//取得当前运行的AutoCAD的数据库对象

tm = db.TransactionManager;// 定义一事务处理管理器

l 主程序AddLine

public Line AddLine(Point3d pt1, Point3d pt2)

{

Line line;//声明一直线对象

try

{

Initialize();//相关的初始化工作,是一自定义函数

line = new Line(pt1, pt2);//给line对象赋于具体的值

btr.AppendEntity(line);

tm.AddNewlyCreatedDBObject(line, true);//在AutoCAD中加入创建的直线

myT.Commit();//提交事务处理

}

finally

{

DisposeAll();//有关的清理工作,是一自定义函数

}

return line;

}

上面程序中的Initialize函数如下:

public void Initialize()

{

myT = tm.StartTransaction();//开启事务处理

bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false); //获取AutoCAD块表对象

btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false); //获取AutoCAD块表记录对象

}

DisposeAll函数如下:

public void DisposeAll()

{

bt.Close();//关闭块表

btr.Close();//关闭块表记录

myT.Dispose();//销毁事务处理

} 如果大家对上面的东西不是很清楚的话,也没有关系,因为你只要知道这是前期的准备工作,以后只要调用相关的函数就可以了。

 楼主| 发表于 2004-8-4 11:18:00 | 显示全部楼层

[ARX]利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)

(6)最后添加测试代码。请按照步骤(1)创建一新的类库工程,然后加入以下代码(请把上面的工程编译,然后在新的类库工程中添加该dll):

#region Using directives

using System;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.Runtime;

using DBTransMan = Autodesk.AutoCAD.DatabaseServices.TransactionManager;

using ZHFArxLibrary;//引用刚编译好的dll所代表的命名空间

#endregion

namespace ClassLibrary1

{

public class Class1

{

public Class1()

{

}

[CommandMethod("AddLine")]//声明AutoCAD .NET命令

public static void AddLine()

{

Arx arx = new Arx();//Arx表示上面编译的dll中的类

Point3d ptSt = new Point3d(100, 100, 0);

Point3d ptEn = new Point3d(150, 100, 0);

arx.AddLine(ptSt, ptEn);

arx.AddLine(new Point2d(100, 120), new Point2d(150, 120));

arx.AddLine(ptSt, 50, 50);

arx.AddLineR(ptSt, 3, 50);

}

}

}

(7)运行程序。

把(6)中的工程编译。然后启动AutoCAD,在命令行中键入netload命令,在弹出的对话框中选择刚编译好的dll文件。在命令行中键入AddLine(就是你在(6)中声明的AutoCAD .NET命令),应该可以看到结果了。 (8)完整的程序代码请看下面的附件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2018-11-6 00:38:28 | 显示全部楼层
老大,能否排版下代码?
比如加个背景什么的
 楼主| 发表于 2004-8-4 11:15:00 | 显示全部楼层

[ARX]利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)

(3)根据二维的起点和终点创建直线。

public Line AddLine(Point2d pt1, Point2d pt2)

{

Line line;

line = AddLine(new Point3d(pt1.X, pt1.Y, 0), new Point3d(pt2.X, pt2.Y, 0)); //调用上面创建的基准函数

return line;

}

(4)已知起点和终点相对于起点的直角坐标,创建直线。

public Line AddLine(Point3d pt1, double x, double y)

{

Line line;

Point3d pt2 = new Point3d();

pt2.X = pt1.X + x;

pt2.Y = pt1.Y + y;

pt2.Z = pt1.Z;

line = AddLine(pt1, pt2);

return line;

}

(5) 已知起点和终点相对于起点的极坐标,创建直线。

public Line AddLineR(Point3d pt1, double angle, double length)

{

Line line;

Point3d pt2 = new Point3d();

pt2 = GetPointAR(pt1, angle, length);

line = AddLine(pt1, pt2);

return line;

}

其中,GetPointAR是已知一点和另一点相对于该点的极坐标,求另上点的绝对坐标。

public Point3d GetPointAR(Point3d pt1,double angle,double length)

{

Point3d pt2=new Point3d();

pt2.X = pt1.X + length * Math.Cos(angle);

pt2.Y = pt1.Y + length * Math.Sin(angle);

pt2.Z = pt1.Z;

return pt2; }

发表于 2004-9-5 11:21:00 | 显示全部楼层
发表于 2004-11-3 16:41:00 | 显示全部楼层
请问楼主,可以按照你所示范的,在CAD2004下,做相应的程序吗


嗯,他们不兼容吧。2005带有激活,使用起来并不方便


谢谢!
发表于 2005-1-12 13:58:00 | 显示全部楼层
假若不用类库怎么做,我想直接做一个运用程序,我的环境.net2003,cad2005)
发表于 2005-3-25 15:44:00 | 显示全部楼层
delphi 创建CAD OLE对象开发
发表于 2005-5-8 14:43:00 | 显示全部楼层
delphi 创建CAD OLE对象开发 ??


非常非常的垃圾!


delphi的兼容性太差,D6导入cad的类型库居然好要报错,而且对很多属性,对象,方法都进行了改名,增加二次学习的难度,比起vb来,差得远!
发表于 2005-5-8 14:48:00 | 显示全部楼层
但是不管是VB6,还是VB.net,C#如果采用ole的方式二次开发cad都存在效率不高,不能够自定义实体的问题,最好的还是C++,ARX,但是要学习ARX无疑要去追随一个注定要没落的MFC,于是就有了我们都一批眼巴巴的等待.net开发ARX的可怜的人,


.net开发ARX的资料,你究竟在哪里?
发表于 2005-5-17 14:21:00 | 显示全部楼层
为什么这几句话在我的机器上编译通不过?? pt2.X = pt1.X + x; pt2.Y = pt1.Y + y; pt2.Z = pt1.Z; 报错信息为: error CS0200: Property or indexer 'Autodesk.AutoCAD.Geometry.Point3d.X' cannot be assigned to -- it is read only
error CS0200: Property or indexer 'Autodesk.AutoCAD.Geometry.Point3d.Y' cannot be assigned to -- it is read only
error CS0200: Property or indexer 'Autodesk.AutoCAD.Geometry.Point3d.Z' cannot be assigned to -- it is read only CommandLinePrompts.Message("\n所输入的参数无法创建图形!"); 报错信息为: error CS0246: The type or namespace name 'CommandLinePrompts' could not be found (are you missing a using directive or an assembly reference?)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:41 , Processed in 0.196568 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表