他社からもらった図面や昔の図面を整理するとき、ブロックの中に直接「色」が設定されていて、画層(レイヤー)で色をコントロールできずにイライラ😠
いちいちブロックエディタを開いて、全選択して色を変えて……しかも、ブロックの中にさらにブロックが入っている「二重・三重ブロック(ネスト)」だと、もうお手上げ🤷
今回紹介するLISP**「CB(Color Block)」**を使えば、そんな面倒な色変更が、マトリョーシカのようなブロックの奥底まで一瞬で完了します。
1. 💡このLISPのポイント
- 二重・三重ブロックも一発変換:ブロックの中にあるブロック(ネスト)の奥底まで、逃さず色を書き換えます。
- ByLayerとByBlockを選択可能:図面整理なら「ByLayer」、後から色を自由に変えたい部品なら「ByBlock」と、状況に合わせて選べます。
- ブロックエディタを開く手間がゼロ:画面上でブロックをポンポンと選択するだけで、一瞬で処理が完了します。
- 寸法や配列複写してあるオブジェクト、パラメーターを含むブロック等少し複雑なブロックの色は変えれません🙏
2. ⚙️運用の準備(確実に動かすための初期設定)
このLISPは単体でも動作しますが、当ブログで推奨している共通ユーティリティや自動ロード設定を行っておくと、万が一のエラー時や「元に戻す(UNDO)」の動作が完璧になります。
まだ設定が終わっていない方は、先に以下の記事を読んで「爆速作図の土台」を作っておくと便利です。
3. 🕺使い方はたったの4ステップ!
コマンド名は、Color Blockの頭文字をとって「CB」です。
- コマンドラインに CB と入力してEnter。
- 変更モードを L(ByLayer)か B(ByBlock)で入力してEnter。(※そのままEnterを押すとByLayerになります)
- 色を変えたいブロックをマウスで**選択(窓選択で複数OK)**してEnter。
- 画面がパッと再描画され、ブロックの中身が一瞬で変更されます!(下の動画は3重ブロックです)
4. 💾LISPのダウンロードと追加方法
以下のリンクからLISPファイルをダウンロードしてください。
※ファイルはZIP形式でダウンロードされます、ダウンロードしたファイルを右クリックして「すべて展開」してからご使用ください。

「LISPの使い方が全くわからない!」という方は、まずこちらの記事でロードの方法をマスターしてくださいね。とても簡単です!
コピーしたいという方はこちら↓
;;; Support: https://easycadwork.com
;;; X(follow me!): https://x.com/easycadwork
;;; 概要: 選択したブロック内の色を ByLayer または ByBlock に一括変更する
(vl-load-com)
(defun c:CB (/ mode colorCode ss i blkRef blkName doc blocks processed queue objName nestName)
;; 共通ユーティリティの有無を確認して実行(ハイブリッド設計)
(if (type ECW_Error) (setq *error* ECW_Error))
(if (type ECW_Start) (ECW_Start))
;; --- メイン処理 ---
;; 1. モードの選択(キーワードを "L" と "B" に明確化)
(initget "L B")
(setq mode (getkword "\n変更モードを選択[ByLayer(L) / ByBlock(B)] <L(ByLayer)>: "))
(if (null mode) (setq mode "L")) ; そのままEnterを押した場合は "L" にする
;; 色コードの設定 (L = ByLayer:256, B = ByBlock:0)
(if (= mode "L")
(setq colorCode 256)
(setq colorCode 0)
)
;; 2. ブロックの選択
(princ (strcat "\n中身を " (if (= mode "L") "ByLayer" "ByBlock") " に変更するブロックを選択: "))
(if (setq ss (ssget '((0 . "INSERT"))))
(progn
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq blocks (vla-get-blocks doc))
(setq processed nil queue nil)
;; 選択したブロックの名前をリストに登録
(repeat (setq i (sslength ss))
(setq blkRef (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
(setq blkName (if (vlax-property-available-p blkRef 'EffectiveName)
(vla-get-EffectiveName blkRef)
(vla-get-Name blkRef)))
(if (not (member blkName queue))
(setq queue (cons blkName queue))
)
)
;; 3. ブロック定義内を走査(ネスト対応)
(while queue
(setq blkName (car queue))
(setq queue (cdr queue))
(if (not (member blkName processed))
(progn
(setq processed (cons blkName processed))
(vl-catch-all-apply
'(lambda ()
(vlax-for obj (vla-item blocks blkName)
;; 指定した色コードに変更
(vl-catch-all-apply 'vla-put-color (list obj colorCode))
;; ネストされたブロックがあればキューに追加
(setq objName (vla-get-ObjectName obj))
(if (or (= objName "AcDbBlockReference") (= objName "AcDbMInsertBlock"))
(progn
(setq nestName (if (vlax-property-available-p obj 'EffectiveName)
(vla-get-EffectiveName obj)
(vla-get-Name obj)))
(if (not (member nestName processed))
(setq queue (cons nestName queue))
)
)
)
)
)
)
)
)
)
(vla-regen doc acActiveViewport)
(princ (strcat "\n完了: " (itoa (length processed)) " 種類のブロック内を " (if (= mode "L") "ByLayer" "ByBlock") " に変更しました。"))
)
(princ "\n※ブロックが選択されませんでした。")
)
(if (type ECW_End) (ECW_End))
(princ)
)Lisp6. ✏️まとめ:面倒な図面整理はLISPに任せよう
「ブロックエディタを開いて直すだけだから……」それが大変💦
特に「二重・三重ブロック」の手直しは、「ここで一回保存して、このブロックの色変えて、元のブロックに戻って、、、、、😱」
こうした面倒な作業はLISPに任せて、あなたは「図面を考える」という本来の仕事に集中してくださいね。

「面倒な作業を一つ自動化完了です、昨日よりも確実にレベルアップしています。明日も一緒に爆速作図を目指しましょう!」



コメント