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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:複合図形定義と複合図形配置(1)
それでは、幾何要素/表記要素フィーチャを見る前に、構造化要素フィーチャの複合図形定義と複合図形配置について先に見ておきます。従来のCADソフトでいうと、複合図形定義はブロック定義、複合図形配置はブロック挿入、とほぼ同じような感じと考えればイメージしやすいと思います。
 
複合図形定義は、その内部に線分フィーチャ、円弧フィーチャ、楕円弧フィーチャ、テキストフィーチャ、複合図形配置フィーチャ、・・・を持ちます。
構造化要素|複合図形定義
 
パラメータ説明範囲
name[257]Char複合図形名0<文字列長さ≦256バイト
FlagInt複合図形種別フラグ(1:部分図(数学座標系)、2:部分図(測地座標系)、3:作図グループ、4:作図部品)
備考
・対象フィーチャは、用紙、レイヤからリンクされない。
・Part21ファイル上の複合図形名には、部分図、作図部品、作図グループを区別するため、以下の接頭文字列が付加されるため、使用できる文字列長はこれらの接頭語を含めて256バイトであることに注意すること。
  部分図(数学座標系):$$SXF_FM_複合図形名(FM_ 部分図をあらわす)
  部分図(測地座標系):$$SXF_FG_複合図形名(FG_ 部分図をあらわす)
  作図グループ:$$SXF_G_複合図形名(G_ 作図グループをあらわす)
  作図部品: $$SXF_P_複合図形名 (P_が作図部品であることをあらわす)
・複合図形配置で利用されていない複合図形定義が存在してはならない。
という訳で、複合図形定義には4種類存在し
 ・部分図(数学座標系=XY座標系)として定義
 ・部分図(測地座標系=YX座標系)として定義
 ・作図グループとして定義
 ・作図部品として定義
があり、必ず、複合図形配置で配置しないといけないこと。部分図、作図グループとして定義したものは1回のみ配置可能。階層構造は
 用紙→(部分図)→(作図グループ)→(作図部品)→幾何要素
となり、部分図は1階層のみ、作図グループ・作図部品は多階層が可能。
UnitData.pas
type
 ・・・
 TFukugoZukeiDef = record  // 構造化要素|複合図形定義
  exf : Boolean ;   // 存在フラグ(True:有り False:無し)
  name : string ;   // 複合図形名
  Flag : Integer ;  // 種別フラグ
  cnt : Integer ;   // 配置数
  // ・・・幾何要素データ等が入る予定・・・
 end;
 
 TDataClass = class
  public
  { Public 宣言 }
  ・・・
  fDef : array of TFukugoZukeiDef;  // 複合図形定義
  fDefN: Integer ;          // 数
  constructor Create;
  destructor Free;
  ・・・
  function FZukeiNameCheck(n:integer;s:string) : Integer;
  function AddFZukeiDef(s:string;f:integer) : Boolean;
 end;
のようなイメージでしょうか? 作図グループの場合は1度のみ配置可能となりますので、配置個を示す変数 cnt を追加しておきます。
 
 
次に、複合図形配置です。
構造化要素|複合図形配置
 
パラメータ説明範囲
LayerIntレイヤコード(0が指定された場合は、レイヤは定義しない)
name[257]Char複合図形名0<文字列長さ≦256バイト
Xdouble配置位置X座標 double(64bits)の範囲
(有効桁15桁)
Ydouble配置位置Y座標 double(64bits)の範囲
(有効桁15桁)
Angledouble回転角0≦度<360
ratio_xdoubleX方向尺度0<尺度<1.0×1015
ratio_ydouble Y方向尺度
(レベル1では、X方向と同一と見なす)
0<尺度<1.0×1015
備考
・角度は水平右側が0度、反時計廻りが正、単位は度とする。
・部分図配置は、用紙に配置可能である。
・部分図定義1つに対し1度のみ配置可能である。
・作図グループ配置は、用紙,部分図,作図グループに配置可能である。
・作図グループ定義1つに対し1度のみ配置可能である。
・作図部品配置は、用紙,部分図,作図グループ,作図部品に配置可能である。
・作図部品定義1つに対し複数配置可能である。
複合図形の配置方法は、複合図形定義の各データを、X方向尺度・Y方向尺度で拡大縮小をしたあと、回転角によって回転を行い、複合図形の原点(0,0)を配置位置(X,Y)に配置(移動)する、というイメージです。
 
