AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:ハッチング(1)
前頁は、構造化要素の「複合曲線定義」について述べましたので、SXF仕様書の次の構造化要素「ハッチング」について考えてみます。ハッチングフィーチャには、「ハッチング(既定義)」、「ハッチング(塗り)」、「ハッチング(ユーザ定義)」、「ハッチング(パターン)」があるとの事です。まずは最初の「ハッチング(既定義)」についてですが、ここではハッチング名を指定する事になっていますが、既定義というからには、線種や色と同様、SXF仕様として明確に決まっているのだろうと思いきや、SXF Ver.3.1の仕様書のどこにも記載がありません。「SXF Ver.3.1仕様書・同解説共通既定義要素編.pdf」にて唯一「Area_control」という空白領域についての記載があるのみです。通常、ハッチングとくれば、水平・垂直・水平垂直のクロスハッチング・斜め線(45°)・斜め線(135°)・斜め線のクロスハッチング、くらいはありそうなものですが、全く記載がありません。利用者が定義をするのなら(ユーザ定義)を使えばいいので、この(既定義)の意味が全く分かりません。「Area_control」だけの為に存在するという事なら分かりますが、仕様書での説明箇所には「ハッチ名:CROSS STRIPES」という図解をされているので、何の事だかさっぱり分かりません。
かろうじて発見したのが、JACICサイトでまだ公開されているVer.2.0仕様書内の「フィーチャ仕様書 別冊」(sxfv2shiyouR541extra1.pdf)にて、
1:右上がり斜線、2:右上がり斜線(破線)、3:水平線、4:水平線(破線)、5:斜線格子縞、6:斜線格子縞(破線)、7:煉瓦模様、8:布織模様、が記載されていますが「・各値はあくまで参考値であることに留意されたい。」と記載されている上に値が「任意」となっている箇所もあります。また、これが Ver.3.0、Ver.3.1で記載されていないという事は、廃止されたのか?とも考えられる訳で、正直、どうすればいいのか混乱してしまいます。国土交通省から供与されるライブラリのドキュメントで明記されていれば良いのですが、それを実際に見てみないと分からないというのも考え物だと思います。
ですのでここでは、上記のVer.2に似せた独自形式で実装しておいて、うまく行かなければユーザ定義として出力すれば良い、という事にしておきます。
 
それでは、まず、ハッチングを考える際には、交点計算が出来なければいけません。線分と線分の交点計算については、★関数 連立方程式の解 やJw_cad外部変形のソース内で既に記述していますが、交点無し=平行、という結果だけだとまずいので、交点無し=平行、又は、同一直線上という結果も出せるよう修正して組み込んでおきます。
UnitFunc.pas
// 直線と直線の交点を算定
//  x1,y1,x2,y2 : 第1要素・直線
//  x3,y3,x4,y4 : 第2要素・直線
//  rx,ry :(出力) 交点
//  (ret) : -1:同一直線上 0:平行 1:交点有 2:延長線上に交点有.
function GetCrossLL(x1,y1,x2,y2,x3,y3,x4,y4:double;var rx,ry:double):Integer ;
※同一直線上の場合には交点は返しません
 
ハッチングを行う手法についてですが、まず、通過点を通り傾き角度θの直線を想定し、その直線が領域図形と交わる点をピックアップし、それを順番に並び替えて、その点間を結ぶ・結ばない・結ぶ・結ばない・・を繰り返します。



直線1本分が終わったら、その直線をハッチング間隔分、上方向にずらして、同様に行っていきます。交点数がゼロになったら、元の通過点よりハッチング間隔分下方向にずらして、同様に行っていきます。交点数がゼロになったらハッチング終了です。クロスハッチングや2本線・3本線等の場合は、その本数分、同様の事を行えば良いです。
 
