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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】補助線の作図
今回は、補助線の作図を行う外部変形アプリケーションを作っていこうと思います。
 
◆補助線って何?
 作図する際に補助的に作図する線分等の事です。ある線分の延長線だったり、目盛(グリッド)のように位置決めをするものだったり、交点等を出すためのものだったり等、使い方は色々ですが、補助線は印刷されない、という事も重要です。まぁ、印刷されないからといって作図したものをずっとほったらかしにするっていうのも何ですけれど。(データとしては残りますので)
 
◆Jw_cadでの補助線の扱い
 線色に「補助線色」というものがあります。これで作図します。同様に線種にも「補助線種」というものがありますが、点や文字には線種はありませんし、短い補助線種の線が印刷されてしまうという件もありますので線種は任意とし、線色を補助線色で作図する、という事にします。また、補助線はある特定のレイヤグループ・レイヤにまとめて入れる事が多いので、その設定も行うようにします。
 Jw_cadでは、補助線作図を行うコマンド、というものはありません。線色や線種を補助線色・補助線種にして、各作図コマンドを使う事で補助線作図を行います。
 

 
今回は、作図の際のパラメータ入力画面と設定画面をページ切替出来るようにして1つのFormで行うようにします。補助線は画面一杯一杯に作図する場合が多いですが、用紙枠でクリッピング(用紙枠内に収まるような調整)は行わず、長い線分を作図するという事にします。まずは2点指定・水平線・垂直線・角度線・平行線・直交線・傾き線・設定から。
それではバッチファイルです。以前の「線の作図」とは少し変更していますので御注意下さい。
p039_補助線の作図.bat
REM p039:補助線の作図
@echo off
GOTO EXE-%1
REM
REM ----- 1)2点指定 実行プログラム -----
:EXE-1
start /w p039.exe /R1
GOTO END
REM
REM ----- 2)水平線 実行プログラム -----
:EXE-2
start /w p039.exe /R2
GOTO END
REM
REM ----- 3)垂直線 実行プログラム -----
:EXE-3
start /w p039.exe /R3
GOTO END
REM
REM ----- 4)角度線 実行プログラム -----
:EXE-4
start /w p039.exe /R4 %2
GOTO END
REM
REM ----- 5)平行線 実行プログラム -----
:EXE-5
start /w p039.exe /R5
GOTO END
REM
REM ----- 6)直交線 実行プログラム -----
:EXE-6
start /w p039.exe /R6
GOTO END
REM
REM ----- 7)傾き線 実行プログラム -----
:EXE-7
start /w p039.exe /R7 %2
GOTO END
REM
REM ----- 8)その他 -----
:EXE-8
REM
GOTO END
REM
REM ----- 9)設定 実行プログラム -----
:EXE-9
start /w p039.exe
GOTO END
REM
REM
REM ----- ----- ----- ----- ----- -----
REM #jww
REM #cd
REM #hc 補助線を作図する外部変形です。機能を選択して下さい(1〜9)
REM #hm補助線の作図|1)2点指定|2)水平線|3)垂直線|4)角度線|5)平行線|6)直交線|7)傾き線|##|9)設定|
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 通過点を指示して下さい。(L)free (R)Read
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 #c 角度を入力して下さい。[°]
REM #1 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:5 -----平行線-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1ln 基準線を指示して下さい。
REM #2 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:6 -----直交線-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1ln 基準線を指示して下さい。
REM #2 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #hr
REM #e
REM
REM #:7 -----傾き線-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #c 傾き角度を入力して下さい。[°]
REM #1ln 基準線を指示して下さい。
REM #2 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:9 -----設定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #hr
REM #e
REM
:END
REM 終了
 
プロジェクト「p039」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p039」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p039−補助線の作図
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p039

メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p039」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p039」の中に「p039.dpr」として保存

Form1の画面は、取りあえずいつもと同じく、大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
BorderIcons
 biMaximize
False最大化しないように
BorderStylebsSingle画面をリサイズしないように
Caption補助線の作図タイトルバーに表示されます
ColorclSkyBlueお好みでどうぞ
Font内
 Name
MS ゴシック プロポーショナルフォントは
文字配置調整が微妙なので
Font内
 Size
