外部変形について

はじめに

 ここでは、今まで自分が作ってきたなかで理解したことを記します。解釈が異なっていたり、誤っている場合もありますので、参考程度にとどめておいてください。
 

概   要

 これから作成しようとする外部変形には、どんな情報が必要かを考えます。
 jww側で、どのような情報を出力するかを指定したファイル(外部変形BATファイル:例えば、当初から実装されている「JWW_SMPL.BAT」など)に従い、jww側から情報を出力します。
 その情報は、「jwc_temp.txt」という名前のファイルで、jwwのインストールフォルダに保存されます(保存先は、先のBATファイルで指定すれば、外部変形BATファイルの存在するフォルダに保存されます)。
 次に、「jwc_temp.txt」を読込み、目的に従い処理を行いその結果を出力します。すると、jwwはその結果を記録した「jwc_temp.txt」を読込んで、図形や文字を描画します。これが大まかな処理ですが、jwwから「jwc_temp.txt」を出力し、処理して「jwc_temp.txt」を読込むとは?????。要するに、 決まり事としてjww側から「jwc_temp.txt」というファイルネームで情報が出力される。外部変形ソフトで処理した内容をjwwが読み込んで描画する。

 もっとわかりやすく言うと、jwwは情報を出力するときも、読込ときも「jwc_temp.txt」という名前のファイルを使うということです。

 jww側から出力された「jwc_temp.txt」を読込み処理をした後に、作業用のファイル例えば「temp.txt」(名前は、何でもいい)に出力し、先の「jwc_temp.txt」を削除し、「temp.txt」を「jwc_temp.txt」に変えてやれば、理解できると思います。
 

 

 

外部変形のソフトは、このテキストデータを目的の内容に変えることです。

 抜粋のサンプルですがある直線一つを選択した、jwc_temp.txt の内容が下記のようになっています。
 1000.15 2000.15 1500.15 3000.15
  これは、直線データの座標値です。この値にX座標だけ+100してやると、
 1100.15 2000.15 1600.15 3000.15
 このように変えた jwc_temp.txt をjwwが読み込んでくれると、X方向+100の位置に直線が描かれます。
 つまり複写されます。移動したいのなら先の座標データの前行に、"hd"を付け読み込んでくれると、最初に選択した直線は削除されます。
 hd
 1100.15 2000.15 1600.15 3000.15
 

 jwwに読込んで描画してもらうための決まりが、「Jw_cad for windows徹底解説リファレンス編」のP306以降に記載してあります。  
 

 

外部変形BATファイルで、出力する情報の指定方法
 
1から書くのはわかりづらいので、既存の利用している外部変形BATファイルをまねてみるのが早道。それをいろいろ変えてみて出力される「jwc_temp.txt」を見てみれば、なんとなくわかってきます。「Jw_cad for windows徹底解説リファレンス編」のP291〜P295までは、何度も読むことになると思います。
 

 それでは、簡単な例をもとに説明します。私が作った外部変形の初期のころのもので、「datein2」という外部変形があります。これは、コンピュータの時計から日時を描き込むものです。
 

  datein2.bat の内容

@REM 年月日時刻入力(YYYY/MM/DD hh:mm) 外部変形
(jwwで外部変形を選択したときに、MEMO欄に表示される内容)
@ECHO OFF
start /wait datein2.exe
copy temp.txt jwc_temp.txt > nul
del temp.txt

外部変形ファイルの指定
「datein2.exe」で「temp.txt」というファイルに処理した内容を出力しているので、これ を「jwc_temp.txt」という名前でコピーしている。そうすると、前の「jwc_temp.txt」は、上書きされる。

GOTO END
REM
REM
REM #jw
REM #cd
REM #1◆記入点をクリック(文字基点は、メニューで変更可)
REM #e
rem パソコンの時計から年月日時刻を取得し、作業画面に記入。
rem
rem 2002.07.24
rem M.Hayashi

:END

 

 

 上記のものを実行すると、記入位置を指示するメッセージが出て何も実行しませんが、下記のようなファイルが作成されます(マウスをクリックする位置により内容が異なります)。
 

  jwc_temp.txt の内容(赤字は環境により異なる値となる)

hq
hk 0
hs 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1
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 0.5 1 1 1 1
hcc      1      1      2      2      3      3            4      4      5      5
hn 0 0 0 0
hp1 -84.8008333333333 36.4433333333333(マウスをクリックした座標)
lgf
ly0
lc2
lt1
cn10

#

 

 

 上記の座標に、日時を書込めばいいわけであるが、どうするか?。下記に、VB6によるコードを示す。
 

  読込みSample

Open "jwc_temp.txt" For Input As #1
   While Not EOF(1)
   Line Input #1, buff$
       Select Case Mid(buff$, 1, 3)
             Case "hp1"
                    hp1 = Split(buff$, " ")
             Case Else
       End Select
       Wend
Close
 

 

 他にもコードはあるが、割り切って欲しい。上記のもので、変数hp1(3)とhp1(4)に
