明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 998|回复: 4

哪位帮我看看,该如何优化,谢谢了

[复制链接]
发表于 2013-9-20 16:33 | 显示全部楼层 |阅读模式
本帖最后由 szj612 于 2013-9-20 16:33 编辑

以下是我写的用于统计圆的程式,把相同规格的圆分别统计
只能统计5种规格的直径和5种规格的color,现在我想改为更多规格,能不能用循环解决?能不能不限规格?
谢谢!


Public Sub TEST() '测试用

Dim sset As AcadSelectionSet
Set sset = ThisDrawing.SelectionSets.Add("dsdgds")
sset.SelectOnScreen
Dim Ent As AcadEntity
Dim A As Long
Dim I(1, 5) As Long     '5种不同的直径,其余都归于第6种,计数和记录值各用一维
Dim J(1, 5, 5) As Long    '对应不同直径的5种不同的COLOR,其余都归于第6种,计数和记录值各用一维
For Each Ent In sset
2:
Select Case CLng(Ent.Diameter)
Case I(0, 0)
    I(1, 0) = I(1, 0) + 1
    Select Case Ent.color
    Case J(0, 0, 0)
        J(1, 0, 0) = J(1, 0, 0) + 1
    Case J(0, 0, 1)
        J(1, 0, 1) = J(1, 0, 1) + 1
    Case J(0, 0, 2)
        J(1, 0, 2) = J(1, 0, 2) + 1
    Case J(0, 0, 3)
        J(1, 0, 3) = J(1, 0, 3) + 1
    Case J(0, 0, 4)
        J(1, 0, 4) = J(1, 0, 4) + 1
    Case Else
        If J(0, 0, 0) = 0 Then
            J(0, 0, 0) = Ent.color
            GoTo 2:
        ElseIf J(0, 0, 1) = 0 Then
            J(0, 0, 1) = Ent.color
            GoTo 2
        ElseIf J(0, 0, 2) = 0 Then
            J(0, 0, 2) = Ent.color
            GoTo 2
        ElseIf J(0, 0, 3) = 0 Then
            J(0, 0, 3) = Ent.color
            GoTo 2
        ElseIf J(0, 0, 4) = 0 Then
            J(0, 0, 4) = Ent.color
            GoTo 2
        Else
            J(1, 0, 5) = J(1, 0, 5) + 1
        End If
    End Select
Case I(0, 1)
    I(1, 1) = I(1, 1) + 1
    Select Case Ent.color
    Case J(0, 1, 0)
        J(1, 1, 0) = J(1, 1, 0) + 1
    Case J(0, 1, 1)
        J(1, 1, 1) = J(1, 1, 1) + 1
    Case J(0, 1, 2)
        J(1, 1, 2) = J(1, 1, 2) + 1
    Case J(0, 1, 3)
        J(1, 1, 3) = J(1, 1, 3) + 1
    Case J(0, 1, 4)
        J(1, 1, 4) = J(1, 1, 4) + 1
    Case Else
        If J(0, 1, 0) = 0 Then
            J(0, 1, 0) = Ent.color
            GoTo 2:
        ElseIf J(0, 1, 1) = 0 Then
            J(0, 1, 1) = Ent.color
            GoTo 2
        ElseIf J(0, 1, 2) = 0 Then
            J(0, 1, 2) = Ent.color
            GoTo 2
        ElseIf J(0, 1, 3) = 0 Then
            J(0, 1, 3) = Ent.color
            GoTo 2
        ElseIf J(0, 1, 4) = 0 Then
            J(0, 1, 4) = Ent.color
            GoTo 2
        Else
            J(1, 1, 5) = J(1, 1, 5) + 1
        End If
    End Select
Case I(0, 2)
    I(1, 2) = I(1, 2) + 1
    Select Case Ent.color
    Case J(0, 2, 0)
        J(1, 2, 0) = J(1, 2, 0) + 1
    Case J(0, 2, 1)
        J(1, 0, 1) = J(1, 2, 1) + 1
    Case J(0, 2, 2)
        J(1, 2, 2) = J(1, 2, 2) + 1
    Case J(0, 2, 3)
        J(1, 2, 3) = J(1, 2, 3) + 1
    Case J(0, 2, 4)
        J(1, 2, 4) = J(1, 2, 4) + 1
    Case Else
        If J(0, 2, 0) = 0 Then
            J(0, 2, 0) = Ent.color
            GoTo 2:
        ElseIf J(0, 2, 1) = 0 Then
            J(0, 2, 1) = Ent.color
            GoTo 2
        ElseIf J(0, 2, 2) = 0 Then
            J(0, 2, 2) = Ent.color
            GoTo 2
        ElseIf J(0, 2, 3) = 0 Then
            J(0, 2, 3) = Ent.color
            GoTo 2
        ElseIf J(0, 2, 4) = 0 Then
            J(0, 2, 4) = Ent.color
            GoTo 2
        Else
            J(1, 2, 5) = J(1, 2, 5) + 1
        End If
    End Select
