==================================================発行部数1017===== AutoCADカスタマイズ入門講座 No.28 1999/12/12 =================================================================== AutoCADカスタマイズ入門講座をご購読頂きありがとうございます。 さて、皆さんの職場や家庭ではもう2000年問題への対応はお済みですか?。 既に会社規模のシステムでは対応なされていると思いますが、例えばあなた が日頃会社や家庭で使用しているパソコンはどうでしょうか?。ハード/ソ フトとももう一度確認してみる事をお勧めします。家の中にもよく見ると日 付を管理している電化製品っていっぱいありますよね?。私の家で使ってい るVTRはもう古いのでかなり心配です。え、メーカーのHPとかで調べろって 。確かにそうなのですが、めんどくさくて...^^;。 という訳で、私もプログラマの端くれなので年末2000年対応モードに入ら なければなりません。まぁ、きっと何にも起こらないと思いますが、備えあ れば憂い無しという感じです。この様な事から本年中の発行は今回で最後と させて頂きます。年明けは1/16日からの発行を予定しています。 -------------------------------------------------------------------- 1.直線の重なり方を考える -------------------------------------------------------------------- さて、今回は始めに直線の重なり方を考えてみましょう。直線の重なり方 には次の様な重なり方があると思います。 @一方の直線の始点、終点間にもう一方の直線の始点終点が完全に入って しまうパターン。 A2直線が完全に重なるパターン。 B一方の直線の始点、終点間にもう一方の直線の始点または終点の一方の みが入るパターン。 C一方の直線の始点、終点どちらか一方と、もう一方の直線の始点、終点 のどちらか一方の座標が完全に一致する場合。 2直線のマージを行う場合は上記のパターンを考慮する必要があります。 まず@、Aのパターンの2直線をマージする場合は簡単です。そう、@の場 合は短いほうの直線を、Aの場合はどちらか一方の直線を削除するだけです 。Bのパターンの2直線をマージする場合には、マージする2直線を最初に削 除した後、2直線の交わっていないほうの端点を始点、終点として直線を引 けば良いでしょう。または、2直線の交わっていないほうの端点と、2直線の 交点を使用して2直線を引くという方法も考えられます。Cのパターンにつ いてですが(Bのパターンについても言える事ですが)、これを一つの直線 にするかどうかは皆さんの考え方によります。設計者の意図によって2つの 直線に分割されているという可能性は十分あると思います。 -------------------------------------------------------------------- 2.最後に -------------------------------------------------------------------- 前回添付したプログラムから2つの直線を選択すると、2直線の重なり具合 を示すメッセージがプロンプト領域に表示されます。このプロンプトを良く 見るとどの様に2つの直線が重なっているのかが良く分かります。 申し訳ございませんが、実際にマージを行う部分の作成については皆さん の方でチャレンジしてみて下さい。上で示したパターンに従って実装してい けば、それほど難しくはないと思います。2つの直線をマージするプログラ ムが出来れば、後は複数の直線同士の比較を行う処理を加えるだけです。複 数の直線の扱いについては、以前作成したmchange.lspなどが参考になると 思います。もちろん、複数の直線同士を比較する場合はwhile文等でループ を作りうまく直線同士を比較する必要があります。 中途半端なプログラムになってしまい非常に残念なのですが、merge.lsp の解説は今回で最後になります。私もマガジンの発行を休んでいる間に実際 にマージする部分を作ってみようと思いますので、ぜひ皆さんも挑戦してみ て下さい。 それではまた来年お会いしましょう (^_-)/ 。 ○ちょっとだけ変更してあります。 (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 (print "作図角度は同一です") ; 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 "直線間の距離は許容値以下です") ; チェック用変数を初期化 (setq ch01 0) (setq ch02 0) (setq ck1 0) (setq ck2 0) (setq ck3 0) (setq ck4 0) ; 直線1のx座標の範囲を求める (if (< (car p10) (car p11)) (progn (setq max1 (car p11)) (setq min1 (car p10)) ) (progn (setq max1 (car p10)) (serq min1 (car p11)) ) ) ; 直線2のx座標の範囲を求める (if (< (car p20) (car p21)) (progn (setq max2 (car p21)) (setq min2 (car p20)) ) (progn (setq max2 (car p20)) (serq min2 (car p21)) ) ) ;直線1,2の端点同士が完全に一致するかどうかをチェック ;しておく (if (< (abs (- min1 min2)) eps) (progn (setq ck01 1) (print "2直線の始点は完全に一致しています") ) ) (if (< (abs (- max1 max2)) eps) (progn (setq ck02 1) (print "2直線の終点は完全に一致しています") ) ) ; 直線1のx座標の範囲に、直線2の始点、終点のx座標が ; 入るかどうかをチェックする (if (and (= ck01 0) (= ck02 0)) (progn (if (and (< min1 min2) (< min2 max1)) (progn (setq ck1 1) (print "min2はマージ後の直線に使われません") ) (print "min2をマージ後の直線に使用します") ) (if (and (< min1 max2) (< max2 max1)) (progn (setq ck2 1) (print "max2はマージ後の直線に使われません") ) (print "max2をマージ後の直線に使用します") ) ; 直線2のx座標の範囲に、直線1の始点、終点のx座標が ; 入るかどうかをチェックする (if (and (< min2 min1) (< min1 max2)) (progn (setq ck3 1) (print "min1はマージ後の直線に使われません") ) (print "min1をマージ後の直線に使用します") ) (if (and (< min2 max1) (< max1 max2)) (progn (setq ck4 1) (print "max1はマージ後の直線に使われません") ) (print "max1をマージ後の直線に使用します") ) ) ) ) ) ) ) (terpri) ) ;--------------------------- ; 属性取得関数 ;--------------------------- (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) ) ●バックナンバーは下記の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.26 発行責任者 :わんきち(wankichi@mba.nifty.ne.jp) 発行システム:インターネットの本屋さん『まぐまぐ』 http://www.mag2.com/ マガジンID:0000011579 ====================================================================