10小さいと少し見難い為
ScaledFalse 動作環境によっての文字の
大きさ変動を少し抑えられる

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
前回作成した「MyFunc.pas」「JwwGaibu.pas」を取り込んでみます。この2つのファイルをエクスプローラで「C:\DelphiProgram\jww\p038」から「C:\DelphiProgram\jww\p039」へコピーします。(※移動しないよう注意)
メニュー「プロジェクト」→「プロジェクトに追加」
を行い「C:\DelphiProgram\jww\p039」の中の「MyFunc.pas」と「JwwGaibu.pas」を指定します。すると、コード画面左側のプロジェクトマネージャに「MyFunc.pas」と「JwwGaibu.pas」が追加されます。
 
Unit1.pas の uses節に MyFunc と JwwGaibu を追加します。(※以下では全角空白を付けて桁調整等をしていますが実際は半角空白或いは無しです)
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  MyFunc, JwwGaibu ;
 
type
  TForm1 = class(TForm)
・・・
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
アイコンが Delphi6デフォルトのものになっていますので、メニュー「ツール」→「イメージエディタ」を実行し、そのメニュー「ファイル」→「新規作成」→「アイコンファイル」を実行し、16×16・16色のアイコンを作成します。(32×32でも構いませんし他のツールで作成するのでも構いません)「C:\DelphiProgram\jww\p039」の中に「Icon1.ico」として保存します。保存できたらイメージエディタを終了します。
メニュー「プロジェクト」→「オプション」を実行し、
[アプリケーション]頁の中の[アイコンの読み込み]ボタンをクリックし、「C:\DelphiProgram\jww\p039\Icon1.ico」を指定します。[OK]ボタンをクリックしてプロジェクトオプション画面を閉じます。
オブジェクトインスペクタにて、Form1 の Icon プロパティの入力欄右端の[…]をクリックして、[読み込み]ボタンをクリックし、「Icon1」を指定して、[OK]ボタンをクリックします。

ページ切替を出来るようにするため、[Win32]内の PageControl コンポーネントを配置します。TabControl コンポーネントはページ毎に異なるコンポーネントの配置が出来ませんのでここでは使用しません。オブジェクトインスペクタで PageControl1のプロパティを変更します。
AlignalTop画面の下にボタンを配置するので alClient には しません
PageControl1 上で右クリックを行い、表示されるポップアップメニューの「ページ新規作成」を2回行います。オブジェクトインスペクタで TabSheet1 の Caption プロパティを「作図(&1)」、TabSheet2 の Caption プロパティを「設定(&2)」としておきます。「作図」の方はそのままにしておき、「設定」ページの中身をまず作ります。その前に、Form1 の画面下部分に、ボタンを2つ配置し、それぞれ以下のようにプロパティを指定します。
Button1
CaptionOK(&Y)ボタン上の文字
DefaultTrue[Enter]キーを押したら[OK]
Button2
Captionキャンセル(&N)ボタン上の文字
CancelTrue[Esc]キーを押したら[キャンセル]
オブジェクトインスペクタにて Form1 の イベント OnShowの箇所でダブルクリック、OnCloseの箇所でダブルクリックし、取りあえず下記のように追記します。
Unit1.pas
(・・・前略・・・)
type
  TForm1 = class(TForm)
 (・・・)
  private
   { Private 宣言 }
   AppPath : string ;
  public
   { Public 宣言 }
  end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
  if (ParamCount >= 1) then
   Form1.WindowState := wsMinimized ;
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  // JWC_TEMP.TXTを開きます
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
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;
 
end.
[設定]ページの中に コンポーネントを配置していきます。[Standard]内の Label を4つ、ComboBox を4つ配置します。Label の Captionプロパティはそれぞれ「レイヤグループ」「レイヤ」「線 種」「線 幅」としています。ComboBoxのプロパティについては下記。ComboBox1・2・3についてはプログラムで内容を入れる事にします。
ComboBox1、ComboBox2、ComboBox3
ImeModeimDisable全角入力出来ないように
StylecsDropDownListキー入力せず項目選択のみ
ComboBox4
ImeModeimDisable全角入力出来ないように
Items任意 よく利用する線幅値を
1行1値ずつ入力して下さい
StylecsDropDownキー入力と項目選択を行いたい


なお、線の作図のような ListBox は配置していません。補助線を色々使い分けたいというケースは余り無いと思われる為です。もし必要な方は独自に追加してみて下さい。
Button1、Button2をダブルクリックして OnClickイベントを記述出来るようにします。取りあえず。
Unit1.pas
(・・・前略・・・)
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Close ;
end;
 
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close ;
end;
 
