zfbj 发表于 2004-9-11 15:12:00

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

       在ActiveX技术中,GetEntity方法能够返回一个AcadEntity类型的对象和一个Variant类型变量(表示拾取点的位置)。在拖管封装的ARX中无法直接使用这些返回值,但是在AutoCAD的一个进程中,不同语言中ObjectID的值是一致的,就可以通过ObjectId在两种语言中实现实体的传递。       最核心的部分我已写入下面的GetEntity函数,需要注意:必须在一个模块中实现该函数,因为需要对ActiveX中的GetEntity函数进行错误处理;为了减少客户程序中编程者的记忆量,利用.NET中变量范围的特性,在不同的模块或类使用了同样的函数或对象名称;注意需要引用AutoCAD 2005类型库和AutoCAD/ObjectDBX Common 16.0类型库。PubFunction模块中放置核心的GetEntity函数及其调用的函数,详细代码为: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函数进行测试:<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作为函数和类之间传递数据的桥梁非常普遍。

524760167 发表于 2019-11-5 14:52:46

你好大神,初学者入门.net开发有没有好的教程或者资料啊?

雪山飞狐_lzh 发表于 2004-9-11 15:18:00

受教了,解决我多天来的疑惑

zfbj 发表于 2004-9-11 15:45:00

希望飞弧版主在.NET上多多发力,我们共同将这个技术的潜力挖掘出来。


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


不知你的有无这种情况?

雪山飞狐_lzh 发表于 2004-9-12 10:54:00

你是说用Com打开AutoCad?


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


要不重装一遍,:)

zfbj 发表于 2004-9-12 12:06:00

不是,因为.NET开发得到的是DLL文件,调试动态链接库需要指定启动的外部文件,也就是Acad.exe文件。


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


还有,昨天晚上是不是不能登录该网站?

雪山飞狐_lzh 发表于 2004-9-12 14:21:00

我倒没有这样调试过,你以前可以么?我一般就是编译为dll文件再Netload运行看看



昨天晚上确实登不上来


实际上我觉得。Net做的Arx最大的用处大概就是做成Com交给VBA或Lisp调用,不知道张兄可不可以作个演示上来?

月海临风 发表于 2004-9-13 13:10:00

我只会VB和DELPHI,可是又对CAD二次开发有浓厚的兴趣,我期待有一天VBA能够和ARX一样强大!或者是VB.NET做出和C++同样强大的ARX也行!

tcsl9621 发表于 2006-3-12 10:47:00

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

<P>请问哪位仁兄知道上哪儿找vb.net开发AutoCAD的书或资料? 我现在急用,如有这方面信息的请与我联系,万分感谢!</P>
<P><A href="mailto:TCSL9621@163.com" target="_blank" >TCSL9621@163.com</A>&nbsp;&nbsp; 13940870386</P>

houlinbo 发表于 2007-1-9 17:29:00

我的怎么通不过,提示 API函数 GetAsyncKeyState 使堆栈不对称          QQ420021327

天龙八部 发表于 2007-8-21 12:03:00

<p>雪山飞狐版主的VLISP和VBA都是不错的,.net和ARX最大的优势是能够保护原代码,</p>
页: [1] 2
查看完整版本: [原创].NET开发ARX程序(3)使用GetEntity方法获得实体