第 3 章 プログラム 15
3.4 ソースコード
3.4.3 可視化プログラムのソースコード解説
必要なモジュールを適用する。
import os
⇒オペレーションシステムを参照。
import re
⇒正規表現モジュールを参照。
from vtk import*
⇒VTKモジュールを参照。
import library as lib
⇒libraryモジュールをlibと名付けて参照。
import math
⇒math(数学関係のモジュール)を参照。
import numpy as np
⇒numpy(配列関係のモジュール)を参照しnpと名付ける。
————————————————————————————————————
def setting_read():
⇒setting_readと名付けた関数を定義する。
pwd = os.getcwd()
⇒カレントディレクトリへのパスをpwdにする。
files = os.listdir(pwd)
⇒path(カレントディレクトリにある)全てのファイルとサブディレクトリの名前からなるリ
ストを返す。順番は不動。
if "visbar_wb_setting_default.txt" in files >= 0:
⇒visbar_wb_setting_default.txtのファイルがあった場合、if分岐に従う setting_file_name="visbar_wb_setting_default.txt"
⇒setting_file_nameをvisbar_wb_setting_default.txtとする f = open(setting_file_name,’r’)
a=1
⇒aに初期値1を入れる。
cnt=0
⇒カウンタの初期値を0に設定。
dic={}
⇒空のディクショナリを作成する。
while True:
⇒whileループを回す。
findsharp=-1
⇒findsharpの初期値を-1に設定する。
line = f.readline()
⇒ファイルを1行読み込む。
if line.find("--end_setting--") >=0 :
⇒読み込んだ一行の中に「--end_setting--」の一文が含まれていたら、直下にあるbreakす る。
break
⇒while文から抜けるbreakを行う。
all_line=[]
⇒all_lineという空のリストを作成。
line = line.replace("\t"," ")
⇒読み込んだ一行の中にタブがあれば、それをスペースに変換する。間違ってタブがあっても 区切れるようにするため。
line = line.rstrip()
⇒末尾に空白文字がある場合、空白文字を削除する。
line = re.sub("\n","",line)
⇒改行文字を取り消している。
line = re.split(" *",line)
⇒空白でlineの中の要素を分けている。
if line[0] == "":
58
⇒lineの要素の一番目が何も無ければ、if分岐の次の行continueを実行する。
continue
⇒whileループの一番最初の文にループをもどす。
if line[0].find("#") >=0:
⇒lineの要素の1番目にシャープが含まれていた場合、if分岐に従いcontinueを実行する。
continue
⇒whileループの一番最初の文にループをもどす。
all_line += line
⇒all_lineにlineの要素を入れる。
del all_line[0]
⇒0番目の要素を削除する。
for i in range(0,len(all_line)):
⇒iという変数でall_lineに入っている要素の数だけループを回す。
if all_line[i].find("#") >=0:
⇒all_lineのどこかにシャープが入っていた場合、以下のif分岐に従う。
findsharp=i
⇒iの変数をfindsharpとして代入する。
if findsharp >=0:
⇒findsharpの値が0以上だった場合、if分岐に従う。
del all_line[findsharp:]
⇒all_lineのシャープが入っていた要素から後ろの要素全てを取り除く。
if len(all_line) ==0:
⇒all_lineの要素が全く無かった場合、if分岐に従う。
print "Dictionary isn’t possible" +" "+ "["+line[0]+"]"
⇒Dictionary isn’t possibleと、ディクショナリのキーを出力させる。
continue
⇒whileループの一番最初の文にループをもどす。
para=[]
para += all_line
⇒paraにall_lineを追加する。
dic[line[0]]=para
⇒ディクショナリにlineの一番目をディクショナリのキー、paraを値として、ディクショナ リに追加する。{line[0]:para}となり、ディクショナリに追加される。
f.close
⇒visbar_wb_setting.txtを閉じる。
if "visbar_wb_setting.txt" in files >= 0:
⇒visbar_wb_setting.txtがディレクトリにあった場合、if分岐に入る。
setting_file_name="visbar_wb_setting.txt"
⇒visbar_wb_setting.txtをsetting_file_nameという変数に入れる。
f = open(setting_file_name,’r’)
⇒setting_file_nameの変数に代入されている(visbar_wb_setting.txt)を読み取り専用で 開く。
a=1
⇒aに1を代入する。
cnt=0
⇒cntの変数に0を代入する。
dic2={}
⇒dic2という空のディクショナリを作成する。
while True:
⇒whileループを回す。
findsharp=-1
⇒findsharpの初期値を-1に設定する。
line = f.readline()
⇒ファイルを1行読み込む。
if line.find("--end_setting--") >=0 :
⇒読み込んだ1行の中に「--end_setting--」の一文が含まれていたら、直下にあるbreakを 実行する。
60
break
⇒while文から抜けるbreakを実行する。
all_line=[]
⇒all_lineという空のリストを作成。
line = line.replace("\t"," ")
⇒読み込んだ一行の中にタブがあれば、それをスペースに変換する。間違ってタブがあっても 区切れるようにするため。
line = line.rstrip()
⇒末尾に空白文字がある場合、空白文字を削除。
line = re.sub("\n","",line)
⇒改行文字を取り消している。
line = re.split(" *",line)
⇒空白でlineの中の要素を分けている。
if line[0] == "":
⇒lineの要素の一番目が何も無ければ、if分岐の次の行continueを実行する。
continue
⇒whileループの一番最初の文にループをもどす。
if line[0].find("#") >=0:
⇒lineの要素の1番目にシャープが含まれていた場合、if分岐に従いcontinueを実行する。
continue
⇒whileループの一番最初の文にループをもどす。
all_line += line
⇒all_lineにlineの要素を入れる。
del all_line[0]
⇒0番目の要素を削除する。
for i in range(0,len(all_line)):
⇒iという変数でall_lineに入っている要素の数だけループを回す。
if all_line[i].find("#") >=0:
⇒all_lineのどこかにシャープが入っていた場合、以下のif分岐に従う。
findsharp=i
⇒iの変数をfindsharpとして代入する。
if findsharp >=0:
⇒findsharpの値が0以上だった場合、if分岐に従う。
del all_line[findsharp:]
⇒all_lineのシャープが入っていた要素から後ろの要素全てを取り除く。
if len(all_line) ==0:
⇒findsharpの値が0以上だった場合、if分岐に従う。
print "Dictionary isn’t possible" +" "+ "["+line[0]+"]"
⇒Dictionary isn’t possibleと、ディクショナリのキーを出力させる。
continue
⇒whileループの一番最初からループをやり直す。
para=[]
⇒paraという空のリストを作成する。
para += all_line
⇒paraにall_lineを追加する。
dic2[line[0]]=para
⇒ディクショナリにlineの一番目をディクショナリのキー、paraを値として、ディクショナ リに追加する。{line[0]:para}となり、ディクショナリに追加される。
dic.update(dic2)
⇒dicをベースにdic2のディクショナリを上書きしたディクショナリをdicとして定義する。
return dic
⇒dicを戻り値とする。
read=setting_read()
⇒setting_read()の関数を実行し、実行した値をreadに入れる。
def setting_bond():
⇒setting_bondの関数を定義する f = open("bond_length.txt",’r’)
⇒bond_length.txtのテキストファイルを読み取り専用で開く。
62
a=1
⇒aに初期値1を入れる。
cnt=0
⇒カウンタの初期値を0に設定。
dic={}
⇒空のディクショナリを作成する。
while True:
⇒whileループを回す。
findsharp=-1
⇒findsharpの初期値を-1に設定する。
line = f.readline()
⇒ファイルを1行読み込む。
if line.find("--end_setting--") >=0 :
⇒読み込んだ一行の中に「--end_setting--」の一文が含まれていたら、直下にあるbreakす る。
break
⇒while文から抜けるbreakを行う。
all_line=[]
⇒all_lineという空のリストを作成。
line = line.replace("\t"," ")
⇒読み込んだ一行の中にタブがあれば、それをスペースに変換する。間違ってタブがあっても 区切れるようにするため。
line = line.rstrip()
⇒末尾に空白文字がある場合、空白文字を削除。
line = re.sub("\n","",line)
⇒改行文字を取り消している。
line = re.split(" *",line)
⇒空白でlineの中の要素を分けている。
if line[0] == "":
continue
⇒whileループの一番最初の文にループをもどす。
if line[0].find("#") >=0:
⇒lineの要素の1番目にシャープが含まれていた場合、if分岐に従いcontinueを実行する。
continue
⇒whileループの一番最初の文にループをもどす。
all_line += line
⇒all_lineにlineの要素を入れる。
del all_line[0:2]
⇒0番目,1番目の要素を削除する。
for i in range(0,len(all_line)):
⇒iという変数でall_lineに入っている要素の数だけループを回す。
if all_line[i].find("#") >=0:
⇒all_lineのどこかにシャープが入っていた場合、以下のif分岐に従う。
findsharp=i
⇒iの変数をfindsharpとして代入する。
if findsharp >=0:
⇒findsharpの値が0以上だった場合、if分岐に従う。
del all_line[findsharp:]
⇒all_lineのシャープが入っていた要素から後ろの要素全てを取り除く。
if len(all_line) ==0:
⇒all_lineの要素が全く無かった場合、if分岐に従う
print "Dictionary isn’t possible" +" "+ "["+line[0]+"]"
⇒Dictionary isn’t possibleと、ディクショナリのキーを出力させる。
continue
⇒whileループの一番最初の文にループをもどす。
dic[line[0],line[1]]=line[2]
⇒ディクショナリにlineの一番目と二番目をディクショナリのキー、lineの三番目を値とし て、ディクショナリに追加する。{line[0],line[1]]:line[2]}となり、ディクショナリに追
64
加される。
f.close
⇒bond_length.txtを閉じる。
retur dic
⇒戻り値にdicを指定する。
read_bond=setting_bond()
⇒setting_bondの戻り値をread_bondに代入する。
————————————————————————————————————
可視化時に必要な初期値を上に書いたsetting read()の関数から持ってくる。
save_step = 0
⇒save_stepの値に0を与える。
isovalue=float(read["isovalue"][0])
⇒isovalueの初期値をsettingファイルのディクショナリから持ってくる。
stableiso=float(read["isovalue"][0])
⇒stableisoの初期値をsettingファイルのディクショナリから持ってくる。
isovalueminus=float(read["isovalueminus"][0])
⇒isovalueminusの初期値をsettingファイルのディクショナリから持ってくる。
stableisominus=float(read["isovalueminus"][0])
⇒stableisominusの初期値をsettingファイルのディクショナリから持ってくる。
level=0
⇒levelの初期値を0とする。
————————————————————————————————————
可視化時に「u」を押した時にpng形式で画像を保存するように関数を作成するsave stepを 画像を保存時に増える変数とした。
def vtk(filenametext,Batch_mode):
⇒vtkという関数をfilenametext,Batch_modeの引数を持って定義している。ここからが可 視化プログラムの根幹である。
save_step = 0
⇒save_stepという初期値を0に設定する。
def userMethod(obj, arg):
⇒定義文で、以下の画像を保存するモジュールを定義する。
global save_step
⇒save_stepをglobalに定義して、定義文の外と中で変数を受け渡しできるようにした。
print "userMethod"
⇒この定義文を使用したときに「userMethod」と表示されるようにする。
print "level =" ,level,"isovalue=",stableiso,"isovalueminus=",stableisominus
⇒level、正の波動関数の値、負の波動関数の値をPython command lineに出力。
isosurface.SetValue(0,stableiso)
⇒isosurface.SetValueの値を設定する。
isosurfaceminus.SetValue(0,stableisominus)
⇒isosurfaceminus.SetValueの値を設定する。
renWin.Render()
⇒renWinのRenderの関数を使用し、図を再描画する。
windowToImageFilter=vtk.vtkWindowToImageFilter()
⇒windowToImageFilterをvtk.vtkWindowToImageFilter()と定義する。
windowToImageFilter.SetInput(renWin)
⇒windowToImageFilterにrenwinをインプットする。
windowToImageFilter.Update()
⇒windowToImageFilterをアップデートする。
pngWriter=vtk.vtkPNGWriter()
⇒pngWriterをvtk.vtkPNGWriter()として定義する。
pngWriter.SetInput(windowToImageFilter.GetOutput())
⇒pngWriterにwindowToImageFilterをインプットする。
pngWriter.SetFileName("image"+ str(save_step) +".png")
⇒保存するファイルの名前を指定する。「image+番号+.png」の形式となっている。
66
pngWriter.Write()
⇒pngWriterのWrite()関数を用いて画像を保存する。
save_step += 1
⇒save_stepの値に1を加える。
————————————————————————————————————
setting readの関数で読み込むことの出来るsettingファイルを作成するモジュールを定義 する。
def setting_write():
⇒setting_writeの関数を定義する。
isosurface.SetValue(0,stableiso)
⇒isosurface.SetValueの値を設定する。
isosurfaceminus.SetValue(0,stableisominus)
⇒isosurfaceminus.SetValueの値を設定する。
renWin.Render()
⇒renWinのRenderの関数を使用し、図を再描画する。
out = open("visbar_wb_setting_output.txt",’w’)
⇒visbar_wb_setting_output.txtを書き込み専用で開く。
out.write(’isovalue’ +’ ’+ str(isovalue*(1.01**level)) + ’\n’)
⇒isovalueの文字と、現在の正の波動関数の値を書き込む。
out.write(’isovalueminus’+’ ’+ str(isovalueminus*(1.01**level)) + ’\n’)
⇒isovalueminusの文字と、現在の負の波動関数の値を書き込む。
out.write(’isoopacity’+’ ’+ \
str(isosurfaceActor.GetProperty().GetOpacity()) + ’\n’)
⇒isoopacityの文字と波動関数の透明度の値を書き込む。
out.write(’outlinecolor’+’ ’+ str( outlineActor.GetProperty().GetAmbientColor()[0])\
+’ ’+ str( outlineActor.GetProperty().GetAmbientColor()[1])\
+’ ’+ str( outlineActor.GetProperty().GetAmbientColor()[2])+ ’\n’)
⇒outlinecolorの文字と外枠の色をRGB形式で書き込む。
out.write(’Window_size’ +’ ’+ str(renWin.GetSize()[0])\
+’ ’+ str(renWin.GetSize()[1])+ ’\n’)
⇒Window_sizeの文字とウィンドウのサイズ(x,y)の座標を書き込む。