[D0016] 異常渦電流損失係数の抽出

 

カスタム材料から異常渦電流損失係数テーブルを作成する。

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()

Download Python source code

ファイルご利用の注意点

JMAGスクリプトライブラリをご利用されるに際し、以下の利用規約をよくお読みいただき、ご同意の上ご利用下さるようお願い申し上げます。