乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 36|回复: 19

[编程交流] 帮助:只改变颜色

[复制链接]

48

主题

304

帖子

256

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
240
发表于 2022-7-5 18:48:13 | 显示全部楼层 |阅读模式
我有一堆由字母和数字组成的多行文字。
 
我只需要更改数字的颜色
 
例子:
 
“房间15”>>>>“房间15”
 
目前,我必须双击每个多行文字进入编辑模式,突出显示这些数字,并点击所需的颜色。
 
任何人都可以想出一个LISP/marco脚本,只需选择所需的多行文字即可更改数字的颜色?
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 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
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:55:25 | 显示全部楼层
开始正在进行的工作
 
  1. (defun C:textcol ( / X obj ans char1)
  2. (setq obj (entget (car (entsel "Pick Mtext" )))) ; do a check for mtext
  3. (setq x "130") ; dummy colour number use a getint and rtos note c is rgb C is number
  4. (setq str (cdr (assoc 1 obj)))
  5. (setq ans "") ; blank string
  6. (setq keepgoing 1) ; 1st character
  7. (while (<= keepGoing (strlen str)) ; repeat for length of text
  8. (setq char1 (substr str keepGoing 1))
  9. (if (and (< 48 (ascii char1))(> 57 (ascii char1))) ; 0 is 48 9 is 57
  10. (setq ans (strcat ans "{\\C" X ";" char1 "}")) ; this allows for a number in middle of text
  11. (setq ans (strcat ans char1))
  12. )
  13. (setq keepGoing (+ keepGoing 1))
  14. )
  15. (entmod (subst (cons 1 ans) (assoc 1 obj) obj))
  16. (princ)
  17. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:58:27 | 显示全部楼层
代码已更新
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:03:42 | 显示全部楼层
试试这个程序,让我知道。
 
  1. (defun c:Test (/ s i en st x l)
  2. ;;------------------------------------;;
  3. ;;        Tharwat 31.05.2015                ;;
  4. ;; Color number in Mtext to Blue = 5        ;;
  5. ;;------------------------------------;;
  6. (if (setq s (ssget "_:L" '((0 . "MTEXT") (-4 . "<NOT")(1 . "*{\\*;*}*")(-4 . "NOT>"))))
  7.    (repeat (setq i (sslength s))
  8.      (setq en (entget (ssname s (setq i (1- i))))
  9.            st (cdr (assoc 1 en))
  10.            x  ""
  11.      )
  12.      (mapcar '(lambda (n)
  13.                 (if (member n '(48 49 50 51 52 53 54 55 56 57))
  14.                   (setq l (cons (strcat x "{\\C5;" (chr n) "}") l)
  15.                   )
  16.                   (setq l (cons (strcat x (chr n)) l)
  17.                   )
  18.                 )
  19.               )
  20.              (vl-string->list st)
  21.      )
  22.      (entmod (subst (cons 1 (apply 'strcat (reverse l)))
  23.                     (assoc 1 en)
  24.                     en
  25.              )
  26.      )
  27.      (setq l nil)
  28.    )
  29. )
  30. (princ)
  31. )(vl-load-com)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:05:50 | 显示全部楼层
我建议在这项任务中使用正则表达式——以下应说明包含彩色和非彩色数字内容的多行文字,以及负数和小数:
  1. ;; Colour Numerical MText  -  Lee Mac
  2. (defun c:numcol ( / *error* enx idx rgx sel str )
  3.    (defun *error* ( msg )
  4.        (if (and (= 'vla-object (type rgx)) (not (vlax-object-released-p rgx)))
  5.            (vlax-release-object rgx)
  6.        )
  7.        (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
  8.            (princ (strcat "\nError: " msg))
  9.        )
  10.        (princ)
  11.    )
  12.    
  13.    (if (setq sel (ssget "_:L" '((0 . "MTEXT") (1 . "*#*"))))
  14.        (if (setq rgx (vlax-get-or-create-object "vbscript.regexp"))
  15.            (progn
  16.                (vlax-put-property rgx 'global     actrue)
  17.                (vlax-put-property rgx 'ignorecase acfalse)
  18.                (vlax-put-property rgx 'multiline  actrue)
  19.                (vlax-put-property rgx 'pattern "(-?\\d+(?:\\.\\d)?\\d*)(?![0-9;}\\|])")
  20.                (repeat (setq idx (sslength sel))
  21.                    (setq enx (entget (ssname sel (setq idx (1- idx))))
  22.                          str (assoc 1 enx)
  23.                    )
  24.                    (entmod (subst (cons 1 (vlax-invoke rgx 'replace (cdr str) "{\\C1;$1}")) str enx))
  25.                )
  26.            )
  27.            (princ "\nUnable to interface with RegExp object.")
  28.        )
  29.    )
  30.    (*error* nil)
  31.    (princ)
  32. )
  33. (vl-load-com) (princ)
回复

使用道具 举报

48

主题

304

帖子

256

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
240
发表于 2022-7-5 19:08:50 | 显示全部楼层
大家好。谢谢你的帮助。我有一个漫长的周末,因此迟了答复。
 
我测试了每个LISP,得到了不同的结果。
 
我还附上了图纸供参考。
 
到目前为止,根据我正在绘制的图纸,李的LISP作品。但是,只有当字母和数字颜色相同时。
 
 
李,我测试了它&如果数字已经是不同的颜色,那么文本,数字不会改变颜色。
 
顺便说一句,李,如何改变Lisp程序不同的颜色,然后红色?我要的颜色实际上是megenta。
194815hiyofhtfl2hvyijb.jpg
仅更改数字LISP结果。图纸
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:13:34 | 显示全部楼层
我的例程不起作用,或者实际上不允许您选择多行文字对象,因为它是格式化的多行文字对象,因此请在多行文字对话框中更改任何格式,制作一个新的多行文字,然后再次尝试该例程。
回复

使用道具 举报

48

主题

304

帖子

256

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
240
发表于 2022-7-5 19:14:14 | 显示全部楼层
 
嗨Tharwat
 
我明白你的意思。但这种Lisp程序的原因是为了快速改变现有多行文字的编号颜色。因此,如果我要创建一个新的文本,它将无法达到目的。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:19:22 | 显示全部楼层
同意你的观点。
 
只需等待Lee,因为他选择了使用正则表达式(C#中的正则表达式方法)的最佳选择,并且很容易为用户添加一个选项,从颜色拨号中选择他们想要的任何颜色。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-9 19:10 , Processed in 0.597490 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表