【AutoCAD】二重ブロックも一発!ブロック内の色をByLayer/ByBlockに一括変換するLISP「CB」

他社からもらった図面や昔の図面を整理するとき、ブロックの中に直接「色」が設定されていて、画層(レイヤー)で色をコントロールできずにイライラ😠

いちいちブロックエディタを開いて、全選択して色を変えて……しかも、ブロックの中にさらにブロックが入っている「二重・三重ブロック(ネスト)」だと、もうお手上げ🤷

今回紹介するLISP**「CB(Color Block)」**を使えば、そんな面倒な色変更が、マトリョーシカのようなブロックの奥底まで一瞬で完了します。

1. 💡このLISPのポイント

  • 二重・三重ブロックも一発変換:ブロックの中にあるブロック(ネスト)の奥底まで、逃さず色を書き換えます。
  • ByLayerとByBlockを選択可能:図面整理なら「ByLayer」、後から色を自由に変えたい部品なら「ByBlock」と、状況に合わせて選べます。
  • ブロックエディタを開く手間がゼロ:画面上でブロックをポンポンと選択するだけで、一瞬で処理が完了します。
  • 寸法や配列複写してあるオブジェクト、パラメーターを含むブロック等少し複雑なブロックの色は変えれません🙏

2. ⚙️運用の準備(確実に動かすための初期設定)

このLISPは単体でも動作しますが、当ブログで推奨している共通ユーティリティや自動ロード設定を行っておくと、万が一のエラー時や「元に戻す(UNDO)」の動作が完璧になります。

まだ設定が終わっていない方は、先に以下の記事を読んで「爆速作図の土台」を作っておくと便利です。

3. 🕺使い方はたったの4ステップ!

コマンド名は、Color Blockの頭文字をとって「CB」です。

  1. コマンドラインに CB と入力してEnter。
  2. 変更モードを L(ByLayer)か B(ByBlock)で入力してEnter。(※そのままEnterを押すとByLayerになります)
  3. 色を変えたいブロックをマウスで**選択(窓選択で複数OK)**してEnter。
  4. 画面がパッと再描画され、ブロックの中身が一瞬で変更されます!(下の動画は3重ブロックです)

4. 💾LISPのダウンロードと追加方法

以下のリンクからLISPファイルをダウンロードしてください。

※ファイルはZIP形式でダウンロードされます、ダウンロードしたファイルを右クリックして「すべて展開」してからご使用ください。

フクロウ
フクロウ

「LISPの使い方が全くわからない!」という方は、まずこちらの記事でロードの方法をマスターしてくださいね。とても簡単です!

コピーしたいという方はこちら↓

CB_ColorBlock.lsp
;;; 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)
)
Lisp

6. ✏️まとめ:面倒な図面整理はLISPに任せよう

「ブロックエディタを開いて直すだけだから……」それが大変💦

特に「二重・三重ブロック」の手直しは、「ここで一回保存して、このブロックの色変えて、元のブロックに戻って、、、、、😱」

こうした面倒な作業はLISPに任せて、あなたは「図面を考える」という本来の仕事に集中してくださいね。

フクロウ
フクロウ

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

コメント

タイトルとURLをコピーしました