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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】読み込みデータの生成(3)
前回、2点間線の外部変形アプリケーションのテストを作ってみましたが、バッチファイルを3つ作成して各自それぞれ実行していましたが、この方が都合がよい場合もありますが、バッチファイルがたくさんあってそれぞれ実行するというのも多少煩雑になってしまいます。まずはこれを1つのバッチファイルにまとめてみます。
p030a_2点間線.bat
REM p030a:2点間線
@echo off
REM #jww
REM #cd
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
start /w p030.exe
p030b_2点間線(連続1).bat
REM p030b:2点間線(連続1)
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1-%d点を指示して下さい。(L)free (R)Read
REM #99#
REM #hr
start /w p030.exe /R1
p030c_2点間線(連続2).bat
REM p030c:2点間線(連続2)
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1 終点を指示して下さい。(L)free (R)Read
REM #hr
start /w p030.exe /R2
「REM #hc」コメント表示

「REM #hm」 項目選択メッセージの設定(最大項目数9)
 REM #hm機能名|機能1|機能2|機能3|
のように記述する
コントロールバーに[機能1][機能2][機能3]のボタンが表示されます。第1ボタンは作図画面で(L)クリックで機能し、第2ボタンは作図画面で(R)クリックで機能します。それぞれ(1)〜(9)の数値キーでの選択も可能です。そのバッチファイルの続きとして、
REM #:1 ----- 機能1 -----(ラベルとコメント)
REM #〜〜〜〜〜 機能1を選んだ場合の指示
REM #e
REM
REM #:2 ----- 機能2 -----
REM #〜〜〜〜〜 機能2を選んだ場合の指示
REM #e
REM
REM #:3 ----- 機能3 -----
REM #〜〜〜〜〜 機能3を選んだ場合の指示
REM #e
REM
のように記述します。ボタンを5つ作ったらラベル(REM #:○)も5つまで記述する必要があります。それぞれの最後は必ず「REM #e」を記述します。
しかし、この中に外部変形プログラムの実行部分を記述する事は出来ません。バッチファイルでのこの指示は Jw_cad が判断・表示等を行うのに使われますが、実際に実行を行うシェル(コマンドプロンプト)は理解してくれませんので、外部変形プログラムの実行部分はバッチファイルの上の方にまとめて記述します。この際に、選択した番号(1〜9)が「%1」に代入されますので、これを外部変形プログラムの起動オプションとして利用するか、或いは、goto文のラベルとして利用して分岐させるようにします。
上記では起動オプションを「/R1」「/R2」のように既に使っていますので後者のパターンでバッチファイルを作ります。
REM p031:2点間線
@echo off
GOTO EXE-%1
REM
REM ----- 1)2点指定 実行プログラム -----
:EXE-1
start /w p030.exe
GOTO END
REM
REM ----- 2)複数点指定 実行プログラム -----
:EXE-2
start /w p030.exe /R1
GOTO END
REM
REM ----- 3)終点指定 実行プログラム -----
:EXE-3
start /w p030.exe /R2
GOTO END
REM
・・・
バッチファイルは最後まで行くと終了しますので、バッチファイルの最後に
:END
REM 終了
と記述し、そこへジャンプするように記述します。
 
以下にまとめます。
p031_2点間線.bat
REM p031:2点間線
@echo off
GOTO EXE-%1
REM
REM ----- 1)2点指定 実行プログラム -----
:EXE-1
start /w p030.exe
GOTO END
REM
REM ----- 2)複数点指定 実行プログラム -----
:EXE-2
start /w p030.exe /R1
GOTO END
REM
REM ----- 3)終点指定 実行プログラム -----
:EXE-3
start /w p030.exe /R2
GOTO END
REM
REM
REM ----- ----- ----- ----- ----- -----
REM #jww
REM #cd
REM #hc 2点間線を作図する外部変形です。機能を選択して下さい(1〜3)
REM #hm2点間線|1)2点指定|2)複数点指定|3)終点指定|
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
:END
REM 終了
Jw_cad を起動し、
メニュー→その他→外部変形
「ファイル選択」画面でフォルダ「Gapp」を指定し、以前に作成したバッチファイル「p031_2点間線.bat」を実行して下さい。

