sieben 发表于 2014-10-21 17:15:36

牛人!还用VB6

zzyong00 发表于 2014-10-21 21:53:46

上回说到“先选择对象再执行命令”,现在牛刀小试一下
4、数值合并计算



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

    On Error GoTo err1

    Dim objSset As AcadSelectionSet, objText As AcadText

    Set objSset = getPickFirstSel()

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

      If objSset.Count = 0 Then Exit Sub
    End If

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

    For Each objText In objSset

      If IsNumeric(objText.TextString) Then
            If InStr(objText.TextString, ".") Then
                If n < Len(objText.TextString) - InStr(objText.TextString, ".") Then
                  n = Len(objText.TextString) - InStr(objText.TextString, ".")
                End If
            End If

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

    Next

    Dim pt1, FMT As String

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

    Exit Sub

err1:
    Debug.Print Err.Description
    Err.Clear

    Exit Sub

End Sub

chenshulu 发表于 2014-10-23 18:16:28

chenshulu 发表于 2014-10-20 18:44 static/image/common/back.gif
你的排图框的源码呢,

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

zzyong00 发表于 2014-10-23 19:43:36

本帖最后由 zzyong00 于 2015-3-8 18:13 编辑

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

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


Option Explicit
Const PI = 3.1415926
Public Coordinate_TextHeight As Double                      '文字高
Public ratio               As Double                      '全局比例


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

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

            objText.Alignment = acAlignmentMiddleCenter
            objText.TextAlignmentPoint = InsPt

            objText.Rotation = Atn(-1 / Tan(dblMidPt_NormalVector(i)))
            objText.Update
      Next i
    Next
    '------------------------------------------------
    Exit Sub
    '----------------
ToExit:
    Resume Next
End Sub

'二点间距离公式
Public Function GetDist2D(ByVal x1 As Double, _
    ByVal y1 As Double, _
    ByVal x2 As Double, _
    ByVal y2 As Double) As Double
    GetDist2D = Sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
End Function




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





qincccken 发表于 2014-10-23 23:12:09

高手,在用VB6,学习一下,谢谢了

VBALISPER 发表于 2014-10-24 09:23:31

向楼主学习.

阿霸jun 发表于 2014-10-24 17:39:30

不错,学习了!

憨哥哥唱情歌 发表于 2014-10-24 18:06:57

向楼主学习了。

vbcad 发表于 2014-10-24 18:47:50

顶!
楼主的免费教程,无私分享令人敬佩!
支持!!

xiaolong1487 发表于 2014-10-25 20:04:59

楼主太厉害了
页: 1 [2] 3 4 5 6 7 8 9 10 11
查看完整版本: 用VB6进行Autocad的二次开发(原创)