|
前頁まで構造化要素のハッチング(パターン)について考えました。これでSXF仕様の構造化要素のハッチングは一応全て終了し、「SXF Ver.3.1仕様書・同解説フィーチャ仕様編(第2版).pdf」の内容は全て読み終わりました。
ですのでこれで終わりなのか、というと、まだそれ以外にも、ラスタ(画像)、等高線、属性付加機構、という機能があるようです。ラスタ・等高線は属性付加機構と関わってくるようですから、属性付加機構がどういうもので、どういう扱いをするものなのかを読み解く必要はありそうです。
が、その前に、CADソフトにおけるハッチング/塗り潰し要素データについてもう少し考えます。 CADソフトでのハッチング処理のほとんどは、ハッチング(既定義)・(ユーザ定義)・(パターン)で表現出来ると思われます。所謂「網掛け」というものは、よくあるのは、GDIや GDI+のブラシ・スタイルにあるもの・そのもの、或いは、16×16ドット程度の小さい画像による塗り潰し、という場合が多かったように思われます。GDIのブラシスタイルとGDI+のブラシスタイルの内容は随分違いますし、印刷時、プリンタ・プリンタドライバ・設定(印刷品質=解像度も含む)によって、印刷後の状態がかなり変わってくる、という事もありますので、これに対応するつもりはありませんが、小画像による塗り潰しというのは、現実、求められる場合も多く、これについては対応しても良いかなと思います。
また、同様に、色の重ね合わせを実現するための、透過塗り潰しの対応、そして、グラデーション塗り潰しの対応、という事も よく求められるケースがありますので、実装しておこうと思います。
これら、透過塗り潰し・グラデーション塗り潰し・画像による塗り潰しは、GDI+、Direct2D で可能な事は既に、GDI+による落書きテストプログラムや、Delphi2010コーナーのDirect2Dのページで記述済みです。
という訳で、ハッチング(塗り)を拡張して、対応していくことにします。但し、他ソフトでデータを受け渡す際には、データを受け渡す手段が無いため、通常のベタ塗り潰しとして表現されることになると思われます。
それではまず、ハッチング(透過塗り)から。
透過情報は、アルファ値(0〜255の整数値)で指定します。
0が完全に透明で色表現無し、255が完全にベタ状態で非透過状態を示します。
ハッチング(透過塗り)のデータ構造は下記のようにします。
UnitData.pas |
type
・・・
TDataHatch5 = record // 独自|構造化要素|ハッチング(透過塗り)
exf : Boolean ; // 存在フラグ(True:有り False:無し)
Layer : Integer ; // レイヤ(1〜256)
Color : Integer ; // 色 (0:レイヤ色 1〜256)
Alpha : Integer ; // 塗りアルファ値(0〜255)
out_id : Integer ; // 外形の複合曲線のフィーチャコード
Number : Integer ; // 中抜の閉領域数(0〜)
in_id : array of Integer; // 中抜の複合曲線のフィーチャコード
end;
・・・ |
データ登録は下記のようにします。内容は、指定項目を1つ追加しているだけでハッチング(塗り)とほぼ同じです。
UnitData.pas |
// ハッチング(塗り) データ項目の追加登録
function TDataClass.AddDataHatch5(s:string;lay,col,al,
oid,num:integer; iid:array of integer) : Boolean ; |
なお、外形・中抜きの複合曲線部は透過しませんので、外形線・中抜き線が不要な場合には、それぞれの複合曲線定義で非表示にされると良いでしょう。
ハッチング(透過塗り)の描画は、恒例のように UnitDataGraph.pasにて行いますが、塗り部分が DisplayPolygon3 手続きで行うようになっているだけで他はハッチング(塗り)と同じです。
UnitDataGraph.pas |
// ハッチング(塗り)の表示
procedure DisplayHatch5(lay,cf,col,al,oid,num:integer;
iid:array of integer;t:TMatrix);
var
c,cc : integer ;
i,j,co : integer ;
begin
with CData do begin
// 一応チェック
j := CCrvIDCheck(oid); // ID番号が有効かどうかをチェック
if (j = -1) then exit ; // ID番号無効
for i:=0 to num-1 do begin
j := CCrvIDCheck(iid[i]); // ID番号が有効かどうかをチェック
if (j = -1) then exit ; // ID番号無効
end;
// ハッチング領域図形のセット
zHArN := 1 + num ;
SetLength(zHAr,zHArN);
CCrvDataToHAr(oid,1); // 複合曲線定義 oid → 外郭部
j := 2 ;
for i:=0 to num-1 do begin
CCrvDataToHAr(iid[i],j); // 複合曲線定義 iid → 中抜き
Inc(j);
end;
// 塗りの表示
DisplayLayCol1(lay,col,c,cc); // 色
gp.G_SetWidth(1);
DisplayPolygon3(cc,al,t) ;
// 外郭線の表示
j := CCrvIDCheck(oid);
if (cDef[j].invisibility = 1) then begin
co := cDef[j].Color ; if (cf = 1) then co := col;
DisplayHArLines(0,lay,co,cDef[j].Ltype,cDef[j].line_width,t);
end;
// 中抜き線の表示
for i:=0 to num-1 do begin
j := CCrvIDCheck(iid[i]);
if (cDef[j].invisibility = 1) then begin
co := cDef[j].Color ; if (cf = 1) then co := col;
DisplayHArLines(i+1,lay,co,cDef[j].Ltype,cDef[j].line_width,t);
end;
end;
// メモリ解放
DataClearHAr ;
end;
end; |
上記の DisplayPolygon3 手続きは、
↓
gp.G_PolygonA(rgb,alpha) ; |
と変更しているだけでそれ以外は DisplayPolygon2 手続きと全く同じです。
この G_PolygonA 手続き(メソッド)は、UnitGraph.pas にて従来のものに overload 定義していますが、内容は、透過の指定をしているだけでほぼ同じものです。
それでは、ハッチング(透過塗り)の登録・描画のテストです。アルファ値を128にしています。
Unit1.pas |
// 透過塗り
CData.AddDataHatch5('' ,1,12,128 ,1,3,[2,3,4]);
CData.AddDataHatch5('部分図A',1,12,128 ,1,3,[2,3,4]); |
ハッチング(塗り)の場合は
となっていましたから、その違いは明確に分かると思います。
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
▲PREV
▼NEXT
M7
Jw_cad
|