明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 507|回复: 0

沙漠骆驼工具箱源码-5长度统计

[复制链接]
发表于 2022-2-10 14:42 | 显示全部楼层 |阅读模式
工具条:长度统计,界面和代码如下:
1 界面:



2 代码如下:



    Dim sumlength As Double  'sumarea
    Dim xiaoshuweishu As Integer
    Dim zigao As Double
    'Dim bilichi As Double
    Dim xbilichi As Double
    Dim ybilichi As Double
   
    Dim bilichi As Double
    Dim bilichi1 As Double
    Dim bilichi2 As Double
    Dim danwei As String
   
    '框选对象进行分类统计 里面用的
    Private Type layerclass   '根据图层分类
        name As String    '图层名称
        sumchangdu As Double ' 长度
        yuanobj As AcadObject '定义原对象,以获取对象的属性
    End Type
  
   
    Dim layerlength() As Double ' 存储每个图层中图元 的长度和
    Dim alllength As Double  '用来存储总的长度
    Dim lengthtongji() As layerclass
            
    Dim currenttextstyle As String
    Dim currentlayername As String
    Dim lengthlayer As AcadLayer    'lengthlayer


Private Sub ComboBox5_Change()
    bilichi1 = ComboBox2.Text
End Sub




Private Sub CommandButton1_Click() '框选对象直接求总长度
    If OptionButton4.value Then bilichi = ComboBox2.Text
    If OptionButton5.value Then bilichi = bilichi2
    If OptionButton5.value And Label3.Caption = "" Then
        MsgBox "请获取当前图形的比例尺!", vbCritical, "获取比例尺"
        Exit Sub
    End If
    Me.Hide
    On Error Resume Next
    currenttextstyle = ThisDrawing.GetVariable("textstyle")
    currentlayername = ThisDrawing.ActiveLayer.name
    Set lengthlayer = ThisDrawing.Layers.Add("长度统计")
    lengthlayer.color = acGreen
    ThisDrawing.SetVariable "cecolor", "256"
    ThisDrawing.ActiveLayer = lengthlayer


    Dim sset1 As AcadSelectionSet
    Dim filtertype(4) As Integer '定义选择过滤器类型的dsf组码
    Dim filterdata(4) As Variant '定义过滤器的值
    filtertype(0) = -4
    filterdata(0) = "<or"
    filtertype(1) = 0
    filterdata(1) = "line"
    filtertype(2) = 0
    filterdata(2) = "lwpolyline"
    filtertype(3) = 0
    filterdata(3) = "POLYLINE"
    filtertype(4) = -4
    filterdata(4) = "or>"
    Set sset1 = ThisDrawing.SelectionSets.Add("ss1")
    If Err.Number <> 0 Then
        Err.Clear
        Set sset1 = ThisDrawing.SelectionSets.Item("ss1")
        sset1.Clear
    End If
    ThisDrawing.Utility.prompt ("请框选要统计长度的对象:")
    sset1.SelectOnScreen filtertype, filterdata
    If sset1.count = 0 Then
        Me.show
        Exit Sub
    End If
    zigao = ComboBox1.Text
'    xbilichi = ComboBox2.Text
'    ybilichi = ComboBox4.Text
    xiaoshuweishu = ComboBox3.Text


    sumlength = 0
    Dim duixiang As AcadObject
    For Each duixiang In sset1
        sumlength = sumlength + duixiang.length
    Next
    If OptionButton1.value Then
        danwei = " m"
        sumlength = sumlength * bilichi / 10 ^ 3 'bilichi
    Else
        danwei = " km"
        sumlength = sumlength * bilichi / 10 ^ 6
    End If
    Dim basepoint As Variant
    Dim geshi As String
   
    ThisDrawing.SetVariable "textstyle", "wh_lkx"
    geshi = "0." & Right("00000", xiaoshuweishu)
    basepoint = ThisDrawing.Utility.GetPoint(, "请拾取插入点:")
    Dim mianjitext As AcadText
    Set mianjitext = ThisDrawing.ModelSpace.AddText("当前图形比例尺 1:" & bilichi, basepoint, zigao)
    basepoint(1) = basepoint(1) - zigao * 2
    Set mianjitext = ThisDrawing.ModelSpace.AddText( _
                "对象个数:" & sset1.count & "。  " & _
                "总长度为:" & Format(sumlength, geshi) & danwei, basepoint, zigao)
   
    '恢复文字样式
    ThisDrawing.SetVariable "textstyle", currenttextstyle
    '恢复图层
    ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item(currentlayername)
    Me.show
