找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1513|回复: 15

[ARX程序]:利用AutoCAD 2005[1].NET API进行AutoCAD的二次开发

[复制链接]
发表于 2004-9-23 15:52:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
利用AutoCAD 2005[1].NET API进行AutoCAD的二次开发

#region Using directives

using System;
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;
#endregion

namespace ZHFArxLibrary
{
    public class Arx
    {
        private Database db;
        private DBTransMan tm;
        private Transaction myT;
        BlockTable bt;
        BlockTableRecord btr;
        public Arx()
        {
            db = HostApplicationServices.WorkingDatabase;
            tm = db.TransactionManager;
            
        }
        #region Line
        public Line AddLine(Point3d pt1, Point3d pt2)
        {
            Line line;
            try
            {
                Initialize();
                line = new Line(pt1, pt2);
                btr.AppendEntity(line);
                tm.AddNewlyCreatedDBObject(line, true);
                myT.Commit();

            }
            finally
            {
                DisposeAll();
            }
            return line;
        }
        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;
        }
        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;
        }
        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;
        }
        #endregion

        public void Initialize()
        {
            myT = tm.StartTransaction();
            bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
            btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
        }
        public void DisposeAll()
        {
            bt.Close();
            btr.Close();
            myT.Dispose();
        }
        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;
        }


    }
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-10-8 11:04:30 | 显示全部楼层
这种模式开发AUTOACAD,实际使用的是Automation/OLE,和使用的语言无关,VB/VBA/VC++/Delphi/VLISP等没有任何实质区别,只是将ACAD作为一个容器。从这一点出发,这种编程方式还不如用VLISP,还是真正嵌入ACAD(同VC++和VBA)。而且作为容器,很多ACAD的高级功能都不能使用(.TLB中提供多少,你就只能用多少),和ACAD的交互也不方便,所以意义不大。
现在为什么在网上有不少网站转载这种方式,只是因为沾上了.NET一点边,在,NET的光环下掩盖了实质。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-13 21:24:44 | 显示全部楼层
有同感!
刚用.net写了一些程序,发现用ARX很容易实现的东西,因为没这样的接口,绕来绕去才实现.
而且效率极低(CAD说还可以忍受&*&*%$$%^$^$&).
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-26 09:01:48 | 显示全部楼层
有不同感,二楼、三楼肯定没有看到cad 2005.net api开发的强大功能,1.net api完全不是vba之类的东西,采用VB6/Delphi等是无法实现的。2、速度上.net api完全可与arx相等,我做过测试,采用.net api 与arx 在cad下生成20万条文本及20万条直线,所用时间都在15秒左右,与arx根本看不出差别来,而采用vb6/vba等了10分种还看不到何时是尽头,中断。3.与cad交互完全融合,如arx一般编写cad命令等。但加载命令不同采用netload而arx加载命令是arxload。4.完全抛开了mfc转而利用功能强大的.net现成资源。5.开发效率高,而且代码简单易学,估计cad2006出来时不用考虑升级的问题。建议如不是开发自定义实体之类的二次开发,可采用.net api。缺点是只能在cad2005以上用,cad2004及以下版本均不支持.net api。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-26 20:29:29 | 显示全部楼层
最初由 LQH 发布
[B]有不同感,二楼、三楼肯定没有看到cad 2005.net api开发的强大功能,1.net api完全不是vba之类的东西,采用VB6/Delphi等是无法实现的。2、速度上.net api完全可与arx相等,我做过测试,采用.net api 与arx 在cad下生... [/B]


我基本认同你说的,我这几天仔细学习了acdbmgd.dll和acmgd.dll后发现我最早说的偏差是比较大。

以下是对你所说的一点补充:

1、.NET API在操作实体数据库的时候还是相对比较慢的,由于我从2002年以来一直在使用.NET,知道.NET的机制下哪些地方容易耗时。所幸.NET API仅是一个壳,那两个dll都是MFC和.NET混编的,我们调用的.NET API实际上直接使用的是MFC程序,所以速度不太慢。但你自己做的纯.NET程序,还是会慢不少,所以编译出来的.NET ARX动态库,应该预处理一下,加快速度。装完AUTOCAD2005,ADESK就在[启动]里加一个加速。
2、现在的.NET API没有提供与AutoCAD交互及一些其它相关内容,这些还是使用的Automation/OLE,操作起来不太爽

另外由于提供了.NET API,新版的Borland产品C++ Builder/C# Builder Delphi 等也能玩的。

