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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】読み込みデータの生成(2)
前回から外部変形での読み込みデータ「JWC_TEMP.TXT」の生成について記述しています。前回は、書き込みレイヤグループの変更・レイヤグループ名の変更・書き込みレイヤの変更・レイヤ名の変更についてのテストプログラムを作成しましたので、今回は、線色・線種・線幅について見ていきます。

まずは、以前に作成した「メモ帳起動.bat」を利用して確認していこうと思います。
「lc」 線色設定 現在の線色
 書式:lc○  ○:線色

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

「lw」 線幅設定 現在の線幅
 書式:lw○  ○:線幅 1/100mm単位整数
Jw_cad を起動し、
メニュー→その他→外部変形
「ファイル選択」画面でフォルダ「Gapp」を指定し、以前に作成したバッチファイル「メモ帳起動.bat」を実行して下さい。
JWC_TEMP.TXT − メモ帳
hq
hk 0
hs 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1
hzs 1189 841
hcw 2 2.5 3 4 5 6 7 8 9 10
hch 2 2.5 3 4 5 6 7 8 9 10
hcd 0 0 0.5 0.5 0.5 1 1 1 1 1
hcc 1 1 2 2 3 3 4 4 5 5
hn 0 0 0 0
lg0
ly0
lc2
lt1
cn4
cn"$<MS ゴシック>
#
のように表示されます。これを
JWC_TEMP.TXT − メモ帳
lc3
lt2
lw20
と書き換えて、メモ帳を閉じます。その後に Jw_cadにて[線属性]を行っても、線色・線種・線幅は変わっていないようです。
再度、外部変形を実行し、「メモ帳起動.bat」を実行して
JWC_TEMP.TXT − メモ帳
lc3
lt2
lw20
0 0 1000 0
と書き換えて、メモ帳を閉じます。すると Jw_cad 作図画面に緑色の点線の水平線が作図されているのが分かります。しかし[線属性]を行っても以前の線色・線種・線幅のままとなっています。なお、水平線を属性取得しても線幅は「20」とはなっていません。バッチファイルの内容に「REM #zw」の指定を入れてあると線幅は「20」となりますので、線幅を指定して作図したい場合には必ずバッチファイルに「REM #zw」を入れるようにします。
線色・線種・線幅の変更は、その外部変形プログラム内でのみ有効であり、Jw_cad 本体側の設定を変更するような事は出来ない、という事のようです。
 
つまり、よく利用する線色・線種・線幅を外部変形プログラムでボタンを押して切り替える、というような事は残念ながら出来ない、という事になりそうです。(※Sendkey(kb_event)やWindowsハンドルを取得するような特殊な場合を除く)
 
その他、軸角、縮尺、図面サイズ、文字種設定を変更するような事をしても、変更は行われません。参照のみ可能、という事のようです。
 
 
現在の設定を取り込んで各変数に代入するという事をこれまでに行いましたので、現在の設定を利用する場合にはその変数の値を利用するとして、以降は、新しく図形を作図する際に、出来ればなるべく簡単に外部変形プログラムを作成出来るような関数・手続き集のようなものを考えつつ作って行く事にします。
 
という訳でまずは、レイヤグループ及びレイヤですが、これは前回行ったように、外部変形プログラム内で変更を行うと Jw_cad 上でも変更されてしまいます。ですので、レイヤグループ・レイヤに関しては、外部変形プログラム終了時に、現在の設定に戻す、というような手続きを用意しておいた方が良いでしょう。
また、レイヤグループ・レイヤ・線色・線種・線幅・文字種・文字フォント・文字基準点・点種(点の線色番号)について、直前の値と同じ値に「変更」するのはファイルサイズを無駄に大きくしてしまうので、直前値と同じであれば書き込まない、つまり、直前値を変数に入れて覚えておくようにします。
新しく変数を作っても良いですが、書き込みデータを読み込む際に利用した変数 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(点線色)を利用します。
 
それではまず単純に、線を描く事から考えていきます。
 
