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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】書き出しデータの取り込み(4)
前々々回から外部変形での書き出しデータ「JWC_TEMP.TXT」の取り込みについて記述しています。選択・指示した要素データを取得する事について考えていきます。前回は属性等の取り込みについて述べましたので今回は要素データの取り込みについて記述します。

プロジェクト「p028」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p028」というフォルダを作成し、Windowsのエクスプローラ等で「p027」内のファイルを「p028」の中へコピーします(※移動しないよう注意)
Delphi6を起動します。メニュー「ファイル」→「プロジェクトを開く」を実行し、「C:\DelphiProgram\jww\p028」内の「p027.dpr」を開きます。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p028−取り込みテスト(4)
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p028

メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p028」の中に「p028.dpr」として保存
「C:\DelphiProgram\jww\p028」の中に「p027.〜」のファイルが残っていますので、Windowsのエクスプローラ等で削除します。

オブジェクトインスペクタで Form1 のプロパティを変更します。
Caption取り込みテスト(4)タイトルバーに表示されます

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。

◆要素順
線や円など、選択・指示されたデータがどのような順序で書き出されたのかを格納する変数を用意します。線や円などを示す要素種類No、線データの何個目かを示す要素No、を動的配列で持つようにします。以降、線データであれば線データ用動的配列、円データであれば円データ用動的配列、に入れる事になりますが、線1→円1→線2→線3→円2→・・・とデータが書き出しされている場合、線1→線2→線3→・・・と円1→円2→・・・であれば再現出来ますが、元の順番を格納しておかないと、元の順番で出力しなおす事が出来なくなってしまいます。
要素種類Noは、
 1:線
 2:円
 3:弧、楕円
 4:文字
 5:点
 6:点マーカー
 7:寸法図形
 8:ブロック図形
 9:線形ソリッド図形
 10:三角形ソリッド図形
 11:四角形ソリッド図形
 12:円ソリッド図形
 13:円周ソリッド図形
 14:円環ソリッド図形(同一扁平率タイプ)
 15:円環ソリッド図形(同一幅タイプ)
とします。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntNo = record
   yn : integer ; // 要素種別No
   no : integer ; // 各要素内での要素No 0〜
  end;
(・・・中略・・・)
  // 要素データ関連
  JW_EntN : integer ; // 全要素データ数
  JW_EntNo : array of TJwwEntNo; // 要素No格納用
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  //
  JW_EntN := 0;
  JW_EntNo := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntNo := nil;
end;
(・・・後略・・・)
 
◆属性データ
各要素データ共通で利用する属性データを用意します。要素データによっては不要のものもありますが、
・指示点&要素指示の際の番号(JGW_IPNo)
・レイヤグループ(JGW_LGrp)
・レイヤ(JGW_Lay)
・線色(JGW_Col)
・線種(JGW_Ltp)
・線幅(JGW_Wid)
・属性(JGW_Attr)
とします。曲線データ(曲線属性)は外部変形では線データのみ対応ですので線データの方に付ける事とします。その他、各要素データ個別のものは各要素データの方で対処する事とします。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntAttr = record
   IPNo : integer ; // 指示点&要素指示の際の番号 0:選択要素
   LGrp : integer ; // レイヤグループ
   Lay : integer ; // レイヤ
   Col : integer ; // 線色
   Ltp : integer ; // 線種
   Wid : integer ; // 線幅[1/100mm単位]
   Attr : integer ; // フラグ属性
  end;
(・・・後略・・・)
 
◆「線」要素データ
線データは
線データ(始点x1,y1 終点x2,y2)
 書式:x1 y1 x2 y2
と書き出されます。これに曲線データ
「pl」 曲線データ
 書式:pl
    x1 y1 x2 y2
    x2 y2 x3 y3
    x3 y3 x4 y4
    #
を考慮します。曲線データについては前回に記述しました通り、フラグ変数 JGW_CrvFl が True の場合、変数 JGW_CrvNo の値を曲線データ番号として登録します。False の場合は 0値で登録します。線データの登録が終わったらハッチ等の属性の変数 JGW_Attr をクリア(0値化)します。
また、寸法図形の線である場合=変数 JGW_DimFl が True の場合には、線データとして登録するのではなく、寸法図形用の一時的変数 JW_EntSunLine に代入するものとします。
線データは、その「線」要素を示す文字が無く4つの実数値で表されています。ですので一番最後に判定するものとし、4項目である、という事だけで線データとみなしていますので注意して下さい。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntLine = record
   att : TJwwEntAttr; // 属性
   CrvNo : integer ; // 曲線データ番号
   x1 : double ; // 始点X
   y1 : double ; // 始点Y
   x2 : double ; // 終点X
   y2 : double ; // 終点Y
  end;