-84.8008333333333、36.4433333333333が読込まれる
(-84.8008333333333、36.4433333333333の内容は、jwwの画面のどこをクリックするかで毎回変わる)。
   次に、年月日を取得するコードを示す。
 

 

年月日取得Sample
strstring =Format(Now,"yyyy/mm/dd") の一行でいける。
 

 

 これで、年月日が取得できたので、それを書込む。ここでの、注意点を述べる。
「Jw_cad for windows徹底解説リファレンス編」のP302、中段ほどに横文字の書式例として「ch %lg %lg %lg %lg "文字列"」のように掲載されている。最初の二つの「%lg」が文字の基点XYであり、それに続く二つの「%lg」は、先の二つの「%lg」を基点(0,0)にしてどの方向に、どれだけかを指定しなければならない。
 
どの方向とは、基点(0,0)から右水平方向ならば、(100,0)のようにY座標として「0」となる。
文字種3ならば、次の計算になる。
jwwが出力した
jwc_temp.txt の内容
hcw 2 2.5 3 4 5 6 7 8 9 10 hcw文字巾を表し、それに続く値は文字種1〜10までの文字巾が出力されている。
 hch 2 2.5 3 4 5 6 7 8 9 10 hch文字高を表す。同上
 hcd 0 0 0.5 0.5 0.5 0.5 1 1 1 1
 hcd文字間隔を表す。同上
 ついでに
 hcc      1      1      2      2      3      3            4      4      5      5 hccは文字色番号を表す。同上)
 (少し話は横にそれますが、何でこの行だけ数字と数字の間がこんなに開くんでしょう。このため、hccのある行の数字の取得には先の「
Split」を用いると内容が少し変わってきます。)
 より文字種3は、巾3、高さ3、間隔0.5となっている。これを 2008/01/01 のような日付形式にするならば、半角10文字分の巾を計算する。
10文字x3(巾)x1/2(半角)+0.5x9=19.5
文字右端の座標は、x=19.5
            y=0
書込みグループの縮尺が異なっていたら、縮尺を調整する。つまり縮尺を掛けてやる。
縮尺もhs 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1 のように出力されている。hsに続く値はレイヤグループ0〜Fまでの縮尺の分母を表している。
先の縮尺を掛けるとは、この分母の値を掛けることになる。
全角が入っていたらどうするか?。
jwwで全角文字を書いてみて、文字列左下を起点に巾3、間隔0.5を書いてみて確かめてみればわかります。
傾き30度の場合は?。
x、yの値にSin(30)、Cos(30)をかけるだけ。上記の式は、下記のようにする。
  x=19.5xCos(30x4*Atn(1)/180))
  y=19.5xSin(30x4*Atan(1)/180))
  4*Atan(1)は、π のこと。
 このようにして計算された文字巾は縮尺1/1であるので縮尺の分母を掛ける必要がある。間違っても、文字の座標には掛けてはいけない。
 

 

書出しSample

Open "temp.txt" For Output As #2
      wbuff$="ch "+CStr(hp1(3))+" "+CStr(hp1(4))+" 19.5 0 " +Chr$(34) +strstring+vbCrLf
      Print #2, wbuff$
Close #2

横文字の書式とよく見比べてみてください。半角スペースの位置も。chの後や、19.5の前後。
 Chr$(34)は、「"」を示します。
 
vbCrLf は改行コード。これを忘れると、文字が正常に描画してくれない。
 

 

書出しSampleより作成されたtemp.txt の内容
ch -84.8008333333333 36.4433333333333 19.5 0 "2008/01/01
 
最後にこの temp.txt を jwc_temp.txt に名前を変えて処理が終わると、jwwがjwc_temp.txt を読み込んで描画してくれる。
 

 

 簡単な文字列を記載する外部変形なら、上記の内容で事は足りる。
 これに、書込みレイヤや、文字種など、いろいろな情報を付け加えていくだけの作業となる。
 単純に書込みレイヤを指定するには、lyfとかを前につければよい。とは何か?。
はレイヤグループの番号。
 書込みレイヤグループを指定するには、lgfとかつければよい。
 ここで注意しなければいけないことがある。レイヤグループに異なる縮尺が設定されていることを考慮しないで先の指定をしてしまうと、意図していない内容になってします。
 具体的には、先に計算した値(縮尺を掛けたもの)を今のレイヤグループの縮尺の分母で割って、書き込みたい縮尺の分母を掛けてやればよい。
 

 

 いろいろ外変作りを経験すると、数学の公式が必要になってきます。三平方の定理、正弦定理など。二点の座標からその距離を出す公式は?。これくらいはまだわかりますが、ある直線と点があり、その垂直距離を出すにはどうしたらいいか?とか。ある点を基点中心にして角度θだけ回転させたときの座標は?。ある直線に対して、反転させたときの座標は?。
 学生のころ使っていた参考書を探して見直すことが多くなります。

         
 

外部変形作成時に
利用している本 

 Visual Basic 2008 の参考書 正規表現で
わからない時に
Visual Basic 2005
の参考書
 



 
 


 

 

topへ