帮助:只改变颜色
我有一堆由字母和数字组成的多行文字。我只需要更改数字的颜色
例子:
“房间15”>>>>“房间15”
目前,我必须双击每个多行文字进入编辑模式,突出显示这些数字,并点击所需的颜色。
任何人都可以想出一个LISP/marco脚本,只需选择所需的多行文字即可更改数字的颜色?
谢谢 做一些关于多行文字是如何创建的研究,然后很容易有一个隐藏的颜色控制。只需一次读取多行文字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 开始正在进行的工作
(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)
)
代码已更新 试试这个程序,让我知道。
(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)
我建议在这项任务中使用正则表达式——以下应说明包含彩色和非彩色数字内容的多行文字,以及负数和小数:
;; 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) 大家好。谢谢你的帮助。我有一个漫长的周末,因此迟了答复。
我测试了每个LISP,得到了不同的结果。
我还附上了图纸供参考。
到目前为止,根据我正在绘制的图纸,李的LISP作品。但是,只有当字母和数字颜色相同时。
李,我测试了它&如果数字已经是不同的颜色,那么文本,数字不会改变颜色。
顺便说一句,李,如何改变Lisp程序不同的颜色,然后红色?我要的颜色实际上是megenta。
仅更改数字LISP结果。图纸 我的例程不起作用,或者实际上不允许您选择多行文字对象,因为它是格式化的多行文字对象,因此请在多行文字对话框中更改任何格式,制作一个新的多行文字,然后再次尝试该例程。
嗨Tharwat
我明白你的意思。但这种Lisp程序的原因是为了快速改变现有多行文字的编号颜色。因此,如果我要创建一个新的文本,它将无法达到目的。 同意你的观点。
只需等待Lee,因为他选择了使用正则表达式(C#中的正则表达式方法)的最佳选择,并且很容易为用户添加一个选项,从颜色拨号中选择他们想要的任何颜色。
页:
[1]
2