💡
構造一貫解析ソフトSS7をPythonで実行する #3 ループ処理例(Python実行)
フォルダ構成
src
├─ ss7_make_python.py :: 入力csv -> 解析のループを行う。
├─ ss01_0001.py :: ss7 python実行
├─ module/
│ └─ ss7_SB1.py :: ss7出力csvの読書きを行う。
└─ data/
│ └─ csv/
│ ├─ exp.csv :: ss7.iknから生成。順次書替え。
│ ├─ inp.csv :: ss7.iknから生成。順次書替え。
│ └─ inp0.csv :: pythonで書換。
└─ Python/ :: ss7 Op.Pythonコマンド実行用のフォルダ
└─ (略)
プログラムの流れ(コマンド実行と同じ)
① 解析済ss7.iknファイル -> exp.csv, inp.csv出力
② exp.csvとinp.csvを読取る。
exp.csvより小梁の断面算定情報を取得し、設定クライテリアと比較する。
NGの場合の小梁配置情報をリスト化する。
③ NGの小梁を書換してinp.csvを作成する。
④ imp.csvから.iknを生成し、解析実行。-> exp.csv, inp.csv出力。
以降②~④のループをNGがなくなるまで繰返し。
ss7_make_python.py
import module.ss7_SB1 as sb
import ss01_0001 as ss7py
import subprocess
import sys
import os
print(sys.getdefaultencoding()) #文字コードの確認
path = os.getcwd() #カレントディレクトリの取得
print("カレントディレクトリ ::", path)
path_ikn = "C:\\UsrData\\Ss7Data\\物件A_Auto2023_v19.ikn"
path_ikn1 = "C:\\UsrData\\Ss7Data\\物件A_Auto2023_v19_1.ikn"
base_scmd = ".\data\scmd\ss01_0001.scmd" #1回目に実行するscmdファイル
base_scmd1 = '.\data\scmd\ss01_0002.scmd' #csvからss7に変換する部分が追加されたベースファイル
newfile = ".\data\scmd\ss03.scmd" #実行ファイル
inpath = "data\csv\inp.csv"
expath = "data\csv\exp.csv"
nwinpath = "data\csv\inp0.csv"
inpath = os.path.join(path, inpath)
expath = os.path.join(path, expath)
nwinpath = os.path.join(path, nwinpath)
def del_file(s_path):
try:
os.remove(s_path)
print(f"{s_path} を削除しました.")
except FileNotFoundError:
print(f"{s_path} は見つかりませんでした.")
def main(crit0, crit1):
count = 1
print("\n計算回数 = %i"%count)
del_file(inpath)
del_file(expath)
del_file(nwinpath)
#Python実行
#第1回目の実行(結果1に実行済ファイルが存在する前提)
ss7py.calc_ss01_0001(path_ikn, expath, inpath)
#csv読み書きとエラー個数取得
n1 = sb.csvmaker(inpath, expath, inpath, crit0, crit1) # inpath -> nwinpath 書換
print("エラー個数 = ", n1)
#whileループになるか判断(n1=0の時、ループには入らない)
if n1 == 0:
n = 0 #下記のwhileループに入らない。
else:
n = 100 #初期値>1 ならなんでもOK whileループに入る。
count += 1
while n >= 1: #エラーがある場合ループ入り
print("\n計算回数 = %i"%count)
#Python実行
ss7py.calc_ss01_0002(path_ikn1, expath, nwinpath, inpath)
#csvの読み書きとエラー個数
n1 = sb.csvmaker(nwinpath, expath, inpath, crit0, crit1)
print("エラー個数 = ", n1)
n = n1
count += 1
crit0 = 0.9 # 検定比
crit1 = 300 # 変形
main(crit0, crit1)
ss01_0001.py
from Python import Ss7Python as Cmd
import os
def del_file(s_path):
try:
os.remove(s_path)
print(f"{s_path} を削除しました.")
except FileNotFoundError:
print(f"{s_path} は見つかりませんでした.")
def calc_ss01_0001(PATH_IKN, PATH_CSVexp, PATH_CSVinp):
Cmd.Init()
Cmd.Start( "1.1.1.19", 1) # 1=ログファイルをクリアする
print(f"PATH_IKN={PATH_IKN}\nPATH_CSVexp={PATH_CSVexp}\nPATH_CSVinp={PATH_CSVinp}")
# データを開く
Data = Cmd.Open(PATH_IKN, 1, 2)
# データが正しく開けたことの判定
if ( Data is not None ):
# 計算実行
#Data.Calculate("結果1", "必要保有水平耐力")
err = Cmd.GetLastError()
# 計算が正しく実行できたことの判定
if ( err.IsOK() == True ):
print( "初期計算はしません" )
# 計算結果データを取得する
res = Data.GetResultData("結果1")
# 結果CSVをエクスポートする
del_file(PATH_CSVexp) # 前回削除
res.ExportResultCsv(None , PATH_CSVexp, 2, 1, 1 ) # 2=中断する 1=省略する 1=全部材出力
res.ExportInputCsv(PATH_CSVinp, 1 ,1)
Data.Close( 1 ) # 1=保存する
else:
print(err.GetErrorMessage())
# データを閉じる
Data.Close( 2 ) # 2=保存しない
else:
print("データが開けない。")
Cmd.End( 1 ) # 1=保存して終了
def calc_ss01_0002(PATH_IKN, PATH_CSVexp, PATH_CSVinp, PATH_CSVinp0):
Cmd.Init()
Cmd.Start( "1.1.1.19", 1) # 1=ログファイルをクリアする
print(f"PATH_IKN={PATH_IKN}\nPATH_CSVexp={PATH_CSVexp}\nPATH_CSVinp={PATH_CSVinp}\n\nPATH_CSVinp0={PATH_CSVinp0}")
# CSV入力データからSS7のデータを作成する
Cmd.CreateDataCsv(PATH_CSVinp0, PATH_IKN, 1) # 2=中断する
err = Cmd.GetLastError()
# CSV新規作成できたことの判定
if ( err.IsOK() == True ):
print( "CSV新規作成が成功しました")
# データを開く
Data = Cmd.Open(PATH_IKN, 1, 3 ) # 1=変換して開く 3=物件データは開かない
# データが正しく開けたことの判定
if ( Data is not None ):
# 計算実行
Data.Calculate( "結果1", "必要保有水平耐力" )
# エラー情報を取得する
err = Cmd.GetLastError()
# 計算が正しく実行できたことの判定
if ( err.IsOK() == True ):
print( "計算が成功しました" )
# 計算結果データを取得する
res = Data.GetResultData("結果1")
# 結果と入力CSVをエクスポートする
del_file(PATH_CSVexp) # 前回削除
res.ExportResultCsv(None , PATH_CSVexp, 2, 1, 1)
del_file(PATH_CSVinp) # 前回削除
res.ExportInputCsv(PATH_CSVinp, 1, 1)
# データを閉じる
Data.Close( 1 ) # 1=保存する
else:
print( "計算が失敗しました" )
print(Cmd.GetErrorMessage())
# データを閉じる
Data.Close( 2 ) # 2=保存しない
else:
print( "CSV新規作成が失敗しました" )
else:
print(err.GetErrorMessage())
Cmd.End( 1 ) # 1=保存して終了
if __name__ == "__main__":
PATH_IKN = r"C:\UsrData\Ss7Data\物件A_Auto2023_v19.ikn"
PATH_CSVexp = r"C:\Users\osdm_132.OSDM01\Downloads\220514_小梁算定の自動化\案3\data\csv\exp.csv"
PATH_CSVinp = r"C:\Users\osdm_132.OSDM01\Downloads\220514_小梁算定の自動化\案3\data\csv\inp0.csv"
calc_ss01_0001(PATH_IKN, PATH_CSVexp, PATH_CSVinp)
Discussion