end.
設定値を登録出来るようにします。
Unit1.pas
(・・・前略・・・)
type
  TForm1 = class(TForm)
 (・・・)
  private
   { Private 宣言 }
   AppPath : string ;
   lgrp,lay,ltp,wid : integer ;
   procedure OpenDatFile ;
   procedure SaveDatFile ;
  public
   { Public 宣言 }
  end;
 
const
  SENLEN = 100000000.0 ;   // 補助線の長さ
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// データファイルを読み込む
procedure TForm1.OpenDatFile ;
var
  fn: string ;
  F : TextFile ;
  s : string ;
begin
  fn := ChangeFileExt(Application.ExeName,'.dat') ;
  lgrp:=-1;
  lay :=-1;
  ltp := 0;
  wid :=-1;
  // 読み込み
  if not(FileExists(fn)) then exit;
  try
   AssignFile(F, fn);
   FileMode := 0;
   Reset(F);
   ReadLn(F, s); lgrp:= SInt(s);
   ReadLn(F, s); lay := 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, IntToStr(lgrp));
   WriteLn(F, IntToStr(lay));
   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 ;
  w1,w2,w3,w4,w5,w7,w8,w9 : double ;
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
   S_Init ; // 初期化
   if (lgrp = -1) then   // レイヤグループ
    S_LGrp(JG_CurLgrp)
   else
    S_LGrp(lgrp);
   if (lay = -1) then   // レイヤ
    S_Lay(JG_CurLay)
   else
    S_Lay(lay);
   S_Col(9,0);    // 線色=補助線=9
   S_Ltp(ltp,1);   // 線種
   S_Wid(wid);    // 線幅
   //
   if (ParamStr(1) = '/R1') then begin
    // 2点指定
    w1 := JG_IPoints[1].x ;
    w2 := JG_IPoints[1].y ;
    w3 := JG_IPoints[2].x ;
    w4 := JG_IPoints[2].y ;
    w5 := Angle(w3-w1,w4-w2); // 2点の傾き角度[rad]
    w7 := (w1+w3)/2.0 ; // 2点の中点
    w8 := (w2+w4)/2.0 ;
    w1 := w7 + SENLEN/2.0*Cos(w5);
    w2 := w8 + SENLEN/2.0*Sin(w5);
    w3 := w7 + SENLEN/2.0*Cos(w5+Pi);
    w4 := w8 + SENLEN/2.0*Sin(w5+Pi);
    S_Line(w1,w2, w3,w4);
   end
   else if (ParamStr(1) = '/R2')
      or(ParamStr(1) = '/R3')
      or(ParamStr(1) = '/R4') then begin
    // 水平線・垂直線・角度線
    w9 := JG_Jikukaku ;
    if (ParamStr(1) = '/R3') then w9 := w9 + 90.0
    else if (ParamStr(1) = '/R4') then w9 := w9 + SDbl(ParamStr(2)) ;
    w5 := w9/180.0*Pi ;
    w7 := JG_IPoints[1].x ;
    w8 := JG_IPoints[1].y ;
    w1 := w7 + SENLEN/2.0*Cos(w5);
    w2 := w8 + SENLEN/2.0*Sin(w5);
    w3 := w7 + SENLEN/2.0*Cos(w5+Pi);
    w4 := w8 + SENLEN/2.0*Sin(w5+Pi);
    S_Line(w1,w2, w3,w4);
   end
   else if (ParamStr(1) = '/R5')
      or(ParamStr(1) = '/R6')
      or(ParamStr(1) = '/R7') then begin
    // 平行線・直交線・傾き線
    if (JW_EntLineN = 0) then Close ;
    with JW_EntLine[0] do
     w9 := Angle(x2-x1,y2-y1)*180.0/Pi;
    if (w9 >= 180.0) then
     w9 := w9 - 180.0;
    if (ParamStr(1) = '/R6') then w9 := w9 + 90.0
    else if (ParamStr(1) = '/R7') then w9 := w9 + SDbl(ParamStr(2)) ;
    w5 := w9/180.0*Pi ;
    w7 := JG_IPoints[2].x ;
    w8 := JG_IPoints[2].y ;
    w1 := w7 + SENLEN/2.0*Cos(w5);
    w2 := w8 + SENLEN/2.0*Sin(w5);
    w3 := w7 + SENLEN/2.0*Cos(w5+Pi);
    w4 := w8 + SENLEN/2.0*Sin(w5+Pi);
    S_Line(w1,w2, w3,w4);
   end;
   if (lgrp <> -1) then
    S_LGrp(JG_CurLgrp);   // レイヤグループを戻す
   if (lay <> -1) then
    S_Lay(JG_CurLay);    // レイヤを戻す
   SaveDatFile ;
   Close ;
  end
  else begin
   // 設定
   Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
   Form1.Top := Mouse.CursorPos.Y - Form1.Height div 2;
   PageControl1.ActivePage := TabSheet2 ; // [設定]
   //
   ComboBox1.Items.Clear ;
   ComboBox1.Items.Add('現在レイヤグループ');
   for i:=0 to 15 do
    ComboBox1.Items.Add('レイヤグループ['+IntToHex(i,1)+']');
   ComboBox2.Items.Clear ;
   ComboBox2.Items.Add('現在レイヤ');
   for i:=0 to 15 do
    ComboBox2.Items.Add('レイヤ('+IntToHex(i,1)+')');
   ComboBox3.Items.Clear ;
   ComboBox3.Items.Add('現在線種');
   for i:=1 to 9 do
    ComboBox3.Items.Add('線種'+IntToStr(i));
   for i:=1 to 5 do
    ComboBox3.Items.Add('ランダム線'+IntToStr(i));
   for i:=1 to 4 do
    ComboBox3.Items.Add('倍長線種'+IntToStr(i));
   for i:=1 to 32 do
    ComboBox3.Items.Add('SXF-'+IntToStr(i));
   ComboBox4.Text := '' ;
   //
   ComboBox1.ItemIndex := lgrp + 1 ;
   ComboBox2.ItemIndex := lay + 1 ;
   ComboBox3.ItemIndex := ltp ;
   if (wid >= 0) then
    ComboBox4.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
  lgrp:= ComboBox1.ItemIndex - 1 ;
  lay := ComboBox2.ItemIndex - 1 ;
  ltp := ComboBox3.ItemIndex ;
  if (ComboBox4.Text = '') then
   wid := -1
  else
   wid := SInt(ComboBox4.Text);
  SaveDatFile ;
  Close ;
