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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】読み込みデータの生成(4)
前々回、
また、レイヤグループ・レイヤ・線色・線種・線幅・文字種・文字フォント・文字基準点・点種(点の線色番号)について、直前の値と同じ値に「変更」するのはファイルサイズを無駄に大きくしてしまうので、直前値と同じであれば書き込まない、つまり、直前値を変数に入れて覚えておくようにします。
新しく変数を作っても良いですが、書き込みデータを読み込む際に利用した変数 JGW_LGrp(レイヤグループ)、JGW_Lay(レイヤ)、JGW_Col(線色)、JGW_Ltp(線種)、JGW_Wid(線幅)、JGW_Mjs(文字種)、JGW_MjsW・JGW_MjsH・JGW_MjsD・JGW_MjsC、JGW_Mbs(文字基準点)、JGW_Font(文字フォント)、JGW_PtCol(点線色)を利用します。
と書きましたが今回はこの処理を行うようにします。
 
バッチファイルは前回の「p031_2点間線.bat」をほとんどそのまま利用します。「p031」を「p032」に書き換えたものを用意します。
p032_2点間線.bat
REM p032:2点間線
@echo off
GOTO EXE-%1
REM
REM ----- 1)2点指定 実行プログラム -----
:EXE-1
start /w p032.exe /R0
GOTO END
REM
REM ----- 2)複数点指定 実行プログラム -----
:EXE-2
start /w p032.exe /R1
GOTO END
REM
REM ----- 3)終点指定 実行プログラム -----
:EXE-3
start /w p032.exe /R2
GOTO END
REM
REM ----- 4)設定 実行プログラム -----
:EXE-4
start /w p032.exe
GOTO END
REM
REM
REM ----- ----- ----- ----- ----- -----
REM #jww
REM #cd
REM #hc 2点間線を作図する外部変形です。機能を選択して下さい(1〜4)
REM #hm2点間線|1)2点指定|2)複数点指定|3)終点指定|4)設定|
REM
REM #:1 -----2点指定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1-始点を指示して下さい。(L)free (R)Read
REM #2終点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:2 -----複数点指定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1-%d点を指示して下さい。(L)free (R)Read
REM #99#
REM #hr
REM #e
REM
REM #:3 -----終点指定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1 終点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:4 -----設定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #hr
REM #e
REM
:END
REM 終了
 
プロジェクト「p032」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p032」というフォルダを作成し、Windowsのエクスプローラ等で「p031」内のファイルを「p032」の中へコピーします(※移動しないよう注意)
Delphi6を起動します。メニュー「ファイル」→「プロジェクトを開く」を実行し、「C:\DelphiProgram\jww\p032」内の「p031.dpr」を開きます。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p032−2点間線
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p032

メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p032」の中に「p032.dpr」として保存
「C:\DelphiProgram\jww\p032」の中に「p031.〜」のファイルが残っていますので、Windowsのエクスプローラ等で削除します。
プロジェクトマネージャを表示しコード画面の左側にドッキングしておきます。

◇書き出しデータ「JWC_TEMP.DAT」での設定値
 JwwGaibu.pas 内の InitJwwGaibu 手続きで初期化され、書き出しデータ「JWC_TEMP.TXT」を読み込む関数 OpenTempFile 〜 手続き GetTempCode にて 変数 JG_* に値がセットされます。書き出される要素データは、変数 JW_Ent* に内容がセットされます。これらの作業を行う際の作業用変数として、変数 JGW_* を利用しています。
 
◇やりたい事
 線色2・線種5の線を作図
→線色2・線種6の線を作図
→線色3・線種6の線を作図
というような場合、単純に考えると
 lc2〜lt5〜x1 y1 x2 y2
 lc2〜lt6〜x1 y1 x2 y2
 lc3〜lt6〜x1 y1 x2 y2
のように書き込みますが、関数呼び出しについてはそれでも良いのですが、実際に生成するファイルとしてはなるべくサイズを小さくしたいので、無駄は省きたい、となってきます。上記の場合、
 lc2〜lt5〜x1 y1 x2 y2
 lt6〜x1 y1 x2 y2
 lc3〜x1 y1 x2 y2
