==================================================発行部数919======
     AutoCADカスタマイズ入門講座              No.16 1999/08/22
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。
諸事情があり、発行をずいぶん休んでしまい、申し訳ございませんでした。
今回からまた発行できるようになりました。今まで待っていてくださった皆
さんありがとうございます。
 また、今回はプログラムが長くなってしまったので、プログラムはこのメ
ールとは別けてお送りします。

--------------------------------------------------------------------
 1.特性変更オプションを完成させる
--------------------------------------------------------------------
 今回は前号で作成した2つの関数(getprop)と(setprop)を使い、CHANGEコ
マンドの特性変更オプションを完成させましょう。以前見たように、特性変
更オプションは5種類あるのですが、今回はその中の色変更オプションにつ
いて解説します。他のオプションは最後にプログラムを載せるので各自で検
討してみてください。
 AutoCADカスタマイズ入門講座No.14号を見てください。この号に作成途中
のプログラムが載せてあります。まず、このプログラムのメイン部分の関数
を完成させましょう。このプログラムでは特性などを変更するエンティティ
を選択するのに(ssget)関数を使用しています。この関数はエンティティを
複数同時に選択できるので、プログラムでもユーザが複数のエンティティを
同時に選択した時の事を考慮しなければなりません。では、プログラムを見
ていきましょう。以前作成したプログラムのメイン部分は以下の様になって
います。

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

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

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

(getobj)関数が返す値、すなわち(ssget)関数が返す値は「選択セット」と
呼ばれています。これは名前からもわかるように、ユーザが選択したエンテ
ィティのエンティティ名の集合となっています。まず、ここでは
(propchange)関数に選択セットを引数として渡す事にします。次の様になり
ます。

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

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

 次に(propchange)関数本体の方を見ていきましょう。ここでは引数として
渡された選択セットを、それぞれ下位の関数へ引き渡しています。

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

 この中の(colorchange)関数が色変更オプションが選択された時に呼ばれ
る関数です。関数は以下の様になっています。

;---------------------------
; 色変更関数
;---------------------------
(defun colorchange( ss1 / i flag tmp1 tmp2 elist )
  (setq i 0) (setq flag 0)
  (setq tmp1 nil) (setq tmp2 nil)
  
  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
    (setq tmp1 (cdr (getprop ename 62)))
    (if (and (/= tmp1 tmp2) (/= tmp2 nil))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

  ; 選択したエンティティ内に2色以上の色属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい色<既定値>:"))
    )
  )

  ; 選択した全エンティティに色属性が付加されていない場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい色<BYLAYER>:"))
    )
  )

  ; 選択した全エンティティが同一の色属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい色<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )
  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq elist (entget ename))
        (setq tmp2 (cons 62 (atoi newc)))
        (setq tmp1 (list tmp2))
        (setq tmp2 (append elist tmp1))
        (entmod tmp2)
        (setq i (+ i 1))
      )
    )
  )
)

--------------------------------------------------------------------
 2.色変更オプション
--------------------------------------------------------------------
 では、色変更オプションについて詳しく見ていきましょう。

  ; 現在の属性を調べる
  (while (if (setq ename (ssname ss1 i)) = nil)
    (setq tmp1 (cdr (getprop ename 62)))
    (if (and (/= tmp1 tmp2) (/= tmp2 nil))
       (progn
         (setq flag 1) 
       )
    )
    (setq tmp2 tmp1)
    (setq i (+ i 1))
  )

 この部分では、選択セットss1からエンティティを取り出し、取り出した
エンティティから変更したい属性が現在どの様になっているかを調べていま
す。選択セットからエンティティ名を取り出すには、(ssname)関数を使用し
ます。書式は、(ssname 選択セット エンティティの番号)です。エンティテ
ィの番号に、選択セットに選択されているエンティティ数以上の数を指定す
ると、(ssname)関数はnilを返します。この事を利用して上記プログラムでは
(while)文を抜けられるようにしています。
 なぜ、この様な事をおこなっているかというと、プログラムの次の部分を
見ればわかるように、コマンドラインにプロンプトを出す必要があるためで
す。実際には選択したエンティティの色属性がすべて同一か、複数あるのか
、または全く設定されていないのかを調べています。以下のプログラムでは
、それぞれの状態に対応したプロンプトをコマンドラインへ出力しています
。また、ユーザに新しい色の値を設定させています。

注)本当のChangeコマンドでは、white、Redなどで色の指定が出来る様にな
っていますが、このプログラムでは今回は対応していません。色番号のみ対
応しています。ただし、対応するのは簡単なので皆さん挑戦してみてくださ
い(ユーザが入力した単語を単に色番号へ変更するだけです)。

  ; 選択したエンティティ内に2色以上の色属性がある場合
  (if (= flag 1)
    (progn
      (setq newc (getstring "新しい色<既定値>:"))
    )
  )

  ; 選択した全エンティティに色属性が付加されていない場合
  (if (and (= flag 0) (= tmp1 nil))
    (progn
      (setq newc (getstring "新しい色<BYLAYER>:"))
    )
  )

  ; 選択した全エンティティが同一の色属性を持つ場合
  (if (and (= flag 0) (/= tmp1 nil))
    (progn
      (princ "新しい色<")(princ tmp1)
      (setq newc (getstring ">:"))
    )
  )

 そして、最後に以下のプログラムで選択したエンティティの色属性をすべ
て変更しています。この部分は複数のエンティティを変更しているだけで、
前回まで学んできた事と同一です。

  ; 属性を変更する
  (setq i 0)
  (if (and (/= newc nil) (/= newc ""))
    (progn
      (while (if (setq ename (ssname ss1 i)) = nil)
        (setq elist (entget ename))
        (setq tmp2 (cons 62 (atoi newc)))
        (setq tmp1 (list tmp2))
        (setq tmp2 (append elist tmp1))
        (entmod tmp2)
        (setq i (+ i 1))
      )
    )
  )

--------------------------------------------------------------------
 3.まとめ
--------------------------------------------------------------------
 今回はCHANGEコマンドの特性変更オプションを完成させました。いかがで
したでしょうか。エラー処理など全く不十分ですし、テストも十分行ってい
ないのですが、そこそこCHANGEコマンドの様なプログラムは出来たのではな
いかと思います。また、プログラムはかなり長くなってしまったのですが、
決して難しい特別な事は行っていないので今までの知識で十分理解できるの
ではないかと思います。次回は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.16
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
              http://www.mag2.com/
              マガジンID:0000011579
====================================================================
戻る