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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:複合曲線定義
前頁は、構造化要素の「バルーン」について述べました。SXF仕様書の次の構造化要素は「ハッチング」なのですが、ハッチングの外形及び中抜きの領域は複合曲線で定義する事になっています。ですので「ハッチング」を考える前に「複合曲線定義」について考えます。
 
複合曲線は、円弧・楕円弧・折線・スプライン曲線の集まりで構成される連続曲線状態のもので、ちゃんと接続されていて閉じていて、交差・重なり・接する事は許されない、とあります。という事はおそらく円弧・楕円弧の始角・終角・向きの整合性も保つ必要があるのでしょう。勿論、フィーチャの順番は最優先でしょう。
 
複合曲線は、それ単体で利用される事は無い、との事です。例えば、CADソフトでよくあるようなポリラインやグループ化・曲線化といった事には利用されない、という事ですね。あくまでもハッチングの領域定義の為だけに存在するもののようです。
 
複合曲線定義は、SXF仕様書では以下のように記載されています。
構造化要素|複合曲線定義

※SXF Ver.3.1仕様書より
パラメータ説明範囲
ColorInt色コード
TypeInt線種コード
line_widthInt線幅コード
invisibilityInt表示/非表示フラグ(0:非表示、1:表示)
備考
・複合曲線は、ハッチングの外形または中抜きの図形としてのみ使用できる。
・複合曲線定義のアセンブリ型フィーチャコードがハッチング要素の外形または中抜きで使用するフィーチャコードである。
・構成要素として使用できるフィーチャ要素は、円弧、楕円弧、折線、スプライン曲線のみである。
・構成要素は、接続し、閉じている必要があり、交差、重なり(中抜の複合曲線が、外形に1点で接する場合も含む)は許さない。
・構成要素は、用紙、複合図形定義(部分図、作図グループ、作図部品)にはリンクされない。
 
色・線種・線幅を指定するという事は、領域を示す図形(複合曲線)そのものをどのような色・線種・線幅で描画するか、という事を決めるのでしょうから、表示/非表示フラグは当然、領域図形を表示するか表示しないか、つまり、ハッチングの線だけを表示するのかしないのかを決めるという事でしょう。レイヤについてはハッチングの方で指定するようになっています。領域図形内の円弧・楕円弧・折線・スプライン曲線それぞれの色・線種・線幅は無効、とします。
 
データ構造は下記のようにします。
UnitData.pas
type
 ・・・
 TCompositeCurveDef = record  // 構造化要素|複合曲線定義
  exf : Boolean ;     // 存在フラグ(True:有り False:無し)
  number : Integer ;    // ID番号 (1〜)
  Color : Integer ;    // 色 (0:レイヤ色  1〜256)
  Ltype : Integer ;    // 線種 (0:レイヤ線種 1〜32)
  line_width: Integer ;  // 線幅 (0:レイヤ線幅 1〜16)
  invisibility: integer;  // 表示/非表示フラグ (0,1)
  cnt : Integer ;     // 参照数
  mOrd : array of TDataOrder ;  // 作図順
  mOrdN : Integer ;        // 数
  mLns : array of TDataLines;   // 幾何要素|折線
  mLnsN : Integer ;        // 数
  mArc : array of TDataArc;    // 幾何要素|円弧
  mArcN : Integer ;        // 数
  mEAr : array of TDataEllipseArc;// 幾何要素|楕円弧
  mEArN : Integer ;        // 数
  mBez : array of TDataBezier;  // 幾何要素|スプライン→ベジェ
  mBezN : Integer ;        // 数
  mBsp : array of TDataBspline;  // 幾何要素|Bスプライン曲線
  mBspN : Integer ;        // 数
  mSpl : array of TDataSpline;  // 幾何要素|スプライン曲線
  mSplN : Integer ;        // 数
 end;
 ・・・
 TDataClass = class
 public
  { Public 宣言 }
  ・・・
  cDef : array of TCompositeCurveDef; // 構造化要素|複合曲線定義
  cDefN : Integer ;          // 数
  ・・・
これはシンボル定義同様、TDataClass内でのみ変数定義されるものとします。まず、複合曲線定義の追加用の関数は
function AddCCurveDef(id,col,ltp,wid,inv:integer) : Boolean;
のようにします。部分図/作図グループ/作図部品、シンボルへの図形データ登録は AddData〜関数で行っていますが、複合曲線定義へのデータ登録は別の関数を用意します。
function AddCCrvDataOrder(idn,tp,no:integer) : Boolean;
function AddCCrvDataLines(id,num:integer;
 vx,vy:array of double) : Boolean;
function AddCCrvDataArc(id,dir:integer;
 cx,cy,cr,sa,ea:double) : Boolean;
