[原创].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作为函数和类之间传递数据的桥梁非常普遍。 你好大神,初学者入门.net开发有没有好的教程或者资料啊? 受教了,解决我多天来的疑惑 希望飞弧版主在.NET上多多发力,我们共同将这个技术的潜力挖掘出来。另外,最近我的AutoCAD 2005好像不支持调试了,也就是说在.NET中一启动AutoCAD,就会没有反应了。
不知你的有无这种情况? 你是说用Com打开AutoCad?
我从来不这么干,本来2005启动就慢
要不重装一遍,:) 不是,因为.NET开发得到的是DLL文件,调试动态链接库需要指定启动的外部文件,也就是Acad.exe文件。
因此调试时应该会自动运行AutoCAD 2005,但是我的不能运行了。
还有,昨天晚上是不是不能登录该网站? 我倒没有这样调试过,你以前可以么?我一般就是编译为dll文件再Netload运行看看
昨天晚上确实登不上来
实际上我觉得。Net做的Arx最大的用处大概就是做成Com交给VBA或Lisp调用,不知道张兄可不可以作个演示上来? 我只会VB和DELPHI,可是又对CAD二次开发有浓厚的兴趣,我期待有一天VBA能够和ARX一样强大!或者是VB.NET做出和C++同样强大的ARX也行!
哪里能找到vb.net开发AutoCAD的书或资料?
<P>请问哪位仁兄知道上哪儿找vb.net开发AutoCAD的书或资料? 我现在急用,如有这方面信息的请与我联系,万分感谢!</P><P><A href="mailto:TCSL9621@163.com" target="_blank" >TCSL9621@163.com</A> 13940870386</P> 我的怎么通不过,提示 API函数 GetAsyncKeyState 使堆栈不对称 QQ420021327 <p>雪山飞狐版主的VLISP和VBA都是不错的,.net和ARX最大的优势是能够保护原代码,</p>
页:
[1]
2