明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: zzyong00

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

    [复制链接]
发表于 2014-10-21 17:15 | 显示全部楼层
牛人!还用VB6

点评

不赶时髦  发表于 2014-10-21 21:40
 楼主| 发表于 2014-10-21 21:53 | 显示全部楼层
上回说到“先选择对象再执行命令”,现在牛刀小试一下
4、数值合并计算


  1. Public Sub SumCalc()                                                            '数值合并计算

  2.     On Error GoTo err1

  3.     Dim objSset As AcadSelectionSet, objText As AcadText

  4.     Set objSset = getPickFirstSel()

  5.     If objSset Is Nothing Then                                                  '透明命令,支持执行前选择
  6.         SelectLots "SSet", "Text"
  7.         Set objSset = ThisDrawing.SelectionSets("SSet")

  8.         If objSset.Count = 0 Then Exit Sub
  9.     End If

  10.     Dim sum, n As Long                                                          '和,最大有效位数

  11.     For Each objText In objSset

  12.         If IsNumeric(objText.TextString) Then
  13.             If InStr(objText.TextString, ".") Then
  14.                 If n < Len(objText.TextString) - InStr(objText.TextString, ".") Then
  15.                     n = Len(objText.TextString) - InStr(objText.TextString, ".")
  16.                 End If
  17.             End If

  18.             sum = sum + CDec(objText.TextString)
  19.         Else
  20.             ThisDrawing.Utility.Prompt objText.TextString & " 该文本不是纯数字,将不参于计算." & vbCrLf
  21.         End If

  22.     Next

  23.     Dim pt1, FMT As String

  24.     If n = 0 Then FMT = "0" Else FMT = "#." & String(n, "0")
  25.     pt1 = ThisDrawing.Utility.GetPoint(, "请指定计算结果文本的插入点:")
  26.     Set objText = ThisDrawing.ModelSpace.AddText(Format(sum, FMT), pt1, objSset.Item( _
  27. 0).Height)

  28.     Exit Sub

  29. err1:
  30.     Debug.Print Err.Description
  31.     Err.Clear

  32.     Exit Sub

  33. End Sub

本帖子中包含更多资源

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

x
发表于 2014-10-23 18:16 | 显示全部楼层
chenshulu 发表于 2014-10-20 18:44
你的排图框的源码呢,

已发过二维排序的源码,在哪,
你的排图框的源码呢,还要等多久呢

点评

http://bbs.mjtd.com/thread-111364-1-1.html  发表于 2014-10-23 19:16
心急吃不了臭豆腐!  发表于 2014-10-23 19:15
 楼主| 发表于 2014-10-23 19:43 | 显示全部楼层
本帖最后由 zzyong00 于 2015-3-8 18:13 编辑

二、对多段线的认识
多段线俗称pl线,pl线最重要的属性应该是Coordinates ,
Coordinates :指定对象中每个顶点的坐标。Variant[变体] (双精度数组); 可读写
点数组。LightweightPolyline 对象:变体为 OCS 坐标系统的二维点数组。
另外,对于有圆弧的pl线,用方法GetBulge和SetBulge读取。
pl线的属性或方法中没有能表示每两个点之间长度的,也没有体现每一段的角度(或叫方向),圆弧段,也没有半径等。
现在,我们对其进行扩展,扩展之前,先说一点小知识,就是关于圆弧段的凸度bugle.
凸度是多段线顶点列表中选定顶点和下一顶点之间的圆弧所包含角度的 1/4 的正切值。负的凸度值表示圆弧从选定顶点到下一顶点为顺时针方向。凸度为0 表示直线段,凸度为1表示半圆。

