明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: zzyong00

用VB6进行Autocad的二次开发(原创)

    [复制链接]
 楼主| 发表于 2014-11-22 23:09:11 | 显示全部楼层
增加一个判断点在pl曲线内侧还是外侧
  1. '在模块中添加以下代码
  2. Public Enum InOut
  3.     Inside = -1
  4.     Outside = 1
  5. End Enum

  6. Private Function InOutside(pl As AcadLWPolyline, P1 As Variant) As long
  7.     'PL是要标注的PL线,P1是要监测是否在曲线内的点,三维DOUBLE数组
  8.     '判断标注位置是否在PL范围内,可以设定坐标标在范围内还是外面
  9.     'intInOut=-1是内侧,intInOut=1是外侧,intInOut=0是不确定是内还是外
  10.     Dim Ppl   As Variant
  11.     Dim tmpPL As AcadLWPolyline
  12.     Dim i     As Integer
  13.     Set tmpPL = pl.Copy

  14.     tmpPL.Closed = True
  15.     tmpPL.Elevation = 0
  16.     Ppl = tmpPL.Coordinates
  17.     Dim dblYmax As Double                                                       'Y坐标最大值
  18.     dblYmax = Ppl(1)
  19.     For i = 3 To UBound(Ppl) Step 2                                            
  20.         If dblYmax < Ppl(i) Then dblYmax = Ppl(i)
  21.     Next i
  22.     Dim tmpP(2) As Double                                                       '临时点
  23.     tmpP(0) = P1(0)
  24.     tmpP(1) = dblYmax + 100
  25.     tmpP(2) = 0
  26.     Dim objL As AcadLine
  27.     Set objL = ThisDrawing.ModelSpace.AddLine(P1, tmpP)

  28.     'ZoomAll
  29.     Dim dblPoints As Variant
  30.     dblPoints = objL.IntersectWith(tmpPL, acExtendNone)
  31.     tmpPL.Delete
  32.     objL.Delete                                                                 '清理战场
  33.     'Debug.Print VarType(dblPoints) '即使没有交点,也是一个空的三维数组
  34.     If UBound(dblPoints) = -1 Then                                          
  35.         InOutside = Outside                                                   
  36.         Exit Function
  37.     End If
  38.     If ((UBound(dblPoints) - LBound(dblPoints) + 1) / 3) Mod 2 Then             '交点个数为奇数,就在内侧;为偶数,就在外侧
  39.         InOutside = Inside
  40.     Else
  41.         InOutside = Outside
  42.     End If
  43.     'Debug.Print InOutside
  44. End Function


回复 支持 1 反对 0

使用道具 举报

发表于 2014-12-13 11:03:57 | 显示全部楼层
楼主非常厉害
发表于 2015-1-1 22:16:39 | 显示全部楼层
vba也好景不长了,在64位vba7中不能调用vb6写的ActiveX DLL了,很郁闷~~~

点评

两种解决方案:1,不用vba,用vb6 2.用vb也可以写标准dll,参照网上的方法,vba7支持标准dll的API调用  发表于 2015-1-1 23:57
发表于 2015-1-20 13:00:31 | 显示全部楼层
”引用“ Autocad 200* Type Library这个引用,如果没装其它版本,怎么同时引用呢,才可以在其它版本都能用

点评

或者得新引用其它版本,重新编译!  发表于 2015-1-20 15:05
autocad各版本是不能同时引用的!!!你可以不引用!后期绑定也可以。  发表于 2015-1-20 15:03
发表于 2015-1-23 08:55:38 | 显示全部楼层
感谢你的回复,如何后期绑定,请给个例子

点评

哥,请好好看看本贴一楼,唉。。。  发表于 2015-1-23 09:05
 楼主| 发表于 2015-1-25 14:34:31 | 显示全部楼层
本帖最后由 zzyong00 于 2015-1-25 14:35 编辑

今天再发一下求点集凸包和最小外接矩形的代码!

首先是测试代码,在vb窗体上放一个按钮,添加如下代码(其它未定义函数详见本贴前面的代码):
  1. Private Sub cmd凸包_Click()
  2.     Dim objSset As AcadSelectionSet
  3.     Dim objDoc As AcadDocument
  4.     Set objDoc = ThisDrawing()
  5.     AppActivate objCad.Caption
  6.     SelectLots "MEA~PL~TMP~123", "point"
  7.     Set objSset = objDoc.SelectionSets("MEA~PL~TMP~123")
  8.     If objSset.Count = 0 Then Exit Sub
  9.     objDoc.SetVariable "MODEMACRO", "计算中,请不在Autocad中执行其它操作!"
  10.     Dim obj1 As AcadPoint ' AcadCircle ' AcadLWPolyline
  11.     Dim i As Long
  12.     ReDim pt(objSset.Count - 1)
  13.     ReDim stack(objSset.Count - 1)
  14.     For Each obj1 In objSset
  15.         pt(i).x = obj1.Coordinates(0)
  16.         pt(i).y = obj1.Coordinates(1)
  17.         i = i + 1
  18.     Next
  19.     Call Hull(objSset.Count - 1)
  20.     Dim Coords() As Double
  21.     ReDim Coords(2 * (lngTop + 1) - 1)
  22.     For i = 0 To lngTop
  23.         Coords(2 * i) = stack(i).x
  24.         Coords(2 * i + 1) = stack(i).y
  25.     Next i
  26.     Dim objPL As AcadLWPolyline
  27.     Set objPL = objDoc.ModelSpace.AddLightWeightPolyline(Coords)
  28.     objPL.Closed = True
  29.     objDoc.Regen acActiveViewport
  30.    
  31.     Dim Coords2() As Double
  32.    
  33.     calMinRect lngTop, Coords2
  34.     Set objPL = objDoc.ModelSpace.AddLightWeightPolyline(Coords2)
  35.     objPL.Closed = True
  36.     objDoc.Regen acActiveViewport
  37.     objDoc.SetVariable "MODEMACRO", ""
  38.    
  39. End Sub

接下来是最主要的计算模块,编写的比较累,略收几个币,安慰一下自己:


本帖子中包含更多资源

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

x
发表于 2015-2-1 22:11:06 | 显示全部楼层
楼主你下了不少功夫写这个插件啊!  受教了!  代码不错!
发表于 2015-2-2 13:09:27 | 显示全部楼层
这个必须顶!
发表于 2015-2-2 20:59:04 | 显示全部楼层
  1. '//极角比较, 返回-1: p0p1 在 p0p2 的右侧,返回 0:p0,p1,p2 共线
  2. Public Function Cmp_PolarAngel(P1 As point, P2 As point, pb As point) As Long
  3.     Dim delta As Double
  4.     delta = (P1.x - pb.x) * (P2.y - pb.y) - (P2.x - pb.x) * (P1.y - pb.y)
  5.     If delta < 0# Then
  6.         Cmp_PolarAngel = 1
  7.     ElseIf delta = 0# Then
  8.         Cmp_PolarAngel = 0
  9.     Else
  10.         Cmp_PolarAngel = -1
  11.     End If
这是个测试函数,里面的x y是怎么来的?还有delta = (P1.x - pb.x) * (P2.y - pb.y) - (P2.x - pb.x) * (P1.y - pb.y) 这句是怎么算的呀?

点评

哪个帖子里不是说了吗?怎么又来这里,一个问题问了多少次了!!!  发表于 2015-2-2 23:22
发表于 2015-2-3 12:40:28 | 显示全部楼层
在那里问了后,过会就不见了。  更没有看到你的回复。   

点评

看你自己的帖子  发表于 2015-2-3 13:32
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 02:32 , Processed in 0.183965 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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