删除坐标相同文本对象 按照原y坐标排序

;;

;;程序名称:对象水平对齐程序,并且按照竖直方向排列

;;执行命令:tb2

;;程序功能:将选定的对象左对齐,并且按照竖直方向排列。

;;

(defun c:tb2(/ selobjs oldcmdecho) ;定义命令txtal,局部变量selobjs,oldcmdecho;

  (setq oldcmdecho (getvar "cmdecho")) ;oldcmdecho 存储命令回显模式

  (setvar "cmdecho" 0) ;屏蔽提示

  (setq selobjs (ssget ' ((0 . "TEXT,MTEXT")))) ;获取文字对象?todo

  

  (process2 selobjs) ;处理选中的对象;

  (setvar "cmdecho" oldcmdecho) ;设置命令回显模式

  (princ)        ;todo?

)

(defun process2 (selobjs   /     amode     apnt apnt_x

  apnt_y   count     objname   vlaxobj MinPoint

  MaxPoint  minext    maxext    ext_l ext_r

  ext_m   tpnt    ext_y  old_y countp lstp n is_del

  orderlist n1

        ) 

    ;; amode 对齐模式;apnt 对齐点;apnt_x 对齐点x坐标

    ;; apnt_y 对起点y坐标;count 计数器;

    ;; objname 获取图元名称 vlaxobj vla对象名

    ;; ext_y 原来的y坐标; old_y 上一个y坐标

    ;; countp 迁移位置的个数; lstp 所有的x坐标集合

    ;; n lstp 中的一个变量;is_del 是否删除了改对象

  (if (not amode)

    (setq amode "L")

  )

  (initget 1)

  (setq apnt (getpoint "\n选择水平对齐方向的对齐点:"))

  (setq apnt_x (car apnt)

 apnt_y (cadr apnt)

  )

  (vl-load-com)

  (setq count 0)



  (repeat (sslength selobjs)

    (setq objname (ssname selobjs count)) ;;ssname此函数将返回选择集 ss 中 index 所代表的图元名

    (setq vlaxobj (vlax-ename->vla-object objname))  ;;将 AutoLISP 类型的对象名转换为 VLA 对象

    (setq MinPoint (vlax-make-variant)) 

    (setq MaxPoint (vlax-make-variant))

    (vla-GetBoundingBox vlaxobj 'MinPoint 'MaxPoint)

    (setq minext (vlax-safearray->list MinPoint))

    (setq maxext (vlax-safearray->list MaxPoint))

    (setq ext_y (cadr minext))

    (setq is_del 1)

    (foreach n orderlist 

    (progn  ;看看是否需要删除对象

        (if (> 4 (abs (- n ext_y)));如果4大于间距则进行删除;

            (if (= is_del 1) ;只需要删除一次

                (setq is_del 2)

            )

        )

    )

    )

    (if (=  is_del 1)

    (setq orderlist (cons ext_y orderlist))

    )

    (setq count (1+ count))

  )

  (print "before sort....")

  (print orderlist)

  (setq orderlist (vl-sort orderlist (function (lambda (e1 e2) (< e1 e2)))))

  (print "after sort......")

  (print orderlist)

  (setq count 0)

  (setq countp 0) 

  (setq old_y 0) ;初始化一个值

  (repeat (sslength selobjs)  ;;repeat 此函数可判别每一个 expr 并重复执行 number 所叙述的次数,

    (setq objname (ssname selobjs count)) ;;ssname此函数将返回选择集 ss 中 index 所代表的图元名

    (setq vlaxobj (vlax-ename->vla-object objname))  ;;将 AutoLISP 类型的对象名转换为 VLA 对象

    (setq MinPoint (vlax-make-variant)) 

    (setq MaxPoint (vlax-make-variant))

    (vla-GetBoundingBox vlaxobj 'MinPoint 'MaxPoint)

    (setq minext (vlax-safearray->list MinPoint))

    (setq maxext (vlax-safearray->list MaxPoint))

    (setq ext_l (car minext))

    (setq ext_r (car maxext))

    (setq ext_m (+ (/ (abs (- ext_l ext_r)) 2) ext_l))

    (setq ext_y (cadr minext)) ;获取y坐标

    (cond

      ((= amode "L")

       (setq tpnt (list ext_l apnt_y))

      )

      ((= amode "M")

       (setq tpnt (list ext_m apnt_y))

      )

      ((= amode "R")

       (setq tpnt (list ext_r apnt_y))

      )

    )

    (print old_y)

    (print ext_l)

    (print "=======")

    (setq lstp (cons old_y lstp))

    (print lstp)

    (setq is_del 1)

    (foreach n lstp 

    (progn  ;看看是否需要删除对象

        (if (> 4 (abs (- n ext_y)));如果4大于间距则进行删除;

            (if (= is_del 1) ;只需要删除一次

                (progn 

                (setq is_del 2)

                (command "_erase" objname "") ;删除对象

                (print "delete object")

                )

            )

        )

    )

    )

    (print "++++++++++")

    (print objname)

    (print is_del)

    (setq countp 0)

    (if (=  is_del 1) ;;如果没有删除对象

        (progn  ;移动对象

        (setq tpnt (list ext_l ext_y));设置原来点坐标

        (print tpnt)

            (foreach n1 orderlist

           (progn

               (if (< ext_y n1)

                 (setq countp (1+ countp));获取countp的位移

            )

           )

        )

            (print "countp now is ")

            (print countp)

        (setq apnt (list apnt_x (- apnt_y  (* 550 countp))));设置目标点

        (print apnt)

        (if tpnt 

          (command "_move" objname "" "non" tpnt "non" apnt)

        )

        

        

        ;;(setq countp (1+ countp))

        )

    

    ) ;end if 



    (setq old_y ext_y) ;再一次设置old_y



    (setq count (1+ count))

  )

)

 

你可能感兴趣的:(排序)