Sponsored links

【AutoLISP サンプル】選択した図形の色を変更

Sponsored links
AutoLISP
Sponsored links
Jagaimo
Jagaimo

選択した図形の色を変更するコマンドです。
グループ選択/個別選択、繰り返し、システム変数変更、エラー処理、汎用性あるパターンは自作関数にするなど、レッスン記事で説明したことを組み入れています。

Sponsored links

コマンドの内容

概要

選択した図形の色を変えるコマンドです。

図形選択

コマンド実行前に図形を選択しているとグループ選択になり、一気に複数の図形の色を変えることができます。

その後、もしくは何も選択せずにコマンド実行をすると個別選択になり、1つづつ確認しながら色を変更して行けます。

繰り返すようにしているので、ESCキーでキャンセルをするまでは、色を変更後、次の図形を選択するようにプロンプトが出てきます。

個別選択の際にはグループ選択のオプションがあり、図形選択せずにGを入力するとグループ選択になります。

システム変数変更(コマンド実行中だけ)

コマンド実行時は、システム変数CMDECHOを0にして、必要ないプロンプトとエコーバックがコマンドラインに表示されないようになっています。
システム変数DYNMODEは3になり、ダイナミック入力モードしてプロンプトが目立つようにしています。

エラー処理も入れているので、エラー中断、ESCキーでの中断してもシステム変数は元の設定に戻ります。

汎用性

色番号を引数にして関数にまとめていますので、
(defun c:コマンド名 () (Jaga00ChCol 色番号))
という風に、色番号を変更しただけの類似コマンドを作るのが簡単です。

コマンド名

上記にあるように、別の色に変えるコマンドが欲しいときは、色番号を変更するだけで類似コマンドを作ることができます。

今回用意したのは、Col1 赤、 Col2 黄色、 Col3 緑、Col_BB ByBlock Col_BL ByLayerに変更するコマンドです。

AutoLISP プログラム

コマンド定義

;/////////////////////////////////////////
;JagaimoLisp コマンド関数
;図形の色変更 var.20200520
;---------------------------------------

(defun c:Col1 () (Jaga00ChCol 1))
(defun c:Col2 () (Jaga00ChCol 2))
(defun c:Col3 () (Jaga00ChCol 3))

(defun c:Col_BB () (Jaga00ChCol "ByBlock"))
(defun c:Col_BL () (Jaga00ChCol "ByLayer"))

;/////////////////////////////////////////

コマンドで使う関数定義

;=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
;JagaimoLisp関数 【Jaga00ChCol】図形の色チェンジ var.20200520
;----------------------------------------------
;<引数> col  変更したい色番号(インデックス)
; 図形選択で色変更(実行前グループ選択)
;=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

(defun Jaga00ChCol (Col / *error* Objs Obj Coltx) 
;-----------------------------------------   
    (defun *error* (msg)
      (if DefCmdEcho (setvar "CMDECHO" DefCmdEcho)) 
      (if DefDynMode (setvar "DYNMODE" DefDynMode)) 
      (princ msg)
    (princ))
;-----------------------------------------
    (setq DefCmdEcho (getvar "CMDECHO")) 
    (setq OldDynMode (getvar "DYNMODE "))
    (setvar "CMDECHO" 0)
    (setvar "DYNMODE" 3)
;-----------------------------------------
    (setq Objs (ssget "_I"))
  
    (if Objs
        (command-s "._CHANGE" Objs "" "_P" "_C" Col "")
    );if
  
    (while T
       (setq ES nil)
          (while (null ES)
              (initget "G")
              (if (numberp Col) (setq Coltx (itoa Col)) (setq Coltx Col))
              (setq ES (entsel (strcat "\n色を変更する図形を選択 <" Coltx ">: もしくは [グループ選択(G)]")))
          );while null ES
        
          (if (= ES "G")
            (progn
                (setq Objs (ssget))
                (command-s "._CHANGE" Objs "" "_P" "_C" Col "")
            );progn
            (progn
              (setq Obj (car ES))
              (command-s "._CHANGE" Obj "" "_P" "_C" Col "")
            );progn        
          );if
     ) ;while
   
;-----------------------------------------
  (if DefCmdEcho (setvar "CMDECHO" DefCmdEcho)) 
  (if DefDynMode (setvar "DYNMODE" DefDynMode))  
  
(princ));defun
;-----------------------------------------

参考記事

図形選択時のプロンプトについているオプションについて。

(ssget “_I”) で、暗黙選択(コマンド実行前に選択していた図形を暗黙の了解で編集する図形として選択)について。

必要無いエコーバックとプロンプトを消す設定と、ダイナミック入力にする設定にコマンド実行中は替えています。それらのシステム変数について。

引数付きの自作関数について。

プロンプトに色番号をだすために、整数から文字列に変換しています。
それについてはこちらの記事を。

エラー処理についてはコチラの記事リストを。


このコマンドはコマンド/関数内でエラー処理を定義する方法を使っていますが、
同じエラー処理内容で別に関数にして、コマンド定義の外でエラー定義をする方法を使ったコマンドサンプル。

Comments