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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:要素データ編集
前回はアンドゥ(UNDO;元に戻す)・リドゥ(REDO;やり直し)について記述しました。ここでは、要素データ編集について考えていきます。
 
その前に、前回でのアンドゥ・リドゥにて、オペレーション番号の追加を Unit1.pas で直接 TDataClass内の変数を操作していましたので、OpNext 手続きを追加し、それを呼び出すようにしています。また、作図→アンドゥ(削除)後に各作図をすると、アンドゥして復帰も出来ないのに削除済の要素データはそのまま状態だとメモリが勿体無いので調整処理も追加しておきます。また、複合曲線定義内の各要素データのアンドゥ・リドゥ対応も追加します。
 
要素データ編集は先にも記述した通り、要素データ内の各データ項目内容を直接変更するのではなく、アンドゥ・リドゥに対応させるため、指定した要素データの削除+新しく要素データを追加、で行うようにします。但し、削除をしてしまった後、新しく要素データを追加する段階で各データ項目内容の指定ミスにより要素データが追加出来ない、という事になると、要素データ編集をするつもりが要素データ削除となってしまいますので、単純に、削除+追加で行ってしまうことは出来ません。予め、データ項目内容の各チェックをしてから、削除+追加を行う必要があります。
 
また、要素データのどの項目内容を編集するにせよ、項目内容を取得する必要性が出てきます。各要素データの識別番号は無く、要素番号(各要素の動的配列の要素インデックス)しかありませんが、それにより各要素データの項目内容を取得する関数を用意することとします。各要素データの動的配列内のメンバ変数値を直接参照する事は出来ますが、オブジェクト指向的には余り良い事でもありませんので。
同様に、レイヤ・色・線種・線幅・文字フォントについても、内容を取得する関数を用意するようにします。こちらは識別番号がありますので、それを使用します。
UnitData.pas
// レイヤ データ項目の取得
function GetLayer(n:integer;
 var s:string;var fla,col,ltp,wid,fnt,cn1,cn2:integer) : Boolean;
var
 idx : integer ;
begin
 Result := False;
 if (n < 1)or(n > LAYER_MAX_NUM) then exit; // レイヤ番号チェック
 idx := GetLayerIdx(n);
 if (idx = -1) then exit ;  // 未使用レイヤ番号
 
 with zLay[idx] do begin
  s  := name ;
  fla := Lflag ;
  col := Color ;
  ltp := Ltype ;
  wid := Width ;
  fnt := Mfont ;
  cn1 := cnt ;
  cn2 := Fcnt ;
 end;
 
 Result := True ;
end;
なお、ここでのレイヤ内要素数・複合図形内要素数は、削除やアンドゥ・リドゥ時などでは値変更を行っていないので、その正確な値が必要な場合には、別途、数え直す手続きを作成してそれを実行してから、値を取得する事になるでしょう。色等についても同様です。 同様の関数を色・線種・線幅・文字フォントについても作成しておきます。
function GetLayer(n:integer;var ・・・) : Boolean;
function GetColor(n:integer;var ・・・) : Boolean;
function GetLtype(n:integer;var ・・・) : Boolean;
function GetWidth(n:integer;var ・・・) : Boolean;
function GetFont(n:integer;var ・・・) : Boolean;
 
 
次に、複合図形定義及び各要素について記述していきます。これらはレイヤ等のように識別子としての番号をもっていませんから、取り合えず、動的配列の添字(要素Index)を識別番号としています。
 
// 複合図形定義 データ項目の削除
// n : 複合図形定義 要素Index (0-)
// (ret) True:OK False:NG
function TDataClass.DelFZukeiDef(n:integer) : Boolean;
begin
 Result := False ;
 if (n < 0)or(n >= fDefN) then exit; // 要素Indexチェック
 if not(fDef[n].exf) then exit; // 既に削除済
 
 if (OpAdd(4,3,n)) then begin
  fDef[n].exf := False ;
  Result := True ;
 end;
end;
 
// 複合図形定義 データ項目の取得
// n : 複合図形定義 要素Index (0-)
// ex : 存在フラグ
// s : 複合図形名
// f : フラグ(1-4)
// cn : 要素数
// (ret) True:OK False:NG
function TDataClass.GetFZukeiDef(n:integer;
 var ex:Boolean;var s:string;var f,cn:integer) : Boolean;
