- 积分
- 23126
- 明经币
- 个
- 注册时间
- 2008-11-22
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 zzyong00 于 2015-4-13 20:55 编辑
用vba或vb进行Auotcad二次开发的人都知道,AutoCAD的VBA接口没有提供Vlisp中的vlax-curve-get族函数。如下:
没有这些函数,有时候开发时,总感觉缩手缩脚,而且,这些函数实现起来也不太容易,本人前一阵子用vlax类调用vlisp的这些函数,但是,太不稳定,经常无故出错,因此,决心自已写一个这样的组件!经过努力,终于有点结果了!
本COM组件的主要功能是用纯粹的几何计算的方法实现了Autocad的Curve类,目前支持曲线为:LWPOLYLINE,LINE,ARC,CIRCLE。本COM组件主要有三个文件组成:Curve17.dll,Curve18.dll,geometry.dll。其中Curve17.dll,Curve18.dll为activex dll,可以在任何文件夹中,只需要运行“注册.bat”注册一下即可,而geometry.dll为标准的dll,需要复制到c:\windows\system32(windowxp系统) 或C:\Windows\SysWOW64(window7系统) 中。
Curve17.dll对应于Autocad2007~Autocad2009,即R17;同理,Curve18.dll,对应于R18。
在这里做一个简单的演示:演示曲线上离指定点最近的点
演示代码(Project.dvb全部代码):
- Public Sub 点到曲线最近距离()
- Dim objSset As AcadSelectionSet
- SelectLots "MEA~PL~TMP~123", "LWPOLYLINE,LINE,ARC,CIRCLE"
- Set objSset = ThisDrawing.SelectionSets("MEA~PL~TMP~123")
- If objSset.Count = 0 Then Exit Sub
- '定义引用曲线类模块
- Dim ObjCurve As Object
- Set ObjCurve = CreateObject("Curve_zzyong00.Curve")
- Dim pt(2) As Double, pt1 As Variant, i As Long
- pt1 = ThisDrawing.Utility.GetPoint(, "请指定点:")
- pt(0) = pt1(0)
- pt(1) = pt1(1)
- For i = 0 To objSset.Count - 1
- Set ObjCurve.Entity = objSset.Item(i)
- Dim tmpPt As Variant
- tmpPt = ObjCurve.GetClosestPointTo(pt, False)
- ThisDrawing.ModelSpace.AddLine pt1, tmpPt
- Next i
- End Sub
- Public Sub SelectLots(ByVal Ssetname As String, ByVal objName As String)
- Dim sSetObj As AcadSelectionSet, flag As Boolean
- For Each sSetObj In ThisDrawing.SelectionSets
- If sSetObj.Name = Ssetname Then
- flag = True
- Exit For
- End If
- Next
- If flag Then sSetObj.Delete '创建集合,如集存在,则删除,新建
- Set sSetObj = ThisDrawing.SelectionSets.Add(Ssetname)
- ThisDrawing.Utility.Prompt "请选择对象,可以框选" & vbCrLf
- If objName <> "" Then
- Dim gpCode(0) As Integer
- Dim dataValue(0) As Variant
- gpCode(0) = 0
- dataValue(0) = objName
- Dim groupCode As Variant, dataCode As Variant
- groupCode = gpCode
- dataCode = dataValue
- sSetObj.SelectOnScreen groupCode, dataCode
- ElseIf objName = "" Then
- sSetObj.SelectOnScreen
- End If
- End Sub
更多演示请参照这个标桩号的例子:http://bbs.mjtd.com/forum.php?mo ... 2535&fromuid=332660
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|