|
前頁は、構造化要素の「引出し線」について述べましたので今回は、SXF仕様書の次の構造化要素の「バルーン」について考えてみます。
バルーン=番号記入は、バルーン円内に数字や英字を記入し、例えば、何らかの順番を示す番号として利用したり、図面内に記載した表との関連を示したりするのに利用されます。
CADソフトによっては、作図する毎に、円内の文字が、1、2、3、・・・、或いは、A、B、C、・・・と自動的に変わっていくという機能がある場合もあります。もしかすると、表との関連付け等も行われるかもしれません。
バルーンの円半径を基準とするのか、バルーン内の文字の大きさを基準とするのか、で多少違ってきます。円半径を固定とすると、文字が1桁→2桁になった場合に文字幅が半分に、3桁になると1/3に、なると文字が見えにくくなるかもしれませんし、文字の大きさを固定にすると桁数が増えたらバルーン半径が大きくなり図面的なバランスが崩れるかもしれません。どちらを採用するのか?或いは、バルーン円半径を予め大きくとっておくのか等で違ってきますが、それはそのCAD制作上のポリシーにも関わってきます。
バルーンは、SXF仕様書では以下のように記載されています。
構造化要素|バルーン |
※SXF Ver.3.1仕様書より |
パラメータ | 型 | 説明 | 範囲 |
Layer | Int | レイヤコード |
|
Color | Int | 色コード |
|
Type | Int | 線種コード |
|
line_width | Int | 線幅コード |
|
vertex_number | Int | 頂点数 |
2≦数<int(32bits)
の最大値 |
vertex_x | CArray<double, double> | X座標(配列) |
double(64bits)の
範囲(有効桁15桁) |
vertex_y | CArray<double, double> | Y座標(配列) |
double(64bits)の
範囲(有効桁15桁) |
center_x | double | 中心X座標 |
double(64bits)の
範囲(有効桁15桁) |
center_y | double | 中心Y座標 |
double(64bits)の
範囲(有効桁15桁) |
Radius | doouble | 半径 | 0<半径<1.0×1015 |
arr_code | Int | 矢印コード |
|
arr_r | double | 矢印配置倍率 | 0<倍率<1.0×1015 |
Flg | Int | 寸法値の有無フラグ(0:無、1:有) |
|
Font | Int | 文字フォントコード |
|
str[257] | Char | 文字列 |
0<文字列長≦256
バイト |
text_x | double | 文字列配置基点X座標 |
double(64bits)の
範囲(有効桁15桁) |
text_y | double | 文字列配置基点Y座標 |
double(64bits)の
範囲(有効桁15桁) |
Height | double | 文字範囲高 | 0<高さ<1.0×1015 |
Width | double | 文字範囲幅 | 0< 幅 <1.0×1015 |
Spc | double | 文字間隔 | 0≦間隔<1.0×1015 |
Angle | double | 文字列回転角 | 0≦ 度 <360 |
Slant | double | スラント角度 | -85≦ 度 ≦85 |
b_pnt | Int | 文字配置基点(1:左下,2:中下,3:右下,4:左中,5:中中,6:右中,7:左上,8:中上,9:右上) |
|
Direct | Int | 文字書出し方向(1:横書き, 2:縦書き) |
|
備考
・矢印コードは、1: blanked arrow, 2: blanked box, 3: blanked dot, 4: dimension origin, 5: filled box, 6: filled arrow, 7: filled dot, 8: integral symbol, 9: open arrow, 10: slash, 11: unfilled arrowから選ぶ。矢印の形状は直線寸法の補足を参照のこと。
・バルーンの円の中心点は、引出し線を構成する点列の第n点目(最後の点)と第(n−1)点目を結ぶ線分の延長上線上に存在する。
・矢印の大きさは、用紙座標系で解釈する。
・矢印は、引出し線を構成する点列の第1点目に配置する。
・角度は水平右側が0度、反時計廻りが正、単位は度とする。
・個別に、文字、矢印、円の色、線幅、線種を設定することはできない。 |
データ構造は下記のようにします。
UnitData.pas |
type
・・・
TDataDimBalloon = record // 構造化要素|バルーン
exf : Boolean ; // 存在フラグ(True:有り False:無し)
Layer : Integer ; // レイヤ(1〜256)
Color : Integer ; // 色 (0:レイヤ色 1〜256)
Ltype : Integer ; // 線種 (0:レイヤ線種 1〜32)
line_width: Integer ; // 線幅 (0:レイヤ線幅 1〜16)
vertex_number :integer; // 頂点数 (2〜)
vertex_x : array of double ; // 頂点X座標
vertex_y : array of double ; // 頂点Y座標
center_x : double ; // 中心X座標
center_y : double ; // 中心Y座標
Radius : double ; // 半径
arr_code : integer ; // 矢印コード(1-11)
arr_r : double ; // 矢印配置倍率
flg : integer ; // 寸法値の有無フラグ(0:無、1:有)
Font : Integer ; // 文字フォントコード
str : string ; // 文字列 (最大256バイト)
text_x : double ; // 文字列配置基点X座標
text_y : double ; // 文字列配置基点Y座標
Height : double ; // 文字範囲高
Width : double ; // 文字範囲幅
Spc : double ; // 文字間隔
Angle : double ; // 文字列回転角[°]
Slant : double ; // スラント角[°]
b_pnt : Integer ; // 文字配置基点 (1-9)
Direct : Integer ; // 文字書出し方向(1,2)
end;
・・・ |
データ追加用の関数は
function AddDataDimBalloon(s,st:string;lay,col,ltp,wid,fl,num,
ar,fnt,bp,dir:integer;vx,vy:array of double;cx,cy,cr,arr,
tx,ty,th,tw,ts,an,sl:double) : Boolean ; |
のようにします。線分・折線等と同様、最初に「データ追加先の複合図形名/シンボル名 null:用紙へ追加」を指定するようにしています。
UnitData.pas |
// バルーン データ項目の追加登録
function TDataClass.AddDataDimBalloon(s,st:string;lay,col,ltp,
wid,fl,num,ar,fnt,bp,dir:integer;
vx,vy:array of double;cx,cy,cr,arr,
tx,ty,th,tw,ts,an,sl:double) : Boolean ;
var
m,i : integer ;
a1,a2,w1,w2 : double ;
begin
Result := False;
if (st = '') then
fl := 0
else
if not(StrCheck(st)) then exit; // 文字列数チェック
if (lay < 1) or (lay > zLayN) then lay := 1 ;
if (col < 0) or (col > zColN) then col := 0 ;
if (ltp < 0) or (ltp > zLtpN) then ltp := 0 ;
if (wid < 0) or (wid > zWidN) then wid := 0 ;
if (fl <> 0) then fl := 1;
if (num < 2) then exit ;
if (cr < LIMIT8) then exit;
if (ar < 1)or(ar > 11) then ar := 9;
if (arr < LIMIT8) then arr := 1.0;
if (fl = 1)and( (th < LIMIT10)or(tw < LIMIT10) ) then exit ;
if (fnt < 0) or (fnt > zFntN) then fnt := 0 ;
if (bp < 1) or (bp > 9) then bp := 2 ; // 中下
if (dir <> 1) then dir := 2 ;
if (ts < 0.0) then ts := 0.0;
an := SetAngle(an);
if (sl < -85.0) or (sl > 85.0) then sl := 0.0;
// 座標チェック
try
for i:=1 to num-1 do
if (SamePosCheck(vx[i],vy[i], vx[i-1],vy[i-1])) then exit ;
except
exit ; // 動的配列エラー
end;
// 引出し線と中心点の1直線上チェック
a1 := dAngle((cx -vx[num-2]),(cy -vy[num-2]));
a2 := dAngle((vx[num-1]-vx[num-2]),(vy[num-1]-vy[num-2]));
a2 := SetAngle(a1-a2) ;
if (Abs(a2) > LIMIT10) then begin
// 1直線上でないため引出し線最終点の方を合わせる
dRev(w1,w2, vx[num-1],vy[num-1], vx[num-2],vy[num-2], -a1);
if (Abs(w1-vx[num-2]) < LIMIT10) then
exit // 不正値
else
dRev(vx[num-1],vy[num-1], w1,vy[num-2],
vx[num-2],vy[num-2], a1);
end;
//
if (s = '') then begin
// 用紙へ追加
・・・ |
これでバルーンデータの登録は出来るようになりましたので次は描画についてです。
UnitDataGraph.pas |
// バルーンの表示
procedure DisplayDimBalloon(lay,col,ltp,wid,
fl,num,ar,fnt,bp,dir:integer;vx,vy:array of double;
cx,cy,cr, arr,
tx,ty,th,tw,ts,an,sl:double;st:string;t:TMatrix);
var
i : integer ;
lx,ly : array of double ;
aa : double ;
begin
// 円
DisplayCircle(lay,col,ltp,wid, cx,cy,cr,t);
// 引出し線
SetLength(lx,num);
SetLength(ly,num);
for i:=0 to num-1 do begin
MtxXY(lx[i],ly[i], vx[i],vy[i], t);
end;
DisplayLines(lay,col,ltp,wid,num, lx,ly);
// 矢印
aa := Angle((lx[1]-lx[0]),(ly[1]-ly[0]));
DisplayArrow(lay,col,ar,lx[0],ly[0],aa,arr);
lx := nil ;
ly := nil ;
// 寸法値
if (fl = 1) then begin
DisplayText(lay,col,fnt,bp,dir, tx,ty,th,tw,ts,an,sl,st,t);
end;
end; |
以下、バルーンのテスト登録&描画結果です。頂点数は5とし頂点座標は乱数で指定しています。
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
▲PREV
▼NEXT
M7
Jw_cad
|