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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:ハッチング(13)
前頁は、独自拡張のハッチング(グラデーション塗り)について考えてみました。今回も同じく、独自拡張によるハッチング(画像塗り)について考えてみます。
 
GDI+、Direct2Dには、小さめの画像を指定し、それをタイル状にして図形内を塗り潰す機能がありますのでそれを利用します。但し、画面を拡大表示しても縮小表示しても、画像が自動的に大きさを変える訳ではありません。

 
大きい画像の場合は、外形線で切り抜いたような表示になります。但しその場合も、画面拡大をするとタイル状になったようになります。また、表示位置を変更することで画像状態が変わる場合もあります。
そういう意味において、ある特定の写真を切り抜いて表示したい、というような場合には扱いにくいと思われます。しかし、そのような処理が出来るCADというのもおそらくは少ないと思います。画像ソフトの範疇でしょうか。
 
ハッチング(パターン)で、文字や塗り潰し等が出来ないという件については、その文字や塗り潰しパターンを画像ファイルにして、この機能によって実現する、という手法は使えるかもしれません。
 
GDIでも Brushオブジェクトで Bitmapを割り当てる、という事は出来ますが、GDI+でのパス指定での描画のような事が出来ない事や、クリッピングの問題、これまでの流れもあって、GDIを指定した場合もこれまで同様 GDI+の機能を利用して描画するようにします。
 
 
ハッチング(画像塗り)のデータ構造は下記のようにします。
UnitData.pas
type
 ・・・
 TDataHatch7 = record  // 独自|構造化要素|ハッチング(画像塗り)
  exf : Boolean ;      // 存在フラグ(True:有り False:無し)
  Layer : Integer ;     // レイヤ(1〜256)
  Color : Integer ;     // 塗り潰し色 (0:レイヤ色 1〜256)
  ImgFileName : string ;   // 画像ファイル名
  out_id : Integer ;     // 外形の複合曲線のフィーチャコード
  Number : Integer ;     // 中抜の閉領域数(0〜)
  in_id : array of Integer; // 中抜の複合曲線のフィーチャコード
 end;
 ・・・
塗り潰し色 Color はそのまま残していますが、これは、他CADへデータ受け渡しをする際、画像を受け渡すことは出来ず通常の塗り潰しになると思われますので、その際の受け渡し用として考えて頂ければ、と思います。
 
なお、GDI+で利用出来る画像ファイル形式は、
  ICO、WMF、EMF、BMP、GIF、PNG、TIFF、JPEG
です。
 
Direct2D、というよりは、Delphi2010では通常状態で
  ICO、WMF、EMF、BMP
WindowsXP SP3以上で DirectXランタイムを使用している場合はTWICImageが利用出来るのでそれにより、
  TIFF
が利用出来るようになり、uses節にて
  GIFImg を指定 → GIF (TGIFImage)
  pngimage を指定 → PNG (TPngImage)
  jpeg を指定 → JPEG (TJPEGImage)
が利用出来るようになる、との事ですから、TIFF は Direct2D を利用する=WindowsVista/7を利用する、という前提ですからまぁ問題は無いと思います。という訳で、UnitGraph.pas の uses節には、「GIFImg,pngimage,jpeg」を追加しておきます。但しこれは、TBitmapで TIFF,GIF,PNG,JPEGが使えるという訳ではありません。TPictureで使えるという事なので、Direct2Dでの画像ブラシは TBitmap で指定を行うため、
pc := TPicture.Create ;
pc.LoadFromFile(fn) ;
bm := TBitmap.Create ;
bm.Width := pc.Width;
bm.Height:= pc.Height;
bm.Canvas.CopyMode := cmSrcCopy;
bm.Canvas.Draw(0,0,pc.Graphic);
のようにして変換を行います。
 
データ登録は下記のようにします。画像ファイル名の指定があるだけで他はハッチング(塗り)と同じです。画像ファイル名がヌル(空状態)の場合にはエラー終了しますが、画像ファイルの有無のチェックは行いません。
UnitData.pas
// ハッチング(画像塗り) データ項目の追加登録
function TDataClass.AddDataHatch7(s,fn:string;lay,col,
 oid,num:integer;iid:array of integer) : Boolean ;
 
なお、外形・中抜きの複合曲線部は画像化しませんので、外形線・中抜き線が不要な場合には、それぞれの複合曲線定義で非表示にされると良いでしょう(※GDI+,Direct2Dでは画像ペンを使用する事も可能ですが、これは利用しません)
 
ハッチング(画像塗り)の描画は、恒例のように UnitDataGraph.pasにて行いますが、塗り部分が手続きDisplayPolygon7 で行うようになっているだけで他はハッチング(塗り)とほぼ同じです。なお、FileExists手続きを使用しましたので、uses節に SysUtils を追加しました。
UnitDataGraph.pas
// ハッチング(画像塗り)の表示
procedure DisplayHatch7(lay,cf,col:integer;fn:string;
 oid,num:integer;iid:array of integer;t:TMatrix);
var
 ex : string ;
 c,cc : integer ;
 i,j,co : integer ;
begin
 ex := AnsiLowerCase(ExtractFileExt(fn));
 if not(FileExists(fn))
  or((ex <> '.ico')and(ex <> '.bmp')and(ex <> '.wmf')
  and(ex <> '.emf')and(ex <> '.jpg')and(ex <> '.jpeg')
  and(ex <> '.png')and(ex <> '.gif')
  and(ex <> '.tif')and(ex <> '.tiff')) then begin
  // 画像ファイルが存在しない場合は、ハッチング(塗り)を実行
  DisplayHatch2(lay,cf,col,oid,num,iid,t);
  exit;
 end;
 
 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);
  DisplayPolygon7(fn,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;
 
手続き DisplayPolygon7 は 実際の描画を行う UnitGraph.pas 内の G_PolygonA 手続き(メソッド)を呼び出します。画像ファイル名を引数にしているだけで、それ以外は、ハッチング(塗り)用の手続き DisplayPolygon2 と同じ内容です。
 
 
それでは、ハッチング(画像塗り)の登録・描画のテストです。
Unit1.pas
// 画像塗り
fn := AppPath + 'あ.jpg';
// fn := AppPath + 'い.gif';
// fn := AppPath + 'う.tif';
// fn := AppPath + 'え.emf';
CData.AddDataHatch7(''    ,fn,1,12, 1,3,[2,3,4]);
CData.AddDataHatch7('部分図A',fn,1,12, 1,3,[2,3,4]);


↓ 用紙を変更して拡大表示

 
"い.gif"を使用してみます。

 
"う.tif"を使用してみます。

 
"え.emf"を使用してみます。

 
メタファイル WMFファイルの場合、GDI+を利用すると一部、色が抜けたり等の欠落が起きるようですが、これに関しては、16bitOSの Windows3.1時代のものですから現在は既に 拡張メタファイル EMFファイルを利用する事をマイクロソフト社等からも推奨されていますので、余り気にしないという事にします。メタファイル・拡張メタファイルの場合は、GDI+とDirect2Dとでは、描画方法が違うようで、状況によって見え方が変わってくるようです。しかし、元々のこのハッチング(画像塗り)での描画そのものが、画面表示状態によって変わってきますので、この辺りも余り気にしない事にします。
 
という訳で上記はてきとうな例でしたが、シームレスな材質を表すような画像を複数用意しておいて、それを選択するようにしておけば、結構色々な表現が出来るのではないかと思われます。
 
という訳で、ハッチングの独自拡張はここまでとし、ハッチングについてはこれで終了とします。
 
それでは、ここまでのテストプログラムです。実行ファイル、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.