複雑になってくると、項目選択ボタンをクリックしたら別のバッチファイルへ移行するというパターンも可能だと思います。
 

 
次に、現在の「2点間線」では現在の線色・線種・線幅での作図となっていますが、設定画面を設けて、その線色・線種・線幅での作図を行う事を考えてみます。
先にバッチファイルを用意しておく事にします。設定画面は起動オプションが無しの時に行うようにします。2点指定の場合、起動オプション「/R0」を指定する事にします。上記の「p031_2点間線.bat」を少し変更しておきます。
p031_2点間線.bat
REM p031:2点間線
@echo off
GOTO EXE-%1
REM
REM ----- 1)2点指定 実行プログラム -----
:EXE-1
start /w p031.exe /R0
GOTO END
REM
REM ----- 2)複数点指定 実行プログラム -----
:EXE-2
start /w p031.exe /R1
GOTO END
REM
REM ----- 3)終点指定 実行プログラム -----
:EXE-3
start /w p031.exe /R2
GOTO END
REM
REM ----- 4)設定 実行プログラム -----
:EXE-4
start /w p031.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 終了
 
プロジェクト「p031」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p031」というフォルダを作成し、Windowsのエクスプローラ等で「p030」内のファイルを「p031」の中へコピーします(※移動しないよう注意)
Delphi6を起動します。メニュー「ファイル」→「プロジェクトを開く」を実行し、「C:\DelphiProgram\jww\p031」内の「p030.dpr」を開きます。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p031−2点間線
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p031

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

起動オプション無しで起動した場合には、画面を最小化せずそのまま表示し、自動的に Close させないようにします。Close時に「JWC_TEMP.TXT」への書き出しは行いません。それ以外の場合はこれまで通りです。Form1 画面はそのまま設定画面となります。
それではForm1画面を作成します。
[Standard]内の Label コンポーネントを3つ配置し、それぞれ Captionプロパティを「線色」「線種」「線幅」とします。線色・線種は選択をしたいので項目選択の出来る ComboBox コンポーネントを使います。3つ配置します。オブジェクトインスペクタでプロパティを以下のように変更します。
ComboBox1、ComboBox2
ImeModeimDisable全角入力出来ないように
StylecsDropDownListキー入力せず項目選択のみ
ComboBox3
ImeModeimDisable全角入力出来ないように
Items任意 よく利用する線幅値を
1行1値ずつ入力して下さい
StylecsDropDownキー入力と項目選択を行いたい
Styleプロパティが「csDropDownList」の場合は、ItemIndexプロパティで何個目を指定したのかを判断させます。Styleプロパティが「csDropDown」の場合は、Textプロパティで内容を取得します。ComboBox1,2の項目一覧はプログラム上で書くようにします。ComboBox1の一番最初は「現在線色」ComboBox2の一番最初は「現在線種」ComboBox3は何も入力していない状態(空状態)を「現在線幅」とします。
設定した内容は設定ファイル「p031.dat」に保存し、読み込んで利用するようにします。設定ファイルの読み書きを行う手続きは TForm1のprivateで定義するようにします。
[Standard]内の Button プロパティを2つ配置し、それぞれ以下のようにプロパティを指定します。
Button1
CaptionOK(&Y)ボタン上の文字
DefaultTrue[Enter]キーを押したら[OK]
Button2
Captionキャンセル(&N)ボタン上の文字
CancelTrue[Esc]キーを押したら[キャンセル]
画面のレイアウトは下図のようにしてみました。

Button1、Button2をダブルクリックして OnClickイベントを記述出来るようにします。以下、ここまでのプログラムです。画面の位置はマウス位置を読み取るようにしてみます。
Unit1.pas
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MyFunc, JwwGaibu, StdCtrls ;
 
