解説用の星図をさっさかるくるプロジェクト メモ5 Javascript+fireworks+VB2005編
前のメモでは、解説用の星図を作るのに
・だいたいの下図が自動的に作られ、それを、パーツごとにちょっと修正できるようにするため
・Javascript で、fireworks を操ることにするが、
・Javascript では外部ファイルが使えんことがわかったので、VB2005で Javascript をはき出すことにし
・とりあえず、CSV形式の星図データYBSC5.CSVを作った
・そのデータを変換するためのVB2005のソフトを作る練習・・・しかできなかった。
さすがに手元に紙の事例がないとしんどいので、本を購入。
amazon などで評判がいい本が店頭で見つからなかったので、事例が多そうなVisual Basic2005 逆引き大全にする。いいかどうかは、わからないけど。網羅的でも教科書的でもないし。
さて続き、まずはテスト。
前のメモの例では、テストがしにくいなあと思ったら Trace というクラスがあることがわかる。イミディエイトウィンドウに表示するというもので、VBステーションというところに用例があった。
−−−−−−−−−−−−−−−−−−−−−−−−−
Imports Microsoft.VisualBasic.FileIO としておいて
Using parser As New TextFieldParser(" C:\Documents and Settings\yoshiya\デスクトップ\YBSC5.csv ",
System.Text.Encoding.GetEncoding("SHIFT_JIS"))
parser.TextFieldType = FieldType.Delimited
parser.HasFieldsEnclosedInQuotes = True
parser.SetDelimiters(",")
While Not parser.EndOfData
Trace.Write(parser.LineNumber & ">>>")
Dim fields As String() = parser.ReadFields()
For Each field As String In fields
Trace.Write(field & "|")
Next
Trace.WriteLine("")
End While
End Using
−−−−−−−−−−−−−−−−−−−−−−−−−
さらにファイル出力を行う
−−−−−−−−−−−−−−−−−−−−−−−−−
Using parser As New TextFieldParser(" C:\Documents and Settings\yoshiya\デスクトップ\YBSC5.csv ", System.Text.Encoding.GetEncoding("SHIFT_JIS"))
parser.TextFieldType = FieldType.Delimited
parser.HasFieldsEnclosedInQuotes = True
parser.SetDelimiters(",")
Dim path As String = " C:\Documents and Settings\yoshiya\デスクトップ\YBSC5o.txt "
Dim outtext As IO.StreamWriter
outtext = New IO.StreamWriter(path, False, System.Text.Encoding.Default)
While Not parser.EndOfData
Trace.Write(parser.LineNumber & ">>>")
outtext.Write(parser.LineNumber & ">>>")
Dim fields As String() = parser.ReadFields()
For Each field As String In fields
Trace.Write(field & "|")
outtext.Write(field & "|")
Next
Trace.WriteLine("")
outtext.WriteLine("")
End While
outtext.Close()
End Using
−−−−−−−−−−−−−−−−−−−−−−−−−
ちょっとなれてきた。前のプログラムにちょちょいと追加。
Trace クラスと形式が同じなので、テストしやすいという印象。これは、まえのVBより進歩しているなあ。
では、もう一歩、フィールドの4つ目 Vmagで等級を限定して出力するのを作ってみる。
変更点は、1行目がタイトル行なので、while 文の外でそれをとばし、
for each ブロックの外に、if then 文を差し込んだ
あと、余計な出力がされないよう、少々文の準備をいれかえている。
−−−−−−−−−−−−−−−−−−−−−−−−−
Dim dumfields As String() = parser.ReadFields()
While Not parser.EndOfData
Dim fields As String() = parser.ReadFields()
If fields(3) < 3.5 Then
Trace.Write(parser.LineNumber & ">>>")
outtext.Write(parser.LineNumber & ">>>")
For Each field As String In fields
Trace.Write(field & "|")
outtext.Write(field & "|")
Next
Trace.WriteLine("")
outtext.WriteLine("")
End If
End While
−−−−−−−−−−−−−−−−−−−−−−−−−
うまく動いた。
ちなみに今回のデータ構造は、等級昇順にしているので、
if fields(3) >= 3.5 Then exit while
で打ち切ってしまうと、スピードアップになる。
さらに調子にのって、javascript を出力してみよう。
・とりあえず、Xが経度、Yが緯度とする。軸をひっくり返ったりとかは考えない。
・明るい星ほど大きくする。調整はあとでやることにして、明るさは3.5等で打ち切ることにして、4-Vmag*2 くらいにしておく
・とりあえず、すべての星を○で表す
fireworks extending のマニュアルでは○は oval を使うことになっている。
使い方
dom.addNewOval(それを囲む矩形で指定)
引数
それを囲む矩形は、浮動小数点形式で
left: float, top: float, right: float, bottom: float
左、上、右、下 (X、Y、X、Y)と指定する
塗る色やほかのプロパティや、どのレイヤーに描画されるかは
そのとき指定されているものがそのまま使われる
例
fw.getDocumentDOM().addNewOval({left:72, top:79, right:236, bottom:228});
面倒くさいことに、センター座標+半径ではなく それを囲む矩形で指定しなければいけない。
変換するルーチンを書いておくか・・・これは、Form1 クラスの中においておかないといけないらしい。
Public Function fwCircle(ByVal X As Single, ByVal Y As Single, ByVal R As Single) As String
Dim leftX As Single, topY As Single, rightX As Single, bottomY As Single
Dim comString As String = "fw.getDocumentDOM().addNewOval({"
leftX = X - R
topY = Y + R
rightX = X + R
bottomY = Y - R
fwCircle = comString & "left:" & Str(leftX) & ",top:" & Str(topY) & ",right:" & Str(rightX) & ",bottom:" & Str(bottomY) & "});"
Exit Function
End Function
さらにこれを呼び出す部分は
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using parser As New TextFieldParser(" C:\Documents and Settings\yoshiya\デスクトップ\YBSC5.csv ", System.Text.Encoding.GetEncoding("SHIFT_JIS"))
parser.TextFieldType = FieldType.Delimited
parser.HasFieldsEnclosedInQuotes = True
parser.SetDelimiters(",")
Dim path As String = " C:\Documents and Settings\yoshiya\デスクトップ\YBSC5o.txt "
Dim outtext As IO.StreamWriter
Dim Radius As Single
outtext = New IO.StreamWriter(path, False, System.Text.Encoding.Default)
Dim dumfields As String() = parser.ReadFields()
While Not parser.EndOfData
Dim fields As String() = parser.ReadFields()
If fields(3) > 3.5 Then Exit While
Radius = (4 - fields(3)) * 2
outtext.Write(fwCircle(fields(1) * 100, fields(2) * 10, Radius))
outtext.WriteLine("")
End While
outtext.Close()
End Using
End Sub
--------------------------------------------------------------------------------
さて、これではき出した jsf ファイルを fireworks 8 に食わせてみると・・・・
いろいろ間違っているのがわかるが、とりあえずそれっぽいのがでてきた。
あと一歩という感じになってきた!
2008年01月14日 記す