■■■■■■■■■■■■■■■■■■■■■■■ ■ ■ ■ JW-CAD用 外部変形プログラム ■ ■ ■ ■ 3D 隠線処理 ■ ■ ■ ■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■ ■ ■ ■ プロテクトモード版 ver 0.7 ■ ■ ■ ■■■■■■■■■■■■■■■■■■■■■■■ ★ 収録ファイル (プロテクトモード版) JWG_3D_P.BAT 外部変形機能から呼び出すバッチファイル. JWG_3D_P.O 3D 隠線処理、実行プログラム(本体). JWG_3D_P.DOC このファイル. 3D_SAMPL.JWC サンプル図面. GO32.LZH GO32.EXE DOS-Extender COPYING.DJ ★ 何をするソフト? JW-CAD(ver1.59以降)の外部変形プログラムです。 JW-CADの「2.5D」で三次元(3D)図形の表示、作図が出来 ますが、ワイヤーフレームでしか処理されません。 元々が二次元CADとして開発されたCADですので当然のことでは 有りますが、これを何とか隠線処理(物体の裏側の見えない線を表示し ない)出来ないかと前々から考えていたところに、JW-CADの ver1.59以降外部変形機能が追加。 これならなんとか出来るのでは、と挑戦してみたプログラムです。 (この先もずっと「挑戦」の段階のままかも・・・(^^; ) 3Dのデータとする為に独自のデータ形式は定めていません、基本的 にJW-CADの2.5D形式のデータをそのまま利用するプログラ ムにしてあります(この原則は今後も守っていくつもりです)が、 2.5D形式のデータ全てに対応できてはいません。(詳しくは後述)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ver0.7からプログラムをリアルモード版と、プロテクトモード 版の2種類にしました。 リアルモード版 従来(ver0.6まで)の延長上に位置します。 MS-DOS 上の通常のプログラム、JWG_3D_*.EXE というファイルを そのまま実行出来ます。 私の開発環境の事情で、コプロ(数値演算プロセッサ)に対応して いません。(^^; プロテクトモード版 プログラムのソースはリアルモード版と基本的に同じです。 MS-DOS 上で実行するには、DOS-Extender が必要です。 コプロ(数値演算プロセッサ)に対応しています。(^o^v ★ 動作環境 ■■■ 重 要 ■■■ このプログラムは、 PC-9801 DA (CPU:Cx486 + 487 にチェンジ 、 メモリー:5MB) MS-DOS ver3.3 JW-CAD ver2.00C の環境で、動くことを確認しています。 コプロ(数値演算プロセッサ)に対応しています。 このプログラムを実行するには、以下の条件が必要です。 CPU DOS-Extender (GO32.EXE) を介してプロテクトモードで動作する 為、i80386以上が必須です。 コプロ(数値演算プロセッサ 80387、80487、PENTIUM) 実行プログラムがコプロ用コードで作られている為、必須です。 DOS-Extender 今回配布プログラムの中に含まれている、GO32.EXE を使います。 メモリー 起動時に、EMS を1.5Mb以上確保してください。 確認するには、 GO32.EXE を単独で実行(GO32 [リターン])したときに VCPI (Expanded) memory available: 1536 Kb と表示される数値が、1500 Kb以上であれば、OK です。 RSWAP GO32.EXE は、RSWAPと相性が悪いことが知られています。 私の環境では一応、RSWAPが常駐したままでも特に問題なく作動し ていますが、プログラムがうまく動かない場合は RSWAPを常駐解 除するか RSWAPの「-m」オプションの値を調整してみてください。 (詳しくは、NIFTY-Serve FEXT MES10 #1097- のコメントツリーを 参照) 以下、用語の説明です。(知ってるよって人はパスしてネ) ☆ リアルモード 普通に MS-DOS を動作させている状態。(16bit) 1MB 以上の空間を直接扱う事ができない。 プログラム xxxx.EXE をそのまま実行することができる。 ☆ プロテクトモード i80386以上のCPUで4GBまでの連続したメモリー空間を利用で き、プログラムは32bitで動作する。 MS-DOSから利用するにはDOS-Extenderを仲介する必要がある。 ☆ DOS-Extender MS-DOS からプロテクトモードを利用できる環境を提供する ソフトウェア。 リアルモード <-> プロテクトモードの切り換えをする。 市販ソフトとしては、dos/4g、run386、exe386 フリーソフトとしては、GO32 が知られている。 ☆ GO32.EXE DJ Delorie 氏が作成・管理している DOS-Extender プログ ラミング環境 DJGPP の中核をなす DOS-Extender プログラ ム。 GO32 自体は 80387 があることが前提で組まれているので、 ない人が浮動小数を使いたい場合は 32bit モード用の Emulator (EMU387)が必要。 ☆ DJGPP DJ Delorie 氏が作成・管理している 386 以上の CPU での プロテクトモードで動作するプログラミング環境。 エクステンダーの他に C コンパイラ、デバッガー等のソフト も配布されている。 IBM-PC、NEC-PC98、Fujitsu-FMR 用のものが NIFTYの FEXT で 入手可能。 (一部 NIFTY-Serve FEXT の会議室から引用しました) このプログラムは、上記 DJGPP の環境下、GNU-Cを使用して自宅のFM -TOWNS上で開発し、会社のPC-98で動作確認をしたもので す。 ちなみに、このプログラム(JWG_3D_P.O)をコプロの無いマシンで動か すには EMU387 というファイル(エミュレータ)を、例えば というディレクトリに入れて、環境変数に set GO32=emu a:/djgpp/emu387 handle 50 fast を加えたうえで、コプロがある場合と同様に実行すれば、動かすことが 出来ます。 ただし、これは本来コプロによってハード的に処理されるはずの実数 演算を、エミュレータによりソフト的に代替え処理するというもので あるため、スピードが落ちます。 私が試した限りではリアルモード版(JWG_3D_R.EXE)より遅くなってし まいました。 このエミュレータのは所在は、 NIFTY-Serve FEXT の LIB13 #212 WMEMU112.ZIP emu387 for djgpp 1.11m5 です。 ★ どうやって使うの? JWG_3D_P.BAT JWG_3D_P.O GO32.EXE を、JW-CADのディレクトリに移して下さい。 他のディレクトリに入れる場合、(例えば <\GAIBU> デイレクトリ) JWG_3D_P.BAT の最後の行を \gaibu\go32 \gaibu\jwg_3d_p.o /c415367 %1 %2 等、としてください。 JW-CADの外部変形コマンドからバッチファイル(JWG_3D_P.BAT) を指定して、2.5D形式のデータを範囲指定すると、3D隠線処理 プログラム(JWG_3D_P.O)の画面に切り替わります。 そこで視点、角度を決めて「出力」指定で終了するとJW-CADに 作図されます。 2.5Dで設定したレイヤグループ毎の高さに対応させるには、範囲 指定の時にJW-CADの画面(作図範囲)左下に小さく表示される数 値(レイヤグループの高さ)も含めて範囲指定してください。 JW-CADの2.5D形式のデータをそのまま利用して、独自のデ ータ形式は全く取り入れていないところがウリです。(^^)v ☆ 操作 画面左側に操作キーの説明が表示されます。 視点、角度を決めた後、 [Z] で隠線処理表示 (画面上で表示するだけ) [X] で 隠線処理図をJW-CADに出力して 終了 [W] でワイヤーフレーム図をJW-CADに出力して 終了 [Q] で JW-CADに出力せずに終了 となります。 画面上のグラフィック表示は、クリッピング処理をしていません (したくなかった (^^;)ので、画面から大きくはみ出すような表示 は出来ないようにしてあります。 [ESC]キーで、隠線処理の計算中に中断することが出来ます。 ☆ 高さの指定 2.5D形式のデータ全てに対応できてはいません。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 2.5D形式のデータの作成方法には下記の5種類がありますが 1)平面図への高さ入力によりデータ作成 2)立面図の位置を設定してデータを作成 3)レイヤグループの高さを設定 4)レイヤの高さを設定 5)円データ 0,10,10,0,0,5,5,3600,4,1,30 a,b,c,x,y,r1,r2,θ,w,h,d (a) : 原図円の高さ・奥行(m) (b) : 追加円の高さ・奥行(m) (c) : 分割角(指定無または 0 は 30゚ となる。) (x) ,(y) : 追加円の原図円からの中心ずれ位置(m) (r1),(r2): 追加円の長軸、短軸径(m) (θ): 螺旋の回転角 (w) : 螺旋の幅(+値が外側、-値が内側)(m) (h) : 幅のある螺旋の高さの差(m) (d) : 幅のある螺旋の角度の差 (a)~(w)の必要なデータまでを入力してください。 === JW_CAD.HLPより === 今のところ、この内の 1)平面図への高さ入力によりデータ作成 3)レイヤグループの高さを設定 5)円データ (a) : 原図円の高さ・奥行(m) (b) : 追加円の高さ・奥行(m) (c) : 分割角(指定無または 0 は 30゚ となる。) (x) ,(y) : 追加円の原図円からの中心ずれ位置(m) (r1),(r2): 追加円の長軸、短軸径(m) にのみ対応しています。 4)レイヤの高さを設定 については、「外部変形」で高さの情報が外部プログラムに渡さ れない様になっている為、JW-CADの仕様が変わらないかぎ り無理のようです。 2)立面図の位置を設定してデータを作成 には、そのうちに対応出来る・・ようになると・・イイナ・(^^; 実行プログラムだけを直接起動しても何にもなりません。JW- CADの外部変形機能から、バッチファイルを指定して下さい。 文章だけでは分かりにくいので、サンプル図面も添付してありま す。 ☆ オプション指定 バッチファイルの中で、下記のオプションを指定します。 /c123456 : 線のPen番号:1-6に対応する線の色を指定 無指定なら /c123456 線のPen番号:1-6に対応する線の色は「外部変形」で外部プ ログラムに渡されない様になっているため、このような形で 指定するようにしました。 (例)/c415367 (私の設定) Pen1:4 緑色 Pen2:1 青色 Pen3:5 水色 Pen4:3 紫色 Pen5:6 黄色 Pen6:7 白色 JW_CAD.JWF から読み取ると言う方法もあるのですが、CAD起 動後に設定ファイルを変更している場合もあるので、こうい う形にしました。 実は色の他に、線のタイプもデータを渡してやらなくてはい けないのですが、このへんは手抜きです。(^^;) /m : 2.5D データ中の高さの数値の単位をミリメートルに指定。 無指定なら メートル。 /k : キー操作において、視点を移動するように指定。 無指定なら 物体を移動。 /t : 「面」と認識する線のタイプを実線のみに指定。 無指定なら全ての線種を面の対象とする。 補助線は常に無視されます。 ★ 「面」!・・・・?? ここが一番肝心な所なのですが、・・・ 3Dにおいて、全ての稜線を描くワイヤーフレームに対して、隠線処理 は「面」の後ろに隠れている線を描かないように処理することを言い ます。 ここで問題になるのは、JW-CADが扱うデータに「面」という要 素が無い!ということです。 これは、元々が二次元CADとして開発されたCADですので当然の ことではあります。 しかしそれでは隠線処理は実現不可能なままに終わってしまいます。 ・・・で、このプログラムでは、JW-CADの2.5Dのデータか ら無理矢理「面」を読み取るようにしてしまいました。 とはいえ、元々が二次元CAD用のデータですので、 「面」を完全に認識させることは不可能です!  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 出来る範囲で、ということで、以下のような形の「面」を定義するよう にしてみました。 JW-CADの2.5Dでの高さ等の設定の方法。 (共通) 基本的には、三次元空間内において同一平面内の同じレイヤ、線種 、線色の線で囲まれた閉じた図形を「面」と見なす。 (1)鉛直面 0,10 ----------- 0,10(この数字はCADでは逆さまになる) これは高さ10mの鉛直な壁(面)と見なす。 鉛直な長方形、台形等、四辺形を指定可。 (2)水平面 又は X(又はY,Zのいずれか)軸に平行な面 5 5 1 1 +-------+ +-------+ | | | | | | | | | | | | | | | | +-------+ +-------+ 5 5 5 5 四辺形である必要はない。 閉じた図形になっていれば「面」と見なす。 辺の数は現バージョンでは 24 本まで。 少しでも隙間が空いていれば「面」にはならない。 (3)X、Y,Z軸のいずれにも平行でない面 3 1 1 1 +-------+ +-----+ / / / | / [a] / / [b] |3.5 / / / / +-------+ +-------+ 5 2.5 5 5 閉じた図形を表す全ての辺(角)が同一平面上に有るように、全て の点の高さをJW-CAD上で入力してやらなくてはならない。 (2)の形態で不整形の場合も該当しますが、最も設定しにくい面 です。この時の数値は必ずしも切りのよい値にはなりません。 [a]の 2.5 (この値が正しいとして)が 2.4999でも 2.5001でも、 同一平面上ではなくなり、「面」とは見なされません。 [b]の 3.5 も、微妙な調整の必要な数値です。 (4)円、円弧、楕円、円柱、円錐 JW-CADの2.5Dでの設定と同じ。 但し、螺旋には対応していません。 円は多角形に置き換えられ、辺の数は分割角度で指定出来ますが、 1つの面の最大辺数が 24 なので、360/24=15゚ 以下の角度を指定 すると、無視されます。 円柱や円錐台の形で、上下の円の長軸、短軸径に異なる値を指定す ると大抵の場合、側面にねじれが生じ「平面」では無くなる為、隠 線処理されなくなります。 繰り返しますが、元々が二次元CAD用のデータですので、上記の 「面」の設定方法を巧く使い分けても あらゆる形態の「面」を完全に認識させることは不可能です!  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 中抜き(ドーナッツ型)の「面」の設定は出来ませんし、逆に「面」に したくなくても、「面」と解釈されてしまうこともあります。 (この場合は線の種類を使い分け、/t オプションを利用して下さい) 対応出来る範囲内で使用して頂くことになります。ご了解ください。 ★ 誤差 このプログラムで、「面」の認識と並んで最も悩まされたのが、「誤差 」です。(内部の演算は全て単精度実数で処理しています。) 「面」の認識の所でも記しましたが、3D空間での座標値の扱いでは 非常に微妙な値が大きな意味を持つことになります。 例えば1つの面上に配したつもりの線も、座標が 0.0001mm ずれただ けで「面」の後ろに隠れるか、表に見えてくるか違ってきます。「面」 には厚さが無いのですから。 又、プログラム中で「面」を定義するときに、空間内の3つの点をもと に法線ベクトルと平面の方程式の係数を算出しますが、その3つの点 が極端に接近していたり、直線上に近い位置関係にあったりすると、そ こで発生する極わずかな誤差が全体に大きな影響を与えることになっ てきます。 その為、極端に細長い「面」等を使うと、その周囲で不正確な作図がな されることも充分あり得ます。 これを少しでも解消できるように、「ある程度の誤差は 0 に等しい」 という判断をするように作ってはありますが、・・・ ★ 処理時間(スピード) 隠線処理の計算には時間がかかります。 3D空間内を走る線1本1本について、全ての「面」との空間内での 位置関係、二次元投影面での重なり等をその都度座標変換しながら調 べていくわけですから、時間がかかって当然です。 添付されているサンプルデータの処理時間を、参考までに記します。 ( 使用機種 PC-9801DA CPU:Cx486+487 40MHz ) サンプルデータ version 4面体 人 家 ver 0.6(rial) 810 ---- 36 ver 0.7(rial) 650 1040 32 ver 0.7(protect) 92 140 5 ( 数値の単位は全て 「秒」 ) ★ こういうことまでは出来ない f^^;) (今後の課題) 範囲指定出来る線の本数は、約3200本まで。 登録(プログラム中で自動的に登録)される面の数は、約1600面ま で。 1つの面を構成する辺の数は24まで。 円(円柱)の数は80まで。 JW-CADの2.5Dでの高さ指定方法の一部に未対応。 書き込みレイヤグループ以外のレイヤグループのデータも指定できま すが、縮尺の異なるレイヤグループのデータは無視する仕様にしてあ ります。 今のところ、一応「面」と「線」の交差は実現したつもりですが、「面 」と「面」の交差は、まだ次の段階の課題です。 現在は +-------+ | | +--| | / | | / +---+ | / / | / / | / /------+ +--------+ となるべきが、 +-------+ | | +--| | / | | / + + | / / | / / | / /------+ +--------+ となってしまいます。 ★ 最後に 鹿児島で2x4による住宅の設計の仕事をしているのですが、普段J W-CADのお世話になってばかりなので、こういうものででも皆さ んのお役に立てれば、と思います。 JW-CADは元々が二次元CADとして開発されたCADですので、 そのサブプログラムでしかないこのプログラムが、三次元の処理を正 確に行うというのは、本来出来ないはずの事なのです。 (・・って、自らを否定するようなことを書いてどうする(^^; ) しかし、それはそれで結構やる気を起こさせるもので、出来ないことを 承知で、「やれるところまで挑戦してみよう!」・・と、取り組んでみ ました。 大きな虫はだいたい駆除したつもりですが、まだ所々に虫が潜んでい る可能性があります。使用の際はデータの保存等、注意してください。 使ってみての感想やバグ情報、大歓迎です。NIFTY-Serve FARCCの会議室までお寄せください。 本作はフリーソフトウェアです。 無償である限り、 自由に配布/転載 /使用して下さって構いませんが、その場合、プログラムの内容は改変 せず、このドキュメントファイルもこのまま添付して下さい。 本作品の使用、 配布によるいかなる損害にも、 作者は責任を負いま せん。 KGF01523 土器手 茂 ★ 履歴 ☆ ver0.5から0.6への変更 ・処理できる線の本数を2400本に、面の数を1200面に増やした。 (^^)v(RSWAP無しの環境でも使える線数に抑えた・・) ・物体の回転を[O],[P],[1],[3],[7],[9]キーでも出来るようにした。 ・ワイヤーフレームでの表示を速くした。(^^)v ・正確に隠線処理出来ない場合があったのを(ある程度?)改善。 ・正確に「面」を認識出来ない場合があったのを改善。(出来たと思う) ・隠線処理の計算中、[ESC]キーで中断出来るようにした。 ・2.5Dデータ中の高さの数値の単位を指定出来るようにした。 (メートル、又はミリメートル) ・「面」と認識する線のタイプを指定出来るようにした。 (全ての線のタイプ、又は実線のみ) ・補助線は一切表示しないようにした。(2.5Dの仕様に合わせた) ・書き込みレイヤグループ以外のレイヤグループを指定した場合、縮尺 の異なるレイヤグループのデータは無視するようにした。 ・2.5Dで設定したレイヤグループ毎の高さに対応。(範囲指定の時に JW-CADの画面(作図範囲)左下に小さく表示される数値も含めて 範囲指定する) ・キー操作で、物体又は、視点の、何方を移動させるかを指定出来るよう にした。 ☆ ver0.6から0.7への変更 ・リアルモード版と、プロテクトモード版の2種類にした。 これに伴い処理できる線の本数、面の数を (リアルモード版 : 1600本、 800面) (プロテクトモード版 : 3200本、1600面) とした。 ・隠線アルゴリズムの再検討により、処理時間を20-30%短縮。 ・JW-CADの2.5D形式のデータの、円弧、円錐、楕円に対応。 円の線分化で一辺の角度を指定出来るようにした。     (リアルモード版 : 12 角形以下)     (プロテクトモード版 : 24 角形以下) 但し、螺旋を除く。 ・面に「接する」線の処理が出来ていなかったのを修正。