明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4835|回复: 14

选择集内的排序问题(高手都来比试一下)

  [复制链接]
发表于 2007-11-2 11:26:00 | 显示全部楼层 |阅读模式

现假设有选择集Sset,其中全为单行文字,由于过滤选择的时候是系统按照其绘图先后顺序而自动添加的,现如何通过其个单行文字的插入点坐标按从从左到右,自上而下的重新排序。此功能用为快速修改页码或图号等,比如一文件中有100幅图,可先查找“第*页”的文字将其添加到Sset中,然后自动修改页码。

请有兴趣的朋友及高手都来出个主意,怎么样给选择集内的元素排序。

发表于 2007-11-3 18:51:00 | 显示全部楼层

 

Dim currInsertionPoint As Variant
currInsertionPoint = textObj.insertionPoint

只是比较insertionPoint(0)和insertionPoint(1)的大小问题啊。

发表于 2007-11-12 22:31:00 | 显示全部楼层
我的办法是autocad到EXCEL-SQL排序.
发表于 2007-11-16 23:13:00 | 显示全部楼层
fjfhgdwfn发表于2007-11-3 18:51:00 Dim currInsertionPoint As VariantcurrInsertionPoint = textObj.insertionPoint只是比较insertionPoint(0)和insertionPoint(1)的大小问题啊。

你考虑问题太简单了,insertionPoint(0)和insertionPoint(1)排序问题可是一个专题了。

排序,X轴排序,y轴排序。二维数组排序。

发表于 2007-11-21 21:50:00 | 显示全部楼层
利用二维数组的已经是很简单的了,当然你如果只是对文字来排序的话,就可以用这种方法,比大小,自己想想就明白了。我做了一些排序的东西,是针对图框排序的,也是通过点来比较的,但是还不够好,不知道其他人还有什么更好的办法。
发表于 2007-11-22 10:51:00 | 显示全部楼层
看看我这样写对不?
模块:
  1. Public Type Point3d
  2. x As Double
  3. y As Double
  4. z As Double
  5. End Type
复制代码
代码
  1. Sub RandApt()
  2. '随机布点x=0~1000,y=0~1000
  3. Dim pt As AcadPoint
  4. Dim p() As Double
  5. Dim pl As AcadLWPolyline
  6. Dim i As Integer
  7. ReDim p(7)
  8. p(0) = 0: p(1) = 0
  9. p(2) = 1000: p(3) = 0
  10. p(4) = 1000: p(5) = 1000
  11. p(6) = 0: p(7) = 1000
  12. Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p)
  13. pl.Closed = True
  14. ThisDrawing.Application.ZoomExtents
  15. ReDim p(2)
  16. For i = 0 To 1000
  17. p(0) = Rnd * 1000
  18. p(1) = Rnd * 1000
  19. Set pt = ThisDrawing.ModelSpace.AddPoint(p)
  20. Next i
  21. End Sub
  22. Sub Sort()
  23. Dim pt As AcadPoint
  24. Dim Ent As AcadEntity
  25. Dim dt() As Point3d
  26. Dim i As Integer
  27. i = -1
  28. For Each Ent In ThisDrawing.ModelSpace
  29. If Ent.ObjectName = "AcDbPoint" Then
  30. Set pt = Ent
  31. i = i + 1
  32. ReDim Preserve dt(i)
  33. dt(i).x = Format(pt.Coordinates(0), "0")
  34. dt(i).y = Format(pt.Coordinates(1), "0.00")
  35. dt(i).z = Format(pt.Coordinates(2), "0.000")
  36. End If
  37. Next
  38. '排序Xy
  39. SSort dt, 2
  40. Open "c:\tmp.txt" For Output As #1
  41. For i = 0 To UBound(dt)
  42.     Print #1, dt(i).x, dt(i).y, dt(i).z
  43. Next i
  44. Close #1
  45. Shell "notepad.exe c:\tmp.txt", vbNormalFocus
  46. MsgBox "Over"
  47. End Sub
  48. Function SSort(dt() As Point3d, k As Integer)
  49. 'X=1、xy=2、xyz=3
  50. Dim dt1() As Point3d
  51. Dim i As Integer
  52. Dim Ex As Boolean
  53. i = UBound(dt)
  54. ReDim dt1(i)
  55. Dim N As Integer
  56. N = i
  57. dt1(0) = dt(0)
  58. If k >= 1 Then '一次排序
  59. For i = 1 To N
  60. Ex = False
  61.     For j = 0 To i - 1
  62.         If dt(i).x <= dt1(j).x Then '插入
  63.             For k = i To j + 1 Step -1
  64.                 dt1(k) = dt1(k - 1)
  65.             Next k
  66.             dt1(j) = dt(i)
  67.             Ex = True
  68.             Exit For
  69.         End If
  70.     Next j
  71.     If Ex = False Then '追加
  72.         dt1(i) = dt(i)
  73.     End If
  74. Next i
  75. End If
  76. '==============='===============
  77. If k >= 2 Then '二次排序
  78. Dim tmp As Point3d
  79. x1 = 0: x2 = 0
  80. While x1 <= N
  81. For i = x1 + 1 To N
  82. If dt1(i).x = dt1(x1).x Then
  83.     x2 = i
  84. Else
  85. Exit For
  86. End If
  87. Next i
  88. If x2 - x1 > 0 Then
  89.     For k = x1 To x2
  90.     For j = x1 To x2 - k + x1 - 1
  91.         If dt1(j).y > dt1(j + 1).y Then
  92.         tmp = dt1(j + 1)
  93.         dt1(j + 1) = dt1(j)
  94.         dt1(j) = tmp
  95.         End If
  96.     Next j
  97.     Next k
  98. End If
  99. x1 = i
  100. x2 = x1
  101. Wend
  102. End If
  103. '==============='===============
  104. If k >= 3 Then '三次排序
  105. x1 = 0: x2 = 0
  106. While x1 <= N
  107. For i = x1 + 1 To N
  108. If dt1(i).x = dt1(x1).x And dt1(i).y = dt1(x1).y Then
  109.     x2 = i
  110. Else
  111. Exit For
  112. End If
  113. Next i
  114. If x2 - x1 > 0 Then
  115.     For k = x1 To x2
  116.     For j = x1 To x2 - k + x1 - 1
  117.         If dt1(j + 1).y < dt1(j).y Then
  118.         tmp = dt1(j + 1)
  119.         dt1(j + 1) = dt1(j)
  120.         dt1(j) = tmp
  121.         End If
  122.     Next j
  123.     Next k
  124. End If
  125. x1 = i
  126. x2 = x1
  127. Wend
  128. End If
  129. '----------返回
  130. For i = 0 To N
  131. dt(i) = dt1(i)
  132. Next i
  133. End Function