上面的推导就不细说了,初高中数学几何问题!
有了以上各种细节知识(还有不知道的,看帮助),就实现上面说的PL线本身提供功能不足之处。
附带功能演示:

  1. Option Explicit
  2. Const PI = 3.1415926
  3. Public Coordinate_TextHeight As Double                      '文字高
  4. Public ratio                 As Double                      '全局比例


  5. Public Sub ShowPLEachPartDist() '标注多线段各段长度
  6.     On Error GoTo ToExit '打开错误陷阱
  7.     '------------------------------------------------
  8.     Dim objPL As AcadLWPolyline ', basePnt As Variant, blnESC As Boolean
  9.     Dim objSset As AcadSelectionSet
  10.     Dim objText As AcadText
  11.     Dim InsPt As Variant  '文本插入点
  12.     Dim dblMpt(2) As Double, dbl_NV_Angle As Double '中点,法向量角度
  13.     Dim dblDistArr() As Double, dblMidPt() As Double, dblMidPt_NormalVector() As Double, dbl_Bugle_Radius() As Double
  14.     Dim i As Long
  15.     Dim objDoc As AcadDocument
  16.     Set objDoc = ThisDrawing()
  17.     SelectLots "MEA~PL~TMP~123", "LWPOLYLINE"
  18.     Set objSset = objDoc.SelectionSets("MEA~PL~TMP~123")
  19.     If objSset.Count = 0 Then Exit Sub
  20.     For Each objPL In objSset
  21. '如果你用,请你下载附件,花费一个币
  22.         getPlEachPartInfo objPL, dblDistArr, dblMidPt, dblMidPt_NormalVector, dbl_Bugle_Radius
  23.         For i = 0 To UBound(dblDistArr)
  24.             dblMpt(0) = dblMidPt(2 * i)
  25.             dblMpt(1) = dblMidPt(2 * i + 1)
  26.             dbl_NV_Angle = dblMidPt_NormalVector(i)
  27.             InsPt = objDoc.Utility.PolarPoint(dblMpt, dbl_NV_Angle, Coordinate_TextHeight * ratio)

  28.             If objDoc.ActiveSpace = acPaperSpace Then   ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''图纸空间
  29.                 Set objText = objDoc.PaperSpace.AddText(Format(CStr(Round(dblDistArr(i), 3)), "#.000"), InsPt, Coordinate_TextHeight * ratio)
  30.             ElseIf objDoc.ActiveSpace = acModelSpace Then ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''模型空间
  31.                 Set objText = objDoc.ModelSpace.AddText(Format(CStr(Round(dblDistArr(i), 3)), "#.000"), InsPt, Coordinate_TextHeight * ratio)
  32.             End If

  33.             objText.Alignment = acAlignmentMiddleCenter
  34.             objText.TextAlignmentPoint = InsPt

  35.             objText.Rotation = Atn(-1 / Tan(dblMidPt_NormalVector(i)))
  36.             objText.Update
  37.         Next i
  38.     Next
  39.     '------------------------------------------------
  40.     Exit Sub
  41.     '----------------
  42. ToExit:
  43.     Resume Next
  44. End Sub

  45. '二点间距离公式
  46. Public Function GetDist2D(ByVal x1 As Double, _
  47.     ByVal y1 As Double, _
  48.     ByVal x2 As Double, _
  49.     ByVal y2 As Double) As Double
  50.     GetDist2D = Sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
  51. End Function




取消原附件的收币,新附件增加凸度圆心坐标





本帖子中包含更多资源

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

x
发表于 2014-10-23 23:12 | 显示全部楼层
高手,在用VB6,学习一下,谢谢了
发表于 2014-10-24 09:23 | 显示全部楼层
向楼主学习.
发表于 2014-10-24 17:39 | 显示全部楼层
不错,学习了!
发表于 2014-10-24 18:06 来自手机 | 显示全部楼层
向楼主学习了。
发表于 2014-10-24 18:47 | 显示全部楼层
顶!
楼主的免费教程,无私分享令人敬佩!
支持!!
回复 支持 1 反对 0

使用道具 举报

发表于 2014-10-25 20:04 来自手机 | 显示全部楼层
楼主太厉害了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 06:10 , Processed in 0.961634 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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