Sponsored links

【AutoLISP サンプル】図形を抽出して特定の画層にするコマンド

Sponsored links
サンプル
Sponsored links
Jagaimo
Jagaimo

外部参照やブロックなどから図形を抽出して特定の画層にするコマンドです。

Sponsored links

コマンドの内容

外部参照やブロックからAutoCADコマンドNCOPYを使って抽出して、抽出した図形をJaga-No_Plotという画層にするコマンドです。
ロックされた画層の図形を抽出するのにも使えます。

Jaga-No_Plot画層は、抽出した図形が入る前提なので、もし画層が無ければ作成され、非表示、フリーズ、ロックになっていたら表示、解除されてJaga-No_Plot画層上の図形は編集できる状態になります。

抽出した図形の画層がロックされていた場合、抽出した図形の画層をJaga-No_Plotに変更するために、一旦ロック解除します。
図形の画層は、コマンド終了時にロックに戻します。
エラー処理に組み込んでいるので、途中でエラー/キャンセル中断の場合も、ロックに戻ります。

抽出された図形の画層を変更したい場合は、
(Jaga00LyCk “Jaga-No_Plot” “CONTINUOUS” “171” “N”)
の部分でJaga00LyCkの引数を変更してください。名前、線種、色、印刷設定です。

コマンド名はNC00です。

AutoLISP プログラム

(defun c:NC00 ( / Obj Ly LkLy)
  (JagaNc00Start)
  
   (Jaga00LyCk "Jaga-No_Plot" "CONTINUOUS" "171" "N") ; 画層Jaga-No_Plotを編集できる状態にする
  
   (command "._NCOPY" pause "" "0,0.0"  "0,0.0") ; 図形を取り出す
   (setq Obj (entlast)) ; 最後の図形を変数Objに入れる
         (setq Ly (cdr (assoc 8 (entget Obj)))) ; Objの画層名を得て
   (setq LkLy (Jaga00LyLKCk Ly)) ; ロックされているかチェック ロックされていたらロック解除
   (command-s "._CHANGE" Obj "" "P" "LA" "Jaga-No_Plot" "") ;コマンドChangeを使ってObjの画層変更
  (getpoint "errck")
  
 (JagaNc00End)
(princ));defun

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun JagaNc00Start ()
;-----------------------------------------
  (setq OldErr *error*) ;標準エラー処理を保存
  (setq *error* JagaNc00ERR) ;エラー処理をJagaERRにする
;--------------------------------------- 
    (setq OldCmdEcho (getvar "CMDECHO")) ;CMDECHOの値を保存
    (setvar "CMDECHO" 0) ;CMDECHOの値を0にする
    (setq OldDynMode (getvar "DYNMODE")) ;DYNMODEの値を保存
    (setvar "DYNMODE" 3) ;DYNMODEの値を3にする
;-----------------------------------------
(princ "\nJagaNc00Start\n") ;実行されたか確認用
(princ));defun

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun JagaNc00End ()
(if LkLy (command-s "._LAYER" "LO" LkLy "")) ; もしLkLyに画層が入っていたらロック	
;-----------------------------------------	
  (setvar "DYNMODE" OldDynMode);DYNMODEの値を保存
  (setvar "CMDECHO" OldCmdEcho);CMDECHOの値を戻す
 ;-----------------------------------------	 
   (setq *error* OldErr) ;エラー処理を戻す
(princ "\nJagaNc00End\n")
(princ));defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun JagaNc00ERR (msg)	
  (JagaNc00End)
(princ (strcat "\n JagaNc00ERR\n " msg));エラーメッセージ表示
(princ));defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun Jaga00LyCk (LyNm Lt Col Pl)
         
(if (null (tblsearch "layer" LyNm )) 
    (progn
      (command-s ".-layer" 
                     "N" LyNm 
		     "L" Lt LyNm 
		     "C" Col LyNm 
                     "P" Pl LyNm 
                     "") ;
       (alert (strcat " \n 画層 < " LyNm " > 作成しました\n")) ;メッセージを出す
  
  )) ;if progn
;----------------------------------------------------
;----------------------------------------------------

   (setq LyInfo (tblsearch "layer" LyNm)) ;
		  
   (if LyInfo ; もしLyInfoに情報があれば(画層があれば)	
   (progn
      (setq 
          Ly62 (cdr(assoc 62 LyInfo)) ; 62の情報を取り出して変数Ly62に入れる
          Ly70 (cdr(assoc 70 LyInfo)) ; 70の情報を取り出して変数Ly70に入れる
      ) ;setq 

;----------------------------------------------------
     
     (if (> 0 Ly62) ; もしLy62が0よりも小さければ
      (progn
            (command-s "._LAYER" "ON" LyNm "") ; 画層をオンにして
            (alert (strcat " \n 画層 < " LyNm " > 非表示だったので表示にしました\n")) ;メッセージを出す
      ));if progn
  
;----------------------------------------------------   
     
      (if (= 1 (logand 1 Ly70)) ; Ly70に1が含まれていたら (フリーズなら)
         (progn
         (command-s "._LAYER" "T" LyNm "") ; 画層を解凍して
            (alert (strcat " \n 画層 < " LyNm " > フリーズ解除しました")) ;メッセージを出す
      ));if progn
     
;----------------------------------------------------
     
      (if (= 4 (logand 4 Ly70)) ; Ly70に4が含まれていたら(ロックなら)
       (progn
        (command-s "._LAYER" "U" LyNm "") ; 画層をロック解除
      ));if progn
     
  ));if progn

);defun
  
  

参考記事

このサンプルでは、「エラー処理」と「必要な画層が使えるようになっているかチェック」部分は、コマンドとは分けて別の自作関数にしました。
別の自作関数にする利点は、他のコマンドにも関数名を入れるだけで同じ処理を加えることができることです。

自作関数の作り方についてはこちらの記事にあります。

非表示画層を表示する関数です。
関数 strcat で文字をつなげることについても書いています。

画層がフリーズかどうかを調べて、もしフリーズなら解凍する方法についてです。

画層がロックされているかどうかを調べて、ロックされていたら解除する方法についてです。
ビットコードが含まれているかどうかを調べる logand について書いてあります。
画層だけでなく、オブジェクトスナップなど、ビットコードで設定されているものを変更したいとき、この関数はとても便利です。

関数 entlast についてです。
entlast では、一番最後に作った図形名を得ることができます。

Comments