LukeCAD 发表于 2022-7-6 15:13:04

文本操作

你好
提前道歉,但我在beg上,我在CAD(2007)中有一些文本写在3行上,但它应该只在2行上,顶行表示“围栏级别”,下一行表示级别和链测长度,例如29.00m@15:00,最后一行给出日期为2009年1月28日,它们应该在第一行上写为“围栏级别29.00m”,然后在下面的行上写为“@15:00 28/01/2009”,我有很多东西要更改,有没有人能快速生成lisp,这样我就可以快速更改它们。
提前谢谢。

dbroada 发表于 2022-7-6 15:26:23

是文字还是多行文字?
 
我不是自愿提出解决方案,但他们需要不同的方法。

LukeCAD 发表于 2022-7-6 15:32:47

它有三行独立的文字,所以不是多行文字。

Lee Mac 发表于 2022-7-6 15:39:13

我想作为一种快速修复方法,你可以使用
 
TXT2MTXT(快速)。
 
但很明显,如果你有很多需要改变的地方,这会很烦人。

Lee Mac 发表于 2022-7-6 15:44:18

都在同一层吗?
 
你可以发一张样图给我吗?
 
谢谢
 

LukeCAD 发表于 2022-7-6 15:49:40

我有,112个实例需要更改,我现在回家后无法发布示例图,就像我需要它连接文本,但必须拆分中间行,将一半添加到第一行,将另一半添加到底线。哦,是的,都在同一层。
上传了一个jpg文件的一个基本例子,我有文本在顶部的例子,它需要在底部的格式。仍在文本中,而不是多行文字。

Lee Mac 发表于 2022-7-6 15:57:17

事实上,我发现这比预期的更难,更让工程师恼火——但我坚持了一段时间:
 

(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))

 
不过,您仍然需要选择每个实例,但这可能会加快速度

Lee Mac 发表于 2022-7-6 16:01:06

我真的无法对上述LISP进行任何改进,因为如果使用“X”参数进入选择集的世界,您可以使用DXF表中的所有不同值进行过滤-但是,使用“fence…”的多个实例等等等等,几乎不可能确定哪些三行文字需要压缩成两行。

fixo 发表于 2022-7-6 16:11:48

这是我的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'~

Lee Mac 发表于 2022-7-6 16:14:47

好主意,Fixo-希望他只是将文本段复制/粘贴到不同的区域,这样所有实例都几乎相同
 
不错
页: [1]
查看完整版本: 文本操作