End Sub


Private Sub CommandButton2_Click()
    Me.Hide
End Sub


Private Sub CommandButton4_Click() '框选对象进行分类统计
    If OptionButton4.value Then bilichi = ComboBox2.Text
    If OptionButton5.value Then bilichi = bilichi2
    If OptionButton5.value And Label3.Caption = "" Then
        MsgBox "请获取当前图形的比例尺!", vbCritical, "获取比例尺"
        Exit Sub
    End If
    Me.Hide
    zigao = ComboBox1.Text
'    xbilichi = ComboBox2.Text
'    ybilichi = ComboBox4.Text
    xiaoshuweishu = ComboBox3.Text
    On Error Resume Next


    currenttextstyle = ThisDrawing.GetVariable("textstyle")
    currentlayername = ThisDrawing.ActiveLayer.name
    Set lengthlayer = ThisDrawing.Layers.Add("长度统计")
    lengthlayer.color = acGreen
    ThisDrawing.SetVariable "cecolor", "256"
    ThisDrawing.ActiveLayer = lengthlayer


    Dim sset1 As AcadSelectionSet
    Dim filtertype(4) As Integer '定义选择过滤器类型的dsf组码
    Dim filterdata(4) As Variant '定义过滤器的值
    filtertype(0) = -4
    filterdata(0) = "<or"
    filtertype(1) = 0
    filterdata(1) = "line"
    filtertype(2) = 0
    filterdata(2) = "lwpolyline"
    filtertype(3) = 0
    filterdata(3) = "POLYLINE"
    filtertype(4) = -4
    filterdata(4) = "or>"
    Set sset1 = ThisDrawing.SelectionSets.Add("ss1")
    If Err.Number <> 0 Then
        Err.Clear
        Set sset1 = ThisDrawing.SelectionSets.Item("ss1")
        sset1.Clear
    End If
    ThisDrawing.Utility.prompt ("请框选要统计长度的对象:")
    sset1.SelectOnScreen filtertype, filterdata
   
    If sset1.count = 0 Then
        Me.show
        Exit Sub
    End If


    Dim i As Integer
    Dim j As Integer
    ReDim layerlength(ThisDrawing.Layers.count - 1)
   
    Dim changduobj As AcadObject
    ReDim huoquobj(sset1.count - 1) As Double
    Dim count1 As Double
    For i = 0 To ThisDrawing.Layers.count - 1
        For Each changduobj In sset1
            If ThisDrawing.Layers.Item(i).name = changduobj.Layer Then
                layerlength(i) = layerlength(i) + changduobj.length
                'Set huoquobj(count1) = changduobj
            End If
            'count1 = count1 + 1
        Next
        If layerlength(i) <> 0 Then  '记录长度不为零的图层个数
            j = j + 1
        End If
    Next
