==================================================発行部数991======
     AutoCADカスタマイズ入門講座              No.25 1999/11/14
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。
みなさんスポーツとかしてますか?。スポーツするにはいい季節ですね(私
はもっぱらTV観戦ですが)。この間、サッカーのオリンピック代表チームは
見事オリンピック出場権を獲得しました。A代表世代の人たちとは違う力強
さを感じますね。また、今ワールドカップバレー(女子)が行われています。
今日は残念ですが日本はキューバにストレートで敗れてしまいました。しか
し、日毎彼女たちの視線が鋭くなっていくのをドキドキしながら見ています
。明日の中国戦はぜひがんばってもらいたいですね。いやー、でもみんな輝
いてますなぁ...(すっかりオヤジ Y(^.^).)。さぁ、みなさん、ニッポ
ンチャチャチャ。

--------------------------------------------------------------------
 1.マージプログラム(プロトタイプ)
--------------------------------------------------------------------
 今回はまずマージプログラムのプロトタイプ(仮に/試しに作るプログラ
ムの事です)として以下のプログラムを考えてみました。プロトタイプとし
て、プログラムの構成などを確かめる事が主目的なので、エラー処理などは
全く加えてません。重なった直線を書いて(難しいですが)試してみて下さい
。

↓ ここから
(defun C:merge()
  ; 2つのエンティティを選択
  (setq name1 (car (entsel "最初の直線を選択して下さい:")))
  (setq name2 (car (entsel "2本目の直線を選択して下さい:")))

  ; 2直線の始点、終点を得る
  (setq p10 (cdr (getprop name1 10)))
  (setq p11 (cdr (getprop name1 11)))
  (setq p20 (cdr (getprop name2 10)))
  (setq p21 (cdr (getprop name2 11)))

  ; 2直線の作図角度を得る
  (setq ang1 (angle p10 p11))
  (setq ang2 (angle p20 p21))

  ; 求めた2直線の作図角度を補正する
  ; 作図角度 < π
  (setq ang1 (mangle ang1))
  (setq ang2 (mangle ang2))

  (setq eps 1e-3)   ; 許容値
  
  ; 作図角度の判定
  (if ( < (abs (- ang1 ang2)) eps)
    (progn
    ; 2直線に直行する直線の準備
    ; 始点p10、終点p30の直線を設定する
    (setq p30 (polar p10 (+ ang1 (/ pi 2.0)) 1.0))

    ; 2直線と垂線の交点を求める
    (setq intp1 (inters p10 p11 p10 p30 nil))
    (setq intp2 (inters p20 p21 p10 p30 nil))

    ; 交点間の距離を求め、許容値以下か判定
    (if (< (distance intp1 intp2) eps)
      (progn
        (print "重なっています")
      )
    )
    )
  )
)

;---------------------------
; 属性取得関数
;---------------------------
(defun getprop(entname grpcode / elist)
  (setq elist (entget entname))
  (assoc grpcode elist)
)

;------------------------------------------
; π以上の角度をπ以下の角度に補正する関数
;------------------------------------------
(defun mangle(angle / i)
  (setq i 0)
  (while (= i 0)
    (if (> angle pi)
      (setq angle (- angle pi))
      (setq i 1)
    )
  )
  (setq angle angle)
)

↑ ここまで

--------------------------------------------------------------------
 2.2直線の情報を比較する
--------------------------------------------------------------------
 今回のプログラムでは簡略化の為、ユーザに2つの直線を選択させるよう
にしていますが、今後プログラムの機能を拡張していっても2つの直線の各
値を比較するという事に変わりはありません。ですのでじっくりご覧くださ
い。

○直線からデータを取得する
 この部分については既に解説しているので、大体分かると思います。コメ
ント文を見ながらどの様な値を取得しているかを確認して下さい。なお、
(getprop)関数は以前、mychangeコマンド(mchange.lsp)を作った時に使用し
たものです。

○直線の角度を求める
 (angle)関数を用いて直線の作図角度を求めます。(angle)関数の書式は
(angle 始点 終点)です。なお、(angle)関数が戻す角度の単位はラジアンで
す。ここで角度の単位の話を少しすると、角度の単位はラジアン(rad)とデ
グリー(deg)がよく一般に使われます。degのほうは日常生活でも良く使い、
普通角度といえばこちらを指すと思います(直角は90°と表します)。これと
は違い、πを基準に表す角度をラジアンといいます。degでいう180は、rad
ではπです。ではπは何かといえば子供の頃一生懸命覚えた、3.141592...
というやつです。degとradの関係は以下の様になります。

180(deg) = 3.141592(rad)

 プログラムの中ではどちらの単位を使っても良いのですが(ただし、統一
しておかないと何がなんだか分からなくなります)、AutoLISPで角度を扱う
関数(上記の(angle)関数や後で述べる(polar)関数)で使用する角度の単位は
radです。ですので、今回のプログラムではradを角度の単位として使用して
います。
 ちなみに、AutoLISPでは定数piにπを設定しています。コマンドラインで
!piと入力し、3.141592と表示される事を確認して下さい。

○角度の補正
 次の2つの直線を考えて下さい。
 直線A 始点(0,0) 終点(100,0)
 直線B 始点(100,0) 終点(0,0)

  すぐ分かるように、上記の2つの直線は全く重なります。ですが、それぞ
れの作図角度を(angle)関数で調べるとどうなるでしょうか?。
 直線A 0.0
 直線B 3.141592
 となります。即ち、どう考えても1つにマージしなければならない2直線
は今までのプログラムの仕様(角度が等しくなければならない)ではマージさ
れない事になります。これはちょっとおかしいですね。これを防ぐには全て
の直線の角度を0からπの間に補正する必要があります。つまり(ここでは考
えやすくするため、degで角度を考えます)、180°の直線は0°、270°の直
線は90°、360°の直線は0°と考えます。何らかの計算で角度が360°以上
になってもやはり角度は0°から180°の間に補正します。この補正を行う為
に、(mangle)という関数を作成しました。この関数の書式は
(mangle 補正する角度)で、補正後の角度を返します。関数の内容は見て頂
ければ分かるように、引数で与えた角度がπよりも小さくなるまで繰り返し
πを引いているだけです。

--------------------------------------------------------------------
 3.その次は...
--------------------------------------------------------------------
 今回の説明はここまでにしたいと思います。プログラムの全ての説明は出
来ませんでしたが、続きは次回にしたいと思います。また、プログラムの方
は、片方の直線上にもう片方の直線の始点または直線の少なくとも一方がの
っているという条件を満たしているかどうかを調べるコードを追加する必要
があります。これは直線の方程式y=axを使う事で簡単に調べられます。中学
校の頃を思い出して考えてみて下さい。

--------------------------------------------------------------------
 4.まとめ
--------------------------------------------------------------------
 次回は今回の説明の続きとプログラムの改良を行っていきます。
お楽しみに!!。

 お詫び:
 前回号を発行後、多くの方からこの講座のホームページでバックナンバー
が正常に参照できないと報告を頂き、調べた結果ファイルのリンクが間違っ
ている事が判明しました。報告して頂いた方にこの場を借りてお礼申し上げ
ます。また、今後この様な事が無い様に十分気を付けます。

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