版主帮帮忙,为什么老丢新增的行文字
www.dimcax.com
版主帮帮忙,为什么老丢新增的行文字
;;------------------------------------------------------------------
;;; edit_exterior 可将大段单行文字重新定义行高、行距
(defun errexit (s)
(princ s)
(restore)
)
(defun undox ()
(vl-file-delete filename)
(command "._undo" "e")
(setvar "cmdecho" oldcmdecho)
(setvar "osmode" os_old)
(setq *error* olderr)
(princ)
)
(defun c:edit_exterior ( / boolean code e1 e2 editor ent_txt file height_last index index_select index_sort index_ssour index_txt insert_last list_last list_txt pi sslist sslist_sort ssnum ssour txt txt_new width_last)
;;保存系统变量,程序初始化
(setq
olderr *error*
restore undox
*error* errexit
oldcmdecho (getvar "cmdecho")
os_old (getvar "osmode")
)
(setvar "cmdecho" 0)
(command "._undo" "be")
;;选择文字
(setq
editor "notepad" ;"d:\\program files\\emeditor\\emeditor.exe" ;"c:\\program files\\ultraedit\\uedit32.exe";
index_select 2
sslist nil
sslist_sort nil
)
(princ "\n请选择第 1 组文字:")
(while (setq ssour (ssget (list (cons 0 "text"))))
(princ (strcat "\n请选择第" (itoa index_select) "组文字<回车结束选择>:"))
(setq index_ssour 0)
(while (< index_ssour (sslength ssour));;将文字信息存入列表sslist
(setq
sslist (append sslist (list (entget (ssname ssour index_ssour))))
index_ssour (1+ index_ssour)
)
);end while
(setq;;按文字原来排版方式设置文字显示顺序,调整顺序后存入sslist_sort
sslist_sort
(append
sslist_sort
(vl-sort sslist
(function
(lambda (e1 e2)
(if (> (caddr (assoc 10 e1)) (caddr (assoc 10 e2)))
(> (caddr (assoc 10 e1)) (caddr (assoc 10 e2)))
(and (> (caddr (assoc 10 e1)) (- (caddr (assoc 10 e2)) (* 1 (cdr (assoc 40 e1))))) (< (cadr (assoc 10 e1)) (cadr (assoc 10 e2))))
)
)
)
);end vl-sort
);end append
sslist nil
index_select (1+ index_select)
)
)
;;设置用于编辑的临时文件file
(setq
filename (strcat (vl-filename-mktemp) ".txt");"edit.txt"
file (open filename "w")
index 0
boolean t
ssnum (length sslist_sort)
)
;;将选中文字行内容写入临时文件file,然后用文字编辑器打开以供用户编辑
(while (< index ssnum)
(setq txt (cdr (assoc 1 (nth index sslist_sort))))
(write-line txt file)
(setq index (1+ index))
)
(close file)
(princ "\n编辑完成文字编辑器中的单行文本后,请单击鼠标左键或右键继续:")
(startapp editor filename)
;;判断用户是否结束文件编辑并返回autocad,单击鼠标以结束文件编辑
(while boolean
(setq code (car (grread t 15 0)))
(if (or (= code 3) (= code 11))
(setq boolean nil)
)
)
;;打开编辑好的临时文件并读入其内容,写入list_txt,并删除临时文件
(setq
file (open filename "r")
list_txt nil
)
(while (setq txt (read-line file))
(setq list_txt (append list_txt (list txt)))
)
(close file)
(vl-file-delete filename)
;;将编辑好的原有文字行写回autocad数据库,并新建多出的文字行
(setq
index_txt 0
index_sort 0
)
(repeat (length list_txt)
(if (or (>= index_sort ssnum) (= (substr (nth index_txt list_txt) 1 2) "/n"))
(progn
(if (= (substr (nth index_txt list_txt) 1 2) "/n");判断是否是插入的文字
(setq txt_new (substr (nth index_txt list_txt) 3));将/n开头的文字去掉/n
(setq txt_new (nth index_txt list_txt))
)
(setq
insert_last (polar insert_last (* 1.5 pi) (* 1.5 height_last))
list_last (list (cons 0 "text") (cons 1 txt_new) (cons 7 (getvar "textstyle")) (cons 10 insert_last) (cons 72 0) (cons 73 0) (cons 62 256) (cons 40 height_last) (cons 41 width_last) (cons 50 0) (cons 8 (getvar "clayer")))
)
(entmake list_last)
)
(progn;将原有文字行更新并获取新增文字的位置、高度、宽度
(setq
ent_txt (nth index_sort sslist_sort)
ent_txt (subst (cons 1 (nth index_txt list_txt)) (assoc 1 ent_txt) ent_txt)
insert_last (cdr (assoc 10 (nth index_sort sslist_sort)))
height_last (cdr (assoc 40 (nth index_sort sslist_sort)))
width_last (cdr (assoc 41 (nth index_sort sslist_sort)))
index_sort (1+ index_sort)
)
(entmod ent_txt)
)
)
(setq index_txt (1+ index_txt))
)
(while (<= index_sort ssnum);将原有最后并被删除的文字删除掉
(entdel (cdr (assoc -1 (nth index_sort sslist_sort))))
(setq index_sort (1+ index_sort))
)
(restore);;恢复系统变量
(princ)
);;;endfunction
d