|
それでは、幾何要素/表記要素フィーチャを見る前に、構造化要素フィーチャの複合図形定義と複合図形配置について先に見ておきます。従来のCADソフトでいうと、複合図形定義はブロック定義、複合図形配置はブロック挿入、とほぼ同じような感じと考えればイメージしやすいと思います。
複合図形定義は、その内部に線分フィーチャ、円弧フィーチャ、楕円弧フィーチャ、テキストフィーチャ、複合図形配置フィーチャ、・・・を持ちます。
構造化要素|複合図形定義 |
|
パラメータ | 型 | 説明 | 範囲 |
name[257] | Char | 複合図形名 | 0<文字列長さ≦256バイト |
Flag | Int | 複合図形種別フラグ(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 を追加しておきます。
次に、複合図形配置です。
構造化要素|複合図形配置 |
|
パラメータ | 型 | 説明 | 範囲 |
Layer | Int | レイヤコード(0が指定された場合は、レイヤは定義しない) |
|
name[257] | Char | 複合図形名 | 0<文字列長さ≦256バイト |
X | double | 配置位置X座標 |
double(64bits)の範囲
(有効桁15桁) |
Y | double | 配置位置Y座標 |
double(64bits)の範囲
(有効桁15桁) |
Angle | double | 回転角 | 0≦度<360 |
ratio_x | double | X方向尺度 | 0<尺度<1.0×1015 |
ratio_y | double |
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
|