根据我使用.NET的经验,如果你要使用.NET API,推荐C#,偶尔有特殊需要(如加密),可以使用MFC和VC++ .NET混编,效果不错。

等用.NET的人多了,还可以在讨论一些.NET下和ARX的东东。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-27 08:17:52 | 显示全部楼层
问 masterhe  有没有找到.net api的相关资料,如有能否共享学习学习,我现在只是在示例里看了一下函数结构等,我还是在用mfc编写,因为我还需用到代理实体等,可能.net api还无法编写代理实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-27 09:27:05 | 显示全部楼层
最初由 LQH 发布
[B]问 masterhe  有没有找到.net api的相关资料,如有能否共享学习学习,我现在只是在示例里看了一下函数结构等,我还是在用mfc编写,因为我还需用到代理实体等,可能.net api还无法编写代理实体。 [/B]


资料我没有,我的学习方法和别人的有点不同(原来在论坛上灌过),学VC++我喜欢看.H,而.NET虽然没有.H,但可以从VS中看对象结构.因为成员函数MS和ADESK都用非常明白的英文,基本上一看就明白.(所以我上边说的是学习那两个dll)
我整理了一下ObjectARX和.NET API的关系如下:
AcDb        Autodesk.AutoCAD.DatabaseServices
AcRx        Autodesk.AutoCAD.Runtime
AcEd        Autodesk.AutoCAD.ApplicationServices
AcUt        Autodesk.AutoCAD.DatabaseServices, Autodesk.AutoCAD.ApplicationServices
AcCm         Autodesk.AutoCAD.Colors
AcGe         Autodesk.AutoCAD.Geometry
AcGi         Autodesk.AutoCAD.GraphicsInterface
AcLy         Autodesk.AutoCAD.LayerManager
AcPl         Autodesk.AutoCAD.PlottingServices

另外我感觉会VC++的人不会那么着急改用.NET API,毕竟丫慢。而且.NET API 能做的事少。
倒是MFC和.NET混编做一些UI的东东还可以,这个在AutoCAD2005以前的版本都行,而且升级也不是问题。
另外做代理对象,好象不行,我没有太研究。
等等吧,不用太着急,ADESK加入.NET支持只是抛砖引玉,为新版做准备,ADESK的有些兼容性做的可不象MS。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-30 17:23:23 | 显示全部楼层
我觉得各位都是老是阿,我知道我差的太远,请问我想学arx该县学什么知识阿?
多谢各位老师!jiabing1978@163.net
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-4 14:01:01 | 显示全部楼层
对.NET支持现在只是过度,等2006版的吧,MS马上要出VS 2005了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-30 09:14:45 | 显示全部楼层
可惜下载内容太少,费了我不少银子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-30 10:45:47 | 显示全部楼层
奇怪masterhe等都讲了这么多心得,没有一个人加分币,就算人家不在乎,加点奖励也是鼓励潜水员浮出水面的信心啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-15 18:39:26 | 显示全部楼层
虽然用.NET API相对比较慢一点,但C#。net是Microsoft主推的潮流,
而且其它很多的软件厂商,也会基于此语言提供开发平台,我觉得用
C#。net来开发CAD还是很有前景的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-17 09:43:51 | 显示全部楼层
都是高手
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-4 23:25:53 | 显示全部楼层
什么点net,这个名字很讨厌,VC7或VC8等这样不是和清晰明了吗?现在的人觉得好象跟网络沾上点边就是好东西。其实真正能进行正常开发的还是2000+VC6,VC7。0又是个绝版,VC7。1+2004或2005简直是不论不类的东西。2006的情况不知如何。平台的根本目的只是提供一个CAD的基础,重要的应该是软件的设计和算法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-5 00:57:05 | 显示全部楼层
最初由 RedCAD 发布
[B]什么点net,这个名字很讨厌,VC7或VC8等这样不是和清晰明了吗?现在的人觉得好象跟网络沾上点边就是好东西。其实真正能进行正常开发的还是2000+VC6,VC7。0又是个绝版,VC7。1+2004或2005简直是不论不类的东西。2006?... [/B]

.NET绝对是AutoCAD二次开发的方向,不管是VBA(肯定会在AutoCAD2008中消失,取而代之的是VSTA FOR AutoCAD),还是C++,前途都不是太好,尤其是Vista发布以后(C++将加速被淘汰,去看一下Vista开发平台上的几乎所有技术都是以.NET为基础的)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 20:54 , Processed in 0.370213 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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