昔「fg」(フォーマット・ジェネレーター)というツールを作って利用してましたが、これは、CADモドキ画面で見積書や伝票などのフォーマットを作図し、文字を記入するところに「変数」(データベース・フィールド名)を割り当てて(文字内容=変数指定可能)、データを作ったら Delphi の Pascalコードを出力し、それをそのまま Delphi でのプログラミングに利用し、Delphiプログラムから「印刷」とやれば、その見積書や伝票などを印刷させる、みたいなツールでした。
まぁ、Delphiでの QuickReport/Rave/FastReport みたいなもんですね。
そいつに、Jw_cad の両ボタンドラッグでの拡大縮小移動な機能を突っ込んで、1人で笑ってましたw(仕事で使うツールだから一般公開してない;一時的に出したけど需要無いのですぐ消した)
そのツールの場合、「変数」は、文字内容にのみ反映されるものでした。
しかし今回のお話は、そうではなく、座標値等に「変数」を使えるように、みたいなお話。
一般的な 2D-CAD の場合
データベース上での各要素データの座標や各数値は、基本的に、定数値です。倍精度CADであれば、double型の数値になります。
が、そこに「変数」を使えるようにする、ということは、そのお約束パターンが使えない、という事になります。基本的には、各座標値・各数値等は、文字型となります。そして、画面描画のたびに、その文字データの内容を評価・計算し、数値化して、画面に図形を表示します。
例えば線データの場合
レイヤー:lay:string
線色 :col:string
線種 :typ:string
線幅 :wid:string
開始点:p1,x : string
p1.y:string
終了点:p2,x : string
p2.y:string
のようなフィールドとなり、これを変換(式評価)、
レイヤー:lay:string → nlay : integer
線色 :col:string → ncol : integer
線種 :typ:string → ntyp : integer
線幅 :wid:string → nwid : integer
開始点:p1,x : string → np1.x:double
p1.y:string → np1.y:double
終了点:p2,x : string → np2.x:double
p2.y:string → np2.y:double
として画面に描画する訳ですが、式の評価ってのはそれなりに時間が掛かってしまうので、別途、
レイヤー:lay:string
レイヤー:nlay : integer
線色 :col:string
線色 :ncol : integer
線種 :typ:string
線種 :ntyp : integer
線幅 :wid:string
線幅 :nwid : integer
開始点:p1,x : string
p1.y:string
np1.x:double
np1.y:double
終了点:p2,x : string
p2.y:string
np2.x:double
np2.y:double
のようにデータを持ってしまう手もあるかもしれません。そうすれば再描画のたびに式の評価を行って遅くなってしまう、というのは避けられるかもしれません。
なお、STEP的に、座標点ってのを別データとして持って
線データ
レイヤー:lay:string
レイヤー:nlay : integer
線色 :col:string
線色 :ncol : integer
線種 :typ:string
線種 :ntyp : integer
線幅 :wid:string
線幅 :nwid : integer
開始点:p1:#1
終了点:p2:#2
座標点データ
#1:x : string
y:string
nx:double
ny:double
#2:x : string
y:string
nx:double
ny:double
のようにしてしまうのもアリかもしれません。
式の評価は、一般的に、「式」な文字列を1文字ずつ解読して、定数・変数・演算子・関数に切り分けて、逆ポーランド記法に変換し、計算を行い、結果を得ます。この辺は「コンパイラ技法」な本の最初の方に出てくると思いますのでそういう本を参考にすれば良いと思います。
インタープリター的に実行するのか、コンパイラー的に実行するのか、は、ご自由に。
パラメトリックなCADの場合、拘束条件というものがあります。まず、線データの場合
・2点指定
・水平線
・垂直線
・角度指定線
・ある線に対して平行な線
・ある線に対して直交な線
・ある線に対して角度指定な線
・接線
等
そして、値が取り得る範囲の指定、こういう値・条件になったら作図出来ませんよという制限指定、データベースとのリンク、他のデータとのリンク・オブジェクト指向等、等が組み込まれているのが通例です。
例えば、ねじの作図をして、タップ穴の作図をして、それを組み立てるような場合、ねじとタップの関係に整合性が無ければエラーを発生させます。そういうのがすべてのオブジェクト、および全体としての整合性の評価が行えないといけません。まぁ、そこまでしないにしても、少なくとも干渉チェック程度は出来ないとお話にならないと思います。
各部品は、テキトーな作図は出来ません。
2D汎用CADでお気軽にテキトーに線などを作図していく、なんて事も出来ないかもしれません。
さ、果たして
このような 2D-CADがあったとして
有効活用できる人がどれくらい居るか?
ま とりあえず
標準部品データを一通り揃えろや!って事にはなると思いますがw
まぁ、Delphiでの QuickReport/Rave/FastReport みたいなもんですね。
そいつに、Jw_cad の両ボタンドラッグでの拡大縮小移動な機能を突っ込んで、1人で笑ってましたw(仕事で使うツールだから一般公開してない;一時的に出したけど需要無いのですぐ消した)
そのツールの場合、「変数」は、文字内容にのみ反映されるものでした。
しかし今回のお話は、そうではなく、座標値等に「変数」を使えるように、みたいなお話。
一般的な 2D-CAD の場合
データベース上での各要素データの座標や各数値は、基本的に、定数値です。倍精度CADであれば、double型の数値になります。
が、そこに「変数」を使えるようにする、ということは、そのお約束パターンが使えない、という事になります。基本的には、各座標値・各数値等は、文字型となります。そして、画面描画のたびに、その文字データの内容を評価・計算し、数値化して、画面に図形を表示します。
例えば線データの場合
レイヤー:lay:string
線色 :col:string
線種 :typ:string
線幅 :wid:string
開始点:p1,x : string
p1.y:string
終了点:p2,x : string
p2.y:string
のようなフィールドとなり、これを変換(式評価)、
レイヤー:lay:string → nlay : integer
線色 :col:string → ncol : integer
線種 :typ:string → ntyp : integer
線幅 :wid:string → nwid : integer
開始点:p1,x : string → np1.x:double
p1.y:string → np1.y:double
終了点:p2,x : string → np2.x:double
p2.y:string → np2.y:double
として画面に描画する訳ですが、式の評価ってのはそれなりに時間が掛かってしまうので、別途、
レイヤー:lay:string
レイヤー:nlay : integer
線色 :col:string
線色 :ncol : integer
線種 :typ:string
線種 :ntyp : integer
線幅 :wid:string
線幅 :nwid : integer
開始点:p1,x : string
p1.y:string
np1.x:double
np1.y:double
終了点:p2,x : string
p2.y:string
np2.x:double
np2.y:double
のようにデータを持ってしまう手もあるかもしれません。そうすれば再描画のたびに式の評価を行って遅くなってしまう、というのは避けられるかもしれません。
なお、STEP的に、座標点ってのを別データとして持って
線データ
レイヤー:lay:string
レイヤー:nlay : integer
線色 :col:string
線色 :ncol : integer
線種 :typ:string
線種 :ntyp : integer
線幅 :wid:string
線幅 :nwid : integer
開始点:p1:#1
終了点:p2:#2
座標点データ
#1:x : string
y:string
nx:double
ny:double
#2:x : string
y:string
nx:double
ny:double
のようにしてしまうのもアリかもしれません。
式の評価は、一般的に、「式」な文字列を1文字ずつ解読して、定数・変数・演算子・関数に切り分けて、逆ポーランド記法に変換し、計算を行い、結果を得ます。この辺は「コンパイラ技法」な本の最初の方に出てくると思いますのでそういう本を参考にすれば良いと思います。
インタープリター的に実行するのか、コンパイラー的に実行するのか、は、ご自由に。
パラメトリックなCADの場合、拘束条件というものがあります。まず、線データの場合
・2点指定
・水平線
・垂直線
・角度指定線
・ある線に対して平行な線
・ある線に対して直交な線
・ある線に対して角度指定な線
・接線
等
そして、値が取り得る範囲の指定、こういう値・条件になったら作図出来ませんよという制限指定、データベースとのリンク、他のデータとのリンク・オブジェクト指向等、等が組み込まれているのが通例です。
例えば、ねじの作図をして、タップ穴の作図をして、それを組み立てるような場合、ねじとタップの関係に整合性が無ければエラーを発生させます。そういうのがすべてのオブジェクト、および全体としての整合性の評価が行えないといけません。まぁ、そこまでしないにしても、少なくとも干渉チェック程度は出来ないとお話にならないと思います。
各部品は、テキトーな作図は出来ません。
2D汎用CADでお気軽にテキトーに線などを作図していく、なんて事も出来ないかもしれません。
さ、果たして
このような 2D-CADがあったとして
有効活用できる人がどれくらい居るか?
ま とりあえず
標準部品データを一通り揃えろや!って事にはなると思いますがw