begin
 Result := False;
 if (n < 0)or(n >= fDefN) then exit; // 要素Indexチェック
 
 with fDef[n] do begin
  ex := exf ;
  s := name ;
  f := Flag ;
  cn := cnt ;
 end;
 
 Result := True ;
end;
 
// 複合図形定義 データ項目の編集登録
// n : 複合図形定義 要素Index (0-)
// s : 複合図形名
// f : フラグ(1-4)
// cn : 要素数
// (ret) True:登録OK False:NG
function TDataClass.EditFZukeiDef(n:integer;
 s:string;f,cn:integer) : Boolean;
var
 l : integer ;
begin
 Result := False;
 if (n < 0)or(n >= fDefN) then exit; // 要素Indexチェック
 if not(fDef[n].exf) then exit;   // 既に削除済
 if not(StrCheck(s)) then exit;   // 文字列数チェック
 if (f < 1)or(f > 4) then exit;   // フラグ指定エラー
 l := StrBytes(s);
 if (f <= 2) then begin
  if (l < 1)or(l > (256-9)) then exit;
 end
 else begin
  if (l < 1)or(l > (256-8)) then exit;
 end;
 if (FZukeiNameCheck(n+1,s) <> 0) then exit; // 既に使用済
 
 if (DelFZukeiDef(n)) then begin
  if (AddFZukeiDef(s,f)) then begin
   with fDef[fDefN-1] do begin
    cnt := cn ;
    
    hOrd := fDef[n].hOrd ;
    hOrdN := fDef[n].hOrdN;
    ・・・
   end;
   Result := True ;
  end;
 end;
end;
上記のように、複合図形定義・シンボル図形定義・複合曲線定義は、変更時におけるデータ追加の際のメンバ要素データのコピーを行う必要があり、それらデータ量が大きくなればなるほど、メモリも大量に消費してしまいます。例えば、座標系を1度変更するだけで、その複合図形内のデータ分のメモリが倍必要になってしまいます。2度変更すると3倍に、3度変更すると4倍になってしまいます。これではいくらメモリがあっても直ぐに足りなくなってしまいます。
 
ですので今更ですが、複合図形定義・シンボル図形定義・複合曲線定義のデータ構造を変更します。メンバ要素データを別にとって、その要素Index値を扱う、というようにします。以下、複合曲線定義の例です。
UnitData.pas
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
 ・・・
 cDef : array of TCompositeCurveDef; // 構造化要素|複合曲線定義
 cDefN : Integer ;          // 数
 ・・・
TCompositeCurveDefData = record // 複合曲線定義の要素データ
 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;
 
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 ;     // 参照数
 datn : Integer ;     // 複合曲線定義の要素データIndex
end;
 
TDataClass = class
 ・・・
 cDef : array of TCompositeCurveDef; // 構造化要素|複合曲線定義
 cDefN : Integer ;          // 数
 cDefD : array of TCompositeCurveDefData; // 要素データ
 cDefDN: Integer ;            // 数
 ・・・
これに従うよう、初期化・解放、要素データへのアクセス等の手続き・関数を全て変更します。
// 複合図形定義 データ項目の取得
// n : 複合図形定義 要素Index (0-)
// ex : 存在フラグ
// s : 複合図形名
// f : フラグ(1-4)
// cn : 要素数
// dn : データ要素Index
// (ret) True:OK False:NG
function TDataClass.GetFZukeiDef(n:integer;
 var ex:Boolean;var s:string;var f,cn,dn:integer) : Boolean;
begin
 Result := False;
 if (n < 0)or(n >= fDefN) then exit; // 要素Indexチェック
 
 with fDef[n] do begin
  ex := exf ;
  s := name ;
  f := Flag ;
  cn := cnt ;
  dn := datn ;
 end;
 
 Result := True ;
end;
 
// 複合図形定義 データ項目の編集登録
// n : 複合図形定義 要素Index (0-)
// s : 複合図形名
// f : フラグ(1-4)
// cn : 要素数
// dn : データ要素Index
// (ret) True:登録OK False:NG
function TDataClass.EditFZukeiDef(n:integer;
 s:string;f,cn,dn:integer) : Boolean;
var
 l : integer ;
