|
【Jw_cad 外部変形】読み込みデータの生成(1) |
今回から外部変形での読み込みデータ「JWC_TEMP.TXT」の生成について記述しています。書き込みデータと同じものも多いですが、存在しないものもありますので注意していきたいと思います。
まずは、以前に作成した「メモ帳起動.bat」を利用して確認していこうと思います。
◆
これがあると外部変形プログラムは実行されておらず(※実際にプログラムが実行されていたとしても)Jw_cad上では「未実行」と表示されて、Jw_cad 上では何も起きません。作図も変更も行われません。書き出しデータの冒頭には「hq」が記載されていますが、この「hq」を一番下に移動し、内容を書き換えた場合には、その書き換えた内容は有効となるようですので「hq」を記述する場合には冒頭部に記述します。
「he」 |
エラー表示
書式:he****
****:エラーメッセージ |
画面上にエラーメッセージを表示し、Jw_cad は「JWC_TEMP.TXT」読み込みを中止します。
例:「heエラーです!」と記述した場合
指示点&線・円円弧・文字指定を行った要素データや範囲選択を行った要素データを削除します。この「hd」が無い場合、以降で線などのデータを書くと、それらの線データを追加作図する、という事になります。範囲選択をした場合、書き出しデータには選択した要素データが記述されますが、「hd」がない場合、その要素データを追加作図する、という事になります。「hd」を記述して、それら要素データを書き換えると、範囲選択した要素データ変更となります。つまり、一旦削除して新規に追加作図する=変更する、という意味合いです。
例:「範囲選択1・メモ帳起動.bat」を実行し
範囲選択をして、冒頭の「hq」を「hd」に変え、
書き出される内容の16行目「#」以降を消すと
その部分が削除される。
例:「範囲選択1・メモ帳起動.bat」を実行し
範囲選択をして、冒頭の「hq」を「hd」に変え、
「洋室」を「和室」に変更する
「hr」 |
現在の外部変形の繰り返しをプログラムで指定
書式:hr |
「メモ帳起動.bat」を実行し、バッチファイルでの繰り返し指定は行っていない事を確認してから、[再実行]し、「hq」を消して、「hr」を記述してみます。場所はどこでも良いようです。そのほか、たとえはレイヤを変更してみます。メモ帳を終了すると、再びメモ帳が起動されます。すぐに起動されますし、裏に見えているJw_cad画面も変わっていないような感じですが、再度メモ帳を閉じると、レイヤが変更されている事が分かります(他のコマンドを起動すると分かる場合もあります)。
「h/」 |
現在の外部変形終了後、別の外部変形への移行をプログラムで指定
書式:h/****.BAT |
「メモ帳起動.bat」を実行し、メモ帳にて、「hq」を消してレイヤを変更して最後に「h/範囲選択1・メモ帳起動.bat」と記述してみます。メモ帳を閉じると、「範囲選択1・メモ帳起動.bat」が起動されるのが分かります。
「h#」 |
注意文表示
書式:h#****
****:注意文 |
「メモ帳起動.bat」を実行し、メモ帳にて、「hq」を消して最後に「h#※※注意して下さい※※」と記述してみます。場所はどこでも良いようです。メモ帳を閉じると以下のようになります。
「by」 |
読み込み倍率指定
書式:by bai
bai:倍率(無指定時 1.0) |
との事で確認作業をしてみましたが、思ったように行かないのでこの機能については無視します(やり方がまずいのかもしれませんが)。
これは書き出しデータの「bz データが図面寸法」(「REM #bz」指定時、各座標が図寸で書出し)と同じですが、この「REM #bz」を行って書き出される「bz」を消すと、範囲選択で図寸として書き出された要素データの座標値等が実寸であると解釈されますので、縮尺が1/1でない場合、図の大きさが変わってしまいますので注意して下さい。
1から作図を行う場合には、実寸で作図をするのか、図寸で作図するのかを決め、図寸で作図する場合にはこの「bz」を指定しておきます。
上記で、1から作図を行う場合、「bz」を指定して図寸で作図するよう記述したあと、この「b0」を指定するとそれ以降、実寸で作図するよう記述する事が出来るようになります。
※「REM #bz」を指定して範囲選択をすると書き出される「bz」を無効化するような意図での「b0」の指定というのは出来ないようです。
「lg」 |
書込レイヤグループの変更
書式:lg○
○:レイヤグループ番号:0〜9,a〜f
※レイヤグループには縮尺がありますが、縮尺によって図形の見え方が変わりますので縮尺には注意が必要です
※プロテクト状態の場合は変更出来ません
※レイヤグループ状態を変更する事は出来ません |
「lgn」 |
書込レイヤグループ名の変更
書式:lgn****
****:レイヤグループ名 |
「ly」 |
書込レイヤの変更
書式:ly○
○:レイヤ番号:0〜9,a〜f
※プロテクト状態の場合は変更出来ません
※レイヤ状態を変更する事は出来ません |
「lyn」 |
書込レイヤ名の変更
書式:lyn****
****:レイヤ名 |
その他、以下は書き込みデータと同じです。
・書込線種の変更
・書込線色の変更
・ハッチ・図形・寸法・建具属性指定
・円データ
・弧・楕円データ
・文字種の変更
・文字フォントと斜体文字
・文字基準点
・文字列
・横文字
・縦文字
・寸法値
・半径 寸法値
・直径 寸法値
・角度 寸法値
・累寸 寸法値
・日影 真北データ
・日影 建物高さデータ
・2.5Dデータ
・点種の変更
・点データ
・線データ
・曲線データ
・寸法図形データ
・ソリッド図形データ |
その他として、連続線データ、相対座標による線データ、極座標による線データというものがありますが、通常の線データの記述だけでフォロー出来ますので当方では考慮しません。
以上、読み込みデータの生成については多種多様となりますし、実際のファイル生成中に色々な条件判断部などが入ると煩雑化してしまいますので、実際のファイル「JWC_TEMP.TXT」の生成中は、文字列の動的配列データを読み込んでそのまま出力を行うようにして、その文字列の動的配列を作成していく手法について考える事にします。
まずは、レイヤグループ名・レイヤ名のクリアを行う外部変形アプリケーションを考えてみます。
プロジェクト「p029」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p029」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
タイトル | p029−レイヤ名クリア |
[ディレクトリ/条件]頁
パス及びディレクトリ | C:\DelphiProgram\jww\p029 |
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p029」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p029」の中に「p029.dpr」として保存
◆
Form1の画面の大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
BorderIcons
biMaximize | False | 最大化しないように |
BorderStyle | bsSingle | 画面をリサイズしないように |
Caption | レイヤ名クリア | タイトルバーに表示されます |
Color | clSkyBlue | お好みでどうぞ |
Font内
Name | MS ゴシック |
プロポーショナルフォントは
文字配置調整が微妙なので |
Font内
Size | 10 | 小さいと少し見難い為 |
Scaled | False |
動作環境によっての文字の
大きさ変動を少し抑えられる |
メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
前回作成した「MyFunc.pas」を取り込んでみます。
メニュー「ファイル」→「開く」
「C:\DelphiProgram\jww\p028」の中の「MyFunc.pas」を指定すると、コード画面に MyFunc 内容が表示されます。この状態で
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p029」の中に「MyFunc.pas」のまま保存
メニュー「プロジェクト」→「プロジェクトに追加」
を行い「C:\DelphiProgram\jww\p029」の中の「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)
・・・ |
|
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
[Standard]内の Label コンポーネントを2つ、ListBox コンポーネントを2つ配置して、Label1 の Caption を「レイヤグループ」、Label2 の Caption を「レイヤ」とします。オブジェクトインスペクタにて 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
i : integer ;
s : string ;
begin
// 初期設定
InitJwwGaibu ;
// プログラムのあるフォルダを取得します
AppPath := ExtractFilePath(Application.ExeName) ;
// JWC_TEMP.TXTを開きます
OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
// 内容確認
ListBox1.Items.Clear ;
for i:=0 to 15 do begin
s := '['+IntToHex(i,1)+'] '+JG_LGrpName[i];
ListBox1.Items.Add(s);
end;
ListBox2.Items.Clear ;
for i:=0 to 255 do begin
s := '['+IntToHex(i,2)+'] '+JG_LayName[i];
ListBox2.Items.Add(s);
end;
end;
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// JWC_TEMP.TXTを保存します
SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
// 最終処理
EndJwwGaibu ;
end;
end. |
|
Form1に、[Standard]内の Button コンポーネントを2つ配置し、オブジェクトインスペクタでそれぞれプロパティを指定します。
Button1
Caption | 実 行(&R) | ボタン上に表示されます |
Default | True |
[Enter]を押すと
このボタンを押した事になる |
Button2
Cancel | True |
[Esc]を押すと
このボタンを押した事になる |
Caption | キャンセル(&C) | ボタン上に表示されます |
それぞれのボタンをダブルクリックして、OnClickイベントの部分を作っておきます。上書き保存を行うと中身がないので消えてしまいますが、
|
unit Unit1;
(・・・中略・・・)
// 実行
procedure TForm1.Button1Click(Sender: TObject);
begin
//
end;
// キャンセル
procedure TForm1.Button2Click(Sender: TObject);
begin
;
end;
end. |
|
というように内部に「//」(コメント)や「;」を書いておくと中身があるという事で消えません。
それでは、「JWC_TEMP.TXT」を生成・保存する際の文字列の動的配列を考えます。Jw_cad への Transfer 用のメモリ、という程度の意味合いで、JT_Mem という名前の変数にします。内容が空の場合には中止を意味する「hq」を送るようにします。
|
JwwGaibu.pas |
(・・・前略・・・)
// 「JWC_TEMP.TXT」生成用メモリ
JT_MemN : integer ;
JT_Mem : array of string ;
(・・・中略・・・)
procedure InitJwwGaibu ;
(・・・)
//
JT_MemN := 0;
JT_Mem := nil;
end;
procedure EndJwwGaibu ;
(・・・)
//
JT_Mem := nil;
end;
(・・・中略・・・)
// Jw_cad 外部変形
// 書き出しデータ「JWC_TEMP.TXT」を保存する
// fn : ファイル名(フルパス)
// (ret)
// True : OK False : Error
function SaveTempFile(fn:string) : Boolean ;
var
F : TextFile ;
i : integer ;
begin
Result := False ;
try
AssignFile(F, fn);
ReWrite(F);
if (JT_MemN = 0) then
WriteLn(F, 'hq')
else
for i:=0 to JT_MemN-1 do
WriteLn(F, JT_Mem[i]);
CloseFile(F);
Result := True ;
except
CloseFile(F);
if FileExists(fn) then
DeleteFile(fn);
end;
end;
end. |
|
次に、この変数 JT_Mem 内に生成する内容を入れる訳ですが、簡単な手続きを用意しておく事にします。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure InitJwwGaibu ;
procedure EndJwwGaibu ;
function OpenTempFile(fn:string) : Boolean ;
function SaveTempFile(fn:string) : Boolean ;
procedure SendMem(s:string);
implementation
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの
// 送信文字列セット
procedure SendMem(s:string);
begin
Inc(JT_MemN);
SetLength(JT_Mem, JT_MemN);
JT_Mem[JT_MemN-1] := s;
end;
end. |
|
こうしておけば Unit1側から「SendMem('hq');」と実行するだけで後はさほど気にしなくても良いという事になります。
それではボタンを押した時の処理を記述します。レイヤグループ名の変更は、書込レイヤグループを指定してレイヤグループ名を指定、レイヤ名の変更は、書込レイヤを指定してレイヤ名を指定、となりますのでこれを順番に行えば良いという事になります。書込レイヤグループ・書込レイヤの指定は 16進数で行うので少し面倒ですし今後何度も使うでしょうから専用の手続きを用意する事にします。
|
JwwGaibu.pas |
(・・・前略・・・)
procedure InitJwwGaibu ;
procedure EndJwwGaibu ;
function OpenTempFile(fn:string) : Boolean ;
function SaveTempFile(fn:string) : Boolean ;
procedure SendMem(s:string);
procedure SendMemLGrp(lgrp:integer);
procedure SendMemLay(lay:integer);
implementation
(・・・中略・・・)
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みレイヤグループ
// (現在のレイヤグループ)を指定
// lgrp : レイヤグループ 0〜15
procedure SendMemLGrp(lgrp:integer);
var
s : string ;
begin
s := 'lg' + IntToHex(lgrp,1);
SendMem(s);
end;
// 「JWC_TEMP.TXT」生成用メモリへの送信
// 書き込みレイヤ
// (現在のレイヤ)を指定
// lay : レイヤ 0〜15
procedure SendMemLay(lay:integer);
var
s : string ;
begin
s := 'ly' + IntToHex(lay,1);
SendMem(s);
end;
end. |
Unit1.pas |
(・・・前略・・・)
// 実行
procedure TForm1.Button1Click(Sender: TObject);
var
i,j : integer ;
begin
for i:=0 to 15 do begin
SendMemLGrp(i);
SendMem('lgn');
for j:=0 to 15 do begin
SendMemLay(j);
SendMem('lyn');
end;
end;
SendMemLGrp(0); // 書込レイヤを[0](0)にセット
SendMemLay(0);
Close ; // 画面を閉じる→終了
end;
// キャンセル
procedure TForm1.Button2Click(Sender: TObject);
begin
SendMem('hq');
Close ; // 画面を閉じる→終了
end;
end. |
|
ついでですが、アイコンが Delphi6デフォルトのものになっていますので、メニュー「ツール」→「イメージエディタ」を実行し、そのメニュー「ファイル」→「新規作成」→「アイコンファイル」を実行し、16×16・16色のアイコンを作成します。(32×32でも構いませんし他のツールで作成するのでも構いません)「C:\DelphiProgram\jww\p029」の中に「Icon1.ico」として保存します。保存できたらイメージエディタを終了します。
メニュー「プロジェクト」→「オプション」を実行し、
[アプリケーション]頁の中の[アイコンの読み込み]ボタンをクリックし、「C:\DelphiProgram\jww\p029\Icon1.ico」を指定します。[OK]ボタンをクリックしてプロジェクトオプション画面を閉じます。
オブジェクトインスペクタにて、Form1 の Icon プロパティの入力欄右端の[…]をクリックして、[読み込み]ボタンをクリックし、「Icon1」を指定して、[OK]ボタンをクリックします。
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p029」内に作成された「p029.exe」をフォルダ「Gapp」内へコピーします。
「Gapp」フォルダ(C:\JWW\Gapp)内に以下のバッチファイルを用意しておきます。不要な指定もありますが... 範囲選択(h1)を行っているのは、「REM #g1」で全てのレイヤグループ状態を取得したいからです。
|
p029−レイヤ名クリア.bat |
REM p029−レイヤ名クリア
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #h1
REM #hc 範囲選択をして下さい(ダミー)。
REM #g1
REM #e
start /w p029.exe |
|
範囲選択が邪魔という場合は
|
p029_レイヤ名クリア.bat |
REM p029−レイヤ名クリア
@echo off
REM #jww
REM #cd
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #gn
REM #e
start /w p029.exe |
|
という風にしても良いですが、p029.exeが実行されて表示される画面内のレイヤグループ名・レイヤ名は、現在の書き込みレイヤグループのものしか表示されません。
但し、取得は出来ませんが、全てのレイヤグループのクリアは正常に出来ているようです。
Jw_cadを起動し、Jw_cad 標準添付の「Aマンション平面例.jww」を開いて
メニュー→その他→外部変形
「ファイル選択」画面でフォルダ「Gapp」を指定し、上記で作成したバッチファイル「p029_レイヤ名クリア.bat」を実行して下さい。
まずはダミーで範囲選択を行います。
範囲選択で適当に囲うと以下のような画面が表示されます。
[実行]ボタンをクリックします。
何事も無かったような感じで終了しますが、レイヤグループ一覧表示をしてみると・・・
レイヤグループ名が消えている事が分かります。同様に、レイヤ名も全て消えている事が分かります。
今回はここまでとします。
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、Pcataサイトに置いておきますので必要な方はそちらからダウンロードして下さい。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
M7
Jw_cad
[BACK]
[NEXT]
|