end;
 
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close ;
end;
 
end.
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p039」内に作成された「p039.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。
 

 
次に、補助線色による点の作図と、補助線色による円の作図も行いたいとします。もう1つバッチファイルを用意し、バッチファイルの移行を出来るようにします。
p039_補助線の作図.bat
REM p039:補助線の作図
@echo off
GOTO EXE-%1
REM
REM ----- 1)2点指定 実行プログラム -----
:EXE-1
start /w p039.exe /R1
GOTO END
REM
REM ----- 2)水平線 実行プログラム -----
:EXE-2
start /w p039.exe /R2
GOTO END
REM
REM ----- 3)垂直線 実行プログラム -----
:EXE-3
start /w p039.exe /R3
GOTO END
REM
REM ----- 4)角度線 実行プログラム -----
:EXE-4
start /w p039.exe /R4 %2
GOTO END
REM
REM ----- 5)平行線 実行プログラム -----
:EXE-5
start /w p039.exe /R5
GOTO END
REM
REM ----- 6)直交線 実行プログラム -----
:EXE-6
start /w p039.exe /R6
GOTO END
REM
REM ----- 7)傾き線 実行プログラム -----
:EXE-7
start /w p039.exe /R7 %2
GOTO END
REM
REM ----- 8)その他 -----
:EXE-8
REM
GOTO END
REM
REM ----- 9)設定 実行プログラム -----
:EXE-9
start /w p039.exe
GOTO END
REM
REM
REM ----- ----- ----- ----- ----- -----
REM #jww
REM #cd
REM #hc 補助線を作図する外部変形です。機能を選択して下さい(1〜9)
REM #hm補助線の作図|1)2点指定|2)水平線|3)垂直線|4)角度線|5)平行線|6)直交線|7)傾き線|8)その他|9)設定|
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 通過点を指示して下さい。(L)free (R)Read
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 #c 角度を入力して下さい。[°]
REM #1 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:5 -----平行線-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1ln 基準線を指示して下さい。
REM #2 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:6 -----直交線-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1ln 基準線を指示して下さい。
REM #2 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #hr
REM #e
REM
REM #:7 -----傾き線-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #c 傾き角度を入力して下さい。[°]
REM #1ln 基準線を指示して下さい。
REM #2 通過点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:8 -----その他-----
REM #h/p039a_補助線の作図.bat
REM #e
REM
REM #:9 -----設定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #hr
REM #e
REM
:END
REM 終了
p039a_補助線の作図.bat
REM p039a:補助線の作図
@echo off
GOTO EXE-%1
REM
REM ----- 1)点 実行プログラム -----
:EXE-1
start /w p039.exe /R8
GOTO END
REM
REM ----- 2)円1 実行プログラム -----
:EXE-2
start /w p039.exe /R9
GOTO END
REM
REM ----- 3)円2 実行プログラム -----
:EXE-3
start /w p039.exe /R10
GOTO END
REM
REM ----- 9)戻る -----
:EXE-9
REM
GOTO END
REM
REM
REM ----- ----- ----- ----- ----- -----
REM #jww
REM #cd
REM #hc 補助線を作図する外部変形です。機能を選択して下さい(1〜9)
REM #hm補助線の作図|1)点|2)円1|3)円2|##|##|##|##|##|9)戻る|
REM
REM #:1 -----点-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1 配置点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:2 -----円1-----
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 #:3 -----円2-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #1 中心点を指示して下さい。(L)free (R)Read
REM #hr
REM #e
REM
REM #:9 -----戻る-----
REM #h/p039_補助線の作図.bat
REM #e
REM
:END
REM 終了
点は配置点を指定するのみ、円1は中心点と半径指定点を指定しますので良いとして、円2作図では、半径・偏平率・傾き角度(楕円の場合)の入力を必要としますが、角度線のような「REM #c」ではなく、プログラム画面にて行います。[作図]ページ内に LabelコンポーネントとEditコンポーネントを配置し、プログラム内で内容を変えます。そうすれば他の作図コマンドとも共用が可能です。不要なものは見えないように Visibleプロパティを Falseにすれば良いでしょう。設定側と間違えないように Nameプロパティを”LabelA1”のように変えておきます。Editコンポーネントの ImeModeプロパティは「imDisable」にしておきます。

