vernonlee 发表于 2022-7-5 18:48:13

帮助:只改变颜色

我有一堆由字母和数字组成的多行文字。
 
我只需要更改数字的颜色
 
例子:
 
“房间15”>>>>“房间15”
 
目前,我必须双击每个多行文字进入编辑模式,突出显示这些数字,并点击所需的颜色。
 
任何人都可以想出一个LISP/marco脚本,只需选择所需的多行文字即可更改数字的颜色?
 
谢谢

BIGAL 发表于 2022-7-5 18:54:20

做一些关于多行文字是如何创建的研究,然后很容易有一个隐藏的颜色控制。只需一次读取多行文字1个字符,并检查其(Ascii x)是否在48-57范围内,如果是,则设置颜色标志并更新。我试图找到一个多行文字例程,我有一个地方,这是问过一次,一些代码被张贴。
 
您的示例房间12 TextString=“房间{\\C1;12}”您可以看到控制代码
 
Ok(ascii“9”)是57,所以只需使用substr遍历文本,直到它找到一个小于58的数字,大于48,然后重写文本,添加\\Cx;中间x i的颜色为红色,数字1为红色。
 
http://www.cadforum.cz/cadforum_en/text-formatting-codes-in-mtext-objects-tip8640

BIGAL 发表于 2022-7-5 18:55:25

开始正在进行的工作
 


(defun C:textcol ( / X obj ans char1)
(setq obj (entget (car (entsel "Pick Mtext" )))) ; do a check for mtext
(setq x "130") ; dummy colour number use a getint and rtos note c is rgb C is number
(setq str (cdr (assoc 1 obj)))
(setq ans "") ; blank string
(setq keepgoing 1) ; 1st character

(while (<= keepGoing (strlen str)) ; repeat for length of text
(setq char1 (substr str keepGoing 1))

(if (and (< 48 (ascii char1))(> 57 (ascii char1))) ; 0 is 48 9 is 57
(setq ans (strcat ans "{\\C" X ";" char1 "}")) ; this allows for a number in middle of text
(setq ans (strcat ans char1))
)

(setq keepGoing (+ keepGoing 1))
)

(entmod (subst (cons 1 ans) (assoc 1 obj) obj))
(princ)
)

BIGAL 发表于 2022-7-5 18:58:27

代码已更新

Tharwat 发表于 2022-7-5 19:03:42

试试这个程序,让我知道。
 

(defun c:Test (/ s i en st x l)
;;------------------------------------;;
;;        Tharwat 31.05.2015                ;;
;; Color number in Mtext to Blue = 5        ;;
;;------------------------------------;;
(if (setq s (ssget "_:L" '((0 . "MTEXT") (-4 . "<NOT")(1 . "*{\\*;*}*")(-4 . "NOT>"))))
   (repeat (setq i (sslength s))
   (setq en (entget (ssname s (setq i (1- i))))
         st (cdr (assoc 1 en))
         x""
   )
   (mapcar '(lambda (n)
                (if (member n '(48 49 50 51 52 53 54 55 56 57))
                  (setq l (cons (strcat x "{\\C5;" (chr n) "}") l)
                  )
                  (setq l (cons (strcat x (chr n)) l)
                  )
                )
            )
             (vl-string->list st)
   )
   (entmod (subst (cons 1 (apply 'strcat (reverse l)))
                  (assoc 1 en)
                  en
             )
   )
   (setq l nil)
   )
)
(princ)
)(vl-load-com)

Lee Mac 发表于 2022-7-5 19:05:50

我建议在这项任务中使用正则表达式——以下应说明包含彩色和非彩色数字内容的多行文字,以及负数和小数:

;; Colour Numerical MText-Lee Mac

(defun c:numcol ( / *error* enx idx rgx sel str )

   (defun *error* ( msg )
       (if (and (= 'vla-object (type rgx)) (not (vlax-object-released-p rgx)))
         (vlax-release-object rgx)
       )
       (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
         (princ (strcat "\nError: " msg))
       )
       (princ)
   )
   
   (if (setq sel (ssget "_:L" '((0 . "MTEXT") (1 . "*#*"))))
       (if (setq rgx (vlax-get-or-create-object "vbscript.regexp"))
         (progn
               (vlax-put-property rgx 'global   actrue)
               (vlax-put-property rgx 'ignorecase acfalse)
               (vlax-put-property rgx 'multilineactrue)
               (vlax-put-property rgx 'pattern "(-?\\d+(?:\\.\\d)?\\d*)(?!)")
               (repeat (setq idx (sslength sel))
                   (setq enx (entget (ssname sel (setq idx (1- idx))))
                         str (assoc 1 enx)
                   )
                   (entmod (subst (cons 1 (vlax-invoke rgx 'replace (cdr str) "{\\C1;$1}")) str enx))
               )
         )
         (princ "\nUnable to interface with RegExp object.")
       )
   )
   (*error* nil)
   (princ)
)
(vl-load-com) (princ)

vernonlee 发表于 2022-7-5 19:08:50

大家好。谢谢你的帮助。我有一个漫长的周末,因此迟了答复。
 
我测试了每个LISP,得到了不同的结果。
 
我还附上了图纸供参考。
 
到目前为止,根据我正在绘制的图纸,李的LISP作品。但是,只有当字母和数字颜色相同时。
 
 
李,我测试了它&如果数字已经是不同的颜色,那么文本,数字不会改变颜色。
 
顺便说一句,李,如何改变Lisp程序不同的颜色,然后红色?我要的颜色实际上是megenta。

仅更改数字LISP结果。图纸

Tharwat 发表于 2022-7-5 19:13:34

我的例程不起作用,或者实际上不允许您选择多行文字对象,因为它是格式化的多行文字对象,因此请在多行文字对话框中更改任何格式,制作一个新的多行文字,然后再次尝试该例程。

vernonlee 发表于 2022-7-5 19:14:14

 
嗨Tharwat
 
我明白你的意思。但这种Lisp程序的原因是为了快速改变现有多行文字的编号颜色。因此,如果我要创建一个新的文本,它将无法达到目的。

Tharwat 发表于 2022-7-5 19:19:22

同意你的观点。
 
只需等待Lee,因为他选择了使用正则表达式(C#中的正则表达式方法)的最佳选择,并且很容易为用户添加一个选项,从颜色拨号中选择他们想要的任何颜色。
页: [1] 2
查看完整版本: 帮助:只改变颜色