fangmin723 发表于 2018-10-16 08:48:38

CAD-文字按坐标从左到右,从下到上排序(2018.10.17新增归并排序)!

本帖最后由 fangmin723 于 2018-10-23 07:51 编辑

最近在接触cad VBA的坐标排序,在明经里面也找到不少,但是效果不是很满意,自己就在前人的基础上重写改良了一下!
网上摘录的 十大经典排序算法(动图演示)在14楼,点击蓝色文字即达!

下面这个是我自己代码演示效果:


这是在本论坛里面找到的,一次性框选没有问题,但是一个一个点选的时候就出现了问题,演示效果如下:
zzyong00版主的帖子:http://bbs.mjtd.com/forum.php?mo ... 364&fromuid=7316343



代码如下:
Sub DealText()
    Dim objSset As Object, objtrans As Object, objEntArr As New Collection, i As Integer, j As Integer
    Set zwdoc = AcadApplication.ActiveDocument
    SelectAllText zwdoc, objSset
    For i = 0 To objSset.Count - 1
      objEntArr.Add objSset.Item(i)
    Next i
    If objEntArr.Count > 0 Then
      SortYup objEntArr
      Dim pt As Variant, colObjArr() As New Collection, k As Long, objTmp As Object, ro%, n%
      ro = 0
      ReDim colObjArr(ro)
      Set pt = objEntArr(1)
      basept1 = pt.InsertionPoint
      For i = 1 To objEntArr.Count
            basept2 = objEntArr(i).InsertionPoint
            If Abs(basept1(1) - basept2(1)) < (pt.Height / 2#) Then
                colObjArr(ro).Add objEntArr(i)
            Else
                ro = ro + 1
                ReDim Preserve colObjArr(ro)
                Set pt = objEntArr(i)
                basept1 = pt.InsertionPoint
                colObjArr(ro).Add objEntArr(i)
            End If
      Next i
      n = 1
      For i = 0 To UBound(colObjArr)
            SortXup colObjArr(i)
            For j = 1 To colObjArr(i).Count
                'MsgBox colObjArr(i).Item(j).TextString
                colObjArr(i).Item(j).TextString = colObjArr(i).Item(j).TextString & CStr(n)
                n = n + 1
            Next j
      Next i
    End If
End Sub
Private Sub SelectAllText(ByVal App As Object, objSset As Object, Optional ByVal strSsetname As String = "SELECTION~TEXT~1111")
      On Error GoTo err1
      Dim flag As Boolean
      flag = False
      For Each objSset In App.SelectionSets
            If objSset.Name = strSsetname Then
                  flag = True
                  Exit For
            End If
      Next
      If flag Then objSset.Delete      '创建集合,如集存在,则删除,再新建
      Set objSset = App.SelectionSets.Add(strSsetname)
      Dim gpCode(0)    As Integer
      Dim dataValue(0) As Variant
      gpCode(0) = 0
      dataValue(0) = "text,mtext"
      Dim groupCode As Variant, dataCode As Variant
      groupCode = gpCode
      dataCode = dataValue
      objSset.SelectOnScreen groupCode, dataCode
      Exit Sub
err1:
      Debug.Print Err.Description
      Err.Clear
End Sub
-------------------------------------------------------------------------------------------------------------------
文字坐标排序方法:(含冒牌排序和归并排序)
**** Hidden Message *****










mikewolf2k 发表于 2018-10-18 10:04:33

fangmin723 发表于 2018-10-17 13:53
好了,新增加归并排序,速度快的起飞

递归的算法有个问题,如果对于有序的序列,递归的嵌套深度会大大增加,导致溢出出错。比如同一段程序,可以轻松排序10000个无序的数列,但是对于有序的数列,只能排1988个,再多就Out of stack space了。

fangmin723 发表于 2018-10-18 07:45:16

本帖最后由 fangmin723 于 2018-10-18 07:51 编辑

zzyong00 发表于 2018-10-17 16:37
我这里有个排序的帖子,共同研究一下。
http://bbs.mjtd.com/thread-113042-1-1.html还是版主厉害,有写排序稳定性比较差,建议还是助攻稳定性较强和速度快的!





fangmin723 发表于 2018-10-16 12:38:14

zzyong00 发表于 2018-10-16 12:34
写代码“难度”低点好,不合看的很明白。
我哪个,点选+框选,会出错误,这是个比较奇怪的事儿,你调试出 ...

没有,不知道啥原因,我看了下,我那么点选后,选择集里面很多的空值,不知道和这个有没有关系,我也试着去找原因,但没找到!

mikewolf2k 发表于 2018-10-16 09:43:37

友情提示下,对于不同对齐方式的文字,其对齐点不一样,有的是alignmentpoint。

fangmin723 发表于 2018-10-16 11:21:53

mikewolf2k 发表于 2018-10-16 09:43
友情提示下,对于不同对齐方式的文字,其对齐点不一样,有的是alignmentpoint。
谢谢指导,vab从来没有接触过CAD的vba,这还是第一次,之前接触的都是coredraw的vba

再请教一下,四个排序如何合成一个呢

mikewolf2k 发表于 2018-10-16 11:32:59

在函数参数里加两个,XY排序,升降序。然后在循环语句里面
If basept1(0) > basept2(0) Then 这段外面再加个判断,比如如果Y排序就是 If basept1(1) > basept2(1)
如果降序就是小于号。

fangmin723 发表于 2018-10-16 11:42:52

本帖最后由 fangmin723 于 2018-10-16 12:01 编辑

mikewolf2k 发表于 2018-10-16 11:32
在函数参数里加两个,XY排序,升降序。然后在循环语句里面
If basept1(0) > basept2(0) Then 这段外面再 ...
这样应该没错吧!
见顶楼!

zzyong00 发表于 2018-10-16 12:34:41

写代码“难度”低点好,不合看的很明白。
我哪个,点选+框选,会出错误,这是个比较奇怪的事儿,你调试出原因了吗?

fangmin723 发表于 2018-10-16 12:43:50

mikewolf2k 发表于 2018-10-16 11:32
在函数参数里加两个,XY排序,升降序。然后在循环语句里面
If basept1(0) > basept2(0) Then 这段外面再 ...

目前就知道冒泡法

664571221 发表于 2018-10-17 11:12:57

牛逼的人呵呵呵呵

白色微風1991 发表于 2018-10-17 12:49:00

學習謝謝樓主
页: [1] 2 3
查看完整版本: CAD-文字按坐标从左到右,从下到上排序(2018.10.17新增归并排序)!