'    If j = 0 Then
'        Me.Show
'        Exit Sub
'    End If
    ReDim lengthtongji(0 To j - 1)
    Dim jj As Double
    For i = 0 To ThisDrawing.Layers.count - 1
        If layerlength(i) <> 0 Then
            lengthtongji(jj).name = ThisDrawing.Layers.Item(i).name
            lengthtongji(jj).sumchangdu = layerlength(i)
            'Set lengthtongji(jj).yuanobj = sset
            jj = jj + 1
        End If
    Next
    alllength = 0


    For i = 0 To UBound(lengthtongji)
        If OptionButton1.value Then
            lengthtongji(i).sumchangdu = lengthtongji(i).sumchangdu * bilichi / 10 ^ 3
        Else
            lengthtongji(i).sumchangdu = lengthtongji(i).sumchangdu * bilichi / 10 ^ 6
        End If
        alllength = alllength + lengthtongji(i).sumchangdu    '求总长度
    Next
   
    If OptionButton1.value Then
        danwei = " m"
    Else
        danwei = " km"
    End If
    Dim basepoint As Variant
    basepoint = ThisDrawing.Utility.GetPoint(, "拾取统计表格插入点:")
   
    '画统计表格
    ThisDrawing.SetVariable "textstyle", "wh_lkx"
   
    Dim biaotoukuan As Double '设定 表格长度
    Dim biaotougao As Double '设定 表格高度
    If zigao < 4 Then
        biaotoukuan = 20
        biaotougao = 8
    Else
        biaotoukuan = zigao * 8
        biaotougao = zigao * 2.5
    End If
    Dim hengxian As AcadLWPolyline
    Dim p1p2(0 To 3) As Double
    p1p2(0) = basepoint(0): p1p2(1) = basepoint(1)
    p1p2(2) = basepoint(0) + 5 * biaotoukuan: p1p2(3) = p1p2(1)
    ThisDrawing.ModelSpace.AddLightWeightPolyline p1p2
    p1p2(0) = basepoint(0): p1p2(1) = basepoint(1) - biaotougao
    p1p2(2) = basepoint(0) + 5 * biaotoukuan: p1p2(3) = p1p2(1)
    ThisDrawing.ModelSpace.AddLightWeightPolyline p1p2
   
    For i = 0 To UBound(lengthtongji)
        p1p2(0) = basepoint(0): p1p2(1) = p1p2(1) - biaotougao
        p1p2(2) = basepoint(0) + 5 * biaotoukuan: p1p2(3) = p1p2(1)
        ThisDrawing.ModelSpace.AddLightWeightPolyline p1p2
    Next
    For i = 0 To 5
        p1p2(0) = basepoint(0) + biaotoukuan * i
        p1p2(1) = basepoint(1)
        p1p2(2) = p1p2(0)
        ThisDrawing.ModelSpace.AddLightWeightPolyline p1p2
    Next
   
    Dim p2p4(0 To 7) As Double
    p2p4(0) = basepoint(0): p2p4(1) = p1p2(3)
    p2p4(2) = basepoint(0): p2p4(3) = p1p2(3) - biaotougao
    p2p4(4) = basepoint(0) + 5 * biaotoukuan: p2p4(5) = p2p4(3)
    p2p4(6) = p2p4(4): p2p4(7) = p2p4(1)
    ThisDrawing.ModelSpace.AddLightWeightPolyline p2p4
   
    Dim mingcheng As AcadText
    Dim charudian(0 To 2) As Double
    charudian(0) = basepoint(0) + biaotoukuan * 0.5
    charudian(1) = basepoint(1) - biaotougao * 0.5
    Set mingcheng = ThisDrawing.ModelSpace.AddText("序 号", charudian, zigao)
    With mingcheng
        .Alignment = acAlignmentMiddleCenter
        .TextAlignmentPoint = charudian
    End With
    charudian(0) = basepoint(0) + biaotoukuan * 1.5
    charudian(1) = basepoint(1) - biaotougao * 0.5
    Set mingcheng = ThisDrawing.ModelSpace.AddText("图层名称", charudian, zigao)
    mingcheng.Alignment = acAlignmentMiddleCenter
    mingcheng.TextAlignmentPoint = charudian
   
    charudian(0) = basepoint(0) + biaotoukuan * 2.5
    charudian(1) = basepoint(1) - biaotougao * 0.5
    Set mingcheng = ThisDrawing.ModelSpace.AddText("图 例", charudian, zigao)
    mingcheng.Alignment = acAlignmentMiddleCenter
    mingcheng.TextAlignmentPoint = charudian
   
    charudian(0) = basepoint(0) + biaotoukuan * 3.5
    charudian(1) = basepoint(1) - biaotougao * 0.5
    Set mingcheng = ThisDrawing.ModelSpace.AddText("长 度", charudian, zigao)
    mingcheng.Alignment = acAlignmentMiddleCenter
    mingcheng.TextAlignmentPoint = charudian
   
    charudian(0) = basepoint(0) + biaotoukuan * 4.5
    charudian(1) = basepoint(1) - biaotougao * 0.5
    Set mingcheng = ThisDrawing.ModelSpace.AddText("单 位", charudian, zigao)
    mingcheng.Alignment = acAlignmentMiddleCenter
    mingcheng.TextAlignmentPoint = charudian
   
    '插入序号和单位
    For i = 1 To UBound(lengthtongji) + 1
        charudian(0) = basepoint(0) + biaotoukuan * 0.5
        charudian(1) = basepoint(1) - (i + 0.5) * biaotougao
        Set mingcheng = ThisDrawing.ModelSpace.AddText(i, charudian, zigao)
        mingcheng.Alignment = acAlignmentMiddleCenter
        mingcheng.TextAlignmentPoint = charudian
    Next
    For i = 1 To UBound(lengthtongji) + 1
        charudian(0) = basepoint(0) + biaotoukuan * 4.5
        charudian(1) = basepoint(1) - (i + 0.5) * biaotougao
        Set mingcheng = ThisDrawing.ModelSpace.AddText(danwei, charudian, zigao)
        mingcheng.Alignment = acAlignmentMiddleCenter
        mingcheng.TextAlignmentPoint = charudian
    Next
   
    Dim geshi As String
    geshi = "0." & Right("00000", xiaoshuweishu)
    charudian(0) = basepoint(0) + biaotoukuan * 2.5
    charudian(1) = basepoint(1) - (i + 0.5) * biaotougao
   
    Set mingcheng = ThisDrawing.ModelSpace.AddText( _
                        "对象个数:" & sset1.count & "。  " & _
                        "总长度=" & Format(alllength, geshi) & danwei, charudian, zigao)
    mingcheng.Alignment = acAlignmentMiddleCenter
    mingcheng.TextAlignmentPoint = charudian
   
    '插入图层名称、图例 和长度数据
    For i = 1 To UBound(lengthtongji) + 1
        charudian(0) = basepoint(0) + biaotoukuan * 1.5
        charudian(1) = basepoint(1) - (i + 0.5) * biaotougao
        Set mingcheng = ThisDrawing.ModelSpace.AddText(lengthtongji(i - 1).name, charudian, zigao)
        mingcheng.Alignment = acAlignmentMiddleCenter
        mingcheng.TextAlignmentPoint = charudian
    Next
    Dim tulipline As AcadLWPolyline '设置图例线型
    Dim yuanline As AcadObject
    Dim tulilist(0 To 3) As Double
    For i = 1 To UBound(lengthtongji) + 1
        charudian(0) = basepoint(0) + biaotoukuan * 2.5
        charudian(1) = basepoint(1) - (i + 0.5) * biaotougao
        tulilist(0) = charudian(0) - biaotoukuan * 0.4
        tulilist(1) = charudian(1)
        tulilist(2) = charudian(0) + biaotoukuan * 0.4
        tulilist(3) = charudian(1)
        Set tulipline = ThisDrawing.ModelSpace.AddLightWeightPolyline(tulilist)
        tulipline.Layer = lengthtongji(i - 1).name
        'tulipline.Linetype = "bylayer"
        'tulipline.color = acByLayer
        'tulipline.Lineweight = acLnWtByLayer
        'tulipline.LinetypeScale = 0.2