function AddCCrvDataEllipseArc(id,dir:integer;
 cx,cy,rx,ry,ra,sa,ea:double) : Boolean;
function AddCCrvDataBezier(id,sp,num:integer;
 vx,vy:array of double) : Boolean;
function AddCCrvDataBspline(id,sp,num:integer;
 vx,vy:array of double) : Boolean;
function AddCCrvDataSpline(id,stp,sp,num:integer;
 av:double;vx,vy:array of double) : Boolean;
 
UnitData.pas
// 複合曲線定義 データ項目の追加登録
//  内部の各データは別途登録
//  id : ID番号(1-)
//  col: 色  (0:レイヤ色  1〜256)
//  ltp: 線種 (0:レイヤ線種 1〜32)
//  wid: 線幅 (0:レイヤ線幅 1〜16)
//  inv: 表示/非表示フラグ (0,1)
// (ret) True:登録OK False:NG
function TDataClass.AddCCurveDef(id,col,ltp,wid,inv:integer) : Boolean;
var
 i : integer ;
begin
 Result := False;
 if (id < 1) then exit ;
 // ID番号が使用済かどうかをチェック
 for i:=0 to cDefN-1 do begin
  if not(cDef[i].exf) then continue ;
  if (cDef[i].number = id) then exit ; // 使用済
 end;
 //
 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 (inv <> 0) then inv := 1 ;
 //
 try
  Inc(cDefN);
  SetLength(cDef, cDefN);
  with cDef[cDefN-1] do begin
   exf := True ;
   number := id ;  // ID番号 (1〜)
   Color := col ;  // 色 (0:レイヤ色  1〜256)
   Ltype := ltp ;  // 線種 (0:レイヤ線種 1〜32)
   line_width := wid ; // 線幅 (0:レイヤ線幅 1〜16)
   invisibility:= inv ; // 表示/非表示フラグ (0:非表示,1:表示)
   cnt := 0 ;
  end;
  DataClearCCurveMember(cDefN-1);
  Result := True ;
 except
  Dec(cDefN);
  SetLength(cDef, cDefN);
 end;
end;
 
// 複合曲線定義内 データ作図順の登録
//  idn: ID番号のIndex(0-)
//  tp : データタイプ (1-)
//  no : データ番号 (0-)
function TDataClass.AddCCrvDataOrder(idn,tp,no:integer) : Boolean;
begin
 Result := False;
 with cDef[idn] do begin
  try
   Inc(mOrdN);
   if ((mOrdN mod 100) = 1) then SetLength(mOrd, mOrdN+99);
   with mOrd[mOrdN-1] do begin
    DataType := tp ;
    DataNo := no ;
   end;
   Result := True ;
  except
   Dec(mOrdN);
  end;
 end;
end;
 
// 複合曲線定義内 折線 データ項目の追加登録
// id : ID番号(1-)
// num: 頂点数
// vx : 頂点X ※呼び出し側で動的配列確保を行っている事
// vy : 頂点Y
// (ret) True:登録OK False:NG
function TDataClass.AddCCrvDataLines(id,num:integer;
 vx,vy:array of double) : Boolean;
var
 i,idn : integer ;
begin
 Result := False;
 // ID番号が有効かどうかをチェック
 idn := -1 ;
 for i:=0 to cDefN-1 do begin
  if not(cDef[i].exf) then continue ;
  if (cDef[i].number = id) then begin
   idn := i ;
   break ;
  end;
 end;
 if (idn = -1) then exit ; // ID番号無効
 
 if (num <=0) then exit ;
 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;
 
 with cDef[idn] do begin
  if (AddCCrvDataOrder(idn,3,mLnsN)) then begin
   try
    Inc(mLnsN);
    if ((mLnsN mod 100) = 1) then SetLength(mLns, mLnsN+99);
    with mLns[mLnsN-1] do begin
     exf := True ;
     Layer := 0 ;
     Color := 0 ;
     Ltype := 0 ;
     line_width := 0 ;
     Number := num ;
     SetLength(X, num);
     SetLength(Y, num);
     for i:=0 to num-1 do begin
      X[i] := vx[i];
      Y[i] := vy[i];
     end;
    end;
    Result := True ;
   except
    Dec(mLnsN);
    Dec(mOrdN);
   end;
  end;
 end;
end;
折線以外の円弧・楕円弧・スプライン曲線も上記と同様です。
 
これで複合曲線定義データの登録は出来るようになりました。ただ、これまでのように、これそのものの描画というものはありませんので(※ハッチング描画の際に表示フラグがオンの場合は描画を行いますが)ここでは取り合えず、これで終わりにしておきます。
 
 
それでは、ここまでのテストプログラムです。実行ファイル、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.