如何把一个对象的颜色设置成 ByLayer

本文介绍如何使用AutoCAD .net API通过代码设置实体颜色为bylayer。提供了具体实现方法,包括获取选择实体和设置颜色的具体步骤。


AutoCAD  .net API中可以用如下代码来设置entity的颜色为bylayer,请注意 BYLAYER的colorIndex为256。很简单,光贴代码。

 [CommandMethod("SetColorByLayer")]
public void SetColorByLayer()
{
ObjectId objId = GetSelectEntity();
using (Transaction trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
{
Entity ent = trans.GetObject(objId, OpenMode.ForWrite) as Entity;
//the corlor index of "BYLAYER" is 256, "BYBLOCK" is 0
ent.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByLayer, 256);
trans.Commit();
}
}
private ObjectId GetSelectEntity()
{
ObjectId oid = ObjectId.Null;
using (DocumentLock docLoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
{
PromptEntityOptions selectionOp = new PromptEntityOptions("\nselect entity");
PromptEntityResult prRes = ed.GetEntity(selectionOp);
if (prRes.Status == PromptStatus.OK)
{
oid = prRes.ObjectId;
}
}
return oid;
}
作者: 峻祁连
邮箱:junqilian@163.com 
出处: http://junqilian.cnblogs.com 
转载请保留此信息。




本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/archive/2011/09/02/2164084.html ,如需转载请自行联系原作者
(defun c:SCG (/ *error* cmde os ss input color-value found layer-colors split-string hex->int parse-color build-layer-colors) ;; 错误处理函数 (defun *error* (msg) (if os (setvar 'osmode os)) (setvar 'cmdecho cmde) (princ (strcat "\n错误: " msg)) (princ) ) ;; 分割字符串函数 (defun split-string (str delim / pos lst) (setq pos (vl-string-position (ascii delim) str)) (if (null pos) (list str) (progn (while pos (setq lst (cons (substr str 1 pos) lst)) (setq str (substr str (+ pos 2))) (setq pos (vl-string-position (ascii delim) str)) ) (reverse (cons str lst)) ) ) ) ;; 十六进制转整数 (defun hex->int (hex) (atoi (strcat "0x" hex)) ) ;; 颜色解析函数 (支持索引色/RGB/关键字) (defun parse-color (str / num rgb-list r g b hex-str) (cond ((wcmatch (strcase str) "BYLAYER") (list :byLayer)) ((wcmatch (strcase str) "BYBLOCK") (list :byBlock)) ;; 索引色处理 ((and (numberp (setq num (atoi str))) (<= 0 num 256)) (list :index num) ) ;; RGB格式: "r,g,b" ((setq rgb-list (split-string str ",")) (if (and (= (length rgb-list) 3) (numberp (setq r (atoi (car rgb-list)))) (numberp (setq g (atoi (cadr rgb-list)))) (numberp (setq b (atoi (caddr rgb-list)))) (<= 0 r 255) (<= 0 g 255) (<= 0 b 255)) (list :rgbValue (+ r (* g 256) (* b 65536))) ; RGB转整数 (progn (prompt "\n无效RGB格式! 使用: 255,0,0") nil) ) ) ;; 十六进制格式: "#RRGGBB" 或 "RRGGBB" ((or (wcmatch str "#*") (wcmatch str "##*")) (setq hex-str (vl-string-trim "#" str)) ; 移除所有#号 (if (and (= (strlen hex-str) 6) (setq r (hex->int (substr hex-str 1 2))) (setq g (hex->int (substr hex-str 3 2))) (setq b (hex->int (substr hex-str 5 2))) (<= 0 r 255) (<= 0 g 255) (<= 0 b 255)) (list :rgbValue (+ r (* g 256) (* b 65536))) ; RGB转整数 (progn (prompt "\n无效HEX格式! 使用: #FF0000") nil) ) ) (t (prompt "\n无效输入! 支持: 0-256, ByLayer, ByBlock, RGB(r,g,b/#RRGGBB)") nil) ) ) ;; 构建图层颜色表 (支持真彩色) (defun build-layer-colors (/ tbl layer layer-name color-index color-rgb) (setq tbl '()) (setq layer (tblnext "layer" T)) (while layer (setq layer-name (cdr (assoc 2 layer))) ;; 优先处理真彩色 (组码420) (cond ((setq color-rgb (cdr (assoc 420 layer))) (setq tbl (cons (cons layer-name (list :rgbValue color-rgb)) tbl)) (t ; 无真彩色时使用索引色 (组码62) (setq color-index (cdr (or (assoc 62 layer) '(62 . 7))) (setq tbl (cons (cons layer-name (list :index color-index)) tbl)) ) (setq layer (tblnext "layer")) ) tbl ) ;; 主程序 (setq cmde (getvar 'cmdecho)) (setq os (getvar 'osmode)) (setvar 'cmdecho 0) (setvar 'osmode 0) (setq found nil) ;; 用户输入处理 (initget "ByBlock ByLayer") (setq input (cond ((getkword "\n选择颜色类型 [ByBlock/ByLayer] <直接输入>: ")) ((getstring "\n输入颜色 (0-256/ByBlock/ByLayer/RGB): ")) )) (cond ;; ByBlock处理 - 修复: 使用正确的组码 ((or (equal input "ByBlock") (equal input "byblock") (equal input "BYBLOCK")) (if (setq ss (ssget "_X" '((62 . 0)))) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个ByBlock对象"))) (princ "\n未找到ByBlock对象"))) ;; ByLayer处理 - 修复: 使用正确的组码 ((or (equal input "ByLayer") (equal input "bylayer") (equal input "BYLAYER")) (if (setq ss (ssget "_X" '((62 . 256)))) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个ByLayer对象"))) (princ "\n未找到ByLayer对象"))) ;; 颜色值处理 (T (if (setq color-value (parse-color input)) (progn (setq layer-colors (build-layer-colors)) (cond ;; 索引色处理 ((eq (car color-value) :index) (setq target-index (cadr color-value)) (setq ss (ssadd)) ;; 优化选择集过滤 (setq filter (list '(-4 . "<OR") '(62 . 256) ; ByLayer对象 (cons 62 target-index) ; 直接匹配对象 '(-4 . "OR>"))) (if (setq all-ents (ssget "_X" filter)) (progn (setq i 0) (repeat (sslength all-ents) (setq ent (ssname all-ents i)) (setq entdata (entget ent)) (setq color62 (cdr (assoc 62 entdata))) (setq layer-name (cdr (assoc 8 entdata))) (cond ;; 直接匹配索引色 ((= color62 target-index) (ssadd ent ss)) ;; 通过图层匹配 (ByLayer情况) ((and (= color62 256) ; ByLayer (setq layer-color (cdr (assoc layer-name layer-colors))) (eq (car layer-color) :index) (= (cadr layer-color) target-index)) (ssadd ent ss)) ) (setq i (1+ i)) ) (if (> (sslength ss) 0) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个索引色 " (itoa target-index) " 对象"))) (princ (strcat "\n未找到索引色 " (itoa target-index) " 对象"))) (princ (strcat "\n未找到索引色 " (itoa target-index) " 对象")) ) ) ;; 真彩色处理 ((eq (car color-value) :rgbValue) (setq target-rgb (cadr color-value)) (setq ss (ssadd)) ;; 优化选择集过滤 (setq filter (list '(-4 . "<OR") '(62 . 256) ; ByLayer对象 (cons 420 target-rgb) ; 直接匹配真彩色 '(-4 . "OR>"))) (if (setq all-ents (ssget "_X" filter)) (progn (setq i 0) (repeat (sslength all-ents) (setq ent (ssname all-ents i)) (setq entdata (entget ent)) (setq color62 (cdr (assoc 62 entdata))) (setq color420 (cdr (assoc 420 entdata))) (setq layer-name (cdr (assoc 8 entdata))) (cond ;; 直接匹配真彩色 ((and color420 (= color420 target-rgb)) (ssadd ent ss)) ;; 通过图层匹配 (ByLayer情况) ((and (= color62 256) ; ByLayer (setq layer-color (cdr (assoc layer-name layer-colors))) (eq (car layer-color) :rgbValue) (= (cadr layer-color) target-rgb)) (ssadd ent ss)) ) (setq i (1+ i)) ) (if (> (sslength ss) 0) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个RGB颜色对象"))) (princ "\n未匹配的RGB对象")) (princ "\n未匹配的RGB对象")) ) ;; 关键字处理 ((eq (car color-value) :byLayer) (if (setq ss (ssget "_X" '((62 . 256)))) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个ByLayer对象"))) (princ "\n未找到ByLayer对象"))) ((eq (car color-value) :byBlock) (if (setq ss (ssget "_X" '((62 . 0)))) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个ByBlock对象"))) (princ "\n未找到ByBlock对象"))) ) ) (princ "\n无效颜色输入")) ) ) ;; 恢复环境 (setvar 'osmode os) (setvar 'cmdecho cmde) (princ) ) ;;; 加载VL函数 (兼容旧版AutoCAD) (if (not (vl-string-search "vl-" (getvar "acadver"))) (arxload "vl.arx"))
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值