feelg 发表于 2009-12-22 13:38:00

求---多个单行文字水平对齐 LISP

有没有。用LISP.把多个单行文字进行按点或线进行水平对齐的。。编辑文字经常遇到。请各位帮一帮。谢啦。。

xianaihua 发表于 2009-12-22 23:43:00

用Vlisp写了一个;;;;文本水平对齐
;;;by:lihuili 2009-12-22
(vl-load-com)
(defun c:txt_hor_Alignment (/ Ent Obj InsPt ss TxtList item text_InsPt NewInsPt)
(setq Ent (entsel "\n 选择要对齐的参考文本(位置不变的文本): "))
(if (and
Ent
(= (value 0 (entget (car Ent))) "TEXT")
(not (redraw (car Ent) 3))
      )
    (progn
      (setq Obj (MakeX (car Ent)))
      (if (= (vla-get-Alignment Obj) 0)
(setq InsPt (safearray-value
      (variant-value (vla-get-InsertionPoint Obj))
      )
)
(setq
   InsPt (safearray-value
    (variant-value (vla-get-TextAlignmentPoint Obj))
)
)
      )
      (prompt "\n选择其他与参考对齐的文本(要改变位置)!")
      (if (setq ss (ssget '((0 . "TEXT"))))
(progn
   (setq TxtList (ss->Objlist ss))
   (foreach item TxtList
   (if (= (vla-get-Alignment item) 0)
       (setq text_InsPt
       (safearray-value
         (variant-value (vla-get-InsertionPoint item))
       )
       )
       (setq text_InsPt
       (safearray-value
         (variant-value
    (vla-get-TextAlignmentPoint item)
         )
       )
       )
   )
   (setq
       InsPt (list (car text_InsPt)
   (cadr InsPt)
   (caddr InsPt)
      )
   )
   (setq NewInsPt (vlax-3d-point InsPt))
   (if (= (vla-get-Alignment item) 0)
       (vla-put-InsertionPoint item NewInsPt)
       (vla-put-TextAlignmentPoint item NewInsPt)
   )
   (redraw (car Ent) 4)
   )
)
      )
    )
)
(princ)
)
(defun VALUE (num ent /)
(cdr (assoc num ent))
)
(defun MakeX (entname)
(vlax-ename->vla-object entname)
)
(defun ss->Objlist (ss / RtnList temp1)
(while (setq temp1 (ssname ss 0))
    (setq RtnList (cons (vlax-ename->vla-object temp1) RtnList))
    (ssdel temp1 ss)
)
RtnList
)


ahill 发表于 2009-12-30 22:22:00

我以前写过一个,可以X和Y向都可以选择用的,你看一下吧。
(defun c:tta(/ txtsel TXTSEL_Num basept basetxt xcoor_basept ycoor_basept txtmb
      dokey i txti txtnew txti_pt xcoor_txti ycoor_txti txti_pt_new )
   (princ "\n文本自动对齐!Design by Ahill!Copyright@2007\n")
   (setvar "cmdecho" 0)
   (princ "\n请选择欲对齐的文本实体(自动滤去非文字实体):")
   (while (if
    (SETQ txtsel (SSGET '((-4 . "<OR" )(0 . "TEXT") (0 . "MTEXT")(-4 . "OR>"))))
   T
   nil)
(SETQ TXTSEL_Num (sslength txtsel))
    (if   (not (setq basept (getpoint "\n点取对齐点<选取参照文字实体>: ")))
(progn
   (princ "\n选取参照文字实体:")
   (SETQ basetxt (SSGET '((-4 . "<OR" )(0 . "TEXT") (0 . "MTEXT")(-4 . "OR>"))))
   (if (= (cdr (assoc 0 (entget (ssname basetxt 0)))) "MTEXT")
      (progn
       (setq basept (cdr (assoc 10 (entget (ssname basetxt 0)))))
      )
   
   (progn
    (setq mb72 (cdr (assoc 72 (entget (ssname basetxt 0)))))
    (setq mb73 (cdr (assoc 73 (entget (ssname basetxt 0)))))
         (if (or (/= 0 mb72) (/= 0 mb73))
   (setq basept (cdr (assoc 11 (entget (ssname basetxt 0)))))
    )
    (if (and (= 0 mb72) (= 0 mb73))
       (setq basept (cdr (assoc 10 (entget (ssname basetxt 0))))) ;获取基准文字座标
      )
   )
   )
)
)
   (setq xcoor_basept (car basept))
   (setq ycoor_basept (cadr basept))
(if (not (setq dokey (getint "\n输入对齐方向 <1>沿X方向对齐 / <2>沿Y方向对齐 <2>:")))
    (setq dokey 2)
)
   (setq i 0)
   (repeat TXTSEL_Num
   
(setq txti (entget (ssname txtsel i)))
   
    (setq mb72 (cdr (assoc 72txti )))
(setq mb73 (cdr (assoc 73txti )))
   
(if (and (or (/= 0 mb72) (/= 0 mb73)) (/= (cdr (assoc 0 txti)) "MTEXT"))
   (progn
      (setq txti_pt (cdr (assoc 11txti )))
      (setq txtmb 11)
   )
)
(if (or (and (= 0 mb72) (= 0 mb73)) (= (cdr (assoc 0 txti)) "MTEXT"))
   (progn
      (setq txti_pt (cdr (assoc 10 txti )))
      (setq txtmb 10)
   )
)
   
   
    (setq xcoor_txti (car txti_pt))
    (setq ycoor_txti (cadr txti_pt))
    (if (= dokey 2)
   (progn
      (setq txti_pt_new (list xcoor_txti ycoor_basept (caddr txti_pt)))
   )
)
    (if (= dokey 1)
   (progn
      (setq txti_pt_new (list xcoor_basept ycoor_txti(caddr txti_pt)))
   )
)
    (setq txti_pt_new (cons txtmb (list (car txti_pt_new) (cadr txti_pt_new) (caddr txti_pt_new))))
    (setq txti_pt (cons txtmb (list (car txti_pt) (cadr txti_pt) (caddr txti_pt))))
    (setq txtnew (subst txti_pt_new txti_pt txti))
    (entmod txtnew)
    (setq i (+ 1 i))
)
   (princ "\n请选择欲对齐的文本实体(自动滤去非文字实体):")
   )
(setvar "cmdecho" 1)
(princ)
)
(princ "\n TTA:文本对齐!Design by Ahill!Copyright@2007")

feelg 发表于 2010-1-25 21:00:00

<p>谢谢,两位兄台了。</p><p></p>

waterchen 发表于 2010-12-9 14:52:46

谢谢2位前辈的分享!

xiaxiang 发表于 2010-12-9 15:34:33

非常好,感谢分享
页: [1]
查看完整版本: 求---多个单行文字水平对齐 LISP