大まかにはこのような感じなのですが、実際には、交点が領域図形の線分と線分の接続点の場合にはどうするのか? 及び ハッチング直線が領域図形の線分と同一直線上になる場合にはどうするのか? を考える必要があります。

 
そのため、交点座標と一緒に、ハッチング領域図形とハッチング直線との関係を示す変数を扱うようにします。
UnitData.pas
・・・
type
 ・・・
 TWorkHatchArea = record  // 作業用|ハッチング領域用
  an : integer ;
  a : array of TPointD ;
 end;
 TWorkHatchCrossP = record // 作業用|ハッチング交点計算用
  x , y : double ;
  dir : integer ;
 end;
このメンバ変数 dir の値を
  0:通常交差
  1:同一線上
  2:上側(0〜180°)
  3:下側(180〜360°)
のようにしています。上図の場合、
左側は
 1本目の線(左側)は交点の下側=3
 2本目の線(右側)は交点の下側=3
右側は
 1本目の線(上側)は交点の上側=2
 2本目の線(下側)は交点の下側=3
となりますが、
2&2・3&3の場合には交点として不採用、2&3・3&2の場合には1交点として採用、というようにプログラミングします。
 
また、ハッチング領域図形とハッチング直線が同一直線上になる場合、交点の採用の方法が多少煩雑になります。
 

例えば上図の場合、赤色の円の箇所は交点として採用しますが、緑色の円の箇所は交点として採用しません。これらをまとめると、8パターンがある事が分かります。

交点計算では同一直線上の場合には交点を返しませんが、直前または直後のハッチング領域図形の線で交点は計算され、その交点はその線の端点に等しくなりますので、それによって分かります。上図での dir値は
3・1 → 1・3
3・1 → 1・2
2・1 → 1・2
2・1 → 1・3

となりますが、処理されるハッチングの作図状態で交点の採用の方法も変わってきますので注意します。
 
交点を並べた状態で、2交点間を、作図する・作図しない・作図する・・・のようにしますので、交点の並べ替え(ソート)を行う必要があります。
 
これらを踏まえて、UnitData.pasに、ハッチング直線1本分の処理を行う関数を作成します。
UnitData.pas
// ハッチング線とハッチング領域図形との交点計算
// (in)
//  zHAr, zHArN : ハッチング領域図形(複数の連続線)
//  px,py : 通過点座標
//  pl : 長さ(ハッチング領域図形をカバーする長さ)
//  pa : 角度[°]
// (out)
//  zHCp, zHCpN : 交点群
// (ret) 交点数(zHCpNと同じ)
function TDataClass.CalcHatch1Point(px,py,pl,pa:double) : integer ;

// ハッチング線とハッチング領域図形との交点計算
// (in)
//  zHAr, zHArN : ハッチング領域図形(複数の連続線)
//  x1,y1 : 始点座標
//  x2,y2 : 終点座標 (ハッチング領域図形をカバーして下さい)
//  px,py : 通過点座標(これを基準点として回転処理します)
//  pa : 角度[°]
// (out)
//  zHCp, zHCpN : 交点群
// (ret) 交点数(zHCpNと同じ)
function TDataClass.CalcHatch1Line(x1,y1,x2,y2,px,py,pa:double) : integer ;
ハッチング領域図形のデータは、UnitData.pas 内の TDataClass 内に
 zHAr : array of TWorkHatchArea ; // 作業用|ハッチング領域
 zHArN: Integer ;
 zHCp : array of TPointD ;    // 作業用|ハッチング交点群
 zHCpN: Integer ;
のように定義しています。
 
ハッチング直線1本分を処理したら、上方向=ハッチング直線の傾き角度+90°の方向へ、ハッチング間隔分だけ離れた位置で処理、更にハッチング間隔分だけ離れた位置で処理・・・を続けて、交点が0個になるまで行います。そのあとに、最初のハッチング直線の下方向=ハッチング直線の傾き角度−90°の方向へ、ハッチング間隔分だけ離れた位置で、、、を同様に行います。
 
このため、ハッチング通過点は、ハッチング領域図形内(線上点はOK)に指定する必要があります。
 
ハッチングの作図テストです。まだ要素データ化は行っていません。

 
長くなりますので、取り合えずはここまでにしておきます。
 
 
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
 ▲PREV
 ▼NEXT
M7
Jw_cad
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.