で済みます。作図量が大きくなればなるほど違ってくる、かもしれません。(※意図的に線属性をころころと変えると差は無くなってしまいます)
 
最初は必ず書き込みます。次回から、前回の値と同じであれば書き込みを行わず、前回の値と異なる場合に書き込みます。という訳で、最初かどうかのフラグ変数(True/False)と前回値を保持する変数を用意します。これを、レイヤグループ・レイヤ・線色・線種・線幅・文字種・文字基準点・文字フォント・点線色を対象に行います。新しく変数を作っても良いのですが、書き出しデータ「JWC_TEMP.DAT」を読み込む際に使う作業用変数は、読み込んだ後はもう使っていませんので、これを使うようにします。足らずは足します(青字箇所)。
 フラグ前回値
レイヤグループJGW_FlgLGrpJGW_LGrp
レイヤJGW_FlgLayJGW_Lay
線色JGW_FlgColJGW_Col
線種JGW_FlgLtpJGW_Ltp
線幅JGW_FlgWidJGW_Wid
文字種JGW_FlgMjs JGW_Mjs
任意サイズの場合
 JGW_MjsW
 JGW_MjsH
 JGW_MjsD
 JGW_MjsC
文字基準点JGW_FlgMbsJGW_Mbs
文字フォントJGW_FlgFontJGW_Font
点線色JGW_FlgPColJGW_PtCol
ソリッド任意色JGW_FlgSColJGW_SlCol
変数宣言部に追加します。
JwwGaibu.pas
(・・・前略・・・)
  // 判別用フラグ True:初期値=現在〜 False:現在ではない
  JGW_FlgLGrp : Boolean ; // レイヤグループ
  JGW_FlgLay : Boolean ; // レイヤ
  JGW_FlgCol : Boolean ; // 線色
  JGW_FlgLtp : Boolean ; // 線種
  JGW_FlgWid : Boolean ; // 線幅
  JGW_FlgMjs : Boolean ; // 文字種
  JGW_FlgMbs : Boolean ; // 文字基準点 (生成時のみ利用)
  JGW_FlgFont : Boolean ; // 文字フォント(生成時のみ利用)
  JGW_FlgPCol : Boolean ; // 点線色   (生成時のみ利用)
  JGW_FlgSCol : Boolean ; // ソリッド任意色(生成時のみ利用)
  // 書き出し要素データに付加する属性
(・・・後略・・・)
これらの変数の初期化を行う手続き S_Init を作成します。生成を行う最初に呼び出す事とします。
JwwGaibu.pas
(・・・前略・・・)
  procedure S_Init ;
  procedure SendMem(s:string);
(・・・中略・・・)
// ---------- - ---------- - ----------
//    「JWC_TEMP.TXT」生成用
// ---------- - ---------- - ----------
 
// 変数の初期化
procedure S_Init ;
begin
  JGW_FlgLGrp := True;
  JGW_FlgLay := True;
  JGW_FlgCol := True;
  JGW_FlgLtp := True;
  JGW_FlgWid := True;
  JGW_FlgMjs := True;
  JGW_FlgMbs := True;
  JGW_FlgFont := True;
  JGW_FlgPCol := True;
  JGW_FlgSCol := True;
  // 一応初期化しておく
  JGW_LGrp := 0;
  JGW_Lay := 0;
  JGW_Col := 1;
  JGW_Ltp := 1;
  JGW_Wid := 0;
  JGW_Mjs := 1;
  JGW_MjsW := 2.0;
  JGW_MjsH := 2.0;
  JGW_MjsD := 0.0;
  JGW_MjsC := 1;
  JGW_Mbs := 0;
  JGW_Font := '<MS ゴシック>';
  JGW_PtCol:= 1;
  JGW_SlCol:= 0;
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの
// 送信文字列セット
procedure SendMem(s:string);
(・・・後略・・・)
Unit1.pas
(・・・前略・・・)
procedure TForm1.FormShow(Sender: TObject);
(・・・)
  if (ParamCount >= 1) then begin
   S_Init ; // 初期化
   S_Col(col,1); // 線色
   S_Ltp(ltp,1); // 線種
