明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 12721|回复: 12

[原创].NET开发ARX程序(3)使用GetEntity方法获得实体

  [复制链接]
发表于 2004-9-11 15:12 | 显示全部楼层 |阅读模式
       在ActiveX技术中,GetEntity方法能够返回一个AcadEntity类型的对象和一个Variant类型变量(表示拾取点的位置)。在拖管封装的ARX中无法直接使用这些返回值,但是在AutoCAD的一个进程中,不同语言中ObjectID的值是一致的,就可以通过ObjectId在两种语言中实现实体的传递。       最核心的部分我已写入下面的GetEntity函数,需要注意:必须在一个模块中实现该函数,因为需要对ActiveX中的GetEntity函数进行错误处理;为了减少客户程序中编程者的记忆量,利用.NET中变量范围的特性,在不同的模块或类使用了同样的函数或对象名称;注意需要引用AutoCAD 2005类型库和AutoCAD/ObjectDBX Common 16.0类型库。PubFunction模块中放置核心的GetEntity函数及其调用的函数,详细代码为:
  1. Imports Autodesk.AutoCAD.ApplicationServicesImports Autodesk.AutoCAD.DatabaseServicesImports Autodesk.AutoCAD.RuntimeImports Autodesk.AutoCAD.GeometryImports Autodesk.AutoCAD.Interop    Module PubFunction         Private Const VK_ESCAPE = &H1B           ' 代表Esc键       Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer         ' 功能:判断用户是否按下某一个键       ' 输入:代表键的常量(从API Viewer中获得)       ' 调用:API函数GetAsyncKeyState       ' 返回:如果用户按下了指定的键,返回True;否则返回False       ' 示例:       '             If CheckKey(&H1B) = True Then do sth       Private Function CheckKey(ByVal lngKey As Long) As Boolean               If GetAsyncKeyState(lngKey) Then                       CheckKey = True               Else                       CheckKey = False               End If       End Function         Public Function GetEntity(ByRef entId As ObjectId, ByRef ptPick As Point3d) As Boolean               Dim acadApp As AcadApplication = CType(Application.AcadApplication, AcadApplication)               Dim objSelect As Common.AcadEntity               Dim basePnt As Object                 ' 选择对象并判断类型               TryRetry:                       acadApp.ActiveDocument.Utility.GetEntity(objSelect, basePnt, "选择对象:")                 Catch ex As Exception When objSelect Is Nothing                   ' 处理未选择到实体的错误                       ' 处理按下Esc键的错误                       If CheckKey(VK_ESCAPE) = True Then                               Exit Function                       Else                               GoTo Retry                       End If                         GoTo Retry               Finally                 End Try                 ' 函数的返回值               entId.OldId = objSelect.ObjectID               If (basePnt.GetType().IsArray() = True) Then                       ptPick.Set(basePnt(0), basePnt(1), basePnt(2))               End If                 Return True       End FunctionEnd Module
可以在一个类文件中注册一个命令方法,对GetEntity函数进行测试:
  1. <CommandMethod("ZffTest", "GetEnt", CommandFlags.Modal)> _       Public Shared Sub GetEntity()               Dim entId As ObjectId               Dim ptPick As Point3d               Dim ent As Entity                 If (PubFunction.GetEntity(entId, ptPick) = True) Then                       ent = entId.Open(OpenMode.ForRead)                       CommandLinePrompts.Message(Chr(13) & Chr(10) & "已经选择了" & ent.GetType().ToString)                                                                ent.Close()               End If       End Sub
实际上,如果用对象的Handle作为传递桥梁应该也是可以的,但是我个人习惯用ObejctId。不得不指出,在我们所进行的VBA编程中,由于大家都使用全局变量来传递数据,因此ObjectId和Handle很少使用,但是在VC进行的ARX开发中,一般禁止使用全局变量(为保证工程的可移植性和健壮性),这时候ObjectId和Handle作为函数和类之间传递数据的桥梁非常普遍。
发表于 2019-11-5 14:52 | 显示全部楼层
你好大神,初学者入门.net开发有没有好的教程或者资料啊?
发表于 2004-9-11 15:18 | 显示全部楼层
受教了,解决我多天来的疑惑
 楼主| 发表于 2004-9-11 15:45 | 显示全部楼层
希望飞弧版主在.NET上多多发力,我们共同将这个技术的潜力挖掘出来。


另外,最近我的AutoCAD 2005好像不支持调试了,也就是说在.NET中一启动AutoCAD,就会没有反应了。


不知你的有无这种情况?
发表于 2004-9-12 10:54 | 显示全部楼层
你是说用Com打开AutoCad?


我从来不这么干,本来2005启动就慢


要不重装一遍,:)
 楼主| 发表于 2004-9-12 12:06 | 显示全部楼层
不是,因为.NET开发得到的是DLL文件,调试动态链接库需要指定启动的外部文件,也就是Acad.exe文件。


因此调试时应该会自动运行AutoCAD 2005,但是我的不能运行了。


还有,昨天晚上是不是不能登录该网站?
发表于 2004-9-12 14:21 | 显示全部楼层
我倒没有这样调试过,你以前可以么?我一般就是编译为dll文件再Netload运行看看



昨天晚上确实登不上来


实际上我觉得。Net做的Arx最大的用处大概就是做成Com交给VBA或Lisp调用,不知道张兄可不可以作个演示上来?
发表于 2004-9-13 13:10 | 显示全部楼层
我只会VB和DELPHI,可是又对CAD二次开发有浓厚的兴趣,我期待有一天VBA能够和ARX一样强大!或者是VB.NET做出和C++同样强大的ARX也行!
发表于 2006-3-12 10:47 | 显示全部楼层

哪里能找到vb.net开发AutoCAD的书或资料?

请问哪位仁兄知道上哪儿找vb.net开发AutoCAD的书或资料? 我现在急用,如有这方面信息的请与我联系,万分感谢!

TCSL9621@163.com   13940870386

发表于 2007-1-9 17:29 | 显示全部楼层
我的怎么通不过,提示 API函数 GetAsyncKeyState 使堆栈不对称          QQ420021327
发表于 2007-8-21 12:03 | 显示全部楼层

雪山飞狐版主的VLISP和VBA都是不错的,.net和ARX最大的优势是能够保护原代码,

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

本版积分规则

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

GMT+8, 2024-4-25 23:27 , Processed in 5.732992 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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