class Entrada_Datos(QtWidgets.QDialog): """Table data input dialog""" def __init__(self, data=None, t=[], property=[], horizontalHeader=[], title="", help=False, helpFile="", DIPPR=False, tc=0, tcValue=None, eq=1, parent=None): """ title: window title data: mrray with original data t: values for x column, generally temperature property: values for 2...n columns horizontalHeader: List with column title help: boolean to show help button helpFile: Path for help file, file or url DIPPR: boolean to show DIPPR widget tc: boolean to show critical temperature (same DIPPR eq need it) tcValue: value for critical temperature eq: Value for DIPPR equation """ super(Entrada_Datos, self).__init__(parent) self.setWindowTitle(title) self.columnas = len(horizontalHeader) self.horizontalHeader = horizontalHeader self.title = title self.helpFile = helpFile gridLayout = QtWidgets.QGridLayout(self) self.botonAbrir = QtWidgets.QPushButton(QtGui.QIcon(QtGui.QPixmap( os.environ["pychemqt"]+"/images/button/fileOpen.png")), QtWidgets.QApplication.translate("pychemqt", "Open")) self.botonAbrir.clicked.connect(self.Abrir) gridLayout.addWidget(self.botonAbrir, 1, 1) self.botonGuardar = QtWidgets.QPushButton(QtGui.QIcon(QtGui.QPixmap( os.environ["pychemqt"]+"/images/button/fileSave.png")), QtWidgets.QApplication.translate("pychemqt", "Save")) self.botonGuardar.clicked.connect(self.Guardar) gridLayout.addWidget(self.botonGuardar, 1, 2) self.botonDelete = QtWidgets.QPushButton(QtGui.QIcon(QtGui.QPixmap( os.environ["pychemqt"]+"/images/button/clear.png")), QtWidgets.QApplication.translate("pychemqt", "Clear")) self.botonDelete.clicked.connect(self.Borrar) gridLayout.addWidget(self.botonDelete, 1, 3) gridLayout.addItem(QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding), 1, 4) self.tabla = Tabla(self.columnas, horizontalHeader=horizontalHeader, verticalHeader=False, stretch=False) self.tabla.setConnected() if data: self.tabla.setMatrix(data) self.tabla.addRow() elif t and property: self.tabla.setColumn(0, t) self.tabla.setColumn(1, property) gridLayout.addWidget(self.tabla, 2, 1, 1, 4) if DIPPR: self.eqDIPPR = eqDIPPR(eq) gridLayout.addWidget(self.eqDIPPR, 3, 1, 1, 4) self.eqDIPPR.eqDIPPR.valueChanged.connect(self.showTc) if tc: lyt = QtWidgets.QHBoxLayout() self.labelTc = QtWidgets.QLabel("Tc: ", self) lyt.addWidget(self.labelTc) self.tc = Entrada_con_unidades(Temperature, value=tcValue) lyt.addWidget(self.tc) lyt.addItem(QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) gridLayout.addItem(lyt, 4, 1, 1, 4) self.showTc(1) if help: botones = QtWidgets.QDialogButtonBox.Help | \ QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok else: botones = QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok self.boton = QtWidgets.QDialogButtonBox(botones) self.boton.accepted.connect(self.accept) self.boton.rejected.connect(self.reject) self.boton.helpRequested.connect(self.ayuda) gridLayout.addWidget(self.boton, 5, 1, 1, 4) def showTc(self, value): self.labelTc.setVisible(value in (7, 9)) self.tc.setVisible(value in (7, 9)) def Abrir(self): fname = str(QtWidgets.QFileDialog.getOpenFileName( self, QtWidgets[0].QCoreApplication.translate("pychemqt", "Open text file"), "./")) if fname: data = loadtxt(fname) self.tabla.setMatrix(data) self.tabla.addRow() def Guardar(self): fname = str(QtWidgets.QFileDialog.getSaveFileName( self, QtWidgets[0].QCoreApplication.translate("pychemqt", "Save data to file"), "./")) if fname: with open(fname, 'w') as file: file.write("#"+self.title+"\n") file.write("#") try: for i in self.horizontalHeader: file.write(i+"\t") except UnicodeEncodeError: pass file.write("\n") data = self.data for fila in range(len(data)): for columna in range(self.tabla.columnCount()): file.write(str(data[fila][columna])+"\t") file.write("\n") def Borrar(self): """Clear table""" self.tabla.setRowCount(1) self.tabla.clearContents() def ayuda(self): """Show help file""" Dialog = HelpView(self.windowTitle(), QtCore.QUrl(self.helpFile)) Dialog.exec_() @property def data(self): return self.tabla.getMatrix()
class Ui_Saturation(QtWidgets.QDialog): """Dialog to define input for a two-phase saturation table calculation""" def __init__(self, method=None, fluid=None, parent=None): """ Parameters ---------- method: str name of method of calculation, meos, coolprop or refprop fluid: int Index of fluid in list """ super(Ui_Saturation, self).__init__(parent) self.setWindowTitle( QtWidgets.QApplication.translate("pychemqt", "Saturation Table")) layout = QtWidgets.QGridLayout(self) gboxType = QtWidgets.QGroupBox( QtWidgets.QApplication.translate("pychemqt", "Interphase")) layout.addWidget(gboxType, 1, 1, 1, 2) layoutg1 = QtWidgets.QGridLayout(gboxType) self.VL = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Vapor-Liquid (boiling line)")) layoutg1.addWidget(self.VL, 1, 1) self.SL = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Solid-Liquid (melting line")) layoutg1.addWidget(self.SL, 2, 1) self.SV = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Solid-Vapor (Sublimation line)")) layoutg1.addWidget(self.SV, 3, 1) groupboxVariar = QtWidgets.QGroupBox( QtWidgets.QApplication.translate("pychemqt", "Change")) layout.addWidget(groupboxVariar, 1, 3, 1, 2) layoutg2 = QtWidgets.QGridLayout(groupboxVariar) self.VariarTemperatura = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Temperature")) self.VariarTemperatura.toggled.connect(self.updateVar) layoutg2.addWidget(self.VariarTemperatura, 1, 1) self.VariarPresion = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Pressure")) self.VariarPresion.toggled.connect(self.updateVar) layoutg2.addWidget(self.VariarPresion, 2, 1) self.VariarXconT = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Quality at fixed temperature")) self.VariarXconT.toggled.connect(self.updateVar) layoutg2.addWidget(self.VariarXconT, 3, 1) self.VariarXconP = QtWidgets.QRadioButton( QtWidgets.QApplication.translate("pychemqt", "Quality at fixed pressure")) self.VariarXconP.toggled.connect(self.updateVar) layoutg2.addWidget(self.VariarXconP, 4, 1) line = QtWidgets.QFrame() line.setFrameShape(QtWidgets.QFrame.HLine) line.setFrameShadow(QtWidgets.QFrame.Sunken) layout.addWidget(line, 2, 1, 1, 4) self.labelFix = QtWidgets.QLabel() layout.addWidget(self.labelFix, 4, 3) self.variableFix = Entrada_con_unidades(float) layout.addWidget(self.variableFix, 4, 4) self.labelinicial = QtWidgets.QLabel( QtWidgets.QApplication.translate("pychemqt", "Initial")) layout.addWidget(self.labelinicial, 4, 1) self.Inicial = Entrada_con_unidades(float) layout.addWidget(self.Inicial, 4, 2) self.labelfinal = QtWidgets.QLabel( QtWidgets.QApplication.translate("pychemqt", "Final")) layout.addWidget(self.labelfinal, 5, 1) self.Final = Entrada_con_unidades(float) layout.addWidget(self.Final, 5, 2) self.labelincremento = QtWidgets.QLabel( QtWidgets.QApplication.translate("pychemqt", "Increment")) layout.addWidget(self.labelincremento, 6, 1) self.Incremento = Entrada_con_unidades(float) layout.addWidget(self.Incremento, 6, 2) buttonBox = QtWidgets.QDialogButtonBox( QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) layout.addWidget(buttonBox, 10, 1, 1, 4) if method: self.fluido = getClassFluid(method, fluid) if isinstance(self.fluido, meos.MEoS) and (self.fluido._Melting_Pressure != meos.MEoS._Melting_Pressure or self.fluido._melting): self.SL.setEnabled(True) else: self.SL.setEnabled(False) if isinstance(self.fluido, meos.MEoS) and (self.fluido._sublimation or self.fluido._Sublimation_Pressure != meos.MEoS._Sublimation_Pressure): self.SV.setEnabled(True) else: self.SV.setEnabled(False) self.VL.setChecked(True) self.VariarTemperatura.setChecked(True) self.updateVary() self.VL.toggled.connect(self.updateVary) def updateVary(self): """Update state for option to choose for properties to change""" self.VariarXconP.setEnabled(self.VL.isChecked()) self.VariarXconT.setEnabled(self.VL.isChecked()) self.VariarTemperatura.setChecked(not self.VL.isChecked()) def updateVar(self, bool): """Update input values units and text""" if bool: # Select initial values fix, inicial, final, step = 0, 0, 0, 0 if self.VL.isChecked(): if self.sender() == self.VariarXconT: fix = ceil((self.fluido.Tc - self.fluido.Tt) / 2) inicial = 0 final = 1 step = 0.1 elif self.sender() == self.VariarXconP: fix = ceil(self.fluido.Pc / 2) inicial = 0 final = 1 step = 0.1 elif self.sender() == self.VariarTemperatura: inicial = ceil(self.fluido.Tt) final = floor(self.fluido.Tc) step = 1. self.Inicial.deleteLater() self.Final.deleteLater() self.Incremento.deleteLater() if self.sender() == self.VariarXconT: self.labelFix.setVisible(True) self.labelFix.setText(unidades.Temperature.__title__) self.variableFix.deleteLater() self.variableFix = Entrada_con_unidades(unidades.Temperature, value=fix) self.layout().addWidget(self.variableFix, 4, 4) unidadVariable = float self.labelinicial.setText( QtWidgets.QApplication.translate("pychemqt", "Initial quality")) self.labelfinal.setText( QtWidgets.QApplication.translate("pychemqt", "Final quality")) elif self.sender() == self.VariarXconP: self.labelFix.setVisible(True) self.labelFix.setText(unidades.Pressure.__title__) self.variableFix.deleteLater() self.variableFix = Entrada_con_unidades(unidades.Pressure, value=fix) self.layout().addWidget(self.variableFix, 4, 4) unidadVariable = float self.labelinicial.setText( QtWidgets.QApplication.translate("pychemqt", "Initial quality")) self.labelfinal.setText( QtWidgets.QApplication.translate("pychemqt", "Final quality")) elif self.sender() == self.VariarTemperatura: self.labelFix.setVisible(False) self.variableFix.setVisible(False) unidadVariable = unidades.Temperature self.labelinicial.setText( QtWidgets.QApplication.translate("pychemqt", "Initial temperature")) self.labelfinal.setText( QtWidgets.QApplication.translate("pychemqt", "Final temperature")) else: self.labelFix.setVisible(False) self.variableFix.setVisible(False) unidadVariable = unidades.Pressure self.labelinicial.setText( QtWidgets.QApplication.translate("pychemqt", "Initial pressure")) self.labelfinal.setText( QtWidgets.QApplication.translate("pychemqt", "Final pressure")) self.Inicial = Entrada_con_unidades(unidadVariable, value=inicial) self.Final = Entrada_con_unidades(unidadVariable, value=final) if unidadVariable == unidades.Temperature: unidadDelta = unidades.DeltaT elif unidadVariable == unidades.Pressure: unidadDelta = unidades.DeltaP else: unidadDelta = unidadVariable self.Incremento = Entrada_con_unidades(unidadDelta, value=step) self.layout().addWidget(self.Inicial, 4, 2) self.layout().addWidget(self.Final, 5, 2) self.layout().addWidget(self.Incremento, 6, 2)
class Entrada_Datos(QtWidgets.QDialog): """Table data input dialog""" def __init__(self, data=None, t=[], property=[], horizontalHeader=[], title="", help=False, helpFile="", DIPPR=False, tc=0, tcValue=None, eq=1, parent=None): """ title: window title data: mrray with original data t: values for x column, generally temperature property: values for 2...n columns horizontalHeader: List with column title help: boolean to show help button helpFile: Path for help file, file or url DIPPR: boolean to show DIPPR widget tc: boolean to show critical temperature (same DIPPR eq need it) tcValue: value for critical temperature eq: Value for DIPPR equation """ super(Entrada_Datos, self).__init__(parent) self.setWindowTitle(title) self.columnas = len(horizontalHeader) self.horizontalHeader = horizontalHeader self.title = title self.helpFile = helpFile gridLayout = QtWidgets.QGridLayout(self) self.botonAbrir = QtWidgets.QPushButton( QtGui.QIcon( QtGui.QPixmap(os.environ["pychemqt"] + "/images/button/fileOpen.png")), QtWidgets.QApplication.translate("pychemqt", "Open")) self.botonAbrir.clicked.connect(self.Abrir) gridLayout.addWidget(self.botonAbrir, 1, 1) self.botonGuardar = QtWidgets.QPushButton( QtGui.QIcon( QtGui.QPixmap(os.environ["pychemqt"] + "/images/button/fileSave.png")), QtWidgets.QApplication.translate("pychemqt", "Save")) self.botonGuardar.clicked.connect(self.Guardar) gridLayout.addWidget(self.botonGuardar, 1, 2) self.botonDelete = QtWidgets.QPushButton( QtGui.QIcon( QtGui.QPixmap(os.environ["pychemqt"] + "/images/button/clear.png")), QtWidgets.QApplication.translate("pychemqt", "Clear")) self.botonDelete.clicked.connect(self.Borrar) gridLayout.addWidget(self.botonDelete, 1, 3) gridLayout.addItem( QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding), 1, 4) self.tabla = Tabla(self.columnas, horizontalHeader=horizontalHeader, verticalHeader=False, stretch=False) self.tabla.setConnected() if data: self.tabla.setData(data) self.tabla.addRow() elif t and property: self.tabla.setColumn(0, t) self.tabla.setColumn(1, property) gridLayout.addWidget(self.tabla, 2, 1, 1, 4) if DIPPR: self.eqDIPPR = eqDIPPR(eq) gridLayout.addWidget(self.eqDIPPR, 3, 1, 1, 4) self.eqDIPPR.eqDIPPR.valueChanged.connect(self.showTc) if tc: lyt = QtWidgets.QHBoxLayout() self.labelTc = QtWidgets.QLabel("Tc: ", self) lyt.addWidget(self.labelTc) self.tc = Entrada_con_unidades(Temperature, value=tcValue) lyt.addWidget(self.tc) lyt.addItem( QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) gridLayout.addItem(lyt, 4, 1, 1, 4) self.showTc(1) if help: botones = QtWidgets.QDialogButtonBox.Help | \ QtWidgets.QDialogButtonBox.Cancel | \ QtWidgets.QDialogButtonBox.Ok else: botones = QtWidgets.QDialogButtonBox.Cancel | \ QtWidgets.QDialogButtonBox.Ok self.boton = QtWidgets.QDialogButtonBox(botones) self.boton.accepted.connect(self.accept) self.boton.rejected.connect(self.reject) self.boton.helpRequested.connect(self.ayuda) gridLayout.addWidget(self.boton, 5, 1, 1, 4) def showTc(self, value): self.labelTc.setVisible(value in (7, 9)) self.tc.setVisible(value in (7, 9)) def Abrir(self): fname = QtWidgets.QFileDialog.getOpenFileName( self, QtWidgets.QApplication.translate("pychemqt", "Open text file"), "./") if fname: data = loadtxt(fname) self.tabla.setData(data) self.tabla.addRow() def Guardar(self): fname = QtWidgets.QFileDialog.getSaveFileName( self, QtWidgets.QApplication.translate("pychemqt", "Save data to file"), "./") if fname: with open(fname, 'w') as file: file.write("#" + self.title + "\n") file.write("#") try: for i in self.horizontalHeader: file.write(i + "\t") except UnicodeEncodeError: pass file.write("\n") data = self.data for fila in range(len(data)): for columna in range(self.tabla.columnCount()): file.write(str(data[fila][columna]) + "\t") file.write("\n") def Borrar(self): """Clear table""" self.tabla.setRowCount(1) self.tabla.clearContents() def ayuda(self): """Show help file""" url = QtCore.QUrl(self.helpFile) QtGui.QDesktopServices.openUrl(url) @property def data(self): return self.tabla.getData()
class InputTableWidget(QtWidgets.QWidget): """Table data input dialog""" def __init__(self, columnas, data=None, t=[], property=[], horizontalHeader=[], title="", DIPPR=False, hasTc=0, Tc=None, eq=1, unit=[], parent=None): """ data: mrray with original data t: values for x column, generally temperature property: values for 2...n columns horizontalHeader: List with column title DIPPR: boolean to show DIPPR widget hasTc: boolean to show critical temperature (some DIPPR eq need it) Tc: value for critical temperature eq: Value for DIPPR equation unit: List of unidades classes for column definition """ super(InputTableWidget, self).__init__(parent) self.columnas = columnas self.title = title self.unit = unit gridLayout = QtWidgets.QGridLayout(self) gridLayout.setContentsMargins(0, 0, 0, 0) openButton = QtWidgets.QPushButton(QtGui.QIcon(QtGui.QPixmap( os.environ["pychemqt"]+"/images/button/fileOpen.png")), "") openButton.setToolTip(QtWidgets.QApplication.translate( "pychemqt", "Load data from a file")) openButton.clicked.connect(self.open) gridLayout.addWidget(openButton, 1, 1) saveButton = QtWidgets.QPushButton(QtGui.QIcon(QtGui.QPixmap( os.environ["pychemqt"]+"/images/button/fileSave.png")), "") saveButton.setToolTip(QtWidgets.QApplication.translate( "pychemqt", "Save data to a file")) saveButton.clicked.connect(self.save) gridLayout.addWidget(saveButton, 1, 2) clearButton = QtWidgets.QPushButton(QtGui.QIcon(QtGui.QPixmap( os.environ["pychemqt"]+"/images/button/clear.png")), "") clearButton.setToolTip(QtWidgets.QApplication.translate( "pychemqt", "Clear data")) clearButton.clicked.connect(self.delete) gridLayout.addWidget(clearButton, 1, 3) gridLayout.addItem(QtWidgets.QSpacerItem( 0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed), 1, 4) self.tabla = Tabla(self.columnas, horizontalHeader=horizontalHeader, verticalHeader=False, stretch=False) self.tabla.setConnected() if unit: hHeader = [] for unit, title in zip(self.unit, horizontalHeader): hHeader.append("%s, %s" % (title, unit.text())) self.tabla.setHorizontalHeaderLabels(hHeader) self.tabla.horizontalHeader().sectionClicked.connect(self.editUnit) if data: self.tabla.setData(data) self.tabla.addRow() elif t and property: self.tabla.setColumn(0, t) self.tabla.setColumn(1, property) gridLayout.addWidget(self.tabla, 2, 1, 1, 4) if DIPPR: self.eqDIPPR = eqDIPPR(eq) gridLayout.addWidget(self.eqDIPPR, 3, 1, 1, 4) self.eqDIPPR.eqDIPPR.valueChanged.connect(self.showTc) self.labelTc = QtWidgets.QLabel("Tc: ", self) gridLayout.addWidget(self.labelTc, 4, 1) self.tc = Entrada_con_unidades(Temperature, value=Tc) gridLayout.addWidget(self.tc, 4, 2, 1, 3) self.showTc(1) def showTc(self, value): """Show/hide Tc widget""" self.labelTc.setVisible(value in (7, 9)) self.tc.setVisible(value in (7, 9)) def open(self): """Load data from a test file""" fname, ext = QtWidgets.QFileDialog.getOpenFileName( self, QtWidgets.QApplication.translate("pychemqt", "Open text file"), "./") if fname: try: # Numpy raise error if use the fname directly and find a # non-latin1 character, inclusive in comment lines with open(fname, "rb") as file: data = loadtxt(file) self.delete() self.tabla.setData(data) except ValueError as er: # Raise a error msg if the file can load by loadtxt, the user # can select any type of file and the input error is possible title = QtWidgets.QApplication.translate( "pychemqt", "Failed to load file") msg = fname + "\n" + er.args[0] QtWidgets.QMessageBox.critical(self, title, msg) def save(self): """Save currend data of table to a file""" fname, ext = QtWidgets.QFileDialog.getSaveFileName( self, QtWidgets.QApplication.translate("pychemqt", "Save data to file"), "./") if fname: with open(fname, 'w') as file: file.write("#"+self.title+"\n") file.write("#") for i in range(self.tabla.columnCount()): item = self.tabla.horizontalHeaderItem(i) file.write(item.text()+"\t") file.write("\n") data = self.data for fila in range(len(data)): for columna in range(self.tabla.columnCount()): file.write(str(data[fila][columna])+"\t") file.write("\n") def delete(self): """Clear table""" self.tabla.setRowCount(0) self.tabla.clearContents() self.tabla.addRow() @property def data(self): return self.tabla.getData() def column(self, column, magnitud=None, unit="conf"): """ column: column to get magnitud: magnitud to get the values unit: unit of the values in table""" data = self.tabla.getColumn(column) if self.unit: magnitud = self.unit[column] tx = self.tabla.horizontalHeaderItem(column).text().split(", ")[-1] unit = magnitud.__units__[magnitud.__text__.index(tx)] if magnitud is not None: data = [magnitud(x, unit) for x in data] return data def editUnit(self, col): """Show dialog to config input unit""" unit = self.unit[col] widget = QtWidgets.QComboBox(self.tabla) for txt in unit.__text__: widget.addItem(txt) txt = self.tabla.horizontalHeaderItem(col).text().split(", ")[-1] widget.setCurrentText(txt) # Define Unit combobox geometry size = self.tabla.horizontalHeader().sectionSize(col) pos = self.tabla.horizontalHeader().sectionPosition(col) h = self.tabla.horizontalHeader().height() geometry = QtCore.QRect(pos, 0, size, h) widget.setGeometry(geometry) widget.currentIndexChanged["int"].connect( partial(self.updateHeader, col)) widget.show() widget.showPopup() def updateHeader(self, col, index): """Change the text in header""" widget = self.sender() txt = self.tabla.horizontalHeaderItem(col).text() newtxt = "%s, %s" % (txt.split(",")[0], widget.currentText()) self.tabla.setHorizontalHeaderItem( col, QtWidgets.QTableWidgetItem(newtxt)) widget.close()