Unit1.pas
(・・・前略・・・)
type
  TForm1 = class(TForm)
 (・・・)
  private
   { Private 宣言 }
   AppPath : string ;
   lgrp,lay,ltp,wid : integer ;
   c10_r,c10_h,c10_a : double ;
   procedure OpenDatFile ;
(・・・)
// データファイルを読み込む
procedure TForm1.OpenDatFile ;
(・・・)
  wid :=-1;
  c10_r := 100.0;
  c10_h := 1.0;
  c10_a := 0.0;
(・・・)
   ReadLn(F, s); wid := SInt(s);
   ReadLn(F, s); c10_r:= SDbl(s);
   ReadLn(F, s); c10_h:= SDbl(s);
   ReadLn(F, s); c10_a:= SDbl(s);
   CloseFile(F);
(・・・)
// データファイルを保存する
procedure TForm1.SaveDatFile ;
(・・・)
   WriteLn(F, IntToStr(wid));
   WriteLn(F, FloatToStr(c10_r));
   WriteLn(F, FloatToStr(c10_h));
   WriteLn(F, FloatToStr(c10_a));
   CloseFile(F);
(・・・)
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
  i : integer ;
  w1,w2,w3,w4,w5,w7,w8,w9 : double ;
  sflag : Boolean ;