发表于 2007-11-28 15:25:00 | 显示全部楼层
6楼的解法,好好要研究一下。
 楼主| 发表于 2007-11-30 18:27:00 | 显示全部楼层

谢谢排序

谢谢高手的指点,非常有用,不过你好像误解了我的意思了,我不是准备给选择集内的对象按照坐标来排序,而是要让他排好序后这些图元还是在选择集内,只是需要排列选择集内图元的在选择集内的顺序。比如可以把sset.item(0)与sset.item(1)做比较,比较条件是其插入点的坐标从从上到下,从做到右,然后把sset.item(0)赋给sset.item(3),sset.item(0)赋为item(1)的值,在把SSET.ITEM(1)赋为item(3)的值。
发表于 2007-12-3 20:04:00 | 显示全部楼层
本帖最后由 作者 于 2007-12-3 21:19:50 编辑

以下的排序方法:
不重复排序+冒泡排序方法
  1. Sub als()  Dim xm, xm1
  2.   Dim tt As AcadText, ll As AcadLine, Ent As AcadEntity           
  3.   aii = 0
  4.   ReDim xm(60) As Long, xm1(60) As Long
  5.   For Each Ent In ThisDrawing.ModelSpace   
  6.     Select Case Ent.ObjectName
  7.       Case "AcDbLine"
  8.         Set ll = Ent
  9.         xm(aii) = ll.EndPoint(0)
  10.         xm1(aii) = ll.EndPoint(1)
  11.         aii = aii + 1
  12.      End Select
  13.   Next Ent
  14.   ReDim Preserve xm1(1000) As Long
  15.   bb = xx(xm1)
  16.   Dim abc() As Long
  17.   ReDim abc(UBound(bb)) As Long
  18.   For ii = 0 To UBound(bb)   
  19.     abc(ii) = Val(bb(ii))   
  20.   Next ii
  21.   
  22.   cc = Bubble_Sort(abc)
  23.   For ii = 0 To UBound(cc)
  24.     Debug.Print ii, "-", cc(ii)
  25.   Next ii
  26.   ReDim Preserve xm(1000) As Long
  27.   bb = xx(xm)
  28.   
  29.   ReDim abc(UBound(bb)) As Long
  30.   For ii = 0 To UBound(bb)
  31.    
  32.     abc(ii) = Val(bb(ii))
  33.    
  34.   Next ii
  35.   
  36.   ccc = Bubble_Sort(abc)
  37.   For ii = 0 To UBound(ccc)
  38.     Debug.Print ii, "-", ccc(ii)
  39.   Next ii
  40.   ReDim xm(0), xm1(0)
  41. End Sub
  42.    
  43. Function xx(xm)
  44.   Dim arr() As String, Temp() As String '声明变量
  45.   Dim s%, r% '声明单值变量
  46.     On Error Resume Next '启动一个错误处理程序
  47.    
  48.     r = 0 '初值
  49.     s = UBound(xm)  '最大下标
  50.    
  51.     For i = 0 To s '循环
  52.       Temp = Filter(arr, xm(i)) '搜索数组
  53.       
  54.       If UBound(Temp) = -1 Then '如果未找到
  55.         ReDim Preserve arr(0 To r)  '定义动态数组大小
  56.         arr(r) = xm(i) '把姓名复制到数组Arr()中。
  57.         r = r + 1 '序号,自增1
  58.       End If
  59.     Next
  60.     xx = arr
  61. End Function
  62. Function Bubble_Sort(Ary)
  63.   Dim aryUBound, i, j
  64.   aryUBound = UBound(Ary)
  65.   For ii = 0 To aryUBound
  66.     Ary(ii) = Val(Round(Ary(ii), 2))
  67.   Next ii
  68.   For i = 0 To aryUBound
  69.     For j = i + 1 To aryUBound
  70.       If Ary(i) < Ary(j) Then
  71.         Swap Ary(i), Ary(j)
  72.       End If
  73.     Next
  74.   Next
  75.   Bubble_Sort = Ary
  76. End Function
  77. Function Swap(a, b)
  78.   Dim tmp
  79.   tmp = a
  80.   a = b
  81.   b = tmp
  82. End Function
发表于 2007-12-3 20:10:00 | 显示全部楼层
本帖最后由 作者 于 2007-12-3 20:12:20 编辑

以上方法在处理AutoCAD的材料表处理中比较实用。

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

本版积分规则

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

GMT+8, 2024-11-26 10:25 , Processed in 0.172891 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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