==================================================発行部数957======
     AutoCADカスタマイズ入門講座              No.23 1999/10/23
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。
前回掲載したプログラムに不具合がありましたので訂正させて頂きます。
sdialog1.lsp内の(sum)関数を以下のものと置き換えて下さい。

(defun sum()
   (setq namae (get_tile "s_mei"))
   (setq ryou (get_tile "y_ryou"))
   (setq honsu (atoi (get_tile "h_su")))
   (set_tile "g_kei" (itoa (* (tanka namae ryou) (+ honsu 1))))
)

修正点は見比べて頂ければすぐ分かると思いますが、honsuの数をダイアロ
グボックスから取ってきたまま、合計金額を求める式に代入してしまってい
ました。前回示したように、本数1を選択した場合は0が取得されます。この
ため、計算がおかしくなってしまっていました。ちゃんと動かん!!(~_~メ)
、と思われた方も多いと思います。申し訳ございませんでした。

--------------------------------------------------------------------
 1.前回のプログラムの問題点は?
--------------------------------------------------------------------
 前回のプログラムで少しは遊んで頂けたでしょうか?。このプログラムの
問題点はどこにあるとお思いましたか?。もしプログラムをためしていない
方はこの機会に試してみて下さい。
このプログラムの大きな問題点は以下の2点です。

1.商品に無い容量が選べてしまう。
2.商品の組み合わせを変更しても、合計金額が変更されない。

 もし、商品の組み合わせを変えても合計金額が変更されなかったら、後々
大変な事になってしまいます(これが本当のシステムなら...)。

--------------------------------------------------------------------
 2.対策方法を考える
--------------------------------------------------------------------
 それぞれの問題点について対策を考えてみましょう。
まず、1についてです。1の問題点は先にも示したように、選択した商品に
無い容量が選べてしまう事です。という事は、選べなくしてしまえば良い事
になります。簡単ですね。実現する方法は色々あると思いますが、今回は容
量のリストを商品毎に動的に生成する様にします。さて、ここで動的とはど
ういう事でしょうか?。sdialog1.dclをもう一度見て下さい。このファイル
内では、次の様に容量のリストが記述されています。

	:popup_list {
		key = "y_ryou";
		label = "容量(mml) :";
		edit_width = 20;
		list = "350\n500\n1000";
        }

この様にファイル内に直接(または最初から)リストを記述してしまう事を、
リストを静的に作成するといいます。
 これとは逆に、その場その場でリストを作成する事をリストを動的に作成
するといいます。ではどの様にリストを動的に作成するのでしょうか?。

いままで、リストは上記の様に直接DCLファイルへ記述していましたが、
AutoLISPファイルの中で記述する事も出来ます。AutoLISP内でリストを作成
するには、
(start_list)、(add_list)、(end_list)の各関数を使用します。

使用法及び呼び出す順番は以下の様になります。

(start_list "操作するリストのkey")
(add_list "リストに追加する値")
  ・
 ・ リストに追加するだけ(add_list)を呼び出す
 ・
(add_list "リストに追加する値")
(end_list)

(start_list)関数でまず操作するリストを指定します。その後、リストに追
加したい項目の数だけ(add_list)関数を呼び出します。全ての項目がリスト
に追加できたら、最後に(end_list)関数を呼び出します。
(add_list)関数には他にも違う使い方があるのですが、今回は上記使い方だ
けを紹介します。興味のある方はマニュアルをご覧ください。

 次に、2の問題点についてです。
今回は処理を簡単にしてしまうため、商品名、容量、本数のリストを変更し
た場合は合計金額の表示を空白にしてしまう事にしました。この様にしてし
まえば、ユーザはもう一度合計ボタンを押さない限り合計金額を確認できま
せん。
1の処理を(setpu)に、2の処理を(gres)という関数に記述していますので
ご確認下さい。最後に改良したプログラムを示します。詳しい説明は省きま
すが、既にここまで学んできた皆さんならじっくり時間をかけて眺めれば理
解できると思います。
もし、不明な点がございましたら以下のメールアドレスへご質問下さい。

; ↓ここから
(defun C:dd ( / id)
  (setq id (load_dialog "sdialog1.dcl"))
  (if (not (new_dialog "drink" id))
      (exit)
  )
; ↓追加
  (action_tile "s_mei" "(setup)")
  (action_tile "y_ryou" "(gres)")
  (action_tile "h_su" "(gres)")
; ↑追加ここまで
  (action_tile "g_kei_b" "(sum)") 
  (start_dialog)
  (unload_dialog id)
)

; ↓追加
(defun setup()
  ; 以下で商品にあった容量リストを作成し、ダイアログの
  ; 他の値をリセットします
  (alert "商品が変更されたため\n選択項目をリセットします")
  (setq ns_mei (get_tile "s_mei"))
  (start_list "y_ryou")
  (if (= ns_mei "0")
      (progn
        (add_list "350")
        (add_list "500")
      )
  )
  (if (= ns_mei "1")
      (progn
        (add_list "500")
        (add_list "1000")
      )
  )
  (if (= ns_mei "2")
      (progn
        (add_list "350")
        (add_list "1000")
      )
  )
  (end_list)

  ; ダイアログの値をリセット
  ; 本数リストのリセット
  (setq i 0)
  (setq h_sh_list '("1" "2" "3" "4" "5" "6" "7" "8" "9"))
  (start_list "h_su")
  (while (< i 9)
    (add_list (nth i h_sh_list))
    (setq i (+ i 1))
  )
  (end_list)
  (gres)
)

(defun gres()
  ; 合計金額をリセット
  (set_tile "g_kei" "")
)
; ↑追加ここまで

(defun sum()
   (setq namae (get_tile "s_mei"))
   (setq ryou (get_tile "y_ryou"))
   (setq honsu (atoi (get_tile "h_su")))
   (set_tile "g_kei" (itoa (* (tanka namae ryou) (+ honsu 1))))
)

(defun tanka(namae ryou)
   (setq tk 0)
   (if (= namae "0")
      (progn
          (if (= ryou "0") (setq tk 120))
          (if (= ryou "1") (setq tk 150))
      )
   )
   (if (= namae "1")
      (progn
          (if (= ryou "0") (setq tk 150))
          (if (= ryou "1") (setq tk 300))
      )
   )
   (if (= namae "2")
      (progn
          (if (= ryou "0") (setq tk 120))
          (if (= ryou "1") (setq tk 300))
      )
   )
   (setq tk tk)
)
; ↑ここまで
--------------------------------------------------------------------
 3.まとめ
--------------------------------------------------------------------
 次回はダイアログボックスを持つ、なんらかの作図プログラムを作成した
いと思います。お楽しみに。
また、ご意見/ご希望/ご感想等がありましたらメールでお願いします。

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