begin
(・・・)
  OpenDatFile ;
  sflag := False ;
  if (ParamCount >= 1) then begin
  (・・・)
   else if (ParamStr(1) = '/R5')
      or(ParamStr(1) = '/R6')
      or(ParamStr(1) = '/R7') then begin
   (・・・)
   end
   else if (ParamStr(1) = '/R8') then begin
    // 点
    w1 := JG_IPoints[1].x ;
    w2 := JG_IPoints[1].y ;
    S_PCol(9,0);
    S_Ten(w1,w2);
   end
   else if (ParamStr(1) = '/R9') then begin
    // 円1
    w1 := JG_IPoints[1].x ;
    w2 := JG_IPoints[1].y ;
    w3 := JG_IPoints[2].x ;
    w4 := JG_IPoints[2].y ;
    w5 := Dist(w1,w2,w3,w4);
    S_Circle(w1,w2,w5);
   end;
  end
  else begin
   sflag := True ;
   PageControl1.ActivePage := TabSheet2 ; // [設定]
  end;
  //
  if (ParamCount >= 1) then begin
   LabelA1.Visible := False; EditA1.Visible := False;
   LabelA2.Visible := False; EditA2.Visible := False;
   LabelA3.Visible := False; EditA3.Visible := False;
   if (ParamStr(1) = '/R10') then begin
    // 円2
    LabelA1.Visible := True; EditA1.Visible := True;
    LabelA2.Visible := True; EditA2.Visible := True;
    LabelA3.Visible := True; EditA3.Visible := True;
    LabelA1.Caption := '半 径';
    LabelA2.Caption := '偏平率';
    LabelA3.Caption := '傾き角度[°]';
    EditA1.Text := FloatToStr(c10_r);
    EditA2.Text := FloatToStr(c10_h);
    EditA3.Text := FloatToStr(c10_a);
    PageControl1.ActivePage := TabSheet1 ;
    sflag := True ;
   end;
  end;
  //
  if (sflag) then begin
   // 設定
   Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
   Form1.Top := Mouse.CursorPos.Y - Form1.Height div 2;
   Form1.WindowState := wsNormal;
   //
   ComboBox1.Items.Clear ;
   ComboBox1.Items.Add('現在レイヤグループ');
   for i:=0 to 15 do
    ComboBox1.Items.Add('レイヤグループ['+IntToHex(i,1)+']');
   ComboBox2.Items.Clear ;
   ComboBox2.Items.Add('現在レイヤ');
   for i:=0 to 15 do
    ComboBox2.Items.Add('レイヤ('+IntToHex(i,1)+')');
   ComboBox3.Items.Clear ;
   ComboBox3.Items.Add('現在線種');
   for i:=1 to 9 do
    ComboBox3.Items.Add('線種'+IntToStr(i));
   for i:=1 to 5 do
    ComboBox3.Items.Add('ランダム線'+IntToStr(i));
   for i:=1 to 4 do
    ComboBox3.Items.Add('倍長線種'+IntToStr(i));
   for i:=1 to 32 do
    ComboBox3.Items.Add('SXF-'+IntToStr(i));
   ComboBox4.Text := '' ;
   //
   ComboBox1.ItemIndex := lgrp + 1 ;
   ComboBox2.ItemIndex := lay + 1 ;
   ComboBox3.ItemIndex := ltp ;
   if (wid >= 0) then
    ComboBox4.Text := IntToStr(wid);
  end
  else begin
   if (lgrp <> -1) then
    S_LGrp(JG_CurLgrp); // レイヤグループを戻す
   if (lay <> -1) then
    S_Lay(JG_CurLay); // レイヤを戻す
   SaveDatFile ;
   Close ;
  end;
end;
(・・・)
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
  flag : Boolean ;
  w1,w2,w3 : double ;
begin
  lgrp:= ComboBox1.ItemIndex - 1 ;
  lay := ComboBox2.ItemIndex - 1 ;
  ltp := ComboBox3.ItemIndex ;
  if (ComboBox4.Text = '') then
   wid := -1
  else
   wid := SInt(ComboBox4.Text);
  //
  if (ParamCount >= 1) then begin
   flag := False;
   if (ParamStr(1) = '/R10') then begin
    c10_r := SDbl(EditA1.Text);
    c10_h := SDbl(EditA2.Text);
    c10_a := SDbl(EditA3.Text);
    if (c10_r <= _LIMIT) then exit;
    if (c10_h <= _LIMIT) then exit;
    while (c10_a < 0.0) do c10_a := c10_a + 360.0;
    while (c10_a >= 360.0) do c10_a := c10_a - 360.0;
    flag := True;
   end;
   //
   if (flag) then begin
    if (ParamStr(1) = '/R10') then begin
     w1 := JG_IPoints[1].x ;
     w2 := JG_IPoints[1].y ;
     if (Abs(c10_h-1.0) <= _LIMIT) then begin
      S_Circle(w1,w2,c10_r);
     end
     else begin
      w3 := JG_Jikukaku + c10_a ;
      S_Arc(w1,w2,c10_r,0.0,0.0,c10_h,w3);
     end;
    end;
    if (lgrp <> -1) then
     S_LGrp(JG_CurLgrp); // レイヤグループを戻す
    if (lay <> -1) then
     S_Lay(JG_CurLay); // レイヤを戻す
   end;
  end;
  SaveDatFile ;
  Close ;
end;
(・・・後略・・・)
少しややこしくなってしまいましたが、円2の場合は、半径・偏平率・傾き角度を入力せねばならないため、OnShow内で 生成・終了を行う事が出来ません。ですので、R10オプションの場合は別処理になるため、そのためのフラグ変数を用意して使用したりしています。
 
 
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p039」内に作成された「p039.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.