前頁から構造化要素のハッチング(パターン)について考えていますが、今回もその続きです。
ハッチング(パターン)で使用するシンボル図形に、前回、線分・折線・円・円弧・楕円・楕円弧・スプライン曲線・クロソイド曲線を利用出来るようにしましたが、点マーカを使いたい場合もあるでしょうから、それに対応させることを考えます。同様に、矢印についても同じロジックですから、使う事はないにしても対応は出来るようにしておきます。
しかし、点マーカ・矢印の塗り潰し部分については、これまでのロジックでは実現できませんので、対応しません。外郭線(アウトライン)のみ、とします。塗り潰しに見せるために、点=円の塗り潰しを、二重円・三重円・・・とする手法は昔からありますが・・・。
なお、点マーカの円は72分割の円、点マーカの点は半径5ドットの円、矢印の円は24分割の円として表示していますが、これらを24分割の円と統一し、点マーカの点=円の直径を0.25(点マーカの円は直径2.5で、その1/10)と解釈して、外郭線を取得する手続きをUnitFuncCurve.pasに作成します。
その際、点マーカでは、連続線とならない箇所もありますので、このための変数を用意する必要がありますが、メモリ等が勿体無いので、ここでは既に存在する変数 tLns、tLsnN を流用する事とします。これを連続線分データとして使うのではなく、始点・終点・始点・終点・・・・と扱うようにします。
また、シンボル図形内で外郭線として扱って計算を行いますから、シンボル図形配置や点マーカ・矢印そのものの描画の場合の用紙に対する大きさ・回転角指定ではなく、シンボル図形配置・作図部品・部分図の尺度・角度に影響する事となります。このため、他CADとのやり取りを行った際に、描画が異なった状態に見える可能性がありますので、注意して下さい。
UnitFuncCurve.pas |
procedure TransTenMarkerToLines(mc:integer;px,py,an,sc:double;t:TMatrix);
procedure TransArrowToLines(ac:integer;px,py,an,sc:double;t:TMatrix); |
これを UnitData.pas の手続き MakeHatch4 で呼び出して利用するようにします。線種・線幅は、レイヤ線種・レイヤ線幅にする事としています。
UnitData.pas |
// ハッチング(パターン) ハッチング線の算出
// n : パターン=シンボル図形 番号(-1〜)
// col : 線色コード
// px : ハッチパターン配置位置X座標
// py : ハッチパターン配置位置Y座標
// pv1 : ハッチパターンの繰返しベクトル1の大きさ
// pv1a : ハッチパターンの繰返しベクトル1の角度[°]
// pv2 : ハッチパターンの繰返しベクトル2の大きさ
// pv2a : ハッチパターンの繰返しベクトル2の角度[°]
// psx : ハッチパターンのX尺度
// psy : ハッチパターンのY尺度
// pa : ハッチパターンの向きの角度[°]
// (ret)
// zHLn, zHLnN
procedure TDataClass.MakeHatch4(n,col:integer;
px,py,pv1,pv1a,pv2,pv2a,psx,psy,pa:double) ;
・・・
//
with sDef[-n-1] do begin
for o:=0 to mOrdN-1 do begin
o1 := mOrd[o].DataType ;
o2 := mOrd[o].DataNo ;
case (o1) of
1: begin
// 点マーカ・データ
with mTen[o2] do begin
ltp := 0 ;
wid := 0 ;
TransTenMarkerToLines(marker_code,start_x,start_y,
rotate_angle,Scale,tr);
end;
end;
2: begin
// 線分データ
with mLin[o2] do begin
ltp := Ltype ;
wid := line_width ;
MtxXY(lx1,ly1, start_x,start_y, tr);
MtxXY(lx2,ly2, end_x ,end_y , tr);
end;
MakeHatch4sub(col,ltp,wid, lx1,ly1,lx2,ly2,
wx1,wy1,wx2,wy2, pv1,w5,pv2,w6,w2,w4) ;
end;
3: begin
// 折線データ
with mLns[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransLinesToLines(Number,X,Y,tr);
end;
end;
4: begin
// 円データ
with mCir[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransCircleToLines(sep,Center_x,Center_y,Radius,tr);
end;
end;
5: begin
// 円弧データ
with mArc[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransArcToLines(sep,Direction,Center_x,Center_y,Radius,
start_angle,end_angle,tr);
end;
end;
6: begin
// 楕円データ
with mEll[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransEllipseToLines(sep,Center_x,Center_y,Radius_x,Radius_y,
rotation_angle,tr);
end;
end;
7: begin
// 楕円弧データ
with mEAr[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransEllipseArcToLines(sep,Direction,Center_x,Center_y,
Radius_x,Radius_y,rotation_angle,start_angle,end_angle,tr);
end;
end;
9: begin
// ベジェ曲線データ
with mBez[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransBezierToLines(sep,Number,X,Y,tr);
end;
end;
10:begin
// Bスプライン曲線データ
with mBsp[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransBsplineToLines(open_close,sep,Number,X,Y,tr);
end;
end;
11:begin
// スプライン曲線データ
with mSpl[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransSplineToLines(Stype,open_close,sep,Number,Aval,X,Y,tr);
end;
end;
12:begin
// クロソイド曲線データ
with mClo[o2] do begin
ltp := Ltype ;
wid := line_width ;
TransClothoidToLines(Direction,sep, base_x,base_y,Aval,
Angle,start_length,end_length,tr);
end;
end;
13:begin
// 矢印データ
with mArw[o2] do begin
ltp := 0 ;
wid := 0 ;
TransArrowToLines(arrow_code,start_x,start_y,
rotate_angle,Scale,tr);
end;
end;
end;
if (o1 >= 3)and(o1 <= 7)or(o1 >= 9)and(o1 <= 13) then begin
if (tLnsN > 0) then begin
for i:=0 to tLnsN-2 do begin
MakeHatch4sub(col,ltp,wid,
tLns[i].x,tLns[i].y, tLns[i+1].x,tLns[i+1].y,
wx1,wy1,wx2,wy2, pv1,w5,pv2,w6,w2,w4) ;
end;
end;
TransLnsClear ; // 連続線分データクリア
end
else if (o1 = 1) then begin
if (tLnsN > 0) then begin
for i:=0 to ((tLnsN div 2)-1) do begin
MakeHatch4sub(col,ltp,wid,
tLns[i*2].x,tLns[i*2].y, tLns[i*2+1].x,tLns[i*2+1].y,
wx1,wy1,wx2,wy2, pv1,w5,pv2,w6,w2,w4) ;
end;
end;
TransLnsClear ; // 連続線分データクリア
end;
end;
end;
SetLength(zHLn, zHLnN);
zHCp := nil;
zHCpN:= 0;
end; |
それでは、ハッチング(パターン)の登録・描画のテストです。
Unit1.pas |
CData.AddSymbolDef('シンボルB');
CData.AddDataTen('シンボルB', 1, 1,1, 0, 0 ,0, 1.0);
CData.AddDataTen('シンボルB', 1, 1,2, -5, 5, 0, 1.0);
CData.AddDataTen('シンボルB', 1, 1,3, 5, 5, 0, 1.0);
CData.AddDataTen('シンボルB', 1, 1,4, -5,-5, 0, 1.0);
CData.AddDataTen('シンボルB', 1, 1,5, 5,-5, 0, 1.0);
CData.AddDataTen('シンボルB', 1, 1,6, -5, 0, 0, 1.0);
CData.AddDataTen('シンボルB', 1, 1,7, 5, 0, 0, 1.0);
CData.AddDataHatch4('' ,'シンボルB',
1,10, 50.0,50.0, 20,0, 20,90, 1.0,1.0,0.0, 1,3,[2,3,4]);
CData.AddDataHatch4('部分図A','シンボルB',
1,10, 50.0,50.0, 20,0, 20,90, 1.0,1.0,0.0, 1,3,[2,3,4]); |
Unit1.pas |
CData.AddSymbolDef('シンボルB');
for i:=1 to 11 do
CData.AddDataArrow('シンボルB', 1,1,i, 0,(i-1)*4,0.0,1.0);
CData.AddDataHatch4('' ,'シンボルB',
1,10, 50.0,50.0, 20,0, 50,90, 1.0,1.0,0.0, 1,3,[2,3,4]);
CData.AddDataHatch4('部分図A','シンボルB',
1,10, 50.0,50.0, 20,0, 50,90, 1.0,1.0,0.0, 1,3,[2,3,4]); |
通常の点マーカ・矢印と比較するとやはり描画表現が違うというのは視覚的に分かってしまいますが、描画が出来ないよりは出来た方が良いと思いますので、このようにしておきます。
文字・寸法関係・ハッチングの各要素データには対応しない事とします。という訳で、ハッチング(パターン)要素データについてはここまで、とします。
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
|