==================================================発行部数883======
     AutoCADカスタマイズ入門講座              No.14 1999/07/18
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。

 今回から前回予告したとおりに、AutoCADのCHANGEコマンドと同様なコマ
ンドをAutoLISPで作成してみたいと思います。ホントに出来るかどうかは私
にもまだわかりませんが(~_~)、作成を通じて今まで学んできた事の理解が
より深まると思います。また、AutoLISPの可能性も感じて頂けるのでは...
と思っています。

--------------------------------------------------------------------
 1.CHANGEコマンドについて
--------------------------------------------------------------------
 みなさんもCHANGEコマンドは使われた事があると思います。どんなコマン
ドだっけ?という方は一度試して、思い出してみてください。基本的にこの
コマンドはエンティティの属性(例えば、線種、色等)を変更するコマンド
です。詳しくはマニュアルやオンラインヘルプ等で確認してください。

 さて、CHANGEコマンドの動作を確認してみましょう。
このコマンドを実行すると最初に次のプロンプトが表示されます。

 図形を指示:

ここで、変更するエンティティを選択します。エンティティを単独で選択す
るだけではなく、各種選択オプション(W、C 等)を使用する事が出来ます。
エンティティの選択が完了すると、次のプロンプトが出力されます。

 P=特性/<変更位置を指示>: (1)

ここで、"P"を入力すると次のサブオプションが表示されます。
 
 変更する特性 (C=色/E=高度/LA=画層/LT=線種/T=厚さ) ?

ここで、各オプションを入力すると各属性を変更する事が出来ます。それぞ
れのサブオプションの意味は、次の通りです。

C 色の変更
E 高度(エンティティの高さ)の変更
LA 画層(レイヤーの変更)
LT 線種の変更
T 厚さの変更

上記、サブオプションを選択すると再度オプションが表示されますが、これ
については次回見ていきたいと思います。

 次に、(1)の式でAutoCADの画面上をマウスでピック、またはコマンドライ
ンから座標値を入力すると、選択したエンティティにより、例えばLineエン
ティティでは始点、終点の変更などをおこなえます。この辺についても、詳
細はマニュアルなどで確認してください。
この辺りについては皆さんのほうが詳しいですね!!。

--------------------------------------------------------------------
 2.CHANGEコマンドのUIを再現する
--------------------------------------------------------------------
 さて、CHANGEコマンドのUIは1.で見てきたようになっていますが、今回
はCHANGEコマンドと同様な(ちょっとは違いますけど...)動作をするUI部の
プログラムを作ってみました。プログラムを以下に示します。

; --- ここから
; -----------------------------
; mychange コマンドメイン関数
; -----------------------------
(defun C:mychange() 
  (setq ss1 (getobj))    ; 変更するエンティティを選択する
  (setq ret (getctype))  ; オプションを選択する

  ; オプションにより処理を分岐させる
  (if (= (type ret) 'STR)
    (propchange ret)  ; 特性変更オプション
    (locatechange)  ; 変更位置オプション
  )
)

; ----------------------------
; エンティティ選択関数
;-----------------------------
(defun getobj()
  (ssget)
)

;-----------------------------
; オプション選択関数
;-----------------------------
(defun getctype( / flag ret )
  (setq flag 1)
  (while flag
    (progn
    (initget 128 "Prop") ;(getxxx)関数で任意入力を許します
    (setq ret (getpoint "P=特性/<変更位置を指示>:"))
    (if (and (= (type ret) 'STR)(= ret "Prop"))
      (progn
        (initget 1 "Color hEight LAyer LType Thick")
        (setq ret (getkword "変更する特性 (C=色/E=高度/LA=画層/LT=線種/T=厚さ) ?"))
      (setq flag nil)
      )
    )
    (if (= (type ret) 'LIST) (setq flag nil))
    )
  )
  (setq ret ret)
)

; ---------------------------
; 特性変更オプション関数
;----------------------------
(defun propchange( option )
  (if (= option "Color")  ;色変更
    (colorchange)
  )
  (if (= option "hEight") ;高度変更
    (heightchange)
  )
  (if (= option "LAyer")  ;画層変更
    (layerchange)
  )
  (if (= option "LType")  ;線種変更
    (ltypechange)
  )
  (if (= option "Thick")  ;厚さ変更
    (thickchange)
  )
  (setq a nil)
)

;----------------------------
; 変更位置オプション関数
;----------------------------
(defun locatechange()
  (prompt "変更位置が選択されました")
)

;---------------------------
; 色変更関数
;---------------------------
(defun colorchange()
  (prompt "色変更が選択されました")
)

;---------------------------
; 高度変更関数
;---------------------------
(defun heightchange()
  (prompt "高度変更が選択されました")
)

;---------------------------
; 画層変更関数
;---------------------------
(defun layerchange()
  (prompt "色変更が選択されました")
)

;---------------------------
; 線種変更関数
;---------------------------
(defun ltypechange()
  (prompt "線種変更が選択されました")
)

;---------------------------
; 厚さ変更関数
;---------------------------
(defun thickchange()
  (prompt "厚さ変更が選択されました")
)

; --- ここまで

--------------------------------------------------------------------
 3.ちょっとだけ解説
--------------------------------------------------------------------
 上記のプログラムについて、今まで触れていない部分について説明します
。
○(initget)関数
 この関数は、(getxxx)関数の入力の制御をする事が可能となります。
(initget)関数の書式は(initget [bits] [string])です。bitsにはある決ま
った整数を指定する事により、例えば(getxxx)関数でリターンキーだけの入
力を禁止したり、0や負の数の入力を禁止したりする事が出来ます。また、
[string]にキーワードを指定する事で、(getxxx)関数が決まったキーワード
しか受け付けない様にする事が可能です。例えば、上記プログラムでは、
 (initget 1 "Color hEight LAyer LType Thick")
という使い方をしています。ここでは、bitsに1、stringに"Color hEight 
LAyer LType Thick"を指定しています。bits=1の意味は、ユーザがリターン
キーのみの入力をする事を禁止します。また、stringキーワードを指定する
事で、(getkword)関数で指定したキーワードしか受け付けなくする事が出来
ます。
(getkword)関数はキーワードの入力を受け付ける関数です。書式は
(getkword [prompt])です。詳しくは上記のプログラムとマニュアルをご覧
ください。
○(type)関数
 この関数は、指定した引数のタイプ(型)を返します。書式は(type item)
です。返す値は

 REAL  浮動小数点
 STR  文字列
 INT  整数
 LIST  リスト
 などです。

--------------------------------------------------------------------
 4.まとめ
--------------------------------------------------------------------
 まず最初の段階として、AutoLISPでchangeコマンドのUI部分のプログラム
を再現してみました。解説が少なかったのですが(申し訳ございません)、プ
ログラム自体は単純なので、実際に動作させながら次回までにプログラムの
構成を確認しておいてください(特に(initget)関数と(getxxx)関数の使い方
に注意してください)。また、次回は内部のプログラムについて考えていき
ます。

●バックナンバーは下記のURLで参照する事が出来ます。
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
====================================================================
■登録/解除の方法
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
「AutoCADカスタマイズ入門講座」は、上記URLよりいつでも
登録/解除可能です。
====================================================================
●広告の問い合わせ
広告のお問い合わせは以下のメールアドレスへお願いします。
wankichi@mba.nifty.ne.jp
====================================================================
■「AutoCADカスタマイズ入門講座」No.14
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
              http://www.mag2.com/
              マガジンID:0000011579
====================================================================

戻る