(・・・中略・・・)
  JW_EntLineN : integer ; // 線データ数
  JW_EntLine : array of TJwwEntLine; // 線データ
  JW_EntSunLine : TJwwEntLine; // 寸法図形用一時データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntLineN := 0;
  JW_EntLine := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntLine := nil;
end;
 
// 要素順データ登録
procedure SetEntNo(a_yn,a_no:integer);
begin
  Inc(JW_EntN);
  SetLength(JW_EntNo, JW_EntN);
  with JW_EntNo[JW_EntN-1] do begin
   yn := a_yn;
   no := a_no;
  end;
end;
 
// 属性登録用手続き
procedure SetEntAttr(var at:TJwwEntAttr);
begin
  with at do begin
   IPNo := JGW_IPNo;
   LGrp := JGW_LGrp;
   Lay := JGW_Lay;
   Col := JGW_Col;
   Ltp := JGW_Ltp;
   Wid := JGW_Wid;
   Attr := JGW_Attr;
  end;
end;
 
procedure GetTempCode(codes:string);
(・・・)
  end
  //
  // 要素データの読み込み
  else if (n = 4) then begin
   if not(JGW_DimFl) then begin
    // 線データ
    SetEntNo(1,JW_EntLineN); // 要素順
    Inc(JW_EntLineN);
    SetLength(JW_EntLine, JW_EntLineN);
    with JW_EntLine[JW_EntLineN-1] do begin
     SetEntAttr(att);
     if (JGW_CrvFl) then
      CrvNo := JGW_CrvNo
     else
      CrvNo := 0;
     x1 := SDbl(pa[0]);
     y1 := SDbl(pa[1]);
     x2 := SDbl(pa[2]);
     y2 := SDbl(pa[3]);
    end;
   end
   else begin
    // 寸法図形用一時データ
    with JW_EntSunLine do begin
     SetEntAttr(att);
     CrvNo := 0;
     x1 := SDbl(pa[0]);
     y1 := SDbl(pa[1]);
     x2 := SDbl(pa[2]);
     y2 := SDbl(pa[3]);
    end;
   end;
   JGW_Attr := 0;
  end;
(・・・後略・・・)
 
◆「円」要素データ
円データは
「ci」 円データ
 書式:ci x y r
    x,y:中心座標
    r:半径
と書き出されます。弧・楕円データも同じく「ci」なので項目数が4の場合を円データとします。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntCircle = record
   att : TJwwEntAttr; // 属性
   cx : double ; // 中心点X
   cy : double ; // 中心点Y
   cr : double ; // 半径
  end;