'        With dmxzdm
'            .Linetype = zdmxian.Linetype
'            .Layer = zdmxian.Layer
'            .LinetypeScale = zdmxian.LinetypeScale
'            .Lineweight = zdmxian.Lineweight
'            .ConstantWidth = zdmxian.ConstantWidth
'            .LinetypeGeneration = zdmxian.LinetypeGeneration
'            .color = zdmxian.color
'        End With
    Next
    For i = 1 To UBound(lengthtongji) + 1
        charudian(0) = basepoint(0) + biaotoukuan * 3.5
        charudian(1) = basepoint(1) - (i + 0.5) * biaotougao
        Set mingcheng = ThisDrawing.ModelSpace.AddText(Format(lengthtongji(i - 1).sumchangdu, geshi), charudian, zigao)
        mingcheng.Alignment = acAlignmentMiddleCenter
        mingcheng.TextAlignmentPoint = charudian
    Next
   


   
    charudian(0) = basepoint(0)
    charudian(1) = basepoint(1) + biaotougao * 0.5


    Set mingcheng = ThisDrawing.ModelSpace.AddText("当前图形比例尺 1:" & bilichi, charudian, zigao)
   
    '恢复文字样式
    ThisDrawing.SetVariable "textstyle", currenttextstyle
    '恢复图层
    ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item(currentlayername)
   
    sset1.Clear
    sset1.Delete
    Me.show
