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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:引出し線
前頁は、構造化要素の「直径寸法」について述べましたので今回は、SXF仕様書の次の構造化要素の「引出し線」について考えてみます。
 
引出し線は、注記、注釈、引出し注記、引出し注釈、リーダー、等のように呼ぶCADソフトはありますが、例えば、キリ、ザグリ、ネジ(ネジ深さ)、等を記入するのによく利用されます。また、面取り寸法というデータ要素が無い場合には、この引出し線で面取り寸法を示す場合もあるでしょう。ただ、面取り寸法は、半径寸法等のように、図形長さと連動してきますから、面取り寸法は面取り寸法データ要素として、あった方が良いとは思えます。また、座標寸法も引出し線付きで表記される場合がありますが、こちらも同様です。
 
SXF仕様には、面取り寸法や座標寸法というものはありませんので、この引出し線データ要素を利用して表現するのでしょうけれども、この辺りは、CADソフト側で実際にどのように実装するのかを決定すべし、という事なのでしょう。もとより、SXF仕様は、データ交換記述方式であって、CADアプリケーション仕様の定義を記述するものではありませんから。
 
まぁ、これまで述べた直線寸法、弧長寸法、角度寸法、直径寸法、半径寸法にしても、図面上で記述する箇所が狭くて描けない場合には、引き出して寸法値を描いたりする訳ですから、それをこの引出し線データ要素を利用するのであれば、相互関連性/寸法値連動についてもしっかり考えておかないといけなくなるでしょう。
 
引出し線は、SXF仕様書では以下のように記載されています。
構造化要素|引出し線

※SXF Ver.3.1仕様書より
パラメータ説明範囲
LayerIntレイヤコード
ColorInt色コード
TypeInt線種コード
line_widthInt線幅コード
vertex_numberdouble頂点数 2≦数<int(32bits)
の最大値
vertex_xCArray<double, double>X座標(配列) double(64bits)の
範囲(有効桁15桁)
vertex_yCArray<double, double>Y座標(配列) double(64bits)の
範囲(有効桁15桁)
arr_codeInt矢印コード
arr_rdouble矢印配置倍率0<倍率<1.0×1015
FlgInt寸法値の有無フラグ(0:無、1:有)
FontInt文字フォントコード
str[257]Char文字列 0<文字列長≦256
バイト
text_xdouble文字列配置基点X座標 double(64bits)の
範囲(有効桁15桁)
text_ydouble文字列配置基点Y座標 double(64bits)の
範囲(有効桁15桁)
Heightdouble文字範囲高0<高さ<1.0×1015
Widthdouble文字範囲幅0< 幅 <1.0×1015
Spcdouble文字間隔0≦間隔<1.0×1015
Angledouble文字列回転角0≦ 度 <360
Slantdoubleスラント角度-85≦ 度 ≦85
b_pntInt文字配置基点(1:左下,2:中下,3:右下,4:左中,5:中中,6:右中,7:左上,8:中上,9:右上)
DirectInt文字書出し方向(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から選ぶ。矢印の形状は直線寸法の補足を参照のこと。
・矢印の大きさは、用紙座標系で解釈する。
・矢印は、引出し線を構成する点列の第1点目に配置する。
・文字がない場合は矢印として扱う。
・角度は水平右側が0度、反時計廻りが正、単位は度とする。
・個別に、文字、矢印の色、線幅、線種を設定することはできない。
 
頂点数 vertex_numberが double型となっていますが、これは正しいのか、Int型の間違いなのか、よく分かりませんけれども、ここでは integer型として定義します。
 
データ構造は下記のようにします。
UnitData.pas
type
 ・・・
 TDataDimLeader = 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座標
  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 AddDataDimLeader(s,st:string;lay,col,ltp,wid,fl,num,
 ar,fnt,bp,dir:integer;vx,vy:array of double; arr,
 tx,ty,th,tw,ts,an,sl:double) : Boolean ;
のようにします。線分・折線等と同様、最初に「データ追加先の複合図形名/シンボル名 null:用紙へ追加」を指定するようにしています。
 
UnitData.pas
// 引出し線 データ項目の追加登録
function TDataClass.AddDataDimLeader(s,st:string;lay,col,ltp,wid,
 fl,num,ar,fnt,bp,dir:integer;vx,vy:array of double; 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 (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;
 //
 if (s = '') then begin
  // 用紙へ追加
  ・・・
 
これで引出し線データの登録は出来るようになりましたので次は描画についてです。
 
UnitDataGraph.pas
// 引出し線の表示
procedure DisplayDimLeader(lay,col,ltp,wid,
 fl,num,ar,fnt,bp,dir:integer;vx,vy:array of double; arr,
 tx,ty,th,tw,ts,an,sl:double;st:string;t:TMatrix);
var
 i : integer ;
 lx,ly : array of double ;
 aa : double ;
begin
 // 寸法線
 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
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.