183017064 发表于 2025-4-11 11:34:50

发个随机改颜色的代码——娱乐用

本帖最后由 183017064 于 2025-8-11 16:57 编辑

;; 随机颜色修改子程序
;; 功能:为指定实体随机分配预设颜色列表中的一种颜色
;; 变量说明:
;; shiti      - 实体(要修改颜色的对象)
;; yanSeLieBiao - 颜色列表(存储多种颜色代码)
;; suoYin       - 索引(用于从颜色列表中随机选取颜色)
(defun SheZhiSuiJiYanSe (shiti / yanSeLieBiao suoYin)
;; 定义颜色列表,包含多种颜色的代码值
(setq yanSeLieBiao '(   
    40    ; 红色
    201   ; 青色
    11    ; 黄色
    110   ; 紫色
    160   ; 橙色
    212   ; 粉色
))
;; 利用当前毫秒数生成随机索引(确保在颜色列表长度范围内)
;; rem函数用于取余数,保证索引不会超出列表范围
(setq suoYin (rem (getvar "MILLISECS") (length yanSeLieBiao)))

;; 修改实体颜色属性
;; entmod:修改实体属性的AutoCAD函数
;; append:将两个列表合并
;; entget:获取实体的当前属性数据
;; cons 62 ...:创建颜色属性对(62是AutoCAD中表示颜色的组码)
(entmod
    (append
      (entget shiti)
      (list (cons 62 (nth suoYin yanSeLieBiao)))
    )
)
)

;; 恢复随层颜色子程序
;; 功能:将指定实体的颜色恢复为"随层"状态(即跟随所在图层的颜色)
;; 变量说明:
;; shiti - 实体(要恢复颜色的对象)
(defun HuiFuSuiCeng (shiti)
;; 修改实体属性为随层颜色
;; 256是AutoCAD中表示"随层"的颜色代码
(entmod
    (append
      (entget shiti)
      (list (cons 62 256)); 256表示随层颜色
    )
)
)
;; 自定义颜色命令
(defun c:C1 () (setcolor 6))   ; 洋红
(defun c:C2 () (setcolor 1))   ; 红色
(defun c:C3 () (setcolor 2))   ; 黄色
(defun c:C4 () (setcolor 3))   ; 绿色
(defun c:C5 () (setcolor 4))   ; 青色
(defun c:C6 () (setcolor 5))   ; 蓝色
(defun c:C7 () (setcolor 11))    ; 棕色
(defun c:C8 () (setcolor 190))   ; 紫色
(defun c:CC () (setcolor 256))   ; 随层


;;; ======================================================
(defun setcolor (colorcode / color-palette color-name ss cnt ent)
    ;; 颜色名称对照表
    (setq color-palette
      '(
            (1 . "红色")   (2 . "黄色")   (3 . "绿色")
            (4 . "青色")   (5 . "蓝色")   (6 . "洋红")
            (11 . "棕色")    (190 . "紫色")   (256 . "随层")
      )
    )
   
    ;; 获取颜色名称
    (setq color-name
      (if (setq temp (assoc colorcode color-palette))
            (cdr temp)
            "未知颜色"
      )
    )
   
    ;; 显示颜色设置提示
    (princ
      (strcat
            "\n当前颜色: "
            color-name
            " (代码 "
            (itoa colorcode)
            ")"
      )
    )
   
    ;; 实体选择
    (if (setq ss (ssget))
      (progn
            (setq cnt 0)
            (repeat (sslength ss)
                (setq ent (ssname ss cnt))
                (entmod
                  (append
                        (entget ent)
                        (list (cons 62 colorcode))
                  )
                )
                (setq cnt (1+ cnt))
            )
            ;; 显示修改结果
            (princ
                (strcat
                  "\n成功修改 "
                  (itoa cnt)
                  " 个实体颜色为 "
                  color-name
                )
            )
      )
      ;; 空选择提示
      (princ "\n未选择任何实体,颜色已设置但未应用")
    )
    (princ) ; 静默退出
)

;;; ======================================================
(princ "\n颜色快捷命令加载成功 (C1-C8/CC)")
(princ)(defun c:tt(/ ent color-list idx) ; 定义命令
(setq color-list '(   ; 颜色列表
    40    ; 红色
    201   ; 青色
    11    ; 黄色
    110   ; 紫色
    160   ; 橙色
    212   ; 粉色
))
(while (setq ent (car (entsel "\n选择实体: "))); 循环选择实体
    (setq idx (rem (getvar "MILLISECS") (length color-list))); 生成随机索引
    (entmod; 修改实体属性
      (append
      (entget ent)
      (list (cons 62 (nth idx color-list))); 应用随机颜色
      ); 闭合 append
    ); 闭合 entmod
); 闭合 while
(princ); 静默退出
)

(defun RandomColorall (/ ent) ; 随机颜色命令
    (while (setq ent (car (entsel "\n选实体: ")))
      (entmod
            (append
                (entget ent)
                (list (cons 62 (1+ (rem (getvar "MILLISECS") 255))))
            )
      )
    )
    (princ)
)作为一个子程序用,当选用一个元素作为基准的话,可以清楚的表达一下。实用性可有可无,添加一点制图的趣味性。(PS:个人认为)

yjwht 发表于 2025-4-11 15:29:19

都试了,前者在color-list中随机颜色,后者在1~255中随机颜色。

magicheno 发表于 2025-4-11 17:23:07

感谢大佬分享

MZ_li 发表于 2025-4-12 09:04:47

感谢大佬分享

jkop 发表于 2025-4-12 10:16:57

娱乐性,还能兼做入门学习用!

season_88 发表于 2025-4-12 21:05:56

谢谢大佬分享

183017064 发表于 2025-4-13 20:35:53

jkop 发表于 2025-4-12 10:16
娱乐性,还能兼做入门学习用!

我也没想那么多,就是想,当我们选择一个元素作为基准的时候,能不能清楚一点。
页: [1]
查看完整版本: 发个随机改颜色的代码——娱乐用