End Sub


Private Sub Label2_Click()
    Me.Hide
    On Error Resume Next
    ThisDrawing.SetVariable "CMDECHO", 0
    Dim pt1 As Variant
    Dim pt2 As Variant
    pt1 = ThisDrawing.Utility.GetPoint(, "请拾取第一点:")
    pt2 = ThisDrawing.Utility.GetPoint(pt1, "请拾取第二点:")
    Dim tushangjuli As Double
    Dim shijijuli As Double
    tushangjuli = distancep1p2(pt1, pt2)
    shijijuli = ThisDrawing.Utility.GetReal("请输入该段的实际距离(单位为m):")
    If Err Then
        ThisDrawing.Utility.prompt "-----执行错误,请重新操作------" & vbCrLf
        Me.show
        Exit Sub
    End If
    bilichi2 = shijijuli * 1000 / tushangjuli
    Label3.Caption = "1:" & Format(bilichi2, "0.00")
    Me.show
End Sub


Private Sub OptionButton4_Click()
    If OptionButton4.value Then
        ComboBox2.Enabled = True
        Label2.Enabled = False
        Label3.Enabled = False
    End If
End Sub




Private Sub OptionButton5_Click()
    If OptionButton5.value Then
        ComboBox2.Enabled = False
        Label2.Enabled = True
        Label3.Enabled = True
    End If
End Sub
Private Sub UserForm_Initialize()
    Dim i As Integer
    For i = 1 To 19  '设置字体高度
        ComboBox1.AddItem Format(i / 2 + 0.5, "0.0")
    Next
    For i = 15 To 95 Step 5  '15---95
        ComboBox1.AddItem i
    Next
    For i = 100 To 1000 Step 50 '100---500
        ComboBox1.AddItem i
    Next
    ComboBox2.AddItem 1 '设置当前图形水平比例
    ComboBox2.AddItem 2
    ComboBox2.AddItem 5
    ComboBox2.AddItem 10
    ComboBox2.AddItem 20
    ComboBox2.AddItem 25
    ComboBox2.AddItem 50
    For i = 3 To 6
        ComboBox2.AddItem 10 * ComboBox2.List(i)
    Next
    For i = 3 To 6
        ComboBox2.AddItem 100 * ComboBox2.List(i)
    Next
    For i = 3 To 6
        ComboBox2.AddItem 1000 * ComboBox2.List(i)
    Next
    For i = 3 To 6
        ComboBox2.AddItem 10000 * ComboBox2.List(i)
    Next
   
    ComboBox3.AddItem 1 '设置小数位数
    ComboBox3.AddItem 2
    ComboBox3.AddItem 3
    ComboBox3.AddItem 4
    ComboBox3.AddItem 5
    newtextstyle2    '调用新建字体样式程序
    bilichi1 = ComboBox2.Text
End Sub


' '创建新的字体样式
'Private Sub newtextstyle()   '创建新的字体样式
'    Dim typeFace As String
'    Dim SavetypeFace As String
'    Dim Bold As Boolean
'    Dim Italic As Boolean
'    Dim charSet As Long
'    Dim PitchandFamily As Long
'    Dim lkxtextstyle As AcadTextStyle
'    Dim currenttextstyle As AcadTextStyle
'    Set currenttextstyle = ThisDrawing.ActiveTextStyle
'    '获取当前字体样式的参数
'    currenttextstyle.GetFont typeFace, Bold, Italic, charSet, PitchandFamily
'    Set lkxtextstyle = ThisDrawing.TextStyles.Add("wh_lkx")
'    With lkxtextstyle
'        .SetFont "宋体", False, False, charSet, PitchandFamily
'        .width = 0.8   '设置宽度比例
'    End With
'End Sub






'求两点之间的距离,参数是(x1,y1),(x2,y2)
Private Function distancep1p2(ByVal p1 As Variant, ByVal p2 As Variant) As Double
    distancep1p2 = ((p1(0) - p2(0)) ^ 2 + (p1(1) - p2(1)) ^ 2) ^ 0.5
End Function







本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 20:47 , Processed in 0.383680 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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