作図グループを配置する際には、
 (配置位置X座標,Y座標) = (0.0,0.0)
 回転角度=0.0
 X方向尺度=Y方向尺度=1.0
とみなす、とありますので、パラメータ内容がどんな値であっても作図グループを配置する場合には、上記でリセットしたほうが良いと思われます。
 
 
とりあえず、
UnitData.pas
type
 ・・・
 TDataFukugoZukei = record  // 構造化要素|複合図形配置
  exf : Boolean ;   // 存在フラグ(True:有り False:無し)
  Layer : Integer ;  // レイヤ(0:定義しない 1〜256)
  name : string ;   // 複合図形名
  X : double ;     // 配置位置X座標
  Y : double ;     // 配置位置Y座標
  Angle : double ;   // 回転角[°]
  ratio_x : double ;  // X方向尺度
  ratio_y : double ;  // Y方向尺度
 end;
 ・・・
 TDataClass = class
  public
  { Public 宣言 }
  ・・・
  dFzk : array of TDataFukugoZukei; // 構造化要素|複合図形配置
  dFzkN: Integer ;          // 数
のようなイメージでしょうか?
 
複合図形定義の中にも複合図形配置はありますので
UnitData.pas
type
 ・・・
 TDataFukugoZukei = record  // 構造化要素|複合図形配置
  exf : Boolean ;   // 存在フラグ(True:有り False:無し)
  Layer : Integer ;  // レイヤ(0:定義しない 1〜256)
  name : string ;   // 複合図形名
  X : double ;     // 配置位置X座標
  Y : double ;     // 配置位置Y座標
  Angle : double ;   // 回転角[°]
  ratio_x : double ;  // X方向尺度
  ratio_y : double ;  // Y方向尺度
 end;
 
 TFukugoZukeiDef = record  // 構造化要素|複合図形定義
  exf : Boolean ;   // 存在フラグ(True:有り False:無し)
  name : string ;   // 複合図形名
  Flag : Integer ;  // 種別フラグ
  cnt : Integer ;   // 配置数
  // ・・・幾何要素データ等が入る予定・・・
  mFzk : array of TDataFukugoZukei; // 構造化要素|複合図形配置
  mFzkN: Integer ;          // 数
 end;
 
 TDataClass = class
  public
  { Public 宣言 }
  ・・・
  dFzk : array of TDataFukugoZukei; // 構造化要素|複合図形配置
  dFzkN: Integer ;          // 数
のようになりますね。すると、一番最初の初期化の場合は
UnitData.pas
dFzk := nil;
dFzkN := 0;
fDef := nil;
fDefN := 0;
で良いですが、最後のメモリ解放の場合は
UnitData.pas
dFzk := nil;
dFzkN := 0;
for i:=0 to fDefN-1 do begin
 with fDef[i] do begin
  mFzk := nil;
 end;
end;
fDef := nil;
fDefN := 0;
のように処理を行う必要があるでしょう。
 
さて、複合図形配置を追加する場合ですが、上記のように、TDataClass内のdFzkに直接追加するのか、或いは、複合図形定義 fDefの中のmFzk に追加するのかを分けないといけません。2つ関数を作ってもいいのですが面倒ですので追加先の指定をするようにします。追加先の名前が指定されている場合には、その名前の複合図形定義へ、名前が指定されていない場合には、TDataClass内のdFzkに追加する事とします。
UnitData.pas
TDataClass = class
 public
  { Public 宣言 }
  ・・・
  function AddDataFZukei(s:string;lay:integer;nam:string;px,py,an,sx,sy:double) : Boolean;
 private
  { Private 宣言 }
 end;
 
・・・
 
// 複合図形配置 データ項目の追加登録
//  s : データ追加先の複合図形名 null:用紙へ追加
//  lay: レイヤ(0,1-256)
//  nam: 複合図形名
//  px : 配置点X
//  py : 配置点Y
//  an : 回転角[°]
//  sx : 尺度X
//  sy : 尺度Y
// (ret) True:登録OK False:NG
function TDataClass.AddDataFZukei(s:string;lay:integer;nam:string;px,py,an,sx,sy:double) : Boolean;
・・・
 
 
取り合えず、ここまでのテストプログラムです。変換行列やアフィン変換などについてはまだコーディングしていません。実行ファイル、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.