Sponsored links

【AutoLISP サンプル】ブロック名変更 (ダイアログボックス付き)

Sponsored links
AutoLISP
Sponsored links
Sponsored links

コマンドの内容

概要

図形を選択し、新しいブロック名を入力すると、選択したブロックのブロック名を変更するコマンドです。

図形選択

図形選択は1つだけです。コマンド実行前でも後でも図形を選択できます。

ブロックのみ選択できるようになっています。

ブロック以外を選択した場合、先に進まず図形選択のプロンプトが出続けます。

ダイアログボックス

ブロック選択後、ダイアログボックスが出てきます。

Current Name には現在の名前が表示されます。
New Name にも現在の名前が表示されるので、新しい名前に変更してください。

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

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

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

ブロック名チェック

すでに図面内にある名前を入力すると、アラートメッセージが出て、新しいブロック名入力を促すダイアログボックスに戻ります。

コマンド名

コマンド名は、BlkReNmです。好みに合わせて変えてください。

AutoLISP プログラム

コマンド部分

(defun c:BlkReNm ( / Obj CuNm NwNm flg)
  (vl-load-com)
  (Jaga00START)
  
	(setq Obj (Jaga00ObjIns))
  (setq CuNm (vla-get-Effectivename (vlax-ename->vla-object Obj)))
  
  (if CuNm (progn
    (while (null flg)
      (BlkReNmDB CuNm)
      (if (tblobjname "block" NwNm)
          (alert "\nそのブロック名はすでに図面内で使われています。\n")
          (setq flg 1)
      );if
    );while flg
    
    (command-s "._RENAME" "_B" CuNm NwNm )
  ));if CuNm
(Jaga00END)
(princ))


;====================================================
;=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
;JagaimoLisp関数  var.20200528
;----------------------------------------------
;ブロック選択/エラー処理
;=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
;====================================================

;=====================================================================================
(defun Jaga00ObjIns( / Objs Obj)
	(setq Objs (ssget "_I" '((0 . "INSERT"))))
		(if Objs 
			(setq Obj (ssname Objs 0))
			(progn
				(setq Obj nil flg "No")
				(while flg
					(while (null Obj)
						(setq Obj (car (entsel "\nブロックを選択: ")))
					);while null Obj
					(if (= "INSERT" (cdr(assoc 0 (entget Obj))))
						(setq flg nil)
						(setq flg "No" Obj nil)
					);if
				);while flg
			);progn	
		);if
Obj		
);defun
;=====================================================================================
;=====================================================================================
(defun Jaga00START ()
  (setq DefErr *error* *error* Jaga00ERR) 
;--------------------------------------- 
  (setq DefCmdEcho (getvar "CMDECHO")) 
    (setvar "CMDECHO" 0)
  (setq DefDynMode (getvar "DYNMODE")) 
    (setvar "DYNMODE" 3)
;-----------------------------------------
(princ "\nJaga00START\n") 
(princ));defun
;=====================================================================================
(defun Jaga00END ()
  (setvar "DYNMODE" DefDynMode)
  (setvar "CMDECHO" DefCmdEcho)
 ;-----------------------------------------	 
   (setq *error* DefErr) 
(princ "\nJaga00END\n")
(princ));defun
;=====================================================================================
(defun Jaga00ERR (msg)	
   (Jaga00END)
(princ (strcat"\nJaga00ERR\n " msg))
(princ));defun
;=====================================================================================

ダイアログボックス部分

ダイアログボックスを呼び出す部分は別に関数にしました。

AutoLISP

(defun BlkReNmDB (CuNm / dcl_id Act)

   (setq dcl_id (load_dialog "JagaDCL.dcl")) ;
   
      (if (not (new_dialog "BlkReNm" dcl_id))
	      (progn
            (princ "***ダイアログボックスが見つかりません***")
            (exit)
      ));if  
;-----------------------------------------------------------
            (set_tile "CuNm" CuNm )
            (set_tile "NwNm" CuNm )	
          ;-----------------------------------------------------------
            (action_tile "accept" "(BlkReNm_GetVar)(done_dialog 1)")
            (action_tile "cancel" "(done_dialog 0)")
          ;-----------------------------------------------------------
            (setq Act (start_dialog))
            (unload_dialog dcl_id)
          ;-----------------------------------------------------------
            (cond 
              ((= Act 0) (princ "ユーザーキャンセル")(exit))
              ((= Act 1) (princ NwNm))
            );cond
;----------------------------------------------------------				
(princ));defun

;================================
(defun BlkReNm_GetVar ()
	(setq NwNm (get_tile "NwNm"))
)
;================================

DCL (ダイアログボックス コントロール言語)

JagaDCL.dcl というファイル名でサポートファイルの検索パス内にあるフォルダに保存してあることを前提で上のAutoLISPにプログラムされています。

BlkReNm :dialog
      {label = "Block Re-Name"; 
//--------------------------------------------------------  
       :column { 
          :boxed_row {label = "Current Name";
              :text{ key = "CuNm";}
          } 
          :boxed_row {label = "New Name";
              :edit_box{ key = "NwNm";}
          }
       } // colmun
 //--------------------------------------------------------   
        ok_cancel;
      }

参考記事

これのダイアログボックスがつかないバージョンです。

ダイアログボックスの記事一覧

ブロック名を得るコードについて。VLISP関数を使っています。

文字列のユーザー入力について。

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

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

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

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

ダイアログボックス 文字入力するタイルとそこから値を受け取る方法です。