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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】円弧半径の変更
前回・前々回では、読み取った範囲選択要素データをそのままにした状態で生成する書き出しデータの方を色々と変更していましたが、メインプログラム側の記述部分が大きくなってしまい余り汎用的ではありません。それとは異なり、JwwGaibu.pas のほうで全要素データ生成を行う手続きを作成しておき、読み取った要素データを変更してからその手続きを呼び出すようにしてみます(線属性については引数で対応出来るようにします)。一度作ってしまえば後々利用しやすくなるというメリットがある反面、要素データを変更したくない場合には利用出来ないというデメリットもあります。手法に応じて使い分けをされると良いと思われます。
 
前々回の「線色変更」を修正して、JwwGaibu.pas に手続き S_EntAll を作成してそれを呼び出すバージョンを作っておき、動作チェックをしてから今回のプログラムで利用する事にします。
Unit1.pas
(・・・前略・・・)
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
  c : integer ;
begin
  c := ComboBox1.ItemIndex ;
  SendMem('hd');
  S_EntAll(-1,-1,GetColorItems(c),-1,-1,GetColorItems(c),-1,0, Label2);
  Label2.Caption := 'ファイル生成中です';
  Label2.Update ;
  Close ;
end;
(・・・後略・・・)
JwwGaibu.pas
function GetColorItems(col:integer) : integer ;
function GetLtypeItems(ltp:integer) : integer ;
(・・・)
procedure S_EntLine(i,j:integer;var cn:integer;a1,a2,a3,a4,a5:integer);
procedure S_EntCircle(i,a1,a2,a3,a4,a5:integer);
procedure S_EntArc(i,a1,a2,a3,a4,a5:integer);
procedure S_EntTen(i,a1,a2,a3:integer);
procedure S_EntMark(i,a1,a2,a3,a5:integer);
procedure S_EntText(i,a1,a2,a3,a4:integer);
procedure S_EntDim(i,a1,a2,a3,a4,a5,a6,a7:integer);
procedure S_EntSolid2(i,a1,a2,a3,a4,a5:integer);
procedure S_EntSolid3(i,a1,a2,a3,a4:integer);
procedure S_EntSolid4(i,a1,a2,a3,a4:integer);
procedure S_EntSolidC(i,a1,a2,a3,a4:integer);
procedure S_EntSolidD(i,a1,a2,a3,a4,a5:integer);
procedure S_EntSolidO(i,a1,a2,a3,a4:integer);
procedure S_EntSolidG(i,a1,a2,a3,a4:integer);
procedure S_EntAll(a1,a2,a3,a4,a5,a6,a7,a8:integer;L:TLabel);
引数a1〜a8にて、生成する書き出しデータの各要素データのレイヤグループ、レイヤ、線色、線種、線幅、等を指定出来るようにしており、-1を指定する事により、その要素データの持つ内容で生成し、それ以外の任意値で指定する事により、任意内容で生成する事が出来るようにしています。円弧の半径などは円弧データの半径値を変更してから手続き S_EntAll を呼び出すようにします。
 
 
半径値を指定するといっても幾つかの手法があると思われます。ここでは、
・実寸値での指定
・図寸値での指定
・現在の値に倍率
に対応させます。
 
それではバッチファイルから。
p046_半径値変更.bat
REM p046−円・円弧・楕円・楕円弧の半径値を変更
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #h1
REM #hc 範囲選択をして下さい。
REM #ht10
REM #ht20
REM #ht30
REM #ht40
REM #g1
REM #hr
start /w p046.exe
 
プロジェクト「p046」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p046」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p046−半径値変更
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p046

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

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

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。前回及び上記で作成した「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\p046」の中に「Icon1.ico」として保存します。保存できたらイメージエディタを終了します。
メニュー「プロジェクト」→「オプション」を実行し、
[アプリケーション]頁の中の[アイコンの読み込み]ボタンをクリックし、「C:\DelphiProgram\jww\p046\Icon1.ico」を指定します。[OK]ボタンをクリックしてプロジェクトオプション画面を閉じます。
オブジェクトインスペクタにて、Form1 の Icon プロパティの入力欄右端の[…]をクリックして、[読み込み]ボタンをクリックし、「Icon1」を指定して、[OK]ボタンをクリックします。

