dinosaurhxe 发表于 2007-11-1 21:57:00

请教ZZXXQQ:为块排序

<p>看了您回复的如何获取块属性和如何替换块属性的贴,想请您解决这个问题。</p><p>根据块的X坐标大小进行排序,若X坐标相同则根据Y坐标,如图。</p><p>我的初步想法是:<br/>  选择集选择需要排序的块(或者输入块名自动选择)→提示输入需要排序的属性(若只有一个则自动选择)→提示根据X坐标由大到小或者由小到大排序→排序→改写块属性为序号</p><p>请指教,谢谢!</p>

yxl88168 发表于 2022-6-5 15:21:55

感谢楼主的无私分享

ivde 发表于 2007-11-2 07:46:00

(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)
)

dinosaurhxe 发表于 2007-11-2 20:48:00

<p>试了一下楼上的代码,似乎没有成功……</p><p>而且还有好多看不懂,还需要进一步学习。</p>

dinosaurhxe2 发表于 2007-11-26 20:50:00

又学了近一个月,自己编了一段,请高手们指点。

(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的提示。

dinosaurhxe2 发表于 2007-11-26 20:57:00

看得出来,ivde的程序比我的简洁许多,但无奈他的代码中好多我都看不懂,所以就自己只好编一个复杂的了。再请前辈们指点。

秋枫 发表于 2007-11-26 22:27:00

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

dinosaurhxe 发表于 2007-11-26 23:07:00

秋枫大侠能说得详细一些么?我感觉我是用的vl-sort啊?

秋枫 发表于 2007-11-26 23:19:00

不好意思,刚才没有看清。

dinosaurhxe2 发表于 2007-11-27 08:23:00

<p>这是我编的第一个排序类的小程序,还多东西其实没有弄懂。用到vl-sort,是因为<a href="mailto:hossman@newsmth"><font color="#000000">hossman@newsmth</font></a>给的提示,至于其他的排序方式,我还有待进一步学习。</p><p>感谢各位前辈的指点!</p>

weig168 发表于 2007-12-12 20:07:00

dinosaurhxe2大侠,你好,请帮忙写一个给块排序的LSP,是冲模零件注解的块,我现在里面的内容全部手动修改的,一套模具2,3百个,真是累啊,请大侠高抬贵手。QQ:279660102
页: [1] 2 3
查看完整版本: 请教ZZXXQQ:为块排序