def __init__(self, parent=None, object_types=list(), circuit: MultiCircuit=None, use_native_dialogues=False): """ Constructor Args: parent: object_types: circuit: """ QtWidgets.QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.setWindowTitle('Grid analysis') # set the circuit self.circuit = circuit self.use_native_dialogues = use_native_dialogues # declare logs self.log = GridErrorLog() self.object_types = object_types # set the objects type model self.ui.objectsListView.setModel(get_list_model(object_types)) # click # self.ui.doit_button.clicked.connect(self.analyze_click) # list click self.ui.objectsListView.clicked.connect(self.object_type_selected) # Actions self.ui.plotwidget.canvas.fig.clear() self.ui.plotwidget.get_figure().set_facecolor('white') self.ui.plotwidget.get_axis().set_facecolor('white') self.ui.actionSave_diagnostic.triggered.connect(self.save_diagnostic) self.analyze_all()
def __init__(self, line: Line, Sbase=100, templates=None, current_template=None): """ Line Editor constructor :param line: Branch object to update :param Sbase: Base power in MVA """ super(LineEditor, self).__init__() # keep pointer to the line object self.line = line self.Sbase = Sbase self.templates = templates self.current_template = current_template self.selected_template = None self.setObjectName("self") self.setContextMenuPolicy(Qt.NoContextMenu) self.layout = QVBoxLayout(self) # ------------------------------------------------------------------------------------------ # Set the object values # ------------------------------------------------------------------------------------------ Vf = self.line.bus_from.Vnom Vt = self.line.bus_to.Vnom Zbase = (Vf * Vf) / self.Sbase Ybase = 1 / Zbase length = self.line.length if length == 0: length = 1.0 R = self.line.R * Zbase / length X = self.line.X * Zbase / length B = self.line.B * Ybase / length I = np.round(self.line.rate / (Vf * 1.73205080757), 6) # current in kA # ------------------------------------------------------------------------------------------ # catalogue self.catalogue_combo = QComboBox() if self.templates is not None: if len(self.templates) > 0: self.catalogue_combo.setModel(get_list_model(self.templates)) if self.current_template is not None: try: idx = self.templates.index(self.current_template) self.catalogue_combo.setCurrentIndex(idx) if isinstance(self.current_template, SequenceLineType): I = self.current_template.rating R = self.current_template.R X = self.current_template.X B = self.current_template.B if isinstance(self.current_template, UndergroundLineType): I = self.current_template.rating R = self.current_template.R X = self.current_template.X B = self.current_template.B elif isinstance(self.current_template, Tower): I = self.current_template.rating R = self.current_template.R1 X = self.current_template.X1 B = self.current_template.Bsh1 except: pass # load template self.load_template_btn = QPushButton() self.load_template_btn.setText('Load template values') self.load_template_btn.clicked.connect(self.load_template_btn_click) # line length self.l_spinner = QDoubleSpinBox() self.l_spinner.setMinimum(0) self.l_spinner.setMaximum(9999999) self.l_spinner.setDecimals(6) self.l_spinner.setValue(length) # Max current self.i_spinner = QDoubleSpinBox() self.i_spinner.setMinimum(0) self.i_spinner.setMaximum(9999999) self.i_spinner.setDecimals(2) self.i_spinner.setValue(I) # R self.r_spinner = QDoubleSpinBox() self.r_spinner.setMinimum(0) self.r_spinner.setMaximum(9999999) self.r_spinner.setDecimals(6) self.r_spinner.setValue(R) # X self.x_spinner = QDoubleSpinBox() self.x_spinner.setMinimum(0) self.x_spinner.setMaximum(9999999) self.x_spinner.setDecimals(6) self.x_spinner.setValue(X) # B self.b_spinner = QDoubleSpinBox() self.b_spinner.setMinimum(0) self.b_spinner.setMaximum(9999999) self.b_spinner.setDecimals(6) self.b_spinner.setValue(B) # accept button self.accept_btn = QPushButton() self.accept_btn.setText('Accept') self.accept_btn.clicked.connect(self.accept_click) # add all to the GUI if templates is not None: self.layout.addWidget(QLabel("Available templates")) self.layout.addWidget(self.catalogue_combo) self.layout.addWidget(self.load_template_btn) self.layout.addWidget(QLabel("")) self.layout.addWidget(QLabel("L: Line length [Km]")) self.layout.addWidget(self.l_spinner) self.layout.addWidget( QLabel("Imax: Max. current [KA] @" + str(int(Vf)) + " [KV]")) self.layout.addWidget(self.i_spinner) self.layout.addWidget(QLabel("R: Resistance [Ohm/Km]")) self.layout.addWidget(self.r_spinner) self.layout.addWidget(QLabel("X: Inductance [Ohm/Km]")) self.layout.addWidget(self.x_spinner) self.layout.addWidget(QLabel("B: Susceptance [S/Km]")) self.layout.addWidget(self.b_spinner) self.layout.addWidget(self.accept_btn) self.setLayout(self.layout) self.setWindowTitle('Line editor')
def display_profiles(self): # set the loaded data_frame to the GUI model = PandasModel(self.original_data_frame) self.ui.tableView.setModel(model) self.ui.sources_list.setModel(get_list_model(self.profile_names))
def __init__(self, branch: Transformer2W, Sbase=100, modify_on_accept=True, templates=None, current_template=None): """ Transformer :param branch: :param Sbase: """ super(TransformerEditor, self).__init__() # keep pointer to the line object self.transformer_obj = branch self.Sbase = Sbase self.modify_on_accept = modify_on_accept self.templates = self.filter_valid_templates(templates) self.current_template = current_template self.selected_template = None self.setObjectName("self") self.setContextMenuPolicy(Qt.NoContextMenu) self.layout = QVBoxLayout(self) # ------------------------------------------------------------------------------------------ # Set the object values # ------------------------------------------------------------------------------------------ self.Vf = self.transformer_obj.bus_from.Vnom self.Vt = self.transformer_obj.bus_to.Vnom # Change the impedances to the system base base_change = Sbase / self.transformer_obj.rate R = self.transformer_obj.R / base_change X = self.transformer_obj.X / base_change G = self.transformer_obj.G / base_change B = self.transformer_obj.B / base_change Sn = self.transformer_obj.rate zsc = np.sqrt(R * R + X * X) Vsc = 100.0 * zsc Pcu = R * Sn * 1000.0 if abs(G) > 0.0 and abs(B) > 0.0: zl = 1.0 / complex(G, B) rfe = zl.real xm = zl.imag Pfe = 1000.0 * Sn / rfe k = 1 / (rfe * rfe) + 1 / (xm * xm) I0 = 100.0 * np.sqrt(k) else: Pfe = 0 I0 = 0 # ------------------------------------------------------------------------------------------ # catalogue self.catalogue_combo = QComboBox() if templates is not None: if len(self.templates) > 0: self.catalogue_combo.setModel(get_list_model(self.templates)) if self.current_template is not None: try: idx = self.templates.index(self.current_template) self.catalogue_combo.setCurrentIndex(idx) # set the template parameters Sn = self.current_template.rating # MVA Pcu = self.current_template.Pcu # kW Pfe = self.current_template.Pfe # kW I0 = self.current_template.I0 # % Vsc = self.current_template.Vsc # % except: pass # load template self.load_template_btn = QPushButton() self.load_template_btn.setText('Load template values') self.load_template_btn.clicked.connect(self.load_template_btn_click) # Sn self.sn_spinner = QDoubleSpinBox() self.sn_spinner.setMinimum(0) self.sn_spinner.setMaximum(9999999) self.sn_spinner.setDecimals(6) self.sn_spinner.setValue(Sn) # Pcu self.pcu_spinner = QDoubleSpinBox() self.pcu_spinner.setMinimum(0) self.pcu_spinner.setMaximum(9999999) self.pcu_spinner.setDecimals(6) self.pcu_spinner.setValue(Pcu) # Pfe self.pfe_spinner = QDoubleSpinBox() self.pfe_spinner.setMinimum(0) self.pfe_spinner.setMaximum(9999999) self.pfe_spinner.setDecimals(6) self.pfe_spinner.setValue(Pfe) # I0 self.I0_spinner = QDoubleSpinBox() self.I0_spinner.setMinimum(0) self.I0_spinner.setMaximum(9999999) self.I0_spinner.setDecimals(6) self.I0_spinner.setValue(I0) # Vsc self.vsc_spinner = QDoubleSpinBox() self.vsc_spinner.setMinimum(0) self.vsc_spinner.setMaximum(9999999) self.vsc_spinner.setDecimals(6) self.vsc_spinner.setValue(Vsc) # accept button self.accept_btn = QPushButton() self.accept_btn.setText('Accept') self.accept_btn.clicked.connect(self.accept_click) # labels # add all to the GUI # add all to the GUI if templates is not None: self.layout.addWidget(QLabel("Available templates")) self.layout.addWidget(self.catalogue_combo) self.layout.addWidget(self.load_template_btn) self.layout.addWidget(QLabel("")) self.layout.addWidget(QLabel("Sn: Nominal power [MVA]")) self.layout.addWidget(self.sn_spinner) self.layout.addWidget(QLabel("Pcu: Copper losses [kW]")) self.layout.addWidget(self.pcu_spinner) self.layout.addWidget(QLabel("Pfe: Iron losses [kW]")) self.layout.addWidget(self.pfe_spinner) self.layout.addWidget(QLabel("I0: No load current [%]")) self.layout.addWidget(self.I0_spinner) self.layout.addWidget(QLabel("Vsc: Short circuit voltage [%]")) self.layout.addWidget(self.vsc_spinner) self.layout.addWidget(self.accept_btn) self.setLayout(self.layout) self.setWindowTitle('Transformer editor')
def __init__(self, parent=None, list_of_objects=None, magnitudes=[''], use_native_dialogues=True): """ Args: parent: list_of_objects: List of objects to which set a profile to magnitudes: Property of the objects to which set the pandas DataFrame list_of_objects: list ob object to modify use_native_dialogues: use the native file selection dialogues? """ QtWidgets.QDialog.__init__(self, parent) if list_of_objects is None: list_of_objects = list() self.ui = Ui_Dialog() self.ui.setupUi(self) self.setWindowTitle('Profiles import dialogue') self.project_directory = None self.magnitudes = magnitudes self.use_native_dialogues = use_native_dialogues # results self.data = None self.time = None self.zeroed = None self.normalized = False # units self.units = dict() self.units['Y'] = 1e24 self.units['Z'] = 1e21 self.units['E'] = 1e18 self.units['P'] = 1e15 self.units['T'] = 1e12 self.units['G'] = 1e9 self.units['M'] = 1e6 self.units['k'] = 1e3 self.units['-'] = 1.0 self.units['m'] = 1e-3 self.units['µ'] = 1e-6 self.units['n'] = 1e-9 self.units['p'] = 1e-12 self.units['f'] = 1e-15 self.units['a'] = 1e-18 self.units['z'] = 1e-21 self.units['y'] = 1e-24 relevant_units = ['T', 'G', 'M', 'k', '-', 'm'] self.ui.units_combobox.addItems(relevant_units) self.ui.units_combobox.setCurrentIndex(2) # setup the plot widget self.ui.plotwidget.canvas.ax.clear() self.ui.plotwidget.canvas.draw() # initialize the objectives list self.objects = list_of_objects # initialize associations self.also_reactive_power = False self.associations = Associations() for elm in list_of_objects: self.associations.append(Association(elm.name, elm.code)) self.display_associations() self.ui.splitter.setStretchFactor(0, 3) self.ui.splitter.setStretchFactor(1, 7) # set name transformations self.transformations = { StringSubstitutions.PSSeBranchName.value: StringSubstitutions.PSSeBranchName, StringSubstitutions.PSSeBusGenerator.value: StringSubstitutions.PSSeBusGenerator, StringSubstitutions.PSSeBusLoad.value: StringSubstitutions.PSSeBusLoad } self.ui.nameTransformationComboBox.setModel( get_list_model(list(self.transformations.keys()))) self.original_data_frame = None self.profile_names = list() # click self.ui.open_button.clicked.connect(self.import_profile) self.ui.set_multiplier_button.clicked.connect( lambda: self.set_multiplier(MultiplierType.Mult)) self.ui.autolink_button.clicked.connect(self.auto_link) self.ui.rnd_link_pushButton.clicked.connect(self.rnd_link) self.ui.assign_to_selection_pushButton.clicked.connect( self.link_to_selection) self.ui.assign_to_all_pushButton.clicked.connect(self.link_to_all) self.ui.doit_button.clicked.connect(self.do_it) self.ui.clear_selection_button.clicked.connect(self.clear_selection) self.ui.transformNamesPushButton.clicked.connect(self.transform_names) # double click self.ui.sources_list.doubleClicked.connect( self.sources_list_double_click) self.ui.assignation_table.doubleClicked.connect( self.assignation_table_double_click) self.ui.tableView.doubleClicked.connect(self.print_profile)