马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 /db_自贡黄明儒_ 于 2014-12-11 16:43 编辑
[功能]文字对齐
前言:
我原来认为,CAD以图形表达为主,根本不用关心文字排列的问题,更不用编程来处理。但后来发现,这个观点是错误的,文字传递的信息也很重要。元老LL_J编的那个程序经过试用,是我见过最好的,唯一的缺点是速度慢(可能是当时的电脑不行)和用户的选项太多,当时也没有读懂(也许今天能读懂了,嘿嘿)
后来自己写了一个,今天整理了一下。这一整理,用了些自己的公用函数。感觉速度还可以。
- ;;HH:ssPts:Sort http://bbs.xdcad.net/thread-670556-1-1.html
- ;;SS_SSsub http://bbs.xdcad.net/thread-678101-1-1.html
- ;;optimizeCode http://bbs.xdcad.net/thread-678104-1-1.html
- ;;Entity:Box By ST http://bbs.xdcad.net/thread-677384-1-1.html
- ;;HH::EntSSHighLight http://bbs.mjtd.com/thread-111599-1-1.html
- ;;HH:Ent4pt http://bbs.mjtd.com/thread-107647-1-1.html
- ;;HH::List-p http://bbs.mjtd.com/thread-111576-1-1.html
- ;;ayEntSSHighLight http://bbs.mjtd.com/thread-109203-1-1.html
- ;;HH:ayEntSSHighLight http://bbs.mjtd.com/thread-109203-1-1.html
- ;;-----------------分类对象对齐命令 AO
- (defun C:AO (/ CODE FILTERLST FLAG H H1 KEY LST P0 SS SSET SSETATTDEF SSETCIRCLE SSETINSERT SSETMTEXT SSETTEXT VALIST0 VARLIST VARTXTLST W0)
- (defun *error* (msg)
- (vl-bt)
- (cond (*DOC* (_EndUndo *DOC*)))
- (while (not (equal (getvar "cmdnames") "")) (command nil))
- (HH:Once=>Init VARLIST valist0)
- (princ "\n 出错啦!")
- (princ)
- )
-
- ;;第一个图元及其列的图元,返回剩余表
- ;;取表中第一个图元,后面X误差较小认为在同一列
- (defun w2 (lst Flag code p0 h1 w0 / L P)
- (while
- (and
- (setq p (car lst))
- (setq p (cdr (assoc code (entget p))))
- (cond ((equal (car p) (car p0) w0)
- (setq l (cons (car lst) l))
- (setq lst (cdr lst))
- )
- )
- )
- )
- (HH:SameCol (REVERSE l) code p0 h1) ;*同列
- lst
- )
- ;;----例表图元最大宽度
- (defun HH:MaxWidth (lst / W W0)
- (setq w0 0)
- (foreach x lst
- (setq w (abs (car (apply 'mapcar (cons '- (Entity:Box x))))))
- (cond ((> w w0) (setq w0 w)))
- )
- w0
- )
- ;;----例表图元最大宽度
- ;;AO子函数****同列处理
- ;;以p0为基点,X方向对齐
- ;;Flag T时是文字 h1行间距
- (defun HH:SameCol (l code p0 h1 / EN I P)
- (setq i -1)
- (foreach x l
- (setq en (entget x))
- (setq p (mapcar '+ (list 0 (* (setq i (1+ i)) h1)) p0))
- (entmod (subst (cons code p) (assoc code en) en))
- )
- )
- ;;AO子函数****同列处理
- ;;7 本程序主程序
- (cond ((cadr (ssgetfirst))
- (setq sSet (ssget "_P" '((0 . "*TEXT,ATTDEF,CIRCLE,ARC,ELLIPSE,INSERT"))))
- )
- )
- (princ "\n 单行文字、多行文字、块、圆依次择其一类对齐")
- (cond ((not sSet)
- (setq sSet (ssget '((0 . "*TEXT,ATTDEF,CIRCLE,ARC,ELLIPSE,INSERT"))))
- )
- )
- (cond
- (sSet
- (vl-load-com)
- (or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
- (or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
- (_StartUndo *DOC*)
- (setq VARLIST (list "cmdecho" "osmode" "shortcutmenu"))
- (setq valist0 (HH:Once=>get VARLIST))
- (HH:Once=>Init VARLIST (list 0 0 11))
- (setq vartxtlst (list "sSetText" "sSetMText" "sSetATTDEF" "sSetCIRCLE" "sSetINSERT"))
- (setq filterlst (list "TEXT" "MTEXT" "ATTDEF" "CIRCLE,ARC,ELLIPSE" "INSERT"))
- (optimizeCode sSet vartxtlst filterlst)
- ;;对文字预处理
- (cond ((or sSetText sSetMText sSetATTDEF)
- (initget "mC mL") ;区分大小写
- (setq key (getkword "\n文本对齐于 [正中(C)/左中(L)]:<C>"))
- (cond ((not key) (setq key "MC")))
- (command "_.JUSTIFYTEXT" sSetText "" (strcase key))
- )
- )
- ;;只取其中一类
- (setq ss (cond (sSetText)
- (sSetMText)
- (sSetATTDEF)
- (sSetINSERT)
- (sSetCIRCLE)
- )
- )
- (setq Flag (or sSetText sSetMText sSetATTDEF)) ;T表示文字
- (setq h (apply 'mapcar (cons '- (Entity:Box (ssname ss 0)))))
- (setq h (* (abs (cadr h)) 2));默认间距
- (initget 46)
- (setq h1 (getreal (strcat "\n >>输入行间距<" (VL-PRINC-TO-STRING h) ">:")))
- (cond ((not h1) (setq h1 h)))
- (cond ((or sSetText sSetATTDEF) (setq code 11))
- (T (setq code 10))
- )
- (setq lst (HH:ssPts:Sort ss "xy" (* h 0.75 0.5))) ;下到上,左到右 (HH:SortEndByPt
- (setq p0 (cdr (assoc code (entget (car lst))))) ;左下
- (setq w0 (HH:MaxWidth lst)) ;最大宽度
- (while (car lst)
- (cond ((setq lst (w2 lst Flag code p0 h1 w0));处理同列图元
- (setq p0 (list (cadr (assoc code (entget (car lst)))) (cadr p0)))
- )
- )
- )
- (HH:Once=>Init VARLIST valist0)
- (_EndUndo *DOC*)
- (command "_.select" ss "") ;因为ss内对象有些已经删除
- (HH::EntSSHighLight (ssget "_p"))
- )
- ) ;原ayEntSSHighLight
- (princ "\n 分类对象对齐命令 AO")
- (princ)
- )
- (princ "\n 黄明儒温馨提示:分类对象对齐命令 AO")
- ;;-----------------分类对象对齐命令 AO
|