◆2点間線
「Gapp」フォルダ(C:\JWW\Gapp)内に以下のバッチファイルを用意しておきます。不要な指定もありますが以前のものを踏襲しているだけで意味は余り無いです。
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
 
プロジェクト「p030」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p030」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p030−2点間線
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p030

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

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

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
前回作成した「MyFunc.pas」を取り込んでみます。
メニュー「ファイル」→「開く」
「C:\DelphiProgram\jww\p029」の中の「MyFunc.pas」を指定すると、コード画面に MyFunc 内容が表示されます。この状態で
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p030」の中に「MyFunc.pas」のまま保存
メニュー「プロジェクト」→「プロジェクトに追加」
を行い「C:\DelphiProgram\jww\p030」の中の「MyFunc.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)
・・・
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
 
オブジェクトインスペクタにて Form1 の イベント OnShowの箇所でダブルクリック、OnCloseの箇所でダブルクリックし、取りあえず下記のように追記します。
unit Unit1;
(・・・中略・・・)
type
  TForm1 = class(TForm)
 (・・・)
  private
   { Private 宣言 }
   AppPath : string ;
  public
   { Public 宣言 }
  end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
  s : string ;
begin
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  // JWC_TEMP.TXTを開きます
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  //
  s :=   FloatToStr(JG_IPoints[1].x) + ' ';
  s := s + FloatToStr(JG_IPoints[1].y) + ' ';
  s := s + FloatToStr(JG_IPoints[2].x) + ' ';
  s := s + FloatToStr(JG_IPoints[2].y) ;
  SendMem(s);
  //
  Close ;
end;
 
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // JWC_TEMP.TXTを保存します
  SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
  // 最終処理
  EndJwwGaibu ;
end;
 
end.
ついでに、アイコンが Delphi6デフォルトのものになっていますので、メニュー「ツール」→「イメージエディタ」を実行し、そのメニュー「ファイル」→「新規作成」→「アイコンファイル」を実行し、16×16・16色のアイコンを作成します。(32×32でも構いませんし他のツールで作成するのでも構いません)「C:\DelphiProgram\jww\p030」の中に「Icon1.ico」として保存します。保存できたらイメージエディタを終了します。
 
メニュー「プロジェクト」→「オプション」を実行し、
[アプリケーション]頁の中の[アイコンの読み込み]ボタンをクリックし、「C:\DelphiProgram\jww\p030\Icon1.ico」を指定します。[OK]ボタンをクリックしてプロジェクトオプション画面を閉じます。
オブジェクトインスペクタにて、Form1 の Icon プロパティの入力欄右端の[…]をクリックして、[読み込み]ボタンをクリックし、「Icon1」を指定して、[OK]ボタンをクリックします。
 
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p030」内に作成された「p030.exe」をフォルダ「Gapp」内へコピーします。
 
 
Jw_cadを起動し、
メニュー→その他→外部変形
「ファイル選択」画面でフォルダ「Gapp」を指定し、上記で作成したバッチファイル「p030a_2点間線.bat」を実行して下さい。
2点を指定して、画面が出て、すぐに画面が消えて、現在の線属性にて2点間の線が作図されます。
画面が出て消えて、となるので若干邪魔なのですが取りあえず当面の目的は果たしました。
 
画面が出て消えて、というのをなるべく避けるために
Unit1.pas
(・・・前略・・・)
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
  s : string ;
begin
  Form1.WindowState := wsMinimized ;
  // 初期設定
(・・・後略・・・)
という風に、実行した直後に最小化すれば良いと思われます。
 
線分を作図するたびに
s :=   FloatToStr(JG_IPoints[1].x) + ' ';
s := s + FloatToStr(JG_IPoints[1].y) + ' ';
s := s + FloatToStr(JG_IPoints[2].x) + ' ';
s := s + FloatToStr(JG_IPoints[2].y) ;
SendMem(s);
と書くのはそれなりに面倒ですので、これを手続き S_Line にしておきます(SendMemと書くのも面倒なので"S_"と略します)。また、短い線分は作図させないように制限を入れておきます。その制限の値については、MyFunc.pas にて定数 _LIMIT を設けておき、それを使うようにしておきます。値は 0.00000001 としておきます。
MyFunc.pas
unit MyFunc;
 
