==================================================発行部数901======
     AutoCADカスタマイズ入門講座              No.15 1999/08/02
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。発行が遅
くなり、大変申し訳ございませんでした。

 暑い日が続きますがみなさんお元気にお過ごしでしょうか?。今年の夏は
なぜか遥か遠い昔の子供の頃に感じた、あのギラギラした太陽を感じます。
ちょっと嬉しいような気もしますが、オゾン層が薄くなってきている為でし
ょうか?。だったら喜べませんね。今回も前回に続き、CHANGEコマンドを作
成していきます。

--------------------------------------------------------------------
 1.特性変更オプションについて
--------------------------------------------------------------------
 今回はCHANGEコマンド内の特性変更オプションについて考えてみます。特
性変更オプションの各サブオプションを変更した時の動作はどれも殆ど同じ
で、例えば色オプションを選択した場合は、現在の色を表示し、ユーザに新
しい色の入力を要求します。実際には以下の様なステップを踏みます。

コマンド:CHANGE
図形を指示:選択された数:1
図形を指示:
P=特性/<変更位置を指示>:p
変更する特性 (C=色/E=高度/LA=画層/LT=線種/T=厚さ)? C
新しい色<5(blue)>:3

そのような訳でプログラムの処理は、
1.エンティティから変更する特性の現在の値を取得
2.1で得た値を表示
3.変更する値をユーザに入力させる
4.新しい値でエンティティの特性を変更
という手順になります。

各特性オプションを選択した時の処理は殆ど同じなので、ここは関数として
処理をまとめたいところです。

--------------------------------------------------------------------
 2.特性の取得、設定関数
--------------------------------------------------------------------
 では、エンティティの特性の取得、設定をおこなう関数を作成してみまし
ょう。まずエンティティの特性を取得する関数を作成します。関数名は
getpropとしましょう。この関数では引数にエンティティ名、グループコー
ドを与える事で、引数で与えたエンティティ名からグループコードを含むリ
ストを返すようにします。

(defun getprop(entname grpcode / elist)
  (setq elist (entget entname))
  (assoc grpcode elist)
)

こんな感じでしょうか。それではちょっと試してみましょう。
まず、いつもの様にAutoCAD上に直線を一本書きます。次に上の4行のプログ
ラムを適当な名前のファイル(例えば、test.lspなど)に保存して、AutoCAD
にロードします。その後、以下の様な手順で考えていた通りに動作するかど
うかを確かめてみてください。

コマンド:(setq a (car (entsel))) 
図形を指示:<Entity name: 600000022>  
            <- 直線を選択し、aにエンティティ名を保存
コマンド:!a  <- エンティティ名を確認
<Entity name: 600000022>

コマンド:(getprop a 10)  <- 上記(getprop)関数を使用
(10 3.76594 4.3375 0.0)

この様に考えていたように動作する事が確認できたと思います。また、グル
ープコードに存在しない適当な数を入力すると、この関数はnilを返します
(実際には(assoc)関数がnilを返すのですが)。

 次は特性を設定する関数を作成します。関数名はsetpropとします。この
関数では引数にエンティティ名、変更したいグループコードを含むリストを
与える事で、引数で与えたエンティティの属性を新しい値を設定し、そのリ
ストを返します。

(defun setprop(entname grplist / elist grpcode olidlist elist2 )
  (setq elist (entget entname))
  (setq grpcode (car grplist))
  (setq oldlist (assoc grpcode elist))
  (setq elist2 (subst grplist oldlist elist))
)

 では、以下の手順で本当に期待したように動作するかどうかを確かめてみ
てください。

まず、先ほど(getprop)関数の検証で使用した直線が残っていればその直線
を、なければ新しい直線を作図します。また、先ほどと同様に上記の6行の
プログラムを適当なファイルに保存し、AutoCADにロードします。

コマンド:(setq a (car (entsel))) 
図形を指示:<Entity name: 600000022> 
            <- 直線を選択し、aにエンティティ名を保存
コマンド:!a  <- エンティティ名を確認
<Entity name: 600000022>
コマンド:(setq b '(10 0.0 0.0 0.0)) 
            <- 変更したいグループコードのリストを作成
コマンド:(setq c (setprop a b))
((-1.<Entity name: 60000022>)(0. "LINE") .........)
コマンド:(entmod c)

ちゃんと直線の始点が原点に変更されたでしょうか?。

--------------------------------------------------------------------
 3.まとめ
--------------------------------------------------------------------
 もう既にお気づきの様に、今回作成したこれらの関数は全て以前に学んだ
事を関数化しただけです。確かにただそれだけなのですが、この様に関数化
する事を心がけると後々汎用的に使用でき非常に便利です。
 次回は今回作成した関数を使用し、CHANGEコマンドの特性変更オプション
を変更完成させます。

●バックナンバーは下記の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.15
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
              http://www.mag2.com/
              マガジンID:0000011579
====================================================================
戻る