begin
 Result := False;
 if (n < 0)or(n >= fDefN) then exit; // 要素Indexチェック
 if not(fDef[n].exf) then exit;   // 既に削除済
 if (dn < 0)or(dn >= fDefDN) then exit; // データ要素Indexチェック
 if not(StrCheck(s)) then exit;   // 文字列数チェック
 if (f < 1)or(f > 4) then exit;   // フラグ指定エラー
 l := StrBytes(s);
 if (f <= 2) then begin
  if (l < 1)or(l > (256-9)) then exit;
 end
 else begin
  if (l < 1)or(l > (256-8)) then exit;
 end;
 if (FZukeiNameCheck(n+1,s) <> 0) then exit; // 既に使用済
 
 if (DelFZukeiDef(n)) then begin
  if (AddFZukeiDef(s,f)) then begin
   with fDef[fDefN-1] do begin
    cnt := cn ;
    datn := dn ;
   end;
   Dec(fDefDN);  // 要素データは追加しないので-1しておく
   Result := True ;
  end;
 end;
end;
 
メンバ要素データへのアクセスは以下のように変更します。以下は複合図形の場合ですが、シンボル図形、複合曲線も同様に行います。
with fDef[m-1] do begin
 ・・・
with fDef[m-1] do begin
 dn := datn ;
end;
with fDefD[dn] do begin
 ・・・
 
これらの変更を行った上で、シンボル図形定義・複合曲線定義についても、データ項目の削除、データ項目の取得、データ項目の編集登録の関数を作成しておきます。
function AddSymbolDef(s:string) : Boolean;
function DelSymbolDef(n:integer) : Boolean;
function GetSymbolDef(n:integer;
 var ex:Boolean;var s:string;var cn,dn:integer) : Boolean;
function EditSymbolDef(n:integer;s:string;cn,dn:integer):Boolean;
function AddCCurveDef(id,col,ltp,wid,inv:integer) : Boolean;
function DelCCurveDef(n:integer) : Boolean;
function GetCCurveDef(n:integer;var ex:Boolean;
 var id,col,ltp,wid,inv,cn,dn:integer) : Boolean;
function EditCCurveDef(n,id,col,ltp,wid,inv,cn,dn:integer):Boolean;
 
 
次に、各データ項目の取得、編集登録の関数を作成しておきます。
function GetDataFZukei(・・・
function EditDataFZukei(・・・
 
function GetDataSZukei(・・・
function EditDataSZukei(・・・
 
function GetDataTen(・・・
function GetDataLine(・・・
function GetDataLines(・・・
function GetDataCircle(・・・
function GetDataArc(・・・
function GetDataEllipse(・・・
function GetDataEllipseArc(・・・
function GetDataText(・・・
function GetDataBezier(・・・
function GetDataBspline(・・・
function GetDataSpline(・・・
function GetDataClothoid(・・・
function GetDataArrow(・・・
function GetDataImage(・・・
function GetDataDocument(・・・
function GetDataTable(・・・
function GetDataDimLine(・・・
function GetDataDimArc(・・・
function GetDataDimAngle(・・・
function GetDataDimRadius(・・・
function GetDataDimDiameter(・・・
function GetDataDimLeader(・・・
function GetDataDimBalloon(・・・
function GetDataHatch1(・・・
function GetDataHatch2(・・・
function GetDataHatch3(・・・
function GetDataHatch4(・・・
function GetDataHatch5(・・・
function GetDataHatch6(・・・
function GetDataHatch7(・・・
function EditDataTen(・・・
function EditDataLine(・・・
function EditDataLines(・・・
function EditDataCircle(・・・
function EditDataArc(・・・
function EditDataEllipse(・・・
function EditDataEllipseArc(・・・
function EditDataText(・・・
function EditDataBezier(・・・
function EditDataBspline(・・・
function EditDataSpline(・・・
function EditDataClothoid(・・・
function EditDataArrow(・・・
function EditDataImage(・・・
function EditDataDocument(・・・
function EditDataTable(・・・
function EditDataDimLine(・・・
function EditDataDimArc(・・・
function EditDataDimAngle(・・・
function EditDataDimRadius(・・・
function EditDataDimDiameter(・・・
function EditDataDimLeader(・・・
function EditDataDimBalloon(・・・
function EditDataHatch1(・・・
function EditDataHatch2(・・・
function EditDataHatch3(・・・
function EditDataHatch4(・・・
function EditDataHatch5(・・・
function EditDataHatch6(・・・
function EditDataHatch7(・・・
 
削除、編集によって、参照カウント数が変動しますが、これには現在対応していません。これについては今後、参照カウント数の更新を行うための手続きを別途作成することとします。
 
 
それでは、ここまでのテストプログラムです。実行ファイル、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.