文本操作
你好提前道歉,但我在beg上,我在CAD(2007)中有一些文本写在3行上,但它应该只在2行上,顶行表示“围栏级别”,下一行表示级别和链测长度,例如29.00m@15:00,最后一行给出日期为2009年1月28日,它们应该在第一行上写为“围栏级别29.00m”,然后在下面的行上写为“@15:00 28/01/2009”,我有很多东西要更改,有没有人能快速生成lisp,这样我就可以快速更改它们。
提前谢谢。 是文字还是多行文字?
我不是自愿提出解决方案,但他们需要不同的方法。 它有三行独立的文字,所以不是多行文字。 我想作为一种快速修复方法,你可以使用
TXT2MTXT(快速)。
但很明显,如果你有很多需要改变的地方,这会很烦人。 都在同一层吗?
你可以发一张样图给我吗?
谢谢
李 我有,112个实例需要更改,我现在回家后无法发布示例图,就像我需要它连接文本,但必须拆分中间行,将一半添加到第一行,将另一半添加到底线。哦,是的,都在同一层。
上传了一个jpg文件的一个基本例子,我有文本在顶部的例子,它需要在底部的格式。仍在文本中,而不是多行文字。
事实上,我发现这比预期的更难,更让工程师恼火——但我坚持了一段时间:
(defun c:fence (/ ss i tEnt tVal l1 l1list l1val l2 l2list
l2val l3 l3list l3val l2pos l1New l2New)
(vl-load-com)
(if (and (setq ss (ssget (list (cons 0 "TEXT")
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(= (setq i (sslength ss)) 3))
(progn
(while (not (minusp (setq i (1- i))))
(setq tEnt (ssname ss i)
tVal (cdr (assoc 1 (entget tEnt))))
(cond ((wcmatch tVal "Fen*")
(setq l1 tEnt)
(setq l1list (entget l1))
(setq l1val tVal))
((wcmatch tVal "*@*")
(setq l2 tEnt)
(setq l2list (entget l2))
(setq l2val tVal))
((wcmatch tVal "*/*")
(setq l3 tEnt)
(setq l3list (entget l3))
(setq l3val tVal))))
(setq l2pos (vl-string-search "@" l2val)
l1New (strcat l1val (chr 32) (substr l2val 1 l2pos))
l2New (strcat (substr l2val (1+ l2pos)) (chr 32) l3val))
(setq l1list (subst (cons 1 l1New) (assoc 1 l1list) l1list)
l2list (subst (cons 1 l2New) (assoc 1 l2list) l2list))
(entmod l1list)
(entmod l2list)
(entdel l3))
(princ "\n<!> No Text Found <!>"))
(princ))
不过,您仍然需要选择每个实例,但这可能会加快速度 我真的无法对上述LISP进行任何改进,因为如果使用“X”参数进入选择集的世界,您可以使用DXF表中的所有不同值进行过滤-但是,使用“fence…”的多个实例等等等等,几乎不可能确定哪些三行文字需要压缩成两行。 这是我的2c
只需更改为标准选择过滤器
(突出显示红色)
;;__________________________________________;;
(defun dxf (key alist)
(cdr (assoc key alist))
)
;;__________________________________________;;
(defun ss_list (ss / en i lst)
(setq i -1)
(while (setq en (ssname ss (setq i (1+ i))))
(setq lst (cons en lst)
)
)
(reverse lst)
)
;;__________________________________________;;
(defun sort_txt_list(lst)
(vl-sort lst
(function (lambda (a b)
(< (cadr (dxf 10 (entget a)))
(cadr (dxf 10 (entget b)))))))
)
;;__________________________________________;;
(defun C:txf (/ *error* com_list ctxt el el1 el2 en fst ip ll
ocm p1 p2 pos pt pt1 pt2 ss str1 str2 tx1 tx2 tx3
txt txt_list ur)
(defun *error*(msg)
(if msg
(if
(not
(member
msg
'("console break"
"Function cancelled"
"quit / exit abort"
"")
)
)
(princ (strcat "\nError: " msg))
)
)
(if ocm
(setvar "cmdecho" ocm)
)
(command "._zoom" "_P")
(command "._ucs" "_P")
(command "undo" "end")
(prompt "\nResetting System Variables... ")
(princ)
)
(setq ocm (getvar "cmdecho"))
(command "._undo" "_BE")
(command "._ucs" "_W")
(command "._zoom" "_E")
(alert "Select 3 lines of text by window\nwith small gap for using them\nlater as template")
(princ "\nSelection start")
(setq pt1 (getpoint "\nLOWER LEFT corner point: ")
pt2 (getcorner pt1 "\nUPPER RIGHT corner point: ")
)
(while (not
(and
(setq ss (ssget "_W" pt1 pt2
(list (cons 0 "TEXT")
(cons 8 "ANNO-TEXT");text layer
(cons 7 "SHERIF");text style
(cons 40 0.75);text size
)
)
)
(= 3 (sslength ss))))
(alert "Select 3 text only from up to down")
)
(setq txt_list (sort_txt_list (ss_list ss)))
;; absolute coordinates of selection window:
(setq fst (car txt_list)
pt (dxf 10 (entget fst))
)
(setq ll (mapcar '- pt1 pt)
ur (mapcar '- pt2 pt)
ss nil
)
(setq ss (ssget "_X"
(list (cons 0 "TEXT")
(cons 1 (dxf 1 (entget fst)))
(cons 8 "ANNO-TEXT");text layer
(cons 7 "SHERIF");text style
(cons 40 0.75);text size
)
)
)
(setq com_list (ss_list ss) ss nil)
(while (setq fst (car com_list))
(setq pt (dxf 10 (entget fst))
p1 (mapcar '+ pt ll)
p2 (mapcar '+ pt ur)
)
(setq ss (ssget "_W" p1 p2
(list (cons 0 "TEXT")
(cons 8 "ANNO-TEXT");text layer
(cons 7 "SHERIF");text style
(cons 40 0.75);text size
)
)
)
(setq txt_list (sort_txt_list (ss_list ss))
tx1 (car txt_list)
tx2 (cadr txt_list)
tx3 (last txt_list)
el1 (entget tx1)
el2 (entget tx2)
)
(setq ctxt "" txt "")
(while (setq en (car txt_list))
(setq el (entget en))
(setq ip (dxf 10 el))
(setq txt (dxf 1 el))
(setq ctxt (strcat txt " " ctxt))
(setq txt_list (cdr txt_list))
)
(setq str1 (substr ctxt (setq pos (1+ (vl-string-search "@" ctxt))))
str2 (substr ctxt 1 (+ (- (strlen ctxt) pos) 2))
)
;;; (entdel (last txt_list))
(entmod (subst (cons 1 str1)(assoc 1 el1) el1))
(entupd tx1)
(entmod (subst (cons 1 str2)(assoc 1 el2) el2))
(entupd tx2)
(command "._erase" tx3 "")
(setq com_list (cdr com_list))
)
(*error* nil)
(princ)
)
(princ "\nStart command with TXF")
(princ)
~'J'~ 好主意,Fixo-希望他只是将文本段复制/粘贴到不同的区域,这样所有实例都几乎相同
不错
页:
[1]