请教ZZXXQQ:为块排序
<p>看了您回复的如何获取块属性和如何替换块属性的贴,想请您解决这个问题。</p><p>根据块的X坐标大小进行排序,若X坐标相同则根据Y坐标,如图。</p><p>我的初步想法是:<br/> 选择集选择需要排序的块(或者输入块名自动选择)→提示输入需要排序的属性(若只有一个则自动选择)→提示根据X坐标由大到小或者由小到大排序→排序→改写块属性为序号</p><p>请指教,谢谢!</p> 感谢楼主的无私分享 (defun c:tt ()(vl-catch-all-apply
'(lambda (/ blk num)
(vla-eval (vlax-get-acad-object) "Thisdrawing.Activeselectionset.Delete")
(if (ssget '((0 . "insert") (66 . 1)))
(progn
(vlax-for obj
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
(setq blk
(cons (list (vlax-get obj 'Insertionpoint) obj) blk)
)
)
(setq blk (vl-sort blk
'(lambda (x1 x2)
(if (equal (caar x1) (caar x2) 1e-8)
(> (cadar x1) (cadar x2))
(< (caar x1) (caar x2))
)
)
)
)
(setq num 1)
(foreach x (mapcar 'cadr blk)
(foreach x (vlax-invoke x 'getattributes)
(vla-put-textstring x (rtos num 2 0))
)
(setq num (1+ num))
)
)
)
)
)
(princ)
) <p>试了一下楼上的代码,似乎没有成功……</p><p>而且还有好多看不懂,还需要进一步学习。</p> 又学了近一个月,自己编了一段,请高手们指点。
(defun c:sdl (/ ss i ch i2 psb ent ent1 psbys ent2 dlxh)
(setq ss (ssget '((0 . "INSERT") (66 . 1) (2 . "DLBH")))) ;选择块名为DLBH的块
(setq i -1)
(setq ch (getstring "\n输入场号或者排序起始序号<1>"))
(if (or (null ch) (= ch ""))
(setq ch "1")
)
(if (= (type (read ch)) 'INT)
(setq ch (1- (read ch)))
(setq i2 0)
) ;if
(setq psb (list)) ;排序表
(repeat (sslength ss)
(setq ent(entget (ssname ss (setq i (1+ i))))
ent1 ent
)
(while (/= (get 0 (setq ent1 (entget (entnext (get -1 ent1))))) "SEQEND")
(if (and (= (get 0 ent1) "ATTRIB") (= (get 2 ent1) "DLBH"))
(setq psbys (list (car (get 11 ent1)) ent1)) ;排序表元素
) ;if
) ;while
(setq psb (cons psbys psb))
) ;repeat
(setq psb (vl-sort psb (function (lambda (e1 e2) (< (car e1) (car e2))))))
(repeat (length psb)
(setq ent2 (cadar psb))
(if (= (type ch) 'INT)
(setq dlxh (itoa (setq ch (1+ ch)))) ;电缆序号
(progn
(setq dlxh (strcat ch "-" (itoa (setq i2 (1+ i2)))))
(setq ent2 (subst (cons 41 0.4) (assoc 41 ent2) ent2)) ;改字宽
) ;progn
) ;if
(setq ent2 (subst (cons 1 dlxh) (assoc 1 ent2) ent2))
(entmod ent2)
(setq psb (cdr psb))
) ;repeat
)
(defun get (aaaaa bbbbb /)
(cdr (assoc aaaaa bbbbb))
)
感谢各位前辈的指点,同时感谢hossman@newsmth的提示。
看得出来,ivde的程序比我的简洁许多,但无奈他的代码中好多我都看不懂,所以就自己只好编一个复杂的了。再请前辈们指点。 <p>建议尽量用 vl-sort 函数来排序。其效率比较高,用这个函数后,你不需要考虑排序算法问题。</p> 秋枫大侠能说得详细一些么?我感觉我是用的vl-sort啊? 不好意思,刚才没有看清。 <p>这是我编的第一个排序类的小程序,还多东西其实没有弄懂。用到vl-sort,是因为<a href="mailto:hossman@newsmth"><font color="#000000">hossman@newsmth</font></a>给的提示,至于其他的排序方式,我还有待进一步学习。</p><p>感谢各位前辈的指点!</p> dinosaurhxe2大侠,你好,请帮忙写一个给块排序的LSP,是冲模零件注解的块,我现在里面的内容全部手动修改的,一套模具2,3百个,真是累啊,请大侠高抬贵手。QQ:279660102