(・・・中略・・・)
  JW_EntCircN : integer ; // 円データ数
  JW_EntCirc : array of TJwwEntCircle; // 円データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntCircN := 0;
  JW_EntCirc := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntCirc := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  // 要素データの読み込み
  else if (pa[0] = 'ci')and(n = 4) then begin
   // 円データ
   SetEntNo(2,JW_EntCircN); // 要素順
   Inc(JW_EntCircN);
   SetLength(JW_EntCirc, JW_EntCircN);
   with JW_EntCirc[JW_EntCircN-1] do begin
    SetEntAttr(att);
    cx := SDbl(pa[1]);
    cy := SDbl(pa[2]);
    cr := SDbl(pa[3]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「円弧・楕円」要素データ
円弧・楕円データは
「ci」 弧・楕円データ
 書式:ci x y r sa ea h ka
    x,y:中心座標
    r:半径
    sa:開始角度[°]
    ea:終了角度[°]
    h:偏平率
    ka:傾き角度[°]
と書き出されます。円データの次に解釈部分を記述します。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntArc = record
   att : TJwwEntAttr; // 属性
   cx : double ; // 中心点X
   cy : double ; // 中心点Y
   cr : double ; // 半径
   sa : double ; // 開始角度[°]
   ea : double ; // 終了角度[°]
   he : double ; // 偏平率
   ka : double ; // 傾き角度[°]
  end;
(・・・中略・・・)
  JW_EntArcN : integer ; // 円弧楕円データ数
  JW_EntArc : array of TJwwEntArc; // 円弧楕円データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntArcN := 0;
  JW_EntArc := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntArc := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if (pa[0] = 'ci')and(n >= 8) then begin
   // 円弧楕円データ
   SetEntNo(3,JW_EntArcN); // 要素順
   Inc(JW_EntArcN);
   SetLength(JW_EntArc, JW_EntArcN);
   with JW_EntArc[JW_EntArcN-1] do begin
    SetEntAttr(att);
    cx := SDbl(pa[1]);
    cy := SDbl(pa[2]);
    cr := SDbl(pa[3]);
    sa := SDbl(pa[4]);
    ea := SDbl(pa[5]);
    he := SDbl(pa[6]);
    ka := SDbl(pa[7]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「文字」要素データ
文字データは
「ch」 横文字
 書式:ch x1 y1 x2 y2 "文字列
    x1,y1:基準点座標
    x2,y2:文字作図方向を示す座標
    "文字列:作図する文字内容

「cv」縦文字

「cs」寸法値

「cr」半径 寸法値

「co」直径 寸法値

「cp」角度 寸法値

「ct」累寸 寸法値

「ck」日影 真北データ

「cz」日影 建物高さデータ

「c2」2.5D データ

と書き出されますが、全て同じ引数となりますので、これらの文字の種類をコード値として保持するようにして同じデータとして扱う事とします。但し「cs」の場合には、寸法図形の寸法値である可能性があるので注意します(※後述)。文字データは、文字種と文字基準点がありますのでそれもデータに含めますが、任意サイズの場合には、文字幅・文字高さ・文字間隔・色が「cn」で指定されますが文字種1〜10の場合はありませんので、文字種データから参照してデータとして保持するようにします。色番号は att.Col に代入します。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntText = record
   att : TJwwEntAttr; // 属性
   no : integer ; // 種別コード
   cc : integer ; // 基準点
   cn : integer ; // 文字種 0:任意サイズ 1〜10
   mw : double ; // 文字幅
   mh : double ; // 文字高さ
   md : double ; // 文字間隔
   x1 : double ; // 基準点X
   y1 : double ; // 基準点Y
   x2 : double ; // 文字作図方向指示点X
   y2 : double ; // 文字作図方向指示点Y
   fo : string ; // 文字フォント(<>付なので注意)
  st : string ; // 文字内容
  end;
(・・・中略・・・)
  JW_EntTextN : integer ; // 文字データ数
  JW_EntText : array of TJwwEntText; // 文字データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntTextN := 0;
  JW_EntText := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntText := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if ((pa[0] = 'ch')or(pa[0] = 'cv')or(pa[0] = 'cs')
     or(pa[0] = 'cr')or(pa[0] = 'co')or(pa[0] = 'cp')
     or(pa[0] = 'ct')or(pa[0] = 'ck')or(pa[0] = 'cz')
     or(pa[0] = 'c2'))and(n >= 6) then begin
   if (not(JGW_DimFl))or(pa[0] <> 'cs') then begin
    // 文字データ
    SetEntNo(4,JW_EntTextN); // 要素順
    i := 0;
    if (pa[0] = 'cv') then i:=1
    else if (pa[0] = 'cs') then i:=2
    else if (pa[0] = 'cr') then i:=3
    else if (pa[0] = 'co') then i:=4
    else if (pa[0] = 'cp') then i:=5
    else if (pa[0] = 'ct') then i:=6
    else if (pa[0] = 'ck') then i:=7
    else if (pa[0] = 'cz') then i:=8
    else if (pa[0] = 'c2') then i:=9;
    Inc(JW_EntTextN);
    SetLength(JW_EntText, JW_EntTextN);
    with JW_EntText[JW_EntTextN-1] do begin
     SetEntAttr(att);
     no := i;
     cc := JGW_Mbs;
     cn := JGW_Mjs;
     if (cn >= 1)and(cn <= 10) then begin
      mw := JG_Mojisyu[cn].w;
      mh := JG_Mojisyu[cn].h;
      md := JG_Mojisyu[cn].d;
      att.Col := JG_Mojisyu[cn].col;
     end
     else begin
      mw := JGW_MjsW;
      mh := JGW_MjsH;
      md := JGW_MjsD;
      att.Col := JGW_MjsC;
     end;
     x1 := SDbl(pa[1]);
     y1 := SDbl(pa[2]);
     x2 := SDbl(pa[3]);
     y2 := SDbl(pa[4]);
     fo := JGW_Font;
     st := pa[5];
    end;
   end
   else begin
    // 寸法図形データ
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「点」要素データ
点データは
「pn」 点の線色番号
 書式:pn○

「pt」 点データ
 書式:pt x y
    x,y:配置座標
として書き出されます。点マーカデータも同じく「pt」として書き出されますので注意します。色番号は att.Col に代入します。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntPnt = record
   att : TJwwEntAttr; // 属性
   px : double ; // 配置点X
   py : double ; // 配置点Y
  end;
(・・・中略・・・)
  JW_EntPntN : integer ; // 点データ数
  JW_EntPnt : array of TJwwEntPnt; // 点データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntPntN := 0;
  JW_EntPnt := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntPnt := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if (pa[0] = 'pt')and(n = 3) then begin
   // 点データ
   SetEntNo(5,JW_EntPntN); // 要素順
   Inc(JW_EntPntN);
   SetLength(JW_EntPnt, JW_EntPntN);
   with JW_EntPnt[JW_EntPntN-1] do begin
    SetEntAttr(att);
    px := SDbl(pa[1]);
    py := SDbl(pa[2]);
    att.Col := JGW_PtCol;
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「点マーカ」要素データ
点マーカデータは
「pt」 点マーカデータ
 書式:pt x y bai ang cod
    x,y:配置座標
    bai:倍率(標準 1)
    ang:角度[°]
    cod:マーカコード
 マーカーコード
   1:blancked arrow 2:blancked box
   3:blancked 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:asterisk -2:circle -3:dot -4:plus
   -5:square -6:triangle -7:X
として書き出されます。色番号は att.Col に代入します。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntMark = record
   att : TJwwEntAttr; // 属性
   px : double ; // 配置点X
   py : double ; // 配置点Y
   bai : double ; // 倍率(標準 1)
   ang : double ; // 角度[°]
   cod : integer ; // マーカコード
  end;
(・・・中略・・・)
  JW_EntMarkN : integer ; // 点マーカデータ数
  JW_EntMark : array of TJwwEntMark; // 点マーカデータ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntMarkN := 0;
  JW_EntMark := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntMark := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if (pa[0] = 'pt')and(n >= 6) then begin
   // 点マーカデータ
   SetEntNo(6,JW_EntMarkN); // 要素順
   Inc(JW_EntMarkN);
   SetLength(JW_EntMark, JW_EntMarkN);
   with JW_EntMark[JW_EntMarkN-1] do begin
    SetEntAttr(att);
    px := SDbl(pa[1]);
    py := SDbl(pa[2]);
    att.Col := JGW_PtCol;
    bai := SDbl(pa[3]);
    ang := SDbl(pa[4]);
    cod := SInt(pa[5]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「寸法図形」要素データ
寸法図形データは
「msg」 寸法図形データ
 書式:msg
    x1 y1 x2 y2
    cs x1 y1 x2 y2 "寸法値
 「REM #jww」指定時
として書き出されます。「msg」を受け取った際の処理と線データを受け取った際の処理は既に記述済みです。「msg」を受け取るとフラグ変数 JGW_DimFl を True にします。その際、直後に線データを受け取った場合、一時保管用の JW_EntSunLine に入れています。次にフラグ変数 JGW_DimFl がTrue で「cs」を受け取った場合は、寸法図形の寸法値として処理します。文字要素データの処理内に記述しますので注意して下さい。なお、msgの次に線データがなく寸法値が入った場合のイレギュラー状態には正常対応していません。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntDim = record
   att : TJwwEntAttr; // 属性
   lin : TJwwEntLine; // 寸法値線
   txt : TJwwEntText; // 寸法値
  end;
(・・・中略・・・)
  JW_EntDimN : integer ; // 寸法図形データ数
  JW_EntDim : array of TJwwEntDim; // 寸法図形データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  //
  with JW_EntSunLine do begin
   att.IPNo := 0;
   att.LGrp := 0;
   att.Lay := 0;
   att.Col := 1;
   att.Ltp := 1;
   att.Wid := 0;
   att.Attr := 0;
   CrvNo := 0;
   x1 := 0.0;
   y1 := 0.0;
   x2 := 1.0;
   y2 := 0.0;
  end;
(・・・)
  JW_EntDimN := 0;
  JW_EntDim := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntDim := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if ((pa[0] = 'ch')or(pa[0] = 'cv')or(pa[0] = 'cs')
(・・・)
   end
   else begin
    // 寸法図形データ
    SetEntNo(7,JW_EntDimN); // 要素順
    Inc(JW_EntDimN);
    SetLength(JW_EntDim, JW_EntDimN);
    with JW_EntDim[JW_EntDimN-1] do begin
     SetEntAttr(att);
     lin.att.IPNo := JW_EntSunLine.att.IPNo;
     lin.att.LGrp := JW_EntSunLine.att.LGrp;
     lin.att.Lay := JW_EntSunLine.att.Lay;
     lin.att.Col := JW_EntSunLine.att.Col;
     lin.att.Ltp := JW_EntSunLine.att.Ltp;
     lin.att.Wid := JW_EntSunLine.att.Wid;
     lin.att.Attr := JW_EntSunLine.att.Attr;
     lin.CrvNo := 0;
     lin.x1 := JW_EntSunLine.x1;
     lin.y1 := JW_EntSunLine.y1;
     lin.x2 := JW_EntSunLine.x2;
     lin.y2 := JW_EntSunLine.y2;
     SetEntAttr(txt.att);
     with txt do begin
      no := 2; // cs
      cc := JGW_Mbs;
      cn := JGW_Mjs;
      if (cn >= 1)and(cn <= 10) then begin
       mw := JG_Mojisyu[cn].w;
       mh := JG_Mojisyu[cn].h;
       md := JG_Mojisyu[cn].d;
       att.Col := JG_Mojisyu[cn].col;
      end
      else begin
       mw := JGW_MjsW;
       mh := JGW_MjsH;
       md := JGW_MjsD;
       att.Col := JGW_MjsC;
      end;
      x1 := SDbl(pa[1]);
      y1 := SDbl(pa[2]);
      x2 := SDbl(pa[3]);
      y2 := SDbl(pa[4]);
      fo := JGW_Font;
      st := pa[5];
     end;
    end;
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「ブロック」要素データ
ブロックデータは
「BL」 ブロックデータ
 書式:BL x y "ブロック名
    x,y:配置座標
 「REM #jww」指定時
として書き出されます。本来ブロック図形要素は倍率や角度等を持つのですが、外部変形での書き出しデータとしては出力されない様子です。ブロック定義内のデータも出力されません。また、Jw_cad への読み込みデータとしても対応されていませんので閲覧専用状態となっています。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntBlk = record
   att : TJwwEntAttr; // 属性
   px : double ; // 配置点X
   py : double ; // 配置点Y
   nam : string ; // ブロック名
  end;
(・・・中略・・・)
  JW_EntBlkN : integer ; // ブロックデータ数
  JW_EntBlk : array of TJwwEntBlk; // ブロックデータ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntBlkN := 0;
  JW_EntBlk := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntBlk := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if (pa[0] = 'BL')and(n >= 4) then begin
   // ブロックデータ
   SetEntNo(8,JW_EntBlkN); // 要素順
   Inc(JW_EntBlkN);
   SetLength(JW_EntBlk, JW_EntBlkN);
   with JW_EntBlk[JW_EntBlkN-1] do begin
    SetEntAttr(att);
    px := SDbl(pa[1]);
    py := SDbl(pa[2]);
    nam:= pa[3];
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
◆「ソリッド図形」要素データ
ソリッド図形データは
「sl」 線形ソリッド図形
 書式:sl x1 y1 x2 y2
    x1,y1:開始点座標
    x2,y2:終了点座標
三角形ソリッド図形
 書式:sl x1 y1 x2 y2 x3 y3
    x1,y1:第1点座標
    x2,y2:第2点座標
    x3,y3:第3点座標
四角形ソリッド図形
 書式:sl x1 y1 x2 y2 x3 y3 x4 y4
    x1,y1:第1点座標
    x2,y2:第2点座標
    x3,y3:第3点座標
    x4,y4:第4点座標

「sc」 円ソリッド図形
 書式:sc x y r h ka sa da flag
    x,y:中心点座標
    r :半径
    h :偏平率(円状態は「1」)
    ka :傾き角度[rad]
    sa :開始角度[rad]
    da :円弧角度[rad]
    flag:円「100」、弓形「5」
      扇形「0」、円外側「-1」

「se」 円周ソリッド図形
 書式:se x y r h ka sa da flag
    x,y:中心点座標
    r :半径
    h :偏平率(円状態は「1」)
    ka :傾き角度[rad]
    sa :開始角度[rad]
    da :円弧角度[rad]
    flag:円「100」、円弧「0」

「so」 円環ソリッド図形(同一扁平率タイプ)
 書式:se x y r h ka sa da ri
    x,y:中心点座標
    r :半径
    h :偏平率(円状態は「1」)
    ka :傾き角度[rad]
    sa :開始角度[rad]
    da :円弧角度[rad]
    ri :内円半径

「sg」 円環ソリッド図形(同一幅タイプ)
 書式:se x y r h ka sa da ri
    x,y:中心点座標
    r :半径
    h :偏平率(円状態は「1」)
    ka :傾き角度[rad]
    sa :開始角度[rad]
    da :円弧角度[rad]
    ri :内円半径
として書き出されます。ソリッド図形は任意色を持つ場合があるので注意します。「sc」と「se」、「so」と「sg」は同じフォーマットですので同じ構造体を利用して宣言します。円形のソリッド図形は円弧・楕円データとは異なり、角度はラジアン値[rad]ですので注意して下さい。また、終了角度ではなく円弧角度になっていますのでこちらも注意して下さい。
JwwGaibu.pas
(・・・前略・・・)
type
 (・・・)
  TJwwEntSld2 = record
   att : TJwwEntAttr; // 属性
   Color : integer ; // 任意色(att.Col=10の場合,有効)
   x1 : double ; // 始点X
   y1 : double ; // 始点Y
   x2 : double ; // 終点X
   y2 : double ; // 終点Y
  end;
  TJwwEntSld3 = record
   att : TJwwEntAttr; // 属性
   Color : integer ; // 任意色(att.Col=10の場合,有効)
   x1 : double ; // 第1点X
   y1 : double ; // 第1点Y
   x2 : double ; // 第2点X
   y2 : double ; // 第2点Y
   x3 : double ; // 第3点X
   y3 : double ; // 第3点Y
  end;
  TJwwEntSld4 = record
   att : TJwwEntAttr; // 属性
   Color : integer ; // 任意色(att.Col=10の場合,有効)
   x1 : double ; // 第1点X
   y1 : double ; // 第1点Y
   x2 : double ; // 第2点X
   y2 : double ; // 第2点Y
   x3 : double ; // 第3点X
   y3 : double ; // 第3点Y
   x4 : double ; // 第4点X
   y4 : double ; // 第4点Y
  end;
  TJwwEntSldC = record
   att : TJwwEntAttr; // 属性
   cx : double ; // 中心点X
   cy : double ; // 中心点Y
   cr : double ; // 半径
   he : double ; // 偏平率
   ka : double ; // 傾き角度[rad]
   sa : double ; // 開始角度[rad]
   da : double ; // 円弧角度[rad]
   fl : integer ; // フラグ
  end;
  TJwwEntSldD = record
   att : TJwwEntAttr; // 属性
   cx : double ; // 中心点X
   cy : double ; // 中心点Y
   cr : double ; // 半径
   he : double ; // 偏平率
   ka : double ; // 傾き角度[rad]
   sa : double ; // 開始角度[rad]
   da : double ; // 円弧角度[rad]
   ri : double ; // 内円半径
  end;
(・・・中略・・・)
  JW_EntSld2N : integer ; // 線形ソリッド図形データ数
  JW_EntSld2 : array of TJwwEntSld2; // 線形ソリッド図形データ
  JW_EntSld3N : integer ; // 三角形ソリッド図形データ数
  JW_EntSld3 : array of TJwwEntSld3; // 三角形ソリッド図形データ
  JW_EntSld4N : integer ; // 四角形ソリッド図形データ数
  JW_EntSld4 : array of TJwwEntSld4; // 四角形ソリッド図形データ
  JW_EntSldCN : integer ; // 円ソリッド図形データ数
  JW_EntSldC : array of TJwwEntSldC; // 円ソリッド図形データ
  JW_EntSldEN : integer ; // 円周ソリッド図形データ数
  JW_EntSldE : array of TJwwEntSldC; // 円周ソリッド図形データ
  JW_EntSldON : integer ; // 円環ソリッド1図形データ数
  JW_EntSldO : array of TJwwEntSldD; // 円環ソリッド1図形データ
  JW_EntSldGN : integer ; // 円環ソリッド2図形データ数
  JW_EntSldG : array of TJwwEntSldD; // 円環ソリッド2図形データ
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
  JW_EntSld2N := 0;
  JW_EntSld2 := nil;
  JW_EntSld3N := 0;
  JW_EntSld3 := nil;
  JW_EntSld4N := 0;
  JW_EntSld4 := nil;
  JW_EntSldCN := 0;
  JW_EntSldC := nil;
  JW_EntSldEN := 0;
  JW_EntSldE := nil;
  JW_EntSldON := 0;
  JW_EntSldO := nil;
  JW_EntSldGN := 0;
  JW_EntSldG := nil;
end;
procedure EndJwwGaibu ;
(・・・)
  JW_EntSld2 := nil;
  JW_EntSld3 := nil;
  JW_EntSld4 := nil;
  JW_EntSldC := nil;
  JW_EntSldE := nil;
  JW_EntSldO := nil;
  JW_EntSldG := nil;
end;
(・・・中略・・・)
procedure GetTempCode(codes:string);
(・・・)
  else if (pa[0] = 'sl')and(n = 5) then begin
   // 線形ソリッド図形データ
   SetEntNo(9,JW_EntSld2N); // 要素順
   Inc(JW_EntSld2N);
   SetLength(JW_EntSld2, JW_EntSld2N);
   with JW_EntSld2[JW_EntSld2N-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    x1 := SDbl(pa[1]);
    y1 := SDbl(pa[2]);
    x2 := SDbl(pa[3]);
    y2 := SDbl(pa[4]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
  else if (pa[0] = 'sl')and(n = 7) then begin
   // 三角形ソリッド図形データ
   SetEntNo(10,JW_EntSld3N); // 要素順
   Inc(JW_EntSld3N);
   SetLength(JW_EntSld3, JW_EntSld3N);
   with JW_EntSld3[JW_EntSld3N-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    x1 := SDbl(pa[1]);
    y1 := SDbl(pa[2]);
    x2 := SDbl(pa[3]);
    y2 := SDbl(pa[4]);
    x3 := SDbl(pa[5]);
    y3 := SDbl(pa[6]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
  else if (pa[0] = 'sl')and(n >= 9) then begin
   // 四角形ソリッド図形データ
   SetEntNo(11,JW_EntSld4N); // 要素順
   Inc(JW_EntSld4N);
   SetLength(JW_EntSld4, JW_EntSld4N);
   with JW_EntSld4[JW_EntSld4N-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    x1 := SDbl(pa[1]);
    y1 := SDbl(pa[2]);
    x2 := SDbl(pa[3]);
    y2 := SDbl(pa[4]);
    x3 := SDbl(pa[5]);
    y3 := SDbl(pa[6]);
    x4 := SDbl(pa[7]);
    y4 := SDbl(pa[8]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
  else if (pa[0] = 'sc')and(n >= 9) then begin
   // 円ソリッド図形データ
   SetEntNo(12,JW_EntSldCN); // 要素順
   Inc(JW_EntSldCN);
   SetLength(JW_EntSldC, JW_EntSldCN);
   with JW_EntSldC[JW_EntSldCN-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    cx := SDbl(pa[1]);
    cy := SDbl(pa[2]);
    cr := SDbl(pa[3]);
    he := SDbl(pa[4]);
    ka := SDbl(pa[5]);
    sa := SDbl(pa[6]);
    da := SDbl(pa[7]);
    fl := SInt(pa[8]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
  else if (pa[0] = 'se')and(n >= 9) then begin
   // 円周ソリッド図形データ
   SetEntNo(13,JW_EntSldEN); // 要素順
   Inc(JW_EntSldEN);
   SetLength(JW_EntSldE, JW_EntSldEN);
   with JW_EntSldE[JW_EntSldEN-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    cx := SDbl(pa[1]);
    cy := SDbl(pa[2]);
    cr := SDbl(pa[3]);
    he := SDbl(pa[4]);
    ka := SDbl(pa[5]);
    sa := SDbl(pa[6]);
    da := SDbl(pa[7]);
    fl := SInt(pa[8]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
  else if (pa[0] = 'so')and(n >= 9) then begin
   // 円環ソリッド図形1データ
   SetEntNo(14,JW_EntSldON); // 要素順
   Inc(JW_EntSldON);
   SetLength(JW_EntSldO, JW_EntSldON);
   with JW_EntSldO[JW_EntSldON-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    cx := SDbl(pa[1]);
    cy := SDbl(pa[2]);
    cr := SDbl(pa[3]);
    he := SDbl(pa[4]);
    ka := SDbl(pa[5]);
    sa := SDbl(pa[6]);
    da := SDbl(pa[7]);
    ri := SDbl(pa[8]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
  else if (pa[0] = 'sg')and(n >= 9) then begin
   // 円環ソリッド図形2データ
   SetEntNo(15,JW_EntSldGN); // 要素順
   Inc(JW_EntSldGN);
   SetLength(JW_EntSldG, JW_EntSldGN);
   with JW_EntSldG[JW_EntSldGN-1] do begin
    SetEntAttr(att);
    Color := JGW_SlCol ;
    cx := SDbl(pa[1]);
    cy := SDbl(pa[2]);
    cr := SDbl(pa[3]);
    he := SDbl(pa[4]);
    ka := SDbl(pa[5]);
    sa := SDbl(pa[6]);
    da := SDbl(pa[7]);
    ri := SDbl(pa[8]);
   end;
   JGW_Attr := 0;
   JGW_CrvFl := False;
   JGW_DimFl := False;
  end
(・・・後略・・・)
 
 
以上で書き出される要素データの読み込みは終了です。
取りあえず、Form1のメモ画面に、読み込んだ要素数の表示を行えるようにしてみます。
Unit1.pas
(・・・前略・・・)
// 起動時
procedure TForm1.FormShow(Sender: TObject);
(・・・)
  // 要素数
  Memo1.Lines.Add('全要素データ数:'+IntToStr(JW_EntN));
  Memo1.Lines.Add('  線データ数   :'+IntToStr(JW_EntLineN));
  Memo1.Lines.Add('  円データ数   :'+IntToStr(JW_EntCircN));
  Memo1.Lines.Add('  円弧楕円データ数:'+IntToStr(JW_EntArcN));
  Memo1.Lines.Add('  文字データ数  :'+IntToStr(JW_EntTextN));
  Memo1.Lines.Add('  点データ数   :'+IntToStr(JW_EntPntN));
  Memo1.Lines.Add('  点マーカデータ数:'+IntToStr(JW_EntMarkN));
  Memo1.Lines.Add('  寸法図形データ数:'+IntToStr(JW_EntDimN));
  Memo1.Lines.Add('  ブロックデータ数:'+IntToStr(JW_EntBlkN));
  Memo1.Lines.Add('  線形ソリッド数 :'+IntToStr(JW_EntSld2N));
  Memo1.Lines.Add('  三角形ソリッド数:'+IntToStr(JW_EntSld3N));
  Memo1.Lines.Add('  四角形ソリッド数:'+IntToStr(JW_EntSld4N));
  Memo1.Lines.Add('  円ソリッド数  :'+IntToStr(JW_EntSldCN));
  Memo1.Lines.Add('  円周ソリッド数 :'+IntToStr(JW_EntSldEN));
  Memo1.Lines.Add('  円環ソリッド1数:'+IntToStr(JW_EntSldON));
  Memo1.Lines.Add('  円環ソリッド2数:'+IntToStr(JW_EntSldGN));
  //
  with StringGrid1 do begin
(・・・後略・・・)
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p028」内に作成された「p028.exe」をフォルダ「Gapp」内へコピーします。
 
「Gapp」フォルダ(C:\JWW\Gapp)内に以下のバッチファイルを用意しておきます。内容は p027とほぼ同じです。
p028_取り込みテスト(4).bat
REM p028−取り込みテスト(4)
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1- 第1点を指示して下さい。(L)free (R)Read
REM #2 第2点を指示して下さい。(L)free (R)Read
REM #h1
REM #hc 範囲選択をして下さい。
REM #g1
REM #hr
start /w p028.exe
 
Jw_cadを起動し、Jw_cad 標準添付の「Aマンション平面例.jww」を開いて
メニュー→その他→外部変形
「ファイル選択」画面でフォルダ「Gapp」を指定し、上記で作成したバッチファイル「p028_取り込みテスト(4).bat」を実行して下さい。第1点、第2点を指定し、範囲選択で全体を囲みます(終点指定時右クリック)。以下のような画面が表示されます。

画面上部のメモを下の方へスクロールさせると・・・

各要素のデータ数を見る事が出来ます。Jw_cad でのメニュー「設定」→「基本設定」の「一般(1)」頁の下方に表示される数と比較すると同じである事が分かります。
 
 
今回はここまでとします。
 
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、Pcataサイトに置いておきますので必要な方はそちらからダウンロードして下さい。
 
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
M7
Jw_cad
 [BACK]
 [NEXT]
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.