💡

構造一貫解析ソフトSS7をPythonで実行する #3 ループ処理例(Python実行)

2023/12/20に公開

フォルダ構成

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