interface
 
const
  _LIMIT = 0.00000001;
 
  function SInt(s:string):integer ;
(・・・後略・・・)
JwwGaibu.pas
(・・・前略・・・)
  procedure SendMem(s:string);
  procedure SendMemLGrp(lgrp:integer);
  procedure SendMemLay(lay:integer);
  procedure S_Line(x1,y1,x2,y2:double);
 
implementation
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
//   線分の作図
//   x1,y1 : 始点
//   x2,y2 : 終点
procedure S_Line(x1,y1,x2,y2:double);
var
  s : string ;
begin
  // 短い線分は描かせない為のチェック
  if (Abs(x2-x1) < _LIMIT)and(Abs(y2-y1) < _LIMIT) then exit;
  //
  s := FloatToStr(x1) + ' ';
  s := s + FloatToStr(y1) + ' ';
  s := s + FloatToStr(x2) + ' ';
  s := s + FloatToStr(y2) ;
  SendMem(s);
end;
 
end.
Unit1.pas
(・・・前略・・・)
procedure TForm1.FormShow(Sender: TObject);
begin
  Form1.WindowState := wsMinimized ;
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  // JWC_TEMP.TXTを開きます
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  //
  S_Line(JG_IPoints[1].x , JG_IPoints[1].y,
     JG_IPoints[2].x , JG_IPoints[2].y );
  //
  Close ;
end;
(・・・後略・・・)
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p030」内に作成された「p030.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。
 
 
次に、上記では、
始点指定→終点指定→(外部変形→作図)→
始点指定→終点指定→(外部変形→作図)→・・・・
となりますが、
連続線を作図したい場合は、
始点指定→終点指定→(外部変形→作図)→
    →終点指定→(外部変形→作図)→
    →終点指定→(外部変形→作図)→・・・・
と行いたい場合があります。
Jw_cad の外部変形では、99点までを指定して作図、という事も出来ますから、バッチファイルで「REM #99#」を指定し、
Unit1.pas
(・・・前略・・・)
procedure TForm1.FormShow(Sender: TObject);
var
  i : integer ;
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 );
  end;
  //
  Close ;
end;
(・・・後略・・・)
のような具合にすれば可能ですが、在り来たりと言えるかもしれません。また、他のバッチファイルを用意して実行する事にして、直前の座標を保存しておき、それを利用するようにすれば可能でしょう。しかし直前の座標からの仮線表示は出来なくなってしまいます。それらをまとめてしまい、プログラム実行時の起動オプションとして指定する事により機能を切り替える事を考えてみます。
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
終点の座標はファイルに保存する事とします。p030cはそれを読み込み、始点座標として利用して作図します。
Unit1.pas
(・・・前略・・・)
// データファイルを読み込む
procedure OpenDatFile(var px,py:double) ;
var
  fn: string ;
  F : TextFile ;
  s : string ;
begin
  fn := ChangeFileExt(Application.ExeName,'.dat') ;
  px := 0.0;
  py := 0.0;
  // 読み込み
  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);
   CloseFile(F);
  except
   CloseFile(F);
  end;
end;
 
// データファイルを保存する
procedure SaveDatFile(px,py:double) ;
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));
   CloseFile(F);
  except
   CloseFile(F);
   if FileExists(fn) then
    DeleteFile(fn);
  end;
end;
 
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
  i : integer ;
  px,py : double ;
begin
  Form1.WindowState := wsMinimized ;
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  // JWC_TEMP.TXTを開きます
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  //
  px := 0.0;
  py := 0.0;
  if (ParamCount >= 1) then begin
   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
    OpenDatFile(px,py);
    S_Line(px,py, JG_IPoints[1].x , JG_IPoints[1].y);
    px := JG_IPoints[1].x ;
    py := JG_IPoints[1].y ;
   end;
  end
  else 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;
  SaveDatFile(px,py);
  //
  Close ;
end;
(・・・後略・・・)
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p030」内に作成された「p030.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.