Source code for pyleecan.Methods.Machine.WindingUD.import_from_csv

from os.path import isfile
from csv import reader
from numpy import zeros, amax, tile

ZS_COL = 0  # Slot id
COIL_COL = 1  # Ntcoil (+/-)
RAD_COL = 2  # Rad layer id
TAN_COL = 3  # Tan layer id


[docs]def import_from_csv(self, file_path=None): """Import the winding matrix from a csv file. One matrix for each phase Column Slot id, Ntcoil, Rad id, Tan id Parameters ---------- self : WindingUD A: WindingUD object file_path : str Path to the file to load """ # parse file_path if file_path[-4:] != ".csv": file_path += ".csv" if not isfile(file_path): raise FileNotFoundError(file_path + " is not a csv winding file") with open(file_path, "r") as csv_file: line_list = list(reader(csv_file)) # Get matrix size if "(" in line_list[0][0] and ")" in line_list[0][0]: is_header, offset = True, 1 wind_shape = eval(line_list[0][0]) else: # No Header is_header, offset = False, 0 Nrad, Ntan, Zs, qs = -1, -1, -1, 0 for line in line_list: if len(line) == 0: qs += 1 else: Nrad = max(Nrad, int(line[RAD_COL])) Ntan = max(Ntan, int(line[TAN_COL])) Zs = max(Zs, int(line[ZS_COL])) wind_shape = (Nrad + 1, Ntan + 1, Zs + 1, qs) if self.parent is not None and self.parent.slot is not None: assert self.parent.slot.Zs % wind_shape[2] == 0, ( "Mismatch between Lamination Zs (" + str(self.parent.slot.Zs) + ") and imported winding Zs (" + str(wind_shape[2]) + ")" ) wind_mat = zeros(wind_shape) # Load matrix qs_id = 0 if is_header: # Remove first line line_list.pop(0) for line in line_list: if len(line) == 0 or line[ZS_COL + offset] == "": qs_id += 1 else: Rad_id = int(float(line[RAD_COL + offset])) Tan_id = int(float(line[TAN_COL + offset])) Zs_id = int(float(line[ZS_COL + offset])) wind_mat[Rad_id, Tan_id, Zs_id, qs_id] = line[COIL_COL + offset] # complete partial winding matrix if self.parent is not None and self.parent.slot is not None: Zs = self.parent.slot.Zs if wind_mat.shape[2] < Zs: wind_mat = tile(wind_mat, (1, 1, Zs // wind_mat.shape[2], 1)) # Update property self.clean() # Remove periodicity self.wind_mat = wind_mat self.Nlayer = wind_shape[0] * wind_shape[1] self.qs = wind_shape[3] self.Ntcoil = amax(self.wind_mat)