LTspiceでパラメータを変化させて.measで値を取得したときに、logファイルでは扱いにくかったので、Excelに変換するpythonプログラムを作りました。
注意点としては、LTspice側でパラメータを変化させるときは小さい順に変化させる必要があります。
LTSpiceLogReaderで変数を読み取るときになぜか順番通りにならないことがあるので、プログラムの中でソートしています。
まずは1変数のとき。
log_to_excel_1para.py
from PyLTSpice import LTSpiceLogReader
import openpyxl as xl
from openpyxl.styles import Border, Side
import tkinter as tk
from tkinter import filedialog, messagebox
#########################################################
#注意
#LTspiceでパラメータを変化させるときは小さい順に変化させること
#例:.step param C list 0.1u 0.5u 1u
#########################################################
############################################################################################
#GUI
############################################################################################
#logファイル選択GUI
def browse_log_file():
filename = filedialog.askopenfilename(
title="logファイルを選択",
filetypes=[("log file", "*.log"), ("All files", "*.*")]
)
log_path_var.set(filename)
#エラー対策
def save_to_excel():
log_path = log_path_var.get()
excel_name = excel_name_var.get()
if not log_path or not excel_name:
messagebox.showwarning("error", "logファイルとExcel名を入力してください。")
return
root.destroy()
#GUIセットアップ
root = tk.Tk()
root.title("log_to_excel_1para")
log_path_var = tk.StringVar()
excel_name_var = tk.StringVar()
#logファイル選択
tk.Label(root, text="logファイル:").grid(row=0, column=0, sticky="e")
tk.Entry(root, textvariable=log_path_var, width=40).grid(row=0, column=1)
tk.Button(root, text="参照", command=browse_log_file).grid(row=0, column=2)
#Excelファイル名
tk.Label(root, text="保存名(.xlsx):").grid(row=1, column=0, sticky="e")
tk.Entry(root, textvariable=excel_name_var, width=40).grid(row=1, column=1)
#実行ボタン
tk.Button(root, text="Run", command=save_to_excel).grid(row=2, column=1, pady=10)
root.mainloop()
#######################################################################################################################
#データ変換
#######################################################################################################################
#ラベルを抽出する関数(_toなどの補助ラベルを除外)
def filtered_labels(log):
meas_name = log.get_measure_names()
return [name for name in meas_name if not (name.endswith("_from") or name.endswith("_to") or name.endswith("_at"))]
#初期リストを生成する関数
def ini_datas(log, var):
datas = [[0] * 2 for i in range(len(set(log[var])) + 1)]
datas[0][0] = var
for i in range(len(set(log[var]))):
datas[i + 1][0] = sorted(set(log[var]))[i]
return datas
#罫線を引く関数
def lines():
thin = Side(style="thick", color="B22222")
for cell in ws[1]: # ws[1] は1行目のセル一覧
if cell.value is not None:
cell.border = Border(bottom=thin)
for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
cell = row[0] # 1列目のセル
if cell.value is not None:
cell.border = Border(right=thin)
cell = ws.cell(row=1, column=1)
cell.border = Border(bottom=thin, right=thin)
#logファイルの読み込み
log = LTSpiceLogReader(log_path_var.get())
#変数を取得
var = log.get_step_vars()[0]
#Excelファイルを生成
wb = xl.Workbook()
ws = wb.active
#各結果について2次元リストを作成、保存
for label in filtered_labels(log):
datas = ini_datas(log, var)
vert = len(set(log[var]))
#リストに格納
for i in range(vert):
datas[i + 1][1] = log[label][i]
#Excelに入力
ws.title = label
for row in datas:
ws.append(row)
ws.cell(1, 2, label)
lines()
ws = wb.create_sheet()
wb.remove(wb["Sheet"])
wb.save(excel_name_var.get() + ".xlsx")
次に2変数のとき。
log_to_excel_2para.py
from PyLTSpice import LTSpiceLogReader
import openpyxl as xl
from openpyxl.styles import Border, Side
import tkinter as tk
from tkinter import filedialog, messagebox
#########################################################
#注意
#LTspiceでパラメータを変化させるときは小さい順に変化させること
#例:.step param C list 0.1u 0.5u 1u
#########################################################
############################################################################################
#GUI
############################################################################################
#logファイル選択GUI
def browse_log_file():
filename = filedialog.askopenfilename(
title="logファイルを選択",
filetypes=[("log file", "*.log"), ("All files", "*.*")]
)
log_path_var.set(filename)
#エラー対策
def save_to_excel():
log_path = log_path_var.get()
excel_name = excel_name_var.get()
if not log_path or not excel_name:
messagebox.showwarning("error", "logファイルとExcel名を入力してください。")
return
root.destroy()
#GUIセットアップ
root = tk.Tk()
root.title("log_to_excel_2para")
log_path_var = tk.StringVar()
excel_name_var = tk.StringVar()
#logファイル選択
tk.Label(root, text="logファイル:").grid(row=0, column=0, sticky="e")
tk.Entry(root, textvariable=log_path_var, width=40).grid(row=0, column=1)
tk.Button(root, text="参照", command=browse_log_file).grid(row=0, column=2)
#Excelファイル名
tk.Label(root, text="保存名(.xlsx):").grid(row=1, column=0, sticky="e")
tk.Entry(root, textvariable=excel_name_var, width=40).grid(row=1, column=1)
#実行ボタン
tk.Button(root, text="Run", command=save_to_excel).grid(row=2, column=1, pady=10)
root.mainloop()
#######################################################################################################################
#データ変換
#######################################################################################################################
#ラベルを抽出する関数(_toなどの補助ラベルを除外)
def filtered_labels(log):
meas_name = log.get_measure_names()
return [name for name in meas_name if not (name.endswith("_from") or name.endswith("_to") or name.endswith("_at"))]
#初期リストを生成する関数
#縦:第一変数 横:第二変数
def ini_datas(log, var1, var2):
datas = [[0] * (len(set(log[var2])) + 1) for i in range(len(set(log[var1])) + 1)]
datas[0][0] = var1 + "↓ " + var2 + "→"
for i in range(len(set(log[var1]))):
datas[i + 1][0] = sorted(set(log[var1]))[i]
for i in range(len(set(log[var2]))):
datas[0][i + 1] = sorted(set(log[var2]))[i]
return datas
#罫線を引く関数
def lines():
thin = Side(style="thick", color="B22222")
for cell in ws[1]: # ws[1] は1行目のセル一覧
if cell.value is not None:
cell.border = Border(bottom=thin)
for row in ws.iter_rows(min_row=1, max_row=ws.max_row):
cell = row[0] # 1列目のセル
if cell.value is not None:
cell.border = Border(right=thin)
cell = ws.cell(row=1, column=1)
cell.border = Border(bottom=thin, right=thin)
#logファイルの読み込み
log = LTSpiceLogReader(log_path_var.get())
#変数を取得
var1 = log.get_step_vars()[0]
var2 = log.get_step_vars()[1]
#Excelファイルを生成
wb = xl.Workbook()
ws = wb.active
#各結果について2次元リストを作成、保存
for label in filtered_labels(log):
datas = ini_datas(log, var1, var2)
vert = len(set(log[var1]))
hori = len(set(log[var2]))
#リストに格納
for i in range(hori):
for j in range(vert):
datas[j + 1][i + 1] = log[label][vert * i + j]
#Excelに入力
ws.title = label
for row in datas:
ws.append(row)
lines()
ws = wb.create_sheet()
wb.remove(wb["Sheet"])
wb.save(excel_name_var.get() + ".xlsx")
補助ラベルはもしかしたら他にもあるかもしれないので、おかしくなったら除外するものに追加してください。