明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15860|回复: 17

[原创].NET开发ARX程序(1)

  [复制链接]
发表于 2004-9-10 10:49:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-9-11 15:15:05 编辑

首先要指明的一点是,虽然.NET开发降低了ARX编程的门槛,但是并不意味着开发者可以在不了解AutoCAD内部实现机理的情况下进行ARX开发。所以,在使用.NET开发ARX应用程序之前,建议大家去看一下ARX版块中关于符号表、块表、符号表记录、块表记录、对象Id、和图形数据库的有关知识,在这里我就不具体讨论这些ARX的概念,直接对应ARX之VC版的帮助系统,开始写一些相应的代码片段。  本章将介绍几个基本的数据库操作。1   创建实体创建本节的函数之前,在类文件的开头引入下面的名称空间:
  1. Imports Autodesk.AutoCAD.ApplicationServicesImports Autodesk.AutoCAD.DatabaseServicesImports Autodesk.AutoCAD.RuntimeImports Autodesk.AutoCAD.GeometryImports Autodesk.AutoCAD  
复制代码
(1)创建直线的函数
  1. <CommandMethod("Zff", "CreateLine", CommandFlags.Modal)> _               Public Shared Sub MyCommand()                       Dim startPt As New Point3d(4.0, 2.0, 0.0)                       Dim endPt As New Point3d(10.0, 7.0, 0.0)                         Dim line As Line                       Dim bt As BlockTable                       Dim btr As BlockTableRecord                         Try                               Dim db As Database = HostApplicationServices.WorkingDatabase                               Dim objId As ObjectId = db.BlockTableId                               ' 打开块表,注意:ObjectId.Open()取代了以前的acdbOpenObject函数                               bt = objId.Open(OpenMode.ForRead)                               objId = bt.Item(btr.ModelSpace)                               btr = objId.Open(OpenMode.ForWrite)                               ' 创建直线                               line = New Line(startPt, endPt)                               ' 将直线添加到块表记录中                               btr.AppendEntity(line)                       Catch                               ' 这里不需要捕获错误                       Finally         ' 无论是否产生错误,Finally的语句都将被调用                               ' 这里没有处理事务,因此手工关闭实体                               line.Close()                               btr.Close()                               bt.Close()                       End Try               End Sub
(2)创建圆的函数
  1. <CommandMethod("Zff", "CreateCircle", CommandFlags.Modal)> _               Public Shared Sub CreateCircle()                       Dim ptCenter As New Point3d(9.0, 3.0, 0.0)                       Dim normal As New Vector3d(0.0, 0.0, 1.0)                         Dim objCircle As Circle                       Dim bt As BlockTable                       Dim btr As BlockTableRecord                         Try                               Dim db As Database = HostApplicationServices.WorkingDatabase                               Dim objId As ObjectId = db.BlockTableId                                 bt = objId.Open(OpenMode.ForRead)                               objId = bt.Item(btr.ModelSpace)                               btr = objId.Open(OpenMode.ForWrite)                                 objCircle = New Circle(ptCenter, normal, 2.0)                               btr.AppendEntity(objCircle)                       Catch                                                      Finally                               objCircle.Close()                               btr.Close()                               bt.Close()                                                      End Try               End Sub
2   创建一个新图层
  1. <CommandMethod("Zff", "CreateLayer", CommandFlags.Modal)> _               Public Shared Sub CreateLayer()                       Dim lt As LayerTable                       Dim ltr As LayerTableRecord                         Try                               Dim db As Database = HostApplicationServices.WorkingDatabase                               Dim objId As ObjectId = db.LayerTableId                                 lt = objId.Open(OpenMode.ForWrite)                               ltr = New LayerTableRecord()                               ltr.Name = "ASDK_MYLAYER"                                 lt.Add(ltr)                       Catch                         Finally                               ltr.Close()                               lt.Close()                       End Try               End Sub