画面上に [Standard]内の RadioButton コンポーネントを3つ、Edit コンポーネントを3つ、Label コンポーネントを1つ配置します。RadioButtonを複数配置した場合、チェックON出来るものは1つのみです(※他コンポーネント上に配置したものを除く)ので、RadioButton1にチェックを入れると他のものはチェックオフとなります。
RadioButton1
Caption実寸値指定表示内容
CheckedTrueチェックをオンに
RadioButton2
Caption図寸値指定表示内容
RadioButton3
Caption倍率指定表示内容
Edit1、Edit2、Edit3
ImeModeimDisable全角入力出来ないように
Label1
AlignalBottom画面下部に表示
AlignmenttaCenter水平中央合わせ表示
AutoSizeFalse自動サイズ調整をオフ
Color$00B9FFFF色:御自由にどうぞ
LayouttlCenter垂直中央合わせ表示
Button コンポーネントを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 ;
   rm : integer ;
   r1,r2,r3 : double ;
   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') ;
  rm := 0 ;
  r1 := 100.0;
  r2 := 100.0;
  r3 := 1.0;
  // 読み込み
  if not(FileExists(fn)) then exit;
  try
   AssignFile(F, fn);
   FileMode := 0;
   Reset(F);
   ReadLn(F, s);   rm := SInt(s);
   ReadLn(F, s);   r1 := SDbl(s);
   ReadLn(F, s);   r2 := SDbl(s);
   ReadLn(F, s);   r3 := SDbl(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(rm));
   WriteLn(F, FloatToStr(r1));
   WriteLn(F, FloatToStr(r2));
   WriteLn(F, FloatToStr(r3));
   CloseFile(F);
  except
   CloseFile(F);
   if FileExists(fn) then DeleteFile(fn);
  end;
end;
 
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
  Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
  Form1.Top := Mouse.CursorPos.Y - 4;
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  // JWC_TEMP.TXTを開きます
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  // 初期設定
  S_Init ;
  OpenDatFile ;
  RadioButton1.Checked := True ;
  if (rm = 1) then
   RadioButton2.Checked := True
  else if (rm = 2) then
   RadioButton3.Checked := True ;
  Edit1.Text := FloatToStr(r1);
  Edit2.Text := FloatToStr(r2);
  Edit3.Text := FloatToStr(r3);
  Label1.Caption := '';
end;
 
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // JWC_TEMP.TXTを保存します
  SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
  // 最終処理
  EndJwwGaibu ;
end;
 
end.
 
Button1、Button2 をダブルクリックして OnClickイベントを記述出来るようにします。
Unit1.pas
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer ;
begin
  rm := 0 ;
  if (RadioButton2.Checked) then rm := 1;
  if (RadioButton3.Checked) then rm := 2;
  r1 := SDbl(Edit1.Text);
  r2 := SDbl(Edit2.Text);
  r3 := SDbl(Edit3.Text);
  if (r1 <= 0.0)or(r2 <= 0.0)or(r3 <= 0.0) then exit ;
  SaveDatFile ;
  // 変更
  Label1.Caption := '円データ変更中です';
  Label1.Update ;
  for i:=0 to JW_EntCircN-1 do begin
   with JW_EntCirc[i] do begin
    case(rm)of
    0: begin
       cr := r1 ;
     end;
    1: begin
       cr := r2 * JG_LGrpScale[att.LGrp] ;
     end;
    2: begin
       cr := cr * r3 ;
     end;
    end;
   end;
  end;
  Label1.Caption := '円弧・楕円データ変更中です';
  Label1.Update ;
  for i:=0 to JW_EntArcN-1 do begin
   with JW_EntArc[i] do begin
    case(rm)of
    0: begin
       cr := r1 ;
     end;
    1: begin
       cr := r2 * JG_LGrpScale[att.LGrp] ;
     end;
    2: begin
       cr := cr * r3 ;
     end;
    end;
   end;
  end;
  // 生成
  SendMem('hd');
  S_EntAll(-1,-1,-1,-1,-1,-1,-1,0, Label1);
  Label1.Caption := 'ファイル生成中です';
  Label1.Update ;
  Close ;
end;
 
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close ;
end;
 
end.
 
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p046」内に作成された「p046.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.