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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:ハッチング(11)
前頁まで構造化要素のハッチング(パターン)について考えました。これで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 ;
    ↓
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
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.