カスタム材料から異常渦電流損失係数テーブルを作成する。
import designer
import subprocess
import os
import csv
import sys
import locale
import codecs
import platform
app = designer.GetApplication()
class DialogData:
def __init__(self):
self.lamination_thickness = 0.5
self.workdir_name = ""
self.material_name = ""
self.hys_method = ""
self.is_open_csv = False
self.is_set_material = False
self.is_set_B_f = False
self.is_valid = False
self.magfluxden =[]
self.frequency = []
def main():
data,dialog = get_data_from_input_dialog()
if(data == False):
return
if data.is_valid == False:
return
while extract_anomalous_coefficient(data)==False:
data,temp = get_data_from_input_dialog2(dialog)
if(data == False):
return
if os.path.exists(data.workdir_name+"/execerror") :
execerror = open(data.workdir_name+"/execerror", "r")
for line in execerror:
message_en = "Error occured while extracting anomalous eddy current loss coefficient. Please see the html file in\n" + line
message_jp = "実行結果にエラーがあります。\n"+line+"\nに存在するhtmlファイルを参照してください。"
show_error_exit_message(message_en, message_jp)
execerror.close()
return
show_normal_exit_message()
def is_num(s):
try:
float(s)
except ValueError:
return False
else:
return True
def get_data_from_input_dialog2(dialog):
return show_input_dialog(dialog),dialog
def get_data_from_input_dialog():
dialog = create_input_dialog()
return show_input_dialog(dialog),dialog
def create_input_dialog():
dialog = app.CreateDialogBox()
title_jp = "異常渦電流損失係数の抽出"
title_en = "Extract Anomalous Eddy Current Loss Coefficient"
inputlbl_jp = "入力"
inputlbl_en = "Input"
workdirlbl_jp = "作業フォルダー"
workdirlbl_en = "Working Directory"
materialname_jp = "カスタム材料名称:"
materialname_en = "Custom Material Name:"
laminoteslbl_jp = "鋼板厚さは0より大きく1.0以下の値を入力してください。"
laminoteslbl_en = "The range of lamination thickness must be greater than 0.0, and less than or equal to 1.0."
workdir_jp = "作業フォルダー:"
workdir_en = "Working Directory:"
calcmethodlbl_jp = "計算方法"
calcmethodlbl_en = "Calculation Method"
#magcharlbl_jp = "磁化特性:"
#magcharlbl_en = "Magnetic Properties:"
hyscalclbl_en = "Hysteresis Loss:"
hyscalclbl_jp = "ヒステリシス損失:"
hys0lbl_en = "FFT"
hys0lbl_jp ="FFT"
hys1lbl_en = "Apply Loop"
hys1lbl_jp = "ループを考慮"
hys2lbl_en = "Hysteresis Model"
hys2lbl_jp = "ヒステリシスモデル"
optionlbl_en = "Settings Option"
optionlbl_jp = "設定オプション"
laminationlbl_jp = "鋼板厚さ, mm:"
laminationlbl_en = "Lamination Thickness, mm:"
BandFlbl_jp = "磁束密度と周波数を指定する"
BandFlbl_en = "Specify Magnetic Flux Density and Frequency"
magfluxdenlbl_jp = "B, T:"
magfluxdenlbl_en = "B, T:"
frequencylbl_jp = "f, Hz:"
frequencylbl_en = "f, Hz:"
magfluxnoteslbl_jp = "磁束密度の列をカンマ区切りで入力してください。"
magfluxnoteslbl_en = "Please input comma-delimited array of B."
freqnoteslbl_jp = "周波数の列をカンマ区切りで入力してください。"
freqnoteslbl_en = "Please input comma-delimited array of f."
dialog.SetTranslation(title_en, title_jp)
dialog.SetTranslation(inputlbl_en, inputlbl_jp)
dialog.SetTranslation(workdirlbl_en, workdirlbl_jp)
dialog.SetTranslation(calcmethodlbl_en, calcmethodlbl_jp)
dialog.SetTranslation(materialname_en, materialname_jp)
#dialog.SetTranslation(magcharlbl_en,magcharlbl_jp)
dialog.SetTranslation(hyscalclbl_en,hyscalclbl_jp)
dialog.SetTranslation(hys0lbl_en,hys0lbl_jp)
dialog.SetTranslation(hys1lbl_en,hys1lbl_jp)
dialog.SetTranslation(hys2lbl_en,hys2lbl_jp)
dialog.SetTranslation(optionlbl_en,optionlbl_jp)
dialog.SetTranslation(laminoteslbl_en, laminoteslbl_jp)
dialog.SetTranslation(workdir_en, workdir_jp)
dialog.SetTranslation(BandFlbl_en, BandFlbl_jp)
dialog.SetTranslation(laminationlbl_en, laminationlbl_jp)
dialog.SetTranslation(magfluxdenlbl_en, magfluxdenlbl_jp)
dialog.SetTranslation(frequencylbl_en, frequencylbl_jp)
dialog.SetTranslation(magfluxnoteslbl_en, magfluxnoteslbl_jp)
dialog.SetTranslation(freqnoteslbl_en, freqnoteslbl_jp)
dialog.SetTitle(title_en)
dialog.AddLabel(inputlbl_en)
dialog.AddString("material_name",materialname_en,"")
dialog.AddLine()
dialog.AddLabel(workdirlbl_en)
dialog.AddDirectoryPath("workdir_name", workdir_en, "")
dialog.AddLine()
dialog.AddLabel(calcmethodlbl_en)
dialog.AddLabel(hyscalclbl_en)
dialog.AddRadio("hys_method",hys0lbl_en,1)
dialog.AddRadio("hys_method",hys1lbl_en,2)
dialog.AddRadio("hys_method",hys2lbl_en,3)
dialog.AddLine()
dialog.AddLabel(optionlbl_en)
dialog.AddReal("lamination_thickness",laminationlbl_en,0.5)
dialog.SetTooltip("lamination_thickness", laminoteslbl_en)
dialog.AddCheckBox("is_set_B_f", BandFlbl_en, False)
dialog.AddString("magfluxlist",magfluxdenlbl_en,"0.2,0.4,0.6")
dialog.SetTooltip("magfluxlist",magfluxnoteslbl_en)
dialog.AddString("freqlist",frequencylbl_en,"100,200,300")
dialog.SetTooltip("freqlist",freqnoteslbl_en)
return dialog
def show_input_dialog(dialog):
dialog.Show()
if dialog.WasCancelled() == False:
data = get_values_from_input_dialog(dialog)
if data.is_valid == False:
return show_input_dialog(dialog)
return data
return False
def get_values_from_input_dialog(dialog):
data = DialogData()
if dialog.GetValue("lamination_thickness") == "":
message_en = "Input lamination thickness."
message_jp = "鋼板厚さを入力してください"
show_error_exit_message(message_en, message_jp)
return data
if dialog.GetValue("lamination_thickness") <= 0:
message_en = "Lamination thickness must be larger than 0.0."
message_jp = "鋼板厚さは0より大きい値を入力してください。"
show_error_exit_message(message_en, message_jp)
return data
if dialog.GetValue("lamination_thickness") >1.0:
message_en = "Input lamination thickness is over 1.0."
message_jp = "鋼板厚さに1.0より大きい値が入力されました。"
title_en = "Warning of lamination thickness"
title_jp = "鋼板厚さのワーニング"
show_message(title_en, title_jp, message_en, message_jp)
if dialog.GetValue("workdir_name") == "":
message_en = "Please specify the working directory."
message_jp = "作業フォルダーを指定してください。"
show_error_exit_message(message_en, message_jp)
return data
if dialog.GetValue("material_name") =="":
message_en = "Please specify the Custom material name."
message_jp = "カスタム材料名称を入力してください。"
show_error_exit_message(message_en, message_jp)
return data
data.lamination_thickness = dialog.GetValue("lamination_thickness")
data.is_update_range = dialog.GetValue("is_set_B_f")
data.material_name =dialog.GetValue("material_name")
data.workdir_name = dialog.GetValue("workdir_name")
data.workdir_name = data.workdir_name.decode('utf-8')
data.material_name = data.material_name.decode('utf-8')
if check_duplicate(data) == False:
return data
if os.path.exists(data.workdir_name) == False:
message_en = "Working directory does not exist."
message_jp = "作業フォルダーが存在しません。"
show_error_exit_message(message_en, message_jp)
return data
if os.listdir(data.workdir_name) != []:
message_en = "Working directory must be empty."
message_jp = "作業フォルダーは空のフォルダを指定してください。"
show_error_exit_message(message_en, message_jp)
return data
data.is_set_B_f = dialog.GetValue("is_set_B_f")
if data.is_set_B_f == 1:
if dialog.GetValue("magfluxlist") =="":
message_en = "Please input comma-delimited array of B."
message_jp = "磁束密度のコンマ区切りの列を入力してください。"
show_error_exit_message(message_en, message_jp)
return data
if dialog.GetValue("freqlist")=="":
message_en = "Please input comma-delimited array of f."
message_jp = "周波数のコンマ区切りの列を入力してください。"
show_error_exit_message(message_en, message_jp)
return data
data.magfluxden = [x.strip() for x in dialog.GetValue("magfluxlist").decode('utf-8').split(",")]
data.frequency = [x.strip() for x in dialog.GetValue("freqlist").decode('utf-8').split(",")]
for i in data.magfluxden:
if(is_num(i) == False):
message_en = "Please input array of numbers of B."
message_jp = "磁束密度には数字の列を入力してください。"
show_error_exit_message(message_en, message_jp)
return data
for i in data.frequency:
if(is_num(i) == False):
message_en = "Please input array of numbers of B."
message_jp = "周波数には数字の列を入力してください。"
show_error_exit_message(message_en, message_jp)
return data
data.hys_method = dialog.GetValue("hys_method")
data.is_valid = True
return data
def check_duplicate(data):
check_mat_lib = app.GetMaterialLibrary()
originaltemp = check_mat_lib.GetUserMaterial(data.material_name)
if(originaltemp.IsValid()==False):
message_en = "Input material does not exist in the Custom Materials"
message_jp = "指定された名前の材料がカスタム材料内に存在しません。"
show_error_exit_message(message_en, message_jp)
return False
original= check_mat_lib.GetCustomMaterial(data.material_name)
first = check_mat_lib.CopyMaterialByObject(original)
#check_mat_lib.DeleteCustomMaterial(data.material_name)
check_mat_lib.DeleteCustomMaterialByObject(original)
#second = check_mat_lib.CopyMaterial(data.material_name)
second = check_mat_lib.GetUserMaterial(data.material_name)
if(second.IsValid() == True):
first.SetValue("Name",data.material_name)
backname = check_mat_lib.CopyMaterialByObject(first)
check_mat_lib.DeleteCustomMaterialByObject(backname)
message_en = "In the Custom Materials, there are several materials with the same name."
message_jp = "カスタム材料の中に同じ名前の材料が複数存在します。"
show_error_exit_message(message_en, message_jp)
return False
else:
first.SetValue("Name",data.material_name)
backname = check_mat_lib.CopyMaterialByObject(first)
check_mat_lib.DeleteCustomMaterialByObject(backname)
return True
def extract_anomalous_coefficient(data):
app.NewProject("Project Make Kappa")
app.Load(app.GetAppDir()+"/sample/Tools/loss/kappa_test.jcf")
app.GetModel(0).GetStudy(0).SetMaterialByName(1, data.material_name)
app.SetCurrentStudy(0)
app.GetModel(0).GetStudy(0).GetCondition(0).SetValue("LaminationThickness", data.lamination_thickness)
app.GetModel(0).GetStudy(0).GetCondition(0).SetValue("HysteresisLossCalcType", data.hys_method)
#if data.is_use_hys_loop == 1:
#app.GetModel(0).GetStudy(0).GetMaterial(1).SetValue("UseMaterialHysteresisLoop", data.is_use_hys_loop)
WorkDir = data.workdir_name
WorkDir = WorkDir.replace("\\","/")
app.GetCurrentStudy().WriteMeshJcf(WorkDir+"/MakeKappa.jcf")
if data.is_set_B_f ==1:
BfFile = open(WorkDir+"/settings_MakeKappa.csv",mode="w")
writer = csv.writer(BfFile,lineterminator="\n")
writer.writerow(data.magfluxden)
writer.writerow(data.frequency)
BfFile.close()
app.GetModel(0).DeleteStudy(0)
modelPath = WorkDir+u"/MakeKappa.jcf"
modelPath ="\"" + modelPath + "\""
WorkDir ="\"" + WorkDir + "\""
app.NewProject("untitled")
if os.name == 'nt':
os.environ['PATH'] = app.GetAppDir()
path = app.GetAppDir()+"/Tools/MakeKappa/MakeKappa.exe"
version,sub1,sub2 = platform.python_version_tuple()
env,temp2 = locale.getlocale()
if env == "ja_JP" or env == "Japanese_Japan":
if version == "2":
subprocess.call([path.encode("cp932"),app.GetAppDir().encode("cp932"),modelPath.encode("cp932"),WorkDir.encode("cp932"),(data.material_name).encode("cp932")])
else:
subprocess.call([path,app.GetAppDir(),modelPath,WorkDir,data.material_name])
else:
subprocess.call([path,app.GetAppDir(),modelPath,WorkDir,data.material_name])
elif os.name == 'posix':
os.environ['LD_LIBRARY_PATH'] = app.GetAppDir()+"/solver/mod/lib/linux64"
path = app.GetAppDir()+"/solver/bin/MakeKappa"
subprocess.call([path,app.GetAppDir(),modelPath,WorkDir,data.material_name])
if os.path.exists(data.workdir_name+"/tableerror") :
message_en = "Please set the f and B."
message_jp = "磁束密度と周波数を指定してください。"
show_error_exit_message(message_en, message_jp)
os.remove(data.workdir_name+"/tableerror")
return False
if os.path.exists(data.workdir_name+"/materialerror") :
message_en = "Anisotropic materials are not supported."
message_jp = "異方性材料には対応していません。"
show_error_exit_message(message_en, message_jp)
os.remove(data.workdir_name+"/materialerror")
return False
return True
def show_normal_exit_message():
title_en = "Calculation Ended"
title_jp = "計算終了"
message_en = "Extracting Anomalous Eddy Current Loss Coefficient has finished."
message_jp = "異常渦電流損失係数の抽出が終了しました。"
show_message(title_en, title_jp, message_en, message_jp)
return
def show_error_exit_message(message_en, message_jp):
title_en = "Error"
title_jp = "エラー"
show_message(title_en, title_jp, message_en, message_jp)
def show_message(title_en, title_jp, message_en, message_jp):
msgdlg = app.CreateDialogBox()
msgdlg.SetTranslation(title_en, title_jp)
msgdlg.SetTranslation(message_en, message_jp)
msgdlg.SetCancelButtonVisible(False)
msgdlg.SetTitle(title_en)
msgdlg.AddLabel(message_en)
msgdlg.Show()
main()