3   打开和关闭ObjectARX对象在VC++开发的ObjectARX应用程序中,使用下面的函数来打开一个对象:
  1. acdbOpenObject(pObject, objId, AcDb::kForWrite);
复制代码
而在.NET开发的ObjectARX应用程序中,根据一个对象的Id获得其控制权,则使用ObjectId类的Open方法。值得注意的是,图形数据库中的对象在打开之后,必须在不用的时候关闭,否则就会引发异常。这在VC开发的ARX程序中也是经常遇到的一个错误。
  1. Public Shared Function ChangeColor(ByVal entId As ObjectId, ByVal newColor As Colors.Color) _             As Autodesk.AutoCAD.Runtime.ErrorStatus                       Dim ent As Entity                       ent = entId.Open(OpenMode.ForWrite, True)                       ent.Color = newColor                       ent.Close()                       Return ErrorStatus.OK               End Function
4   向组字典中添加一个组用AutoCAD操作者的观点来看,也就是使用GROUP命令在图形中创建了一个组。AutoCAD内部保存组的机理就是将组的名称和其对象写入到一个类似字典的数据类型中去。
  1. Public Function CreateGroup(ByVal objIds As ObjectIdCollection, ByVal groupName As String)                       Dim objGroup As Group = New Group(groupName, True)                       Dim id As ObjectId                       Dim dbDic As DBDictionary                       For Each id In objIds                               objGroup.Append(id)                       Next                         Try                                 Dim db As Database = HostApplicationServices.WorkingDatabase                               Dim dicId As ObjectId = db.GroupDictionaryId                               dbDic = dicId.Open(OpenMode.ForWrite)                               dbDic.SetAt(groupName, dbDic)                       Catch                         Finally                               dbDic.Close()                               objGroup.Close()                       End Try               End Function
发表于 2004-9-10 12:18:00 | 显示全部楼层
期待已久!抢先学习,
发表于 2004-9-10 22:45:00 | 显示全部楼层
感觉.Net开发的Arx还是没有C++的强大,有时间的话还是要学习C++来开发Arx
 楼主| 发表于 2004-9-11 11:20:00 | 显示全部楼层
对,前两天看了一个Autodesk发布ARX 2005的PPT,感觉这确实是一个雏形,很多东西都是直接封装了以前ARX中的东西,而且很多内容还没有提供。


实际上,我也是从C++的ARX文档中转写过来的几个函数。


毕竟,.NET开发ARX提供了一种从VC开发ARX转过来的路子,就像微软希望广大的VC程序员转到.NET平台上。Autodesk很狡猾,直接跟着微软走。
发表于 2004-9-13 09:43:00 | 显示全部楼层
我只会VB和DELPHI,可是又对CAD二次开发有浓厚的兴趣,我期待有一天VBA能够和ARX一样强大!或者是VB.NET做出和C++同样强大的ARX也行!
 楼主| 发表于 2004-9-13 21:07:00 | 显示全部楼层
短时间恐怕不会,但是Vb.net能做的东西会越来越多。
发表于 2005-3-11 09:03:00 | 显示全部楼层
大侠们很长时间都不来了,想问一个问题,objectArx2005,下载以后,看文档说只支持VS.net 2002,也就是vc++.net 7.0 ,对于。net 2003 或者即将发布得vs.net 2005不支持,不知道,autodesk公司怎么规划其开发路线的,大家谈谈好吗?
发表于 2005-8-25 17:09:00 | 显示全部楼层
那位大侠能较全面的对比一下,Visual Lisp ,VBA ,VB6 ,VB.Net, C++ ArX ,C# ARX 二次开发程序的速度吗?
发表于 2005-9-3 14:14:00 | 显示全部楼层

不支持.net2003吗?.net 2005也不支持???

那还不是要用vc++6.0

哎,白看了.net这么长时间了~~

发表于 2005-9-6 10:53:00 | 显示全部楼层
好,期待下文
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 08:30 , Processed in 0.173168 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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