明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11832|回复: 24

图元排序问题

  [复制链接]
发表于 2012-10-7 22:06 | 显示全部楼层 |阅读模式
求助大家帮个忙,我想要像图中的图元排序,怎样编程啊?
首先考虑y坐标,在一定容差范围内,对图元的x坐标排序;
之后再对y坐标排序。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-11-19 08:49 | 显示全部楼层
zml84 发表于 2012-11-13 19:22
网友 ynhh 在6楼评论所言“容差”问题,请细看equal函数。

大师指点的对,是我自己没看这个函数的说明,你太伟大了。
你这程序真神。但无法选择先对Y方向再对X方向的竖排啊,能不能再优化可选择X或Y优先?
回复 支持 1 反对 0

使用道具 举报

发表于 2021-5-21 15:08 | 显示全部楼层
6楼 zml84 大神代码强悍。,测试可行,还有有容差判断

修改 (if (equal (cadr e1) (cadr e2) 1e1)  中的  1e1 变量就实现容差

图片上白色上参考线,偏差参考线的 圆照样编号,强大

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2019-1-29 13:35 | 显示全部楼层
本帖最后由 xyp1964 于 2019-1-29 13:38 编辑

  1. (defun c:tt (/ lst)
  2.   (setq ukw (Ukword 1 "1 2" "1-先上下后左右/2-先左右后上下" ukw))   (princ "\n请选择要排序的实体...")
  3.   (if (setq ss (ssget '((0 . "circle"))))
  4.     (progn
  5.       (setq i 0)
  6.       (repeat (sslength ss)
  7.         (setq pt  (cdr (assoc 10 (entget (ssname ss i))))
  8.               lst (cons pt lst)
  9.               i          (1+ i)
  10.         )
  11.       )
  12.       (setq lst        (if (= ukw "1")
  13.                   (vl-sort lst '(lambda (x y) (if (equal (cadr x) (cadr y) 1e-3) (< (car x) (car y))(> (cadr x) (cadr y)))))
  14.                   (vl-sort lst '(lambda (x y)(if (equal (car x) (car y) 1e-3)(> (cadr x) (cadr y))(< (car x) (car y))))))
  15.             i        0
  16.       )
  17.       (mapcar '(lambda (x)
  18.                  (setq i  (1+ i)  bh (itoa i))
  19.                  (command "text" "j" "mc" "non" x 25 0 bh)
  20.                )
  21.               lst
  22.       )
  23.     )
  24.   )
  25.   (princ)
  26. )

回复 支持 1 反对 0

使用道具 举报

发表于 2012-10-9 13:04 | 显示全部楼层
本帖最后由 zml84 于 2012-10-9 13:05 编辑

(defun c:tt ()
    (princ "\n请选择要排序的实体...")
    (if	(setq ss (ssget))
	(progn
	    ;; 1、获取点位表
	    (setq lst '()
		  i   0
	    )
	    (repeat (sslength ss)
		(setq en  (ssname ss i)
		      ent (entget en)
		      pt  (cdr (assoc 10 ent))
		      lst (cons pt lst)
		      i	  (1+ i)
		)
	    )
	    ;; 2、排序
	    (setq
		lst (vl-sort
			lst
			(function
			    (lambda (e1 e2)
				(if (equal (cadr e1) (cadr e2) 1e1)
				    (< (car e1) (car e2))
				    (< (cadr e1) (cadr e2))
				)
			    )
			)
		    )
	    )
	    ;; 3、写序号文字
	    (setq i 1)
	    (foreach pt	lst
		(command "_.text" "j" "mc"  "non"pt (getvar "TEXTSIZE") 0 (itoa i))
		(setq i (1+ i))
	    )




	)
    )
    (princ)
)

点评

代码简捷明了,很好用,学习了  发表于 2013-4-12 20:01
Z大师太牛了。你这程序真神。但无法选择先对Y方向再对X方向的竖排啊,能不能再优化可选择X或Y优先?  发表于 2012-11-19 08:46
程序真是太N了,只是没按标题说的设置有容差啊,是不是加容并很难? 首先考虑y坐标,在一定容差范围内,对图元的x坐标排序;  发表于 2012-11-13 13:48
太感谢了,完全符合我的要求啊!!!!强力顶!!!!!  发表于 2012-10-9 19:25

评分

参与人数 1明经币 +2 收起 理由
gbhsu + 2

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2012-10-7 22:06 | 显示全部楼层
本帖最后由 vlisp2012 于 2012-10-7 22:14 编辑

附上cad文件。
比如对附图中的圆中,写入文字。

本帖子中包含更多资源

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

x
发表于 2012-10-8 11:48 来自手机 | 显示全部楼层
你可以参考我编的圆编号并排序代码
发表于 2012-10-8 13:27 | 显示全部楼层
参考vl-sort,很方便的
发表于 2012-10-8 23:37 | 显示全部楼层
我使用VBA写的,核心代码下面是,如果使用.net写还可以更加简单
  1. '循环将CAD图形内图元以坐标分堆
  2. '华夏梦清 2012年7月11日,江河梦小组
  3. '循环x,y方向探测是否有距离大于Mjg的相邻文字,如果有那么将后面的去掉,然后(不管有没有)两个方向上是否有间隔大于Mjg的
  4. '如果没有跳出循环说明取出了了一张表格,然后继续递归此过程
  5. '**************************************************************************************************************************
  6. Public OutTextDic As New Scripting.Dictionary '储存的公共字典,返回数据,分堆储存
  7. Public ExcelTextdic As New Scripting.Dictionary '创建toexcel公共字典
  8. Public STMi As Long  '分出表格的个数
  9. Public Mjg As Double '水平竖直大于多少分隔为一个表格
  10. '直接导入Excel表格
  11. Public Sub Chuncun1(Tkset As AcadSelectionSet)
  12.    Dim MDic1 As New Scripting.Dictionary, MDic2 As New Scripting.Dictionary
  13.      GetDicSet Tkset, MDic1
  14.      Throw MDic1, MDic2
  15.        ZitoExcel OutTextDic
  16.        ToExcel ExcelTextdic
  17. End Sub
  18. '存入ExcelTextdic公共字典
  19. Public Sub Chuncun2(Tkset As AcadSelectionSet)
  20.    Dim MDic1 As New Scripting.Dictionary, MDic2 As New Scripting.Dictionary
  21.      GetDicSet Tkset, MDic1
  22.      Throw MDic1, MDic2
  23.        ZitoExcel OutTextDic
  24.        STMi = 0
  25.        Set OutTextDic = Nothing
  26. End Sub

  27. '经典算法,两字典相互扔数据模块
  28. '经典算法,字典内嵌套字典
  29. 'Nothing 可选的。断绝 objectvar 与任何指定对象的关联。若没有其它变量指向 objectvar 原来所引用的对象,将其赋为 Nothing 会释放该对象所关联的所有系统及内存资源。
  30. Public Sub Throw(MDic1 As Scripting.Dictionary, MDic2 As Scripting.Dictionary)  '互扔模块
  31.    Dim Icount As Long, Jcount As Long
  32.    Dim j As Long, kk As Long
  33.    Dim Mpt1, Mpt2
  34.    Dim Dic1 As New Scripting.Dictionary, Dic2 As New Scripting.Dictionary
  35.    Set Dic1 = MDic1: Set Dic2 = MDic2
  36.   ' On Error Resume Next
  37.   ' Dim Min, Max, Min1, Max1
  38.    Do
  39.         Icount = Dic1.Count
  40.         Jcount = Dic2.Count
  41.         If Icount = 0 And Jcount = 0 Then Exit Do
  42.         STMi = STMi + 1 '此公共变量每递增一就遍历出来一个表格
  43.        ' UserForm1.Caption = STMi
  44.         If Icount = 0 Then '由dic2扔到dic1
  45.                  Do
  46.                    ReDic Dic2
  47.                    Px Dic2, 0
  48.                    For j = 0 To Dic2.Count - 2
  49.                        Mpt1 = Dic2(j).InsertionPoint
  50.                        Mpt2 = Dic2(j + 1).InsertionPoint
  51.                        If Mpt2(0) - Mpt1(0) > Mjg Then 'TextH为平均字高,Doubli为自高的倍数
  52.                           ' Xbl = True
  53.                             kk = Dic1.Count
  54.                             For K = j + 1 To Dic2.Count - 1
  55.                                   Dic1.Add K - j - 1 + kk, Dic2(K)
  56.                                   Dic2.Remove (K)
  57.                             Next
  58.                             Exit For
  59.                        End If
  60.                    Next

  61.                        If Not Blpxy(Dic2) Then
  62.                            ' For j = 0 To Dic2.Count - 1
  63.                                 OutTextDic.Add STMi, Dic2
  64.                             'Next
  65.                             Set Dic2 = Nothing
  66.                             'Dic2.RemoveAll
  67.                             Exit Do
  68.                        End If
  69.                    ReDic Dic2
  70.                    Px Dic2, 1
  71.                            
  72.                    For j = 0 To Dic2.Count - 2
  73.                        Mpt1 = Dic2(j).InsertionPoint
  74.                        Mpt2 = Dic2(j + 1).InsertionPoint
  75.                        If Mpt1(1) - Mpt2(1) > Mjg Then
  76.                            Ybl = True
  77.                             kk = Dic1.Count
  78.                             For K = j + 1 To Dic2.Count - 1
  79.                                   Dic1.Add K - j - 1 + kk, Dic2(K)
  80.                                   Dic2.Remove (K)
  81.                             Next
  82.                             Exit For
  83.                        End If
  84.                    Next
  85. '                   For Each key In Dic1
  86. '                       Debug.Print key & "--" & Dic1(key).TextString
  87. '                   Next

  88.                       If Not Blpxy(Dic2) Then
  89.                            ' For j = 0 To Dic2.Count - 1
  90.                                 OutTextDic.Add STMi, Dic2
  91.                             'Next
  92.                             Set Dic2 = Nothing
  93.                             'Dic2.RemoveAll
  94.                             Exit Do
  95.                       End If
  96.                    DoEvents

  97.                 Loop

  98.            Else                       '由dic1扔到dic2 第二次开始外层循环肯定跳到此处(假设先开始第一个if条件的话)
  99.                  Do
  100.                    ReDic Dic1
  101.                    Px Dic1, 0
  102.                    For j = 0 To Dic1.Count - 2
  103.                        Mpt1 = Dic1(j).InsertionPoint
  104.                        Mpt2 = Dic1(j + 1).InsertionPoint
  105.                        'Debug.Print "Mpt1 = " & Mpt1(0)
  106.                        ' Debug.Print "Mpt2 = " & Mpt2(0)
  107.                        If Mpt2(0) - Mpt1(0) > Mjg Then
  108.                           ' Xbl = True
  109.                            kk = Dic2.Count
  110.                             For K = j + 1 To Dic1.Count - 1
  111.                                   Dic2.Add K - j - 1 + kk, Dic1(K)
  112.                                   Dic1.Remove (K)
  113.                             Next
  114.                             Exit For
  115.                        End If
  116.                    Next
  117. '                  For Each Key In Dic1
  118. '                       Debug.Print Key & "--" & Dic1(Key).TextString
  119. '                   Next
  120.                        If Not Blpxy(Dic1) Then
  121.                            'For j = 0 To Dic1.Count - 1
  122.                                 OutTextDic.Add STMi, Dic1
  123.                            ' Next
  124.                             Set Dic1 = Nothing
  125.                             Exit Do
  126.                         End If
  127.                    ReDic Dic1
  128.                    Px Dic1, 1
  129.                    For j = 0 To Dic1.Count - 2
  130.                        Mpt1 = Dic1(j).InsertionPoint
  131.                        Mpt2 = Dic1(j + 1).InsertionPoint
  132.                        If Mpt1(1) - Mpt2(1) > Mjg Then
  133.                            Ybl = True
  134.                            kk = Dic2.Count
  135.                             For K = j + 1 To Dic1.Count - 1
  136.                                   Dic2.Add K - j - 1 + kk, Dic1(K)
  137.                                   Dic1.Remove (K)
  138.                             Next
  139.                            
  140.                             Exit For
  141.                        End If
  142.                    Next

  143.                        If Not Blpxy(Dic1) Then
  144.                            ' For j = 0 To Dic1.Count - 1
  145.                                 OutTextDic.Add STMi, Dic1
  146.                                 
  147.                                 'Debug.Print Dic1.Items(j).TextString & "--" & STMi
  148.                            ' Next
  149.                            
  150.                             Set Dic1 = Nothing
  151.                             Exit Do
  152.                         End If
  153.                    DoEvents
  154.                 Loop

  155.              End If
  156.              DoEvents
  157.         Loop
  158.             
  159.             ' Throw Dic1, Dic2
  160. End Sub

  161. '递归将CAD图形内图元以坐标分堆 同上面的功能一样,貌似耗费时间多一些
  162. Public Sub Throw1(MDic1 As Scripting.Dictionary, MDic2 As Scripting.Dictionary)  '互扔模块
  163.    Dim Icount As Long, Jcount As Long
  164.    Dim j As Long, kk As Long
  165.    Dim Mpt1, Mpt2
  166.    Dim Dic1 As New Scripting.Dictionary, Dic2 As New Scripting.Dictionary
  167.    Set Dic1 = MDic1: Set Dic2 = MDic2
  168.   ' On Error Resume Next
  169.   ' Dim Min, Max, Min1, Max1
  170.         Icount = Dic1.Count
  171.         Jcount = Dic2.Count
  172.         If Icount = 0 And Jcount = 0 Then Exit Sub
  173.         STMi = STMi + 1 '此公共变量每递增一就遍历出来一个表格
  174.        ' Me.Caption = STMi
  175.         If Icount = 0 Then '由dic2扔到dic1
  176.                  Do
  177.                    ReDic Dic2
  178.                    Px Dic2, 0
  179.                    For j = 0 To Dic2.Count - 2
  180.                        Mpt1 = Dic2(j).InsertionPoint
  181.                        Mpt2 = Dic2(j + 1).InsertionPoint
  182.                        If Mpt2(0) - Mpt1(0) > Mjg Then 'TextH为平均字高,Doubli为自高的倍数
  183.                           ' Xbl = True
  184.                             kk = Dic1.Count
  185.                             For K = j + 1 To Dic2.Count - 1
  186.                                   Dic1.Add K - j - 1 + kk, Dic2(K)
  187.                                   Dic2.Remove (K)
  188.                             Next
  189.                             Exit For
  190.                        End If
  191.                    Next

  192.                        If Not Blpxy(Dic2) Then
  193.                            ' For j = 0 To Dic2.Count - 1
  194.                                 OutTextDic.Add STMi, Dic2
  195.                             'Next
  196.                             Set Dic2 = Nothing
  197.                             'Dic2.RemoveAll
  198.                             Exit Do
  199.                        End If
  200.                    ReDic Dic2
  201.                    Px Dic2, 1
  202.                            
  203.                    For j = 0 To Dic2.Count - 2
  204.                        Mpt1 = Dic2(j).InsertionPoint
  205.                        Mpt2 = Dic2(j + 1).InsertionPoint
  206.                        If Mpt1(1) - Mpt2(1) > Mjg Then
  207.                            Ybl = True
  208.                             kk = Dic1.Count
  209.                             For K = j + 1 To Dic2.Count - 1
  210.                                   Dic1.Add K - j - 1 + kk, Dic2(K)
  211.                                   Dic2.Remove (K)
  212.                             Next
  213.                             Exit For
  214.                        End If
  215.                    Next
  216. '                   For Each key In Dic1
  217. '                       Debug.Print key & "--" & Dic1(key).TextString
  218. '                   Next

  219.                       If Not Blpxy(Dic2) Then
  220.                            ' For j = 0 To Dic2.Count - 1
  221.                                 OutTextDic.Add STMi, Dic2
  222.                             'Next
  223.                             Set Dic2 = Nothing
  224.                             'Dic2.RemoveAll
  225.                             Exit Do
  226.                       End If
  227.                    DoEvents

  228.                 Loop

  229.            Else                       '由dic1扔到dic2 第二次开始外层循环肯定跳到此处(假设先开始第一个if条件的话)
  230.                  Do
  231.                    ReDic Dic1
  232.                    Px Dic1, 0
  233.                    For j = 0 To Dic1.Count - 2
  234.                        Mpt1 = Dic1(j).InsertionPoint
  235.                        Mpt2 = Dic1(j + 1).InsertionPoint
  236.                        'Debug.Print "Mpt1 = " & Mpt1(0)
  237.                        ' Debug.Print "Mpt2 = " & Mpt2(0)
  238.                        If Mpt2(0) - Mpt1(0) > Mjg Then
  239.                            'Xbl = True
  240.                            kk = Dic2.Count
  241.                             For K = j + 1 To Dic1.Count - 1
  242.                                   Dic2.Add K - j - 1 + kk, Dic1(K)
  243.                                   Dic1.Remove (K)
  244.                             Next
  245.                             Exit For
  246.                        End If
  247.                    Next
  248.                        If Not Blpxy(Dic1) Then
  249.                            'For j = 0 To Dic1.Count - 1
  250.                                 OutTextDic.Add STMi, Dic1
  251.                            ' Next
  252.                             Set Dic1 = Nothing
  253.                             Exit Do
  254.                         End If
  255.                    ReDic Dic1
  256.                    Px Dic1, 1
  257.                    For j = 0 To Dic1.Count - 2
  258.                        Mpt1 = Dic1(j).InsertionPoint
  259.                        Mpt2 = Dic1(j + 1).InsertionPoint
  260.                        If Mpt1(1) - Mpt2(1) > Mjg Then
  261.                            Ybl = True
  262.                            kk = Dic2.Count
  263.                             For K = j + 1 To Dic1.Count - 1
  264.                                   Dic2.Add K - j - 1 + kk, Dic1(K)
  265.                                   Dic1.Remove (K)
  266.                             Next
  267.                            
  268.                             Exit For
  269.                        End If
  270.                    Next

  271.                        If Not Blpxy(Dic1) Then
  272.                            ' For j = 0 To Dic1.Count - 1
  273.                                 OutTextDic.Add STMi, Dic1
  274.                                 
  275.                                 'Debug.Print Dic1.Items(j).TextString & "--" & STMi
  276.                            ' Next
  277.                            
  278.                             Set Dic1 = Nothing
  279.                             Exit Do
  280.                         End If
  281.                    DoEvents
  282.                 Loop

  283.              End If
  284.              DoEvents
  285.          Set MDic1 = Dic1: Set MDic2 = Dic2
  286.             
  287.              Throw1 MDic1, MDic2
  288. End Sub
  289. '判断是否真正获得了一个表格,两个方向上面都没有间隙大于Mjg 的值就是一张表格
  290. Public Function Blpxy(Pdic As Scripting.Dictionary) As Boolean '必须两个方向都没有间隙才能说明取出了一个表格,否则继续分
  291. Dim j As Long, Xbl As Boolean, Ybl As Boolean
  292. Dim Mpt1, Mpt2
  293. ReDic Pdic
  294. Px Pdic, 0
  295.     For j = 0 To Pdic.Count - 2
  296.         Mpt1 = Pdic(j).InsertionPoint
  297.         Mpt2 = Pdic(j + 1).InsertionPoint
  298. '            Debug.Print "Mpt1 = " & Mpt1(0)
  299. '             Debug.Print "Mpt2 = " & Mpt2(0)
  300.         If Mpt2(0) - Mpt1(0) > Mjg Then  'TextH为平均字高,Doubli为自高的倍数
  301.             Xbl = True
  302.             Exit For
  303.         End If
  304.     Next
  305.      ReDic Pdic
  306.      Px Pdic, 1
  307.     For j = 0 To Pdic.Count - 2
  308.         Mpt1 = Pdic(j).InsertionPoint
  309.         Mpt2 = Pdic(j + 1).InsertionPoint
  310.         If Mpt1(1) - Mpt2(1) > Mjg Then 'TextH为平均字高,Doubli为自高的倍数
  311.             Ybl = True
  312.             Exit For
  313.         End If
  314.     Next
  315.     If Xbl = False And Ybl = False Then
  316.          Blpxy = False
  317.     Else
  318.          Blpxy = True
  319.     End If
  320. End Function
  321. '初始化字典(因为从一个字典扔掉一部分后,字典的键值可能改变了,顺序也可能改变了
  322. Public Sub ReDic(Mdic As Scripting.Dictionary)
  323.    Dim i As Long, Msp, Mstring As String
  324.    Dim Key
  325.    For Each Key In Mdic
  326.        Msp = Mdic(Key).InsertionPoint
  327.        Mstring = Msp(0) & "|" & Msp(1) & "|" & Msp(2)
  328.        Mdic.Key(Key) = Mstring
  329.    Next
  330. End Sub
  331. '从一个选择集里面获得文字字典
  332. Public Sub GetDicSet(Tkset As AcadSelectionSet, Tkdic As Scripting.Dictionary)
  333.     Dim i As Long
  334.     Dim Mdic As New Scripting.Dictionary
  335.     Dim Inp, Mstring As String
  336.     For i = 0 To Tkset.Count - 1
  337.         Inp = Tkset(i).InsertionPoint
  338.         Mstring = Inp(0) & "|" & Inp(1) & "|" & Inp(2)
  339.         If Mdic.Exists(Mstring) Then
  340.             MsgBox "你的文字有重叠!重叠部分不计入计算!" & vbCrLf & "您可以使用CAD2012的Overkill命令删除后再统计!"
  341.         Else
  342.             Mdic.Add Mstring, Tkset(i)
  343.         End If
  344.     Next
  345.    Set Tkdic = Mdic
  346. End Sub
  347. '将数字作为键值,小字典键值都是数字
  348. Public Sub Px(Tkdic As Scripting.Dictionary, Mflag As Integer)   'Mflag 0 对x排序,1,对Y排序,2对z排序
  349.     Dim i  As Long, j As Long
  350.     Dim Icount As Long
  351.     Dim Inp1, Inp2, Tem As Long, ObjTem As AcadEntity
  352.     Dim Mi As Double, Mkey As String, Mkeys
  353.     Dim Msp1, Msp2, keytem As String, Mpd As Boolean
  354.     Icount = Tkdic.Count - 1
  355.    
  356.         Mkeys = Tkdic.Keys
  357.         For i = 0 To UBound(Mkeys) - 1
  358.             For j = i + 1 To UBound(Mkeys)
  359.                 Msp1 = Split(Mkeys(i), "|")
  360.                 Msp2 = Split(Mkeys(j), "|")
  361.                   If Mflag = 0 Then
  362.                       Mpd = (Val(Msp1(Mflag)) > Val(Msp2(Mflag))) 'x小的前
  363.                   ElseIf Mflag = 1 Then
  364.                      Mpd = (Val(Msp1(Mflag)) < Val(Msp2(Mflag))) 'y大的在前
  365.                   End If
  366.                 If Mpd Then
  367.                     keytem = Mkeys(i)
  368.                     Mkeys(i) = Mkeys(j)
  369.                     Mkeys(j) = keytem
  370.                 End If
  371.             Next
  372.         Next
  373.         For i = 0 To UBound(Mkeys)
  374.          Tkdic.Key(Mkeys(i)) = i
  375.         Next
  376. End Sub
  377. '**************************************************************************************************************************
  378. '经典算法直接求出其在excel表格内的位置
  379. '分堆之后对每一堆对象进行表格排序
  380. Public Sub ShituPx(ByRef Xzdic As Scripting.Dictionary, IRow As Long, ORow As Long)
  381. Dim Inp1, Inp2, i As Long, j As Long, Icount As Long
  382. Dim Ma1, Mi1, Ma2, Mi2
  383. Dim MMbl As Boolean
  384. MMbl = True
  385.     ReDic Xzdic
  386.     Px Xzdic, 0
  387.     Icount = Xzdic.Count
  388.     ExcelTextdic.Add Xzdic.Item(0), "1" '列
  389.     j = 1
  390.     For i = 0 To Icount - 2
  391.         If MMbl Then Xzdic.Item(i).GetBoundingBox Mi1, Ma1
  392.         Xzdic.Item(i + 1).GetBoundingBox Mi2, Ma2
  393.         If Not (Mi2(0) > Ma1(0) Or Mi1(0) > Ma2(0)) Then  '盒子横向重叠,落入同一列
  394.              ExcelTextdic.Add Xzdic.Item(i + 1), CStr(j)
  395.              MMbl = False
  396.         Else
  397.             j = j + 1
  398.             ExcelTextdic.Add Xzdic.Item(i + 1), CStr(j)
  399.             MMbl = True
  400.         End If
  401.     Next
  402.     ReDic Xzdic
  403.     Px Xzdic, 1
  404. '    For Each Key In Xzdic
  405. '        Debug.Print Xzdic(Key).TextString & "--" & Key
  406. '    Next
  407.         j = 1 + IRow
  408.         MMbl = True
  409.         ExcelTextdic.Item(Xzdic.Item(0)) = CStr(j) & "|" & ExcelTextdic.Item(Xzdic.Item(0)) '行
  410.         For i = 0 To Icount - 2
  411.             Xzdic.Item(i).GetBoundingBox Mi1, Ma1
  412.             Xzdic.Item(i + 1).GetBoundingBox Mi2, Ma2
  413.             If Not (Mi2(1) > Ma1(1) Or Mi1(1) > Ma2(1)) Then '盒子竖向重叠,落入同一行
  414.                  ExcelTextdic.Item(Xzdic.Item(i + 1)) = CStr(j) & "|" & ExcelTextdic.Item(Xzdic.Item(i + 1))
  415.                  MMbl = False
  416.             Else
  417.                 j = j + 1
  418.                 ExcelTextdic.Item(Xzdic.Item(i + 1)) = CStr(j) & "|" & ExcelTextdic.Item(Xzdic.Item(i + 1))
  419.                 MMbl = True
  420.             End If
  421.         Next
  422.         ORow = j

  423. End Sub
  424. ' 将一堆东西分开后存入字典,属性值为i,j
  425. Sub ZitoExcel(Dzdic As Scripting.Dictionary)
  426. Dim Dkey, OutRow As Long
  427. Static SubRow As Long
  428.     'SubRow = 0
  429.     For Each Dkey In Dzdic
  430.           ShituPx Dzdic(Dkey), SubRow, OutRow
  431.          ' Debug.Print OutRow
  432.           SubRow = OutRow
  433.     Next
  434. End Sub
  435. '将由zitoexcel获得的字典输入的Excel
  436. Public Sub ToExcel(Dzdic As Scripting.Dictionary)
  437. On Error Resume Next
  438.     Dim Key, i As Long, j As Long, Tkbh As String
  439.     Dim Msp, xlApp, xlBook, xlSheet
  440.         Set xlApp = CreateObject("Excel.Application") '创建EXcel
  441.         xlApp.Visible = True
  442.         If Err.Number = 429 And VarType(xlApp) <> 9 Then '说明创建 Excel对象没有成功
  443.              Err.Number = 0
  444.              Set xlApp = CreateObject("ET.Application") '创建WPs
  445.         End If
  446.         If Err.Number = 429 And VarType(xlApp) <> 9 Then '说明创建 WPS对象没有成功
  447.             MsgBox "您的电脑上没有安装任何版本的EXCEL以及任何版本的WPS!" & vbCrLf & "所以不能使用本插件!", vbCritical, "江河梦小组"
  448.             Exit Sub
  449.         End If
  450.         If Dzdic.Count <> 0 Then
  451.                 Set xlBook = xlApp.Workbooks.Add
  452.                 Set xlSheet = xlBook.Worksheets(1)
  453.                
  454.                 With xlSheet
  455.                 For Each Key In Dzdic
  456.                     Msp = Split(Dzdic(Key), "|")
  457.                     i = Val(Msp(0)): j = Val(Msp(1))
  458.                     If UBound(Msp) = 2 Then
  459.                          Tkbh = Msp(2)
  460.                          .Cells(i, j + 1) = IIf(IsNumeric(Key.TextString), "'" & Key.TextString, Key.TextString)
  461.                          .Cells(i, 1) = Tkbh
  462.                     Else
  463.                          .Cells(i, j) = IIf(IsNumeric(Key.TextString), "'" & Key.TextString, Key.TextString)
  464.                     End If
  465.                 Next
  466.                 End With
  467.                
  468.                 Set xlApp = Nothing
  469.                 Set xlBook = Nothing
  470.                 Set xlSheet = Nothing
  471.         End If
  472.        STMi = 0
  473.        Set OutTextDic = Nothing
  474.        Set ExcelTextdic = Nothing
  475. End Sub

  476. '*********************************************************************
  477. Sub SSd(STRname As String)
  478.   Dim i As Integer
  479.     For i = 1 To ThisDrawing.SelectionSets.Count
  480.         If ThisDrawing.SelectionSets(i - 1).Name = STRname Then
  481.             ThisDrawing.SelectionSets(i - 1).Delete
  482.             Exit For
  483.         End If
  484.     Next
  485. End Sub
  486. '获得一个选择集字高的平均值
  487. Public Function GetAH(Tkset As AcadSelectionSet) As Double
  488.     Dim Ent As AcadEntity, SubH As Double
  489.     For Each Ent In Tkset
  490.         SubH = SubH + Ent.Height
  491.     Next
  492.     If Tkset.Count = 0 Then
  493.        ThisDrawing.Utility.Prompt "你没有选择任何文字!"
  494.         Exit Function
  495.      End If
  496.     GetAH = SubH / Tkset.Count
  497. End Function
  498. '直接选择获得文字表格
  499. Public Sub GetExcel(Optional TextBl As Double = 20)
  500.   Dim pTypey, pData, sset As AcadSelectionSet
  501.     SSd "ss6"
  502.     Set sset = ThisDrawing.SelectionSets.Add("ss6") '创建名为ss的选择集
  503.     BuildFilter pType, pData, 0, "*Text"
  504.     MM.Hide
  505.     sset.SelectOnScreen pType, pData '框选内容到选择集中(表格过滤)
  506.     Mjg = TextBl * GetAH(sset)
  507.     Chuncun1 sset
  508. End Sub
  509. '直接选择获得文字表格(考虑江河图框)
  510. Public Sub GetTKExcel(Optional TextBl As Double = 20)
  511.   Dim pTypey, pData, Pt, Pd, SSet1 As AcadSelectionSet, SSet2 As AcadSelectionSet
  512.   Dim Tkent As AcadEntity, TextEnt As AcadEntity, Mstring As String, Att, Atts
  513.   Dim TkMa, TkMi
  514.     SSd "ss1"
  515.     Set SSet1 = ThisDrawing.SelectionSets.Add("ss1") '创建名为ss的选择集
  516.     SSd "ss2"
  517.     Set SSet2 = ThisDrawing.SelectionSets.Add("ss2") '创建名为ss的选择集
  518.     BuildFilter Pt, Pd, -4, "<or", 2, "TK-A[0-3]", 2, "TK-JG-A[3-4]", 2, "TK-MT-JT", 2, "TK-MT-LC", -4, "or>"
  519.     BuildFilter pType, pData, 0, "*Text"
  520.     MM.Hide
  521.     SSet1.SelectOnScreen Pt, Pd
  522.     For Each Tkent In SSet1
  523.           Mstring = ""
  524.           Atts = Tkent.GetAttributes()
  525.           For Each Att In Atts '遍历属性
  526.                 If Trim(Att.TagString) = "图纸编号" Then
  527.                     Mstring = Att.TextString
  528.                     Exit For
  529.                 End If
  530.                 DoEvents
  531.           Next
  532.           Tkent.GetBoundingBox TkMi, TkMa
  533.           'Tkmi(2) = 0: TkMa(2) = 0
  534.           SSet2.Select acSelectionSetWindow, TkMi, TkMa, pType, pData
  535.           Mjg = TextBl * GetAH(SSet2)
  536.           Chuncun2 SSet2
  537.             For Each Key In ExcelTextdic
  538.                  If UBound(Split(ExcelTextdic(Key), "|")) = 1 Then
  539.                    ExcelTextdic(Key) = ExcelTextdic(Key) & "|" & Mstring
  540.                  End If
  541.             Next
  542.            SSet2.Clear
  543.     Next
  544. '    For Each Key In ExcelTextdic
  545. '         Debug.Print Key.TextString & "--" & ExcelTextdic(Key)
  546. '    Next
  547.     ToExcel ExcelTextdic
  548.     SSet1.Delete
  549.     Set SSet1 = Nothing
  550.     Set SSet2 = Nothing
  551.     End
  552. End Sub

本帖子中包含更多资源

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

x

点评

非常感谢!!!!  发表于 2012-10-9 19:24
发表于 2012-10-9 15:46 | 显示全部楼层
zml84 发表于 2012-10-9 13:04
本帖最后由 zml84 于 2012-10-9 13:05 编辑 (defun c:tt ()
    (princ "\n请选择要排序的实体...")
    ...

经典,,,比我写的好多了,
发表于 2012-10-9 16:55 | 显示全部楼层
精彩精彩......。
数字很连续,又是整数,视乎有还可以深化精简...。

点评

不妨试一试。  发表于 2012-10-11 20:32
发表于 2012-10-12 23:10 | 显示全部楼层

点评

多谢回复,您的程序我已下载。到底是大儒啊,很博大的胸怀,共享了那么多好程序!!!!  发表于 2012-10-13 08:52
发表于 2012-11-13 19:22 | 显示全部楼层

网友 ynhh 在6楼评论所言“容差”问题,请细看equal函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 09:13 , Processed in 0.220730 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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