解説用の星図をさっさかるくるプロジェクト メモ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日 記す

続く