type
  TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   ComboBox1: TComboBox;
   ComboBox2: TComboBox;
   ComboBox3: TComboBox;
   Button1: TButton;
   Button2: TButton;
   procedure FormShow(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
  private
   { Private 宣言 }
   AppPath : string ;
   px,py : double ;
   col,ltp,wid : integer ;
   procedure OpenDatFile ;
   procedure SaveDatFile ;
  public
   { Public 宣言 }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// データファイルを読み込む
procedure TForm1.OpenDatFile ;
var
  fn: string ;
  F : TextFile ;
  s : string ;
begin
  fn := ChangeFileExt(Application.ExeName,'.dat') ;
  px := 0.0;
  py := 0.0;
  col:= 0;
  ltp:= 0;
  wid:=-1;
  // 読み込み
  if not(FileExists(fn)) then exit;
  try
   AssignFile(F, fn);
   FileMode := 0;
   Reset(F);
  
   ReadLn(F, s); px := SDbl(s);
   ReadLn(F, s); py := SDbl(s);
   ReadLn(F, s); col:= SInt(s);
   ReadLn(F, s); ltp:= SInt(s);
   ReadLn(F, s); wid:= SInt(s);
  
   CloseFile(F);
  except
   CloseFile(F);
  end;
end;
 
// データファイルを保存する
procedure TForm1.SaveDatFile ;
var
  fn: string ;
  F : TextFile ;
begin
  fn := ChangeFileExt(Application.ExeName,'.dat') ;
  try
   AssignFile(F, fn);
   ReWrite(F);
  
   WriteLn(F, FloatToStr(px));
   WriteLn(F, FloatToStr(py));
   WriteLn(F, IntToStr(col));
   WriteLn(F, IntToStr(ltp));
   WriteLn(F, IntToStr(wid));
  
   CloseFile(F);
  except
   CloseFile(F);
   if FileExists(fn) then
    DeleteFile(fn);
  end;
end;
 
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
  i : integer ;
begin
  if (ParamCount >= 1) then
   Form1.WindowState := wsMinimized ;
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  // JWC_TEMP.TXTを開きます
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  //
  OpenDatFile ;
  if (ParamCount >= 1) then begin
   if (ParamStr(1) = '/R0') then begin
    S_Line(JG_IPoints[1].x , JG_IPoints[1].y,
       JG_IPoints[2].x , JG_IPoints[2].y );
    px := JG_IPoints[2].x ;
    py := JG_IPoints[2].y ;
   end
   else if (ParamStr(1) = '/R1') then begin
    for i:=1 to 98 do begin
     if not(JG_IPoints[i+1].flg) then break;
     S_Line(JG_IPoints[i ].x , JG_IPoints[i ].y,
        JG_IPoints[i+1].x , JG_IPoints[i+1].y );
     px := JG_IPoints[i+1].x ;
     py := JG_IPoints[i+1].y ;
    end;
   end
   else if (ParamStr(1) = '/R2') then begin
    S_Line(px,py, JG_IPoints[1].x , JG_IPoints[1].y);
    px := JG_IPoints[1].x ;
    py := JG_IPoints[1].y ;
   end;
   SaveDatFile ;
   Close ;
  end
  else begin
   // 設定
   Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
   Form1.Top := Mouse.CursorPos.Y - Form1.Height div 2;
   //
   ComboBox1.Items.Clear ;
   ComboBox1.Items.Add('現在線色');
   for i:=1 to 9 do
    ComboBox1.Items.Add('線色'+IntToStr(i));
   for i:=1 to 256 do
    ComboBox1.Items.Add('SXF-'+IntToStr(i));
   ComboBox2.Items.Clear ;
   ComboBox2.Items.Add('現在線種');
   for i:=1 to 9 do
    ComboBox2.Items.Add('線種'+IntToStr(i));
   for i:=1 to 5 do
    ComboBox2.Items.Add('ランダム線'+IntToStr(i));
   for i:=1 to 4 do
    ComboBox2.Items.Add('倍長線種'+IntToStr(i));
   for i:=1 to 32 do
    ComboBox2.Items.Add('SXF-'+IntToStr(i));
   ComboBox3.Text := '' ;
   //
   ComboBox1.ItemIndex := col ;
   ComboBox2.ItemIndex := ltp ;
   if (wid >= 0) then
    ComboBox3.Text := IntToStr(wid);
  end;
end;
 
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if (ParamCount >= 1) then begin
   // JWC_TEMP.TXTを保存します
   SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
  end;
  // 最終処理
  EndJwwGaibu ;
end;
 
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
begin
  col := ComboBox1.ItemIndex ;
  ltp := ComboBox2.ItemIndex ;
  if (ComboBox3.Text = '') then
   wid := -1
  else
   wid := SInt(ComboBox3.Text);
  SaveDatFile ;
  Close ;
end;
 
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close ;
end;
 
end.
それでは設定した内容で線分を作図するようにします。線色・線種・線幅の設定(変更)は下記で行います。
「lc」 線色設定 現在の線色
 書式:lc○  ○:線色

「lt」 線種設定 現在の線種
 書式:lt○  ○:線種

「lw」 線幅設定 現在の線幅
 書式:lw○  ○:線幅 1/100mm単位整数
SXF線色は 101〜356、ランダム線種は 11〜15、倍長線種は 16〜19、SXF線種は 31〜62、となります。線幅は 0〜30000まで入力可能のようです。(設定→基本設定 [色・画面]頁での設定は 1〜500のようですが)線幅=0 は、基本線幅となります。これを考慮してプログラムの追記を行います。
Unit1.pas
(・・・前略・・・)
procedure TForm1.FormShow(Sender: TObject);
(・・・)
  if (ParamCount >= 1) then begin
   // 線色
   i := JG_CurCol ;
   if (col > 0) then begin
    if (col >= 10) then
     i := col - 10 + 101
    else
     i := col ;
   end;
   SendMem('lc'+IntToStr(i));
   // 線種
   i := JG_CurLtp ;
   if (ltp > 0) then begin
    if (ltp >= 19) then
     i := ltp - 19 + 31
    else if (ltp >= 10) then
     i := ltp - 10 + 11
    else
     i := ltp ;
   end;
   SendMem('lt'+IntToStr(i));
   // 線幅
   i := JG_CurWid ;
   if (wid >= 0) then begin
    if (wid <= 30000) then
     i := wid ;
   end;
   SendMem('lw'+IntToStr(i));
   //
   if (ParamStr(1) = '/R0') then begin
(・・・後略・・・)
のようになりますが、プログラムが綺麗に見えませんし、何度も指定するたびに同じ事を記述するのは手間ですので、これを「S_Col」のような名前の手続きにします。レイヤグループ・レイヤも「S_〜」に書き換えておきます。
JwwGaibu.pas
(・・・前略・・・)
  procedure SendMem(s:string);
  procedure S_LGrp(lgrp:integer);
  procedure S_Lay(lay:integer);
  procedure S_Col(col,mode:integer);
  procedure S_Ltp(ltp,mode:integer);
  procedure S_Wid(wid:integer);
  procedure S_Line(x1,y1,x2,y2:double);
 
implementation
(・・・中略・・・)
procedure S_LGrp(lgrp:integer);
(・・・)
end;
 
procedure S_Lay(lay:integer);
(・・・)
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
//  書き込み線色を指定
//  col : 色番号
//  mode: 0:色番号をそのまま出力 1:選択項目リストを変換して出力
procedure S_Col(col,mode:integer);
var
  i : integer ;
begin
  i := col ;
  if (mode = 1) then begin
   i := JG_CurCol ;
   if (col > 0) then begin
    if (col >= 10) then
     i := col - 10 + 101
    else
     i := col ;
   end;
  end;
  SendMem('lc'+IntToStr(i));
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
//  書き込み線種を指定
//  ltp : 線種番号
//  mode: 0:線種番号をそのまま出力 1:選択項目リストを変換して出力
procedure S_Ltp(ltp,mode:integer);
var
  i : integer ;
begin
  i := ltp ;
  if (mode = 1) then begin
   i := JG_CurLtp ;
   if (ltp > 0) then begin
    if (ltp >= 19) then
     i := ltp - 19 + 31
    else if (ltp >= 10) then
     i := ltp - 10 + 11
    else
     i := ltp ;
   end;
  end;
  SendMem('lt'+IntToStr(i));
end;
 
// 「JWC_TEMP.TXT」生成用メモリへの送信
//  書き込み線幅を指定
//  wid : 線幅[1/100mm]
//     -1 : 現在の線幅値を出力
procedure S_Wid(wid:integer);
var
  i : integer ;
begin
  i := wid ;
  if (wid = -1) then
   i := JG_CurWid ;
  if (i < 0)or(i > 30000) then
   i := 0 ;
  SendMem('lw'+IntToStr(i));
end;
(・・・後略・・・)
Unit1.pas
(・・・前略・・・)
procedure TForm1.FormShow(Sender: TObject);
(・・・)
  if (ParamCount >= 1) then begin
   S_Col(col,1); // 線色
   S_Ltp(ltp,1); // 線種
   S_Wid(wid); // 線幅
   if (ParamStr(1) = '/R0') then begin
(・・・後略・・・)
線色・線種の書き出しは、指定したそのままの値を書き出したい場合も多くなると思われますので、mode値で切り替える事が出来るようにしておきます。
 
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p031」内に作成された「p031.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.