• 検索結果がありません。

可視化プログラムのソースコード解説

ドキュメント内 TITLE (ページ 61-90)

第 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)の座標を書き込む。

ドキュメント内 TITLE (ページ 61-90)

関連したドキュメント