明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7129|回复: 34

[原创]用纯粹的几何计算的方法实现了Autocad的Curve类

  [复制链接]
发表于 2015-4-13 20:52 | 显示全部楼层 |阅读模式
本帖最后由 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全部代码):

  1. Public Sub 点到曲线最近距离()

  2.     Dim objSset As AcadSelectionSet

  3.     SelectLots "MEA~PL~TMP~123", "LWPOLYLINE,LINE,ARC,CIRCLE"
  4.     Set objSset = ThisDrawing.SelectionSets("MEA~PL~TMP~123")
  5.     If objSset.Count = 0 Then Exit Sub
  6.     '定义引用曲线类模块

  7.     Dim ObjCurve As Object
  8.     Set ObjCurve = CreateObject("Curve_zzyong00.Curve")

  9.     Dim pt(2) As Double, pt1 As Variant, i As Long
  10.     pt1 = ThisDrawing.Utility.GetPoint(, "请指定点:")
  11.     pt(0) = pt1(0)
  12.     pt(1) = pt1(1)
  13.     For i = 0 To objSset.Count - 1
  14.         Set ObjCurve.Entity = objSset.Item(i)
  15.         Dim tmpPt As Variant
  16.         tmpPt = ObjCurve.GetClosestPointTo(pt, False)
  17.         ThisDrawing.ModelSpace.AddLine pt1, tmpPt
  18.     Next i
  19. End Sub
  20. Public Sub SelectLots(ByVal Ssetname As String, ByVal objName As String)
  21.     Dim sSetObj As AcadSelectionSet, flag As Boolean
  22.     For Each sSetObj In ThisDrawing.SelectionSets
  23.         If sSetObj.Name = Ssetname Then
  24.             flag = True
  25.             Exit For
  26.         End If
  27.     Next
  28.     If flag Then sSetObj.Delete                                                 '创建集合,如集存在,则删除,新建
  29.     Set sSetObj = ThisDrawing.SelectionSets.Add(Ssetname)
  30.     ThisDrawing.Utility.Prompt "请选择对象,可以框选" & vbCrLf

  31.     If objName <> "" Then
  32.         Dim gpCode(0)    As Integer
  33.         Dim dataValue(0) As Variant
  34.         gpCode(0) = 0
  35.         dataValue(0) = objName
  36.         Dim groupCode As Variant, dataCode As Variant
  37.         groupCode = gpCode
  38.         dataCode = dataValue
  39.         sSetObj.SelectOnScreen groupCode, dataCode
  40.     ElseIf objName = "" Then
  41.         sSetObj.SelectOnScreen
  42.     End If
  43. End Sub



更多演示请参照这个标桩号的例子:http://bbs.mjtd.com/forum.php?mo ... 2535&fromuid=332660

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

楼主VB用得很溜  发表于 2022-7-26 09:30
 楼主| 发表于 2024-1-6 10:42 | 显示全部楼层
787116960 发表于 2023-11-15 21:56
大佬  在excelvba中运行不了 报错:运行时错误 '-2147221164 (80040154)':没有注册类

本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系统) 中。
 楼主| 发表于 2017-10-20 19:29 | 显示全部楼层
新鲜8 发表于 2017-10-20 12:14
问版主一个问题怎么用vba代码关闭CAD(不保存关闭)

  1. Public Sub ss()
  2. Dim objDoc As AcadDocument, objcad As AcadApplication
  3. Set objcad = ThisDrawing.Application
  4. For Each objDoc In objcad.Documents
  5.     objDoc.Close False
  6. Next
  7. objcad.Quit

  8. End Sub
发表于 2024-1-8 20:55 | 显示全部楼层
zzyong00 发表于 2024-1-6 10:42
本COM组件主要有三个文件组成:Curve17.dll,Curve18.dll,geometry.dll。其中Curve17.dll,Curve18.dll为ac ...

我想用excel中的vba来调用  但是一直出现错误  大佬能给个实例嘛
发表于 2015-4-13 22:35 来自手机 | 显示全部楼层
我记得cad的ge曲线库应该是可以脱离cad环境直接在.net调用。这样看用vb.net结合com也许是更好的方法
 楼主| 发表于 2015-4-14 00:02 | 显示全部楼层
如果acge*.dll能够脱离cad环境直接被调用,哪可好了
我看了下acge18.dll,调用约定应该是cdecl方式,vb6正常情况下是不支持的
发表于 2015-4-14 13:24 | 显示全部楼层
楼主是vba板块新兴的中坚力量啊

点评

不敢当  发表于 2015-4-14 13:47
发表于 2015-4-28 17:17 | 显示全部楼层
顶一下!!!!!!!!!!!
发表于 2015-5-16 09:27 | 显示全部楼层
楼主为后起之星呀
发表于 2015-12-2 20:35 | 显示全部楼层
这个附件内容不支持CAD2006或者CAD2010吧?
 楼主| 发表于 2015-12-2 20:53 | 显示全部楼层
你好小崧 发表于 2015-12-2 20:35
这个附件内容不支持CAD2006或者CAD2010吧?

Curve17.dll对应于Autocad2007~Autocad2009,即R17;同理,Curve18.dll,对应于R18,autocad2010-2012
 楼主| 发表于 2015-12-2 20:56 | 显示全部楼层
如需要其它版本,可以联系我
发表于 2015-12-2 20:57 | 显示全部楼层
zzyong00 发表于 2015-12-2 20:53
Curve17.dll对应于Autocad2007~Autocad2009,即R17;同理,Curve18.dll,对应于R18,autocad2010-2012

公司只是部分人用2010以上的版本,大多还是用的2006

点评

低版本的cad不想支持了,没有64位的,基本面临淘汰  发表于 2015-12-2 21:42
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 18:18 , Processed in 0.243307 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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