Case I(0, 3)
    I(1, 3) = I(1, 3) + 1
    Select Case Ent.color
    Case J(0, 3, 0)
        J(1, 3, 0) = J(1, 3, 0) + 1
    Case J(0, 3, 1)
        J(1, 3, 1) = J(1, 3, 1) + 1
    Case J(0, 3, 2)
        J(1, 3, 2) = J(1, 3, 2) + 1
    Case J(0, 3, 3)
        J(1, 3, 3) = J(1, 3, 3) + 1
    Case J(0, 3, 4)
        J(1, 3, 4) = J(1, 3, 4) + 1
    Case Else
        If J(0, 3, 0) = 0 Then
            J(0, 3, 0) = Ent.color
            GoTo 2:
        ElseIf J(0, 3, 1) = 0 Then
            J(0, 3, 1) = Ent.color
            GoTo 2
        ElseIf J(0, 3, 2) = 0 Then
            J(0, 3, 2) = Ent.color
            GoTo 2
        ElseIf J(0, 3, 3) = 0 Then
            J(0, 3, 3) = Ent.color
            GoTo 2
        ElseIf J(0, 3, 4) = 0 Then
            J(0, 3, 4) = Ent.color
            GoTo 2
        Else
            J(1, 3, 5) = J(1, 3, 5) + 1
        End If
    End Select
Case I(0, 4)
    I(1, 4) = I(1, 4) + 1
    Select Case Ent.color
    Case J(0, 4, 0)
        J(1, 4, 0) = J(1, 4, 0) + 1
    Case J(0, 4, 1)
        J(1, 4, 1) = J(1, 4, 1) + 1
    Case J(0, 4, 2)
        J(1, 4, 2) = J(1, 4, 2) + 1
    Case J(0, 4, 3)
        J(1, 4, 3) = J(1, 4, 3) + 1
    Case J(0, 4, 4)
        J(1, 4, 4) = J(1, 4, 4) + 1
    Case Else
        If J(0, 4, 0) = 0 Then
            J(0, 4, 0) = Ent.color
            GoTo 2:
        ElseIf J(0, 4, 1) = 0 Then
            J(0, 4, 1) = Ent.color
            GoTo 2
        ElseIf J(0, 4, 2) = 0 Then
            J(0, 4, 2) = Ent.color
            GoTo 2
        ElseIf J(0, 4, 3) = 0 Then
            J(0, 4, 3) = Ent.color
            GoTo 2
        ElseIf J(0, 4, 4) = 0 Then
            J(0, 4, 4) = Ent.color
            GoTo 2
        Else
            J(1, 4, 5) = J(1, 4, 5) + 1
        End If
    End Select
Case Else
    If I(0, 0) = 0 Then
        I(0, 0) = CLng(Ent.Diameter)
        GoTo 2
    ElseIf I(0, 1) = 0 Then
        I(0, 1) = CLng(Ent.Diameter)
        GoTo 2
    ElseIf I(0, 2) = 0 Then
        I(0, 2) = CLng(Ent.Diameter)
        GoTo 2
    ElseIf I(0, 3) = 0 Then
        I(0, 3) = CLng(Ent.Diameter)
        GoTo 2
    ElseIf I(0, 4) = 0 Then
        I(0, 4) = CLng(Ent.Diameter)
        GoTo 2
    Else
        I(1, 5) = I(1, 5) + 1
    End If
End Select
Next
Dim op As Variant                         '输出结果
op = ThisDrawing.Utility.GetPoint
Dim txt As AcadText
For M = 0 To 5
    For N = 0 To 5
        If J(1, M, N) > 0 Then
            Set txt = ThisDrawing.ModelSpace.AddText(J(1, M, N) & "-" & I(0, M) & "*" & J(0, M, N), op, 4)
            op(1) = op(1) - 6
        End If
    Next N
Next M
sset.Delete
End Sub
发表于 2013-9-20 23:59 | 显示全部楼层
把圆的直径、颜色和ID写入数据库,然后用SQL语言建立一个查询完全可以不用这么麻烦而达到你的要求。
 楼主| 发表于 2013-9-21 10:22 | 显示全部楼层
谢谢楼上,因为编程只是业余爱好,所以还不懂怎么操作数据库,我想知道,如果不用数据库,有没有好的算法?不限规格有困难的话,可以限定规格,实际上规格(直径)和子规格(颜色)不会超过15。
这个程式所要解决的现实示例是:在一张总图中,包含许多个螺丝,因为螺丝是标准件,所以大小规格(直径)不是很多,但同一大小又可能存在多种长度(程式中以颜色代替),我想列出清单,把相同规格的螺丝汇总。
发表于 2013-9-21 21:06 | 显示全部楼层
找找排序的函数,然后建立数组,将圆的直径、颜色、句柄等信息组合成多维数组。
通过数组中的某一维元素进行排序,排序后你就知道怎么处理了。
排序过程设成独立的函数,这样你想处理多少数据都可以。
 楼主| 发表于 2013-9-22 00:29 | 显示全部楼层
谢谢明总,我明白了思路,估计在原理上和数据库也差不多,我试试看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-13 14:07 , Processed in 0.170613 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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