(・・・後略・・・)
それではこの変数を利用するよう変更します。
JwwGaibu.pas
(・・・前略・・・)
procedure S_LGrp(lgrp:integer);
(・・・)
begin
  if (JGW_FlgLGrp)
  or(JGW_FlgLGrp = False)and(JGW_LGrp <> lgrp) then begin
    s := 'lg' + IntToHex(lgrp,1);
    SendMem(s);
    JGW_LGrp := lgrp ;
    JGW_FlgLGrp := False ;
  end;
end;
 
procedure S_Lay(lay:integer);
(・・・)
begin
  if (JGW_FlgLay)
  or(JGW_FlgLay = False)and(JGW_Lay <> lay) then begin
    s := 'ly' + IntToHex(lay,1);
    SendMem(s);
    JGW_Lay := lay ;
    JGW_FlgLay := False ;
  end;
end;
 
procedure S_Col(col,mode:integer);
(・・・)
  if (JGW_FlgCol)
  or(JGW_FlgCol = False)and(JGW_Col <> i) then begin
    SendMem('lc'+IntToStr(i));
    JGW_Col := i ;
    JGW_FlgCol := False ;
  end;
end;
 
procedure S_Ltp(ltp,mode:integer);
(・・・)
  if (JGW_FlgLtp)
  or(JGW_FlgLtp = False)and(JGW_Ltp <> i) then begin
    SendMem('lt'+IntToStr(i));
    JGW_Ltp := i ;
    JGW_FlgLtp := False ;
  end;
end;

procedure S_Wid(wid:integer);
(・・・)
  if (JGW_FlgWid)
  or(JGW_FlgWid = False)and(JGW_Wid <> i) then begin
    SendMem('lw'+IntToStr(i));
    JGW_Wid := i ;
    JGW_FlgWid := False ;
  end;
end;
(・・・後略・・・)
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p032」内に作成された「p032.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。動作そのものは「p031」と同じとなります。
 
それでは、ソリッド任意色の対応と、文字種・文字基準点・文字フォント・点線色の処理を追加します。
JwwGaibu.pas
(・・・前略・・・)
  procedure S_Wid(wid:integer);
  procedure S_Mjs(mjs:integer;mw,mh,md:double;col,mode:integer);
  procedure S_Mbs(mbs:integer);
  procedure S_Font(fnt:string);
  procedure S_PCol(col,mode:integer);
  procedure S_SCol(col:integer);
  procedure S_SColRGB(r,g,b:integer);
  //
  procedure S_Line(x1,y1,x2,y2:double);
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込み文字種を指定
// mjs : 文字種 1-10 0:任意サイズ -1:現在値
// mw,mh,md : 任意サイズ時の文字幅・高・幅
// col,mode : 任意サイズ時の文字色・モード
procedure S_Mjs(mjs:integer;mw,mh,md:double;col,mode:integer);
var
  i,j,c : integer ;
  w,h,d : double ;
  f : Boolean ;
  s : string ;
begin
  i := col ;
  if (mode = 1) then begin
   i := JG_CurMjsC ;
   if (col > 0) then begin
    if (col >= 10) then
     i := col - 10 + 101
    else
     i := col ;
   end;
  end;
  j := mjs ;
  w := mw ;
  h := mh ;
  d := md ;
  c := i ;
  if (j < 0)or(j > 10) then begin
   j := JG_CurMjs ;
   if (j = 0) then begin
    w := JG_CurMjsW;
    h := JG_CurMjsH;
    d := JG_CurMjsD;
    c := JG_CurMjsC;
   end;
  end;
  f := False ;
  if (JGW_FlgMjs) then f := True
  else begin
   if (JGW_Mjs <> j) then f := True
   else begin
    if (j = 0) then begin
     if (JGW_MjsW <> w) or (JGW_MjsH <> h)
     or(JGW_MjsD <> d) or (JGW_MjsC <> c) then
      f := True ;
    end;
   end;
  end;
  if (f) then begin
   if (j <> 0) then begin
    SendMem('cn'+IntToStr(j));
   end
   else begin
    s := 'cn0 ' + FloatToStr(w)
       + ' ' + FloatToStr(h)
       + ' ' + FloatToStr(d)
       + ' ' + FloatToStr(c);
    SendMem(s);
    JGW_MjsW := w;
    JGW_MjsH := h;
    JGW_MjsD := d;
    JGW_MjsC := c;
   end;
   JGW_Mjs := j ;
   JGW_FlgMjs := False ;
  end;
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込み文字基準点を指定
// mbs : 文字基準点 0-8
// 0:左下 1:中下 2:右下
// 3:左中 4:中中 5:右中
// 6:左上 7:中上 8:右上
procedure S_Mbs(mbs:integer);
var
  i : integer ;
begin
  i := mbs ;
  if (i < 0)or(i > 8) then i := 0;
  if (JGW_FlgMbs)
  or(JGW_FlgMbs = False)and(JGW_Mbs <> i) then begin
   SendMem('cc'+IntToStr(i));
   JGW_Mbs := i ;
   JGW_FlgMbs := False ;
  end;
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込み文字フォントを指定
// fnt : 文字フォント名 空(ヌル)or'<>'の場合、現在のフォント
// 前後に<>を付ける必要があります
// 最後に/を付けると斜体
procedure S_Font(fnt:string);
var
  f : string ;
begin
  f := fnt ;
  if (f = '')or(f = '<>') then
   f := JG_CurFont ;
  if (JGW_FlgFont)
  or(JGW_FlgFont = False)and(JGW_Font <> f) then begin
   SendMem('cn"$' + f);
   JGW_Font := f ;
   JGW_FlgFont := False ;
  end;
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込み点線色を指定
// col : 色番号
// mode: 0:色番号をそのまま出力 1:選択項目リストを変換して出力
procedure S_PCol(col,mode:integer);
var
  i : integer ;
begin
  i := col ;
  if (mode = 1) then begin
   i := 1 ;
   if (col > 0) then begin
    if (col >= 10) then
     i := col - 10 + 101
    else
     i := col ;
   end;
  end;
  if (JGW_FlgPCol)
  or(JGW_FlgPCol = False)and(JGW_PtCol <> i) then begin
    SendMem('pn'+IntToStr(i));
    JGW_PtCol := i ;
    JGW_FlgPCol := False ;
  end;
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みソリッド任意色を指定
// col : RGB色を示す値 $000000〜$FFFFFF
// 赤(0〜255)+緑(0〜255)×256+青(0〜255)×65536
procedure S_SCol(col:integer);
var
  i : integer ;
begin
  i := col ;
  if (i < 0)or(i > $ffffff) then i := 0;
  if (JGW_FlgSCol)
  or(JGW_FlgSCol = False)and(JGW_SlCol <> i) then begin
   SendMem('lc10 '+IntToStr(i));
   JGW_SlCol := i ;
   JGW_FlgSCol := False ;
  end;
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みソリッド任意色を指定(R,G,B値を個別指定)
// r : 赤色成分値 0-255
// g : 緑色成分値 0-255
// b : 青色成分値 0-255
procedure S_SColRGB(r,g,b:integer);
var
  ir,ig,ib,i : integer ;
begin
  ir := r ;
  ig := g ;
  ib := b ;
  if (ir < 0)or(ir > 255) then ir := 0;
  if (ig < 0)or(ig > 255) then ig := 0;
  if (ib < 0)or(ib > 255) then ib := 0;
  i := ir + ig*256 + ib*65536 ;
  if (JGW_FlgSCol)
  or(JGW_FlgSCol = False)and(JGW_SlCol <> i) then begin
    SendMem('lc10 '+IntToStr(i));
    JGW_SlCol := i ;
    JGW_FlgSCol := False ;
  end;
end;
(・・・後略・・・)
 
これだけでは余り面白くありませんので、各値を複数登録出来るようにしてみます。Form1画面を右横に大きくします。[Standard]内の Buttonを配置し、同じく ListBoxを配置し、再度、Buttonを配置します。最初の Button3 の Captionプロパティを「→登録→」、後の Button4 の Captionプロパティを「削除←」とします。

Button3をダブルクリックします。オブジェクトインスペクタのイベント頁の「OnClick」入力欄をダブルクリック、でも構いません。
procedure TForm1.Button3Click(Sender: TObject);
begin
 
end;
となりますので下記のように追記します。
// [→登録→]
procedure TForm1.Button3Click(Sender: TObject);
var
  s : string ;
begin
s := 'C=' + IntToStr(ComboBox1.ItemIndex)
  +' L=' + IntToStr(ComboBox2.ItemIndex)
  +' W=' + ComboBox3.Text ;
  ListBox1.Items.Add(s);
end;
 
Button4をダブルクリックします。オブジェクトインスペクタのイベント頁の「OnClick」入力欄をダブルクリック、でも構いません。
procedure TForm1.Button4Click(Sender: TObject);
begin
 
end;
となりますので下記のように追記します。
// [削除←]
procedure TForm1.Button4Click(Sender: TObject);
var
  i : integer ;
begin
  if (ListBox1.Items.Count = 0) then exit ;
  i := ListBox1.ItemIndex ;
  if (i >= 0) then
   ListBox1.Items.Delete(i);
end;
 
ListBox1をダブルクリックします。オブジェクトインスペクタのイベント頁の「OnClick」入力欄をダブルクリック、でも構いません。
procedure TForm1.ListBox1Click(Sender: TObject);
begin
 
end;
となりますので下記のように追記します。
// [選択]
procedure TForm1.ListBox1Click(Sender: TObject);
var
  i : integer ;
  s,t : string ;
begin
  if (ListBox1.Items.Count = 0) then exit ;
  i := ListBox1.ItemIndex ;
  if (i >= 0) then begin
   s := ListBox1.Items[i] ;
   i := AnsiPos(' L=',s);
   t := Copy(s,3,i-3) ;
   s := Copy(s,i+3,Length(s));
   ComboBox1.ItemIndex := SInt(t) ;
   i := AnsiPos(' W=',s);
   t := Copy(s,1,i-1) ;
   s := Copy(s,i+3,Length(s));
   ComboBox2.ItemIndex := SInt(t) ;
   ComboBox3.Text := s ;
  end;
end;
あとはこのListBox1内容を保存・呼び出しを行えば良いですが、datファイルと一緒にすると登録量が多くなると普段の作図の際に遅くなるかもしれませんので、lstファイルを別に作る事にします。
Unit1.pas
(・・・前略・・・)
type
  TForm1 = class(TForm)
  (・・・)
  private
   { Private 宣言 }
   AppPath : string ;
   px,py : double ;
   col,ltp,wid : integer ;
   procedure OpenDatFile ;
   procedure SaveDatFile ;
   procedure OpenLstFile ;
   procedure SaveLstFile ;
(・・・)
// データファイルを読み込む
procedure TForm1.OpenLstFile ;
var
  fn: string ;
  F : TextFile ;
  i,j : integer ;
  s : string ;
begin
  fn := ChangeFileExt(Application.ExeName,'.lst') ;
  ListBox1.Items.Clear ;
  // 読み込み
  if not(FileExists(fn)) then exit;
  try
   AssignFile(F, fn);
   FileMode := 0;
   Reset(F);
   ReadLn(F, s);   j := SInt(s);
   for i:=1 to j do begin
    ReadLn(F, s);
    ListBox1.Items.Add(s);
   end;
   CloseFile(F);
  except
   CloseFile(F);
  end;
end;
 
// データファイルを保存する
procedure TForm1.SaveLstFile ;
var
  fn: string ;
  F : TextFile ;
  i,j : integer ;
  s : string ;
begin
  fn := ChangeFileExt(Application.ExeName,'.lst') ;
  try
   AssignFile(F, fn);
   ReWrite(F);
   j := ListBox1.Items.Count ;
   WriteLn(F, IntToStr(j));
   for i:=0 to j-1 do begin
    s := ListBox1.Items[i] ;
    WriteLn(F, s);
   end;
   CloseFile(F);
  except
   CloseFile(F);
   if FileExists(fn) then
    DeleteFile(fn);
  end;
end;
(・・・)
procedure TForm1.FormShow(Sender: TObject);
(・・・)
   ComboBox2.ItemIndex := ltp ;
   if (wid >= 0) then
    ComboBox3.Text := IntToStr(wid);
   //
   OpenLstFile ;
  end;
end;
(・・・)
procedure TForm1.Button1Click(Sender: TObject);
(・・・)
  SaveDatFile ;
  SaveLstFile ;
  Close ;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  SaveLstFile ;
  Close ;
end;
 (・・・)
とします。
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p032」内に作成された「p032.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。

設定画面

 
 
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、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.