明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8775|回复: 26

请教ZZXXQQ:为块排序

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

看了您回复的如何获取块属性和如何替换块属性的贴,想请您解决这个问题。

根据块的X坐标大小进行排序,若X坐标相同则根据Y坐标,如图。

我的初步想法是:
  选择集选择需要排序的块(或者输入块名自动选择)→提示输入需要排序的属性(若只有一个则自动选择)→提示根据X坐标由大到小或者由小到大排序→排序→改写块属性为序号

请指教,谢谢!

本帖子中包含更多资源

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

x
发表于 2022-6-5 15:21:55 | 显示全部楼层
感谢楼主的无私分享
发表于 2007-11-2 07:46:00 | 显示全部楼层
  1. (defun c:tt ()
  2.   (vl-catch-all-apply
  3.     '(lambda (/ blk num)
  4.        (vla-eval (vlax-get-acad-object) "Thisdrawing.Activeselectionset.Delete")
  5.        (if (ssget '((0 . "insert") (66 . 1)))
  6.      (progn
  7.        (vlax-for obj
  8.              (vla-get-activeselectionset
  9.                (vla-get-activedocument (vlax-get-acad-object))
  10.              )
  11.          (setq blk
  12.             (cons (list (vlax-get obj 'Insertionpoint) obj) blk)
  13.          )
  14.        )
  15.        (setq blk (vl-sort blk
  16.                   '(lambda (x1 x2)
  17.                  (if (equal (caar x1) (caar x2) 1e-8)
  18.                    (> (cadar x1) (cadar x2))
  19. &#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; (< (caar x1) (caar x2))
  20. &#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160; )
  21. &#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; )
  22. &#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; )
  23. &#160;&#160; &#160;&#160;&#160; )
  24. &#160;&#160; &#160;&#160;&#160; (setq num 1)
  25. &#160;&#160; &#160;&#160;&#160; (foreach x (mapcar 'cadr blk)
  26. &#160;&#160; &#160;&#160;&#160;&#160;&#160; (foreach x&#160;&#160; &#160;(vlax-invoke x 'getattributes)
  27. &#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; (vla-put-textstring x (rtos num 2 0))
  28. &#160;&#160; &#160;&#160;&#160;&#160;&#160; )
  29. &#160;&#160; &#160;&#160;&#160;&#160;&#160; (setq num (1+ num))
  30. &#160;&#160; &#160;&#160;&#160; )
  31. &#160;&#160; &#160; )
  32. &#160;&#160;&#160;&#160;&#160;&#160; )
  33. &#160;&#160;&#160;&#160; )
  34. &#160; )
  35. &#160; (princ)
  36. )
 楼主| 发表于 2007-11-2 20:48:00 | 显示全部楼层

试了一下楼上的代码,似乎没有成功……

而且还有好多看不懂,还需要进一步学习。

发表于 2007-11-26 20:50:00 | 显示全部楼层
又学了近一个月,自己编了一段,请高手们指点。
  1. (defun c:sdl (/ ss i ch i2 psb ent ent1 psbys ent2 dlxh)
  2.   (setq ss (ssget '((0 . "INSERT") (66 . 1) (2 . "DLBH")))) ;选择块名为DLBH的块
  3.   (setq i -1)
  4.   (setq ch (getstring "\n输入场号或者排序起始序号<1>"))
  5.   (if (or (null ch) (= ch ""))
  6.      
  7.     (setq ch "1")
  8.   )
  9.   (if (= (type (read ch)) 'INT)
  10.     (setq ch (1- (read ch)))
  11.     (setq i2 0)
  12.   ) ;if
  13.   (setq psb (list)) ;排序表
  14.   (repeat (sslength ss)
  15.     (setq ent  (entget (ssname ss (setq i (1+ i))))
  16.    ent1 ent
  17.     )
  18.     (while (/= (get 0 (setq ent1 (entget (entnext (get -1 ent1))))) "SEQEND")
  19.       (if (and (= (get 0 ent1) "ATTRIB") (= (get 2 ent1) "DLBH"))
  20. (setq psbys (list (car (get 11 ent1)) ent1)) ;排序表元素
  21.       ) ;if
  22.     ) ;while
  23.     (setq psb (cons psbys psb))
  24.   ) ;repeat
  25.   (setq psb (vl-sort psb (function (lambda (e1 e2) (< (car e1) (car e2))))))
  26.   (repeat (length psb)
  27.     (setq ent2 (cadar psb))
  28.     (if (= (type ch) 'INT)
  29.       (setq dlxh (itoa (setq ch (1+ ch)))) ;电缆序号
  30.       (progn
  31. (setq dlxh (strcat ch "-" (itoa (setq i2 (1+ i2)))))
  32. (setq ent2 (subst (cons 41 0.4) (assoc 41 ent2) ent2)) ;改字宽
  33.       ) ;progn
  34.     ) ;if
  35.     (setq ent2 (subst (cons 1 dlxh) (assoc 1 ent2) ent2))
  36.     (entmod ent2)
  37.     (setq psb (cdr psb))
  38.   ) ;repeat
  39. )
  40. (defun get (aaaaa bbbbb /)
  41.   (cdr (assoc aaaaa bbbbb))
  42. )
感谢各位前辈的指点,同时感谢hossman@newsmth的提示。
发表于 2007-11-26 20:57:00 | 显示全部楼层
看得出来,ivde的程序比我的简洁许多,但无奈他的代码中好多我都看不懂,所以就自己只好编一个复杂的了。再请前辈们指点。
发表于 2007-11-26 22:27:00 | 显示全部楼层

建议尽量用 vl-sort 函数来排序。其效率比较高,用这个函数后,你不需要考虑排序算法问题。

 楼主| 发表于 2007-11-26 23:07:00 | 显示全部楼层
秋枫大侠能说得详细一些么?我感觉我是用的vl-sort啊?
发表于 2007-11-26 23:19:00 | 显示全部楼层
不好意思,刚才没有看清。
发表于 2007-11-27 08:23:00 | 显示全部楼层

这是我编的第一个排序类的小程序,还多东西其实没有弄懂。用到vl-sort,是因为hossman@newsmth给的提示,至于其他的排序方式,我还有待进一步学习。

感谢各位前辈的指点!

发表于 2007-12-12 20:07:00 | 显示全部楼层
dinosaurhxe2大侠,你好,请帮忙写一个给块排序的LSP,是冲模零件注解的块,我现在里面的内容全部手动修改的,一套模具2,3百个,真是累啊,请大侠高抬贵手。QQ:279660102
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 02:08 , Processed in 0.629694 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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