明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1647|回复: 3

[VBA]有关一段VBA程序优化的问题

[复制链接]
发表于 2006-8-23 20:22:00 | 显示全部楼层 |阅读模式
  1. Public Function CheckRegionIntersect(ByVal player As String)    '//////////////////////检查多边形面域是否相交
  2.   On Error GoTo ERR_HANDLE:
  3.        Dim psel As AcadSelectionSet
  4.        Dim pENty As AcadEntity
  5.        Dim s_Obj() As AcadEntity
  6.        ReDim s_Obj(0) As AcadEntity
  7.        Dim pPolyline As AcadPolyline
  8.        Dim pLWPolyline As AcadLWPolyline
  9.        Dim pCNT As Integer
  10.        Dim i, j As Integer
  11.        i = 0
  12.        For Each pENty In ThisDrawing.ModelSpace
  13.          If pENty.layer = player Then
  14.            If UCase(pENty.ObjectName) = "ACDBPOLYLINE" Then
  15.               Set pLWPolyline = pENty
  16.                   If pLWPolyline.Closed = True Then
  17.                           If i = 0 Then
  18.                             Set s_Obj(0) = pENty
  19.                           Else
  20.                              ReDim Preserve s_Obj(i) As AcadEntity
  21.                                 Set s_Obj(i) = pENty
  22.                           End If
  23.                            i = i + 1
  24.                   End If
  25.            ElseIf UCase(pENty.ObjectName) = "ACDB2DPOLYLINE" Then
  26.                Set pPolyline = pENty
  27.                   If pPolyline.Closed = True Then
  28.                           If i = 0 Then
  29.                             Set s_Obj(0) = pENty
  30.                           Else
  31.                              ReDim Preserve s_Obj(i) As AcadEntity
  32.                                 Set s_Obj(i) = pENty
  33.                           End If
  34.                           i = i + 1
  35.                    End If
  36.            End If
  37.         End If
  38.      Next
  39. '//////////////判断图型中是否有选择集s_AAA如果有将选择集清空,如果没有则直接新建选择集s_AAA
  40.       If ThisDrawing.SelectionSets.Count = 0 Then Set psel = ThisDrawing.SelectionSets.Add("s_tmp"): GoTo uuu:
  41.       For j = 0 To ThisDrawing.SelectionSets.Count - 1
  42.           If ThisDrawing.SelectionSets.Item(j).Name = "s_tmp" Then
  43.                Set psel = ThisDrawing.SelectionSets.Item(j)
  44.                    psel.Clear
  45.                    Exit For
  46.           End If
  47.           If j = ThisDrawing.SelectionSets.Count - 1 Then
  48.               Set psel = ThisDrawing.SelectionSets.Add("s_tmp")
  49.           End If
  50.       Next
  51.       
  52. uuu:     psel.AddItems s_Obj       '/////////////////////将实体数组对象添加到新增加的选择集中
  53. CreateLayer    '创建新图层
  54. For j = 0 To ThisDrawing.Layers.Count - 1
  55.       If ThisDrawing.Layers.Item(j).Name = "dan" Then
  56.            ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item(j)
  57.             Exit For
  58.       End If
  59. Next
  60.   '/////////////////将选择集中的所有要素转换成面域
  61.   Dim pRegion As Variant
  62.   Dim pLineObj(0 To 0) As AcadEntity
  63.   
  64.   For i = 0 To psel.Count - 1
  65.      Set pLineObj(0) = psel.Item(i)
  66.      pRegion = ThisDrawing.ModelSpace.AddRegion(pLineObj)
  67.   Next
  68.   
  69.        psel.Clear
  70.       
  71.        Set pENty = Nothing
  72.         '/////////////将所有面域对象添加到psel选择集中
  73.         Dim s_RegionObj() As AcadEntity
  74.         ReDim s_RegionObj(0) As AcadEntity
  75.         j = 0
  76.        For Each pENty In ThisDrawing.ModelSpace
  77.          If pENty.layer = "dan" Then
  78.            If UCase(pENty.ObjectName) = "ACDBREGION" Then
  79.                If j = 0 Then
  80.                   Set s_RegionObj(0) = pENty
  81.                Else
  82.                    ReDim Preserve s_RegionObj(j) As AcadEntity
  83.                   Set s_RegionObj(j) = pENty
  84.                End If
  85.                j = j + 1
  86.            End If
  87.         End If
  88.        Next
  89.        psel.AddItems s_RegionObj   '/////////添加对象
  90.        Dim pRegion1 As AcadRegion
  91.        Dim pRegion2 As AcadRegion
  92.        For i = 0 To psel.Count - 2
  93.            For j = i + 1 To psel.Count - 1
  94.                  Set pRegion1 = psel.Item(i).Copy
  95.                  Set pRegion2 = psel.Item(j).Copy
  96.                InterSectRegion pRegion1, pRegion2
  97.            Next
  98.        Next
  99.       
  100.        For i = 0 To psel.Count - 1
  101.            psel.Item(i).Delete
  102.        Next
  103.        Dim tmpRegion As AcadRegion
  104.        Set pENty = Nothing
  105.        For Each pENty In ThisDrawing.ModelSpace
  106.            If UCase(pENty.ObjectName) = "ACDBREGION" Then
  107.                Set tmpRegion = pENty
  108.                   drawcircle tmpRegion.Centroid
  109.                   pCNT = pCNT + 1
  110.            End If
  111.        Next
  112.        MsgBox "数据处理完成" & Chr(10) & "共检查到" + CStr(pCNT) + "处交错"
  113. ERR_HANDLE:
  114.     psel.Delete
  115. End Function
  116. Private Function InterSectRegion(ByVal pRegion1 As AcadRegion, ByVal pRegion2 As AcadRegion) '///面相交
  117. Dim NewRegion As AcadRegion
  118. Dim parea As Double
  119.     parea = pRegion1.Area
  120.     pRegion1.Boolean acIntersection, pRegion2
  121.     If pRegion1.Area = 0 Then
  122.        pRegion1.Delete
  123.     End If
  124. End Function
以上是我写的一段用于检查 面交错 的程序.程序实现了预定功能.但遇到的问题是当图层中的图元数量有上千个的时候,程序就会出现死锁的现象,进而导致程序崩溃.
我想请教大家的是,我的这段代码该如何修改,才能在处理大数据量(3000-8000图元/层)的时候,不会出现死锁的现象,谢谢
 楼主| 发表于 2006-8-27 12:38:00 | 显示全部楼层

大家能给点建议么

发表于 2013-1-7 15:24:19 | 显示全部楼层
可以把全部代码贴上来看看吗?
发表于 2013-1-7 15:30:06 | 显示全部楼层
把全部代码发给我看看? 邮箱 chy_dt@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:42 , Processed in 0.184728 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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