Sponsored links

【AutoLISP ユーザー入力】選択肢を付ける 関数 initget とgetkword – 画層を選んで雲マーク

Sponsored links
AutoLISP
Sponsored links

initget と getkword を使って選択肢がついたコマンドを作ります。

Sponsored links

予備知識

コチラの記事で作ったコマンドに、さらに選択肢を付け加えます。

この記事では、条件式 の関数 if と cond を使います。

コマンドの内容

既存コマンドREVCLOUD[雲マーク]を使って、円、ポリライン、線分などの図形を円弧の長さ5の雲マークにするコマンドです。

画層選択プロンプトを付けて、

  1. 改定番号付き画層
  2. 印刷しない下書き画層
  3. 画層変更をしない(現在の画層のまま)

の3つの選択肢を付けます。

このようにコマンドラインに選択肢が出てきて、番号を入力するか、クリックで選択できます。

さらに、ダイナミック入力をオンにしているときは、カーソル下に選択肢がでてきてクリックで選択できます。

円、ポリライン、線分などの 図形を選択すると雲マークになります。
雲マークは画層を選択された画層に変更します。
選択された画層が図面にない場合は、選択肢3に設定変更されて現在の画層のままになります。

AutoLISP プログラム

コマンド名は test です。

(defun c:test (); / LySel Nm )


;;;;;選択肢を付けて 1 2 3のどれかを変数LySelに入れる;;;;

   (initget 1 "1 2 3")
   (setq LySel (getkword "画層選択:  [1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]"))


;;;;;雲作成;;;;
  
;-----画層名設定 もし画層Nmが無いなら現在の画層----
   (cond
      ((= LySel "1") (setq Nm (strcat "Jaga_Rev-"(getstring "改訂番号:"))))    
      ((= LySel "2") (setq Nm "Jaga-No_Plot"))
    );cond
  
  (if Nm
    (if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら  
      (progn
          (alert (strcat "画層 " Nm " が無いので現在の画層を使います"))
          (setq LySel "3")  
    ));progn if
  ); if Nm
  
;-----雲作成----
	  (command-s "._REVCLOUD" "_A" 5 5 "_O" pause "_N")	

;-----雲を設定された画層に変更----   
  (if (/= LySel "3")
        (command-s "._CHANGE"  (entlast) "" "_P" "_LA" Nm "")
  );if
  
(princ));defun

AutoLISP の説明

関数 initget 選択肢

(initget 1 "1 2 3")

関数 initget は次のユーザ入力で使用するキーワードを設定する関数です。

intget の 右となりの数字はユーザー入力の許可/禁止に関するコード(省略可)です。
1 は、何も入力しないことを禁止します。
ここでは、ユーザーにどれかを選んでもらいたいので 1 を入れました。

その他のコードについては、公式ヘルプページを参考にしてください。

その次の文字列が選択肢です。ここでは、”1 2 3″ にしました。

(setq LySel (getkword "画層選択: [1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]"))

関数 getkword では、ユーザーが入力したキーワードが戻り値になります。

関数の次が、プロンプトメッセージです。選択肢を / で仕切って [ ] で囲みます。
コマンド実行時、以下のようにコマンドライン、カーソル下(ダイナミック入力ON時)に表示されます、

選択された画層を設定

(cond
      ((= LySel "1") (setq Nm (strcat "Jaga_Rev-"(getstring "改訂番号:"))))    
      ((= LySel "2") (setq Nm "Jaga-No_Plot"))
 );cond

関数cond を使って選択されたのが1番の改訂番号付きの画層であれば、改訂番号をユーザー入力して 画層名を「Jaga_Rev- 改定番号」に設定。

2番の印刷されない下書きが画層なら、 画層名を「 Jaga-No_Plot 」に設定。

どちらも、変数Nmに画層名が入ります。

 (if Nm
    (if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら  
      (progn
          (alert (strcat "画層 " Nm " が無いので現在の画層を使います"))
          (setq LySel "3")  
    ));progn if
  ); if Nm

変数Nmに入れた画層が無ければ、画層を選択肢3の画層変更なし(現在の画層)に変更します。

(command-s "._REVCLOUD" "_A" 5 5 "_O" pause "_N")

そして、選択した 円、ポリライン、線分などの 図形を、コマンドREVCLOUDを使って、円弧の長さ5の雲マークにします。

(if (/= LySel "3")
(command-s "._CHANGE" (entlast) "" "_P" "_LA" Nm "")
);if

条件式 if を使って、「選択肢3 画層変更なし」では無いなられば、 雲マークの画層を変数Nmに入っている画層名にします。

まとめ

  • initget は次のユーザ入力で使用するキーワードを設定する関数。
  • intget 1つ目の引数はユーザー入力の許可/禁止に関するコード(省略可)
  • getkword では、ユーザーが入力したキーワードを得る関数。

カスタマイズ例

特定の画層を使うコマンドは、”画層が無ければ作る。” ようにした方が利便性が上がります。

雲マークを入れる画層が非表示/フリーズしていた場合、雲マークを作っても表示されないので、特定の画層を使うコマンドは、使う画層が非表示/フリーズになっていたら表示/解凍にするようにした方がいいです。

いろいろカスタマイズした雲マークサンプルコマンドがこちらです。

関連記事