diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | Bin_Phase_env.py | 73 | ||||
m--------- | Chemical-Simulator-GUI | 6 | ||||
-rw-r--r-- | ComponentSelector.py (renamed from component_selector.py) | 89 | ||||
-rw-r--r-- | ComponentSelector.ui (renamed from comp_selector.ui) | 15 | ||||
-rw-r--r-- | Container.py (renamed from container.py) | 167 | ||||
-rw-r--r-- | DockWidgets/DockWidget.py (renamed from dockWidget.py) | 152 | ||||
-rw-r--r-- | DockWidgets/DockWidget.txt | 636 | ||||
-rw-r--r-- | DockWidgets/DockWidget.ui (renamed from dockWidget.ui) | 5 | ||||
-rw-r--r-- | DockWidgets/DockWidgetCompoundSeparator.py | 99 | ||||
-rw-r--r-- | DockWidgets/DockWidgetCompoundSeparator.ui | 45 | ||||
-rw-r--r-- | DockWidgets/DockWidgetDistillationColumn.py | 120 | ||||
-rw-r--r-- | DockWidgets/DockWidgetDistillationColumn.ui | 270 | ||||
-rw-r--r-- | DockWidgets/DockWidgetFlash.py | 74 | ||||
-rw-r--r-- | DockWidgets/DockWidgetFlash.ui | 161 | ||||
-rw-r--r-- | DockWidgets/DockWidgetMaterialStream.py (renamed from DockWidgetMatStm.py) | 108 | ||||
-rw-r--r-- | DockWidgets/DockWidgetMaterialStream.ui (renamed from DockWidgetMatStm.ui) | 0 | ||||
-rw-r--r-- | DockWidgets/DockWidgetMixer.py | 61 | ||||
-rw-r--r-- | DockWidgets/DockWidgetMixer.ui | 137 | ||||
-rw-r--r-- | DockWidgets/DockWidgetShortcutColumn.py | 97 | ||||
-rw-r--r-- | DockWidgets/DockWidgetShortcutColumn.ui | 295 | ||||
-rw-r--r-- | DockWidgets/DockWidgetSplitter.py | 78 | ||||
-rw-r--r-- | DockWidgets/DockWidgetSplitter.ui | 200 | ||||
-rw-r--r-- | DockWidgets/__pycache__/DockWidget.cpython-36.pyc | bin | 0 -> 6111 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidget.cpython-37.pyc | bin | 0 -> 6125 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc | bin | 0 -> 3163 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc | bin | 0 -> 3187 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc | bin | 0 -> 4180 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc | bin | 0 -> 4204 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc | bin | 0 -> 2889 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc | bin | 0 -> 2913 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc | bin | 0 -> 8766 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc | bin | 0 -> 8757 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc | bin | 0 -> 2206 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc | bin | 0 -> 2233 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc | bin | 0 -> 3358 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc | bin | 0 -> 3382 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc | bin | 0 -> 2740 bytes | |||
-rw-r--r-- | DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc | bin | 0 -> 2764 bytes | |||
-rw-r--r-- | Graphics.py | 437 | ||||
-rw-r--r-- | OMChem/ConvReactor.py | 4 | ||||
-rw-r--r-- | OMChem/Flowsheet.py | 108 | ||||
-rw-r--r-- | Simulator/Databases/Databases.py | 29 | ||||
-rw-r--r-- | Simulator/Simulator/UnitOperations/Mixer.mo | 32 | ||||
-rw-r--r-- | Streams.py | 498 | ||||
-rw-r--r-- | Undo.dat | bin | 39600 -> 64582 bytes | |||
-rw-r--r-- | UnitOperations.py | 401 | ||||
-rw-r--r-- | class_diagram.pdf | bin | 0 -> 12397 bytes | |||
-rw-r--r-- | icon/AdiabaticCompressor.png | bin | 0 -> 643 bytes | |||
-rw-r--r-- | icon/AdiabaticExpander.png | bin | 0 -> 565 bytes | |||
-rw-r--r-- | icon/CompoundSeparator.png (renamed from icons/CompSep.png) | bin | 1521 -> 1521 bytes | |||
-rw-r--r-- | icon/Cooler.png | bin | 0 -> 2334 bytes | |||
-rw-r--r-- | icon/DistillationColumn.png (renamed from icons/DistCol.png) | bin | 6006 -> 6006 bytes | |||
-rw-r--r-- | icon/Equation.png (renamed from icons/Equation.png) | bin | 3889 -> 3889 bytes | |||
-rw-r--r-- | icon/Flash.png | bin | 0 -> 2079 bytes | |||
-rw-r--r-- | icon/Heater.png | bin | 0 -> 2088 bytes | |||
-rw-r--r-- | icon/MaterialStream.png | bin | 0 -> 452 bytes | |||
-rw-r--r-- | icon/Mixer.png | bin | 0 -> 911 bytes | |||
-rw-r--r-- | icon/Pump.png | bin | 0 -> 1348 bytes | |||
-rw-r--r-- | icon/Sequential.png (renamed from icons/Sequential.png) | bin | 5827 -> 5827 bytes | |||
-rw-r--r-- | icon/ShortcutColumn.png (renamed from icons/ShortCol.png) | bin | 6006 -> 6006 bytes | |||
-rw-r--r-- | icon/Splitter.png | bin | 0 -> 937 bytes | |||
-rw-r--r-- | icon/Valve.png | bin | 0 -> 1195 bytes | |||
-rw-r--r-- | icon/compoundSelector.png (renamed from icons/compoundSelector.png) | bin | 1249 -> 1249 bytes | |||
-rw-r--r-- | icon/icon_1.svg | 732 | ||||
-rw-r--r-- | icon/logo.png | bin | 0 -> 9457 bytes | |||
-rw-r--r-- | icon/new.svg (renamed from icons/new.svg) | 0 | ||||
-rw-r--r-- | icon/package-icon.svg (renamed from icons/package-icon.svg) | 0 | ||||
-rw-r--r-- | icon/plus.png (renamed from icons/plus.png) | bin | 3337 -> 3337 bytes | |||
-rw-r--r-- | icon/zoomIn.png (renamed from icons/zoomIn.png) | bin | 32456 -> 32456 bytes | |||
-rw-r--r-- | icon/zoomOut.png (renamed from icons/zoomOut.png) | bin | 31836 -> 31836 bytes | |||
-rw-r--r-- | icon/zoomReset.png (renamed from icons/zoomReset.png) | bin | 48307 -> 48307 bytes | |||
-rw-r--r-- | icons/AdiabaticCompressor.png | bin | 643 -> 740 bytes | |||
-rw-r--r-- | icons/AdiabaticExpander.png | bin | 565 -> 741 bytes | |||
-rw-r--r-- | icons/Column.png | bin | 0 -> 4681 bytes | |||
-rw-r--r-- | icons/CompoundSeparator.png | bin | 0 -> 1708 bytes | |||
-rw-r--r-- | icons/Cooler.png | bin | 2334 -> 3042 bytes | |||
-rw-r--r-- | icons/DistillationColumn.png | bin | 0 -> 4361 bytes | |||
-rw-r--r-- | icons/Flash.png | bin | 2079 -> 2431 bytes | |||
-rw-r--r-- | icons/Heater.png | bin | 2088 -> 2750 bytes | |||
-rw-r--r-- | icons/MaterialStream.png | bin | 452 -> 527 bytes | |||
-rw-r--r-- | icons/Mixer.png | bin | 911 -> 1008 bytes | |||
-rw-r--r-- | icons/Pump.png | bin | 1348 -> 1620 bytes | |||
-rw-r--r-- | icons/ShortcutColumn.png | bin | 0 -> 4361 bytes | |||
-rw-r--r-- | icons/Splitter.png | bin | 937 -> 1068 bytes | |||
-rw-r--r-- | icons/Valve.png | bin | 1195 -> 1498 bytes | |||
-rw-r--r-- | icons/compound.png | bin | 0 -> 4849 bytes | |||
-rw-r--r-- | icons/eq.png | bin | 0 -> 5162 bytes | |||
-rw-r--r-- | icons/icon_1.svg | 868 | ||||
-rw-r--r-- | icons/images.png | bin | 0 -> 2938 bytes | |||
-rw-r--r-- | icons/logo.png | bin | 9457 -> 1391 bytes | |||
-rw-r--r-- | icons/new.png | bin | 0 -> 2812 bytes | |||
-rw-r--r-- | icons/sq.png | bin | 0 -> 8725 bytes | |||
-rw-r--r-- | icons/zoo.png | bin | 0 -> 6707 bytes | |||
-rw-r--r-- | icons/zoom_in.png | bin | 0 -> 4908 bytes | |||
-rw-r--r-- | icons/zoom_out.png | bin | 0 -> 4865 bytes | |||
-rw-r--r-- | icons/zoom_reset.png | bin | 0 -> 5052 bytes | |||
-rw-r--r-- | main.ui | 1072 | ||||
-rw-r--r-- | mainApp.py | 207 | ||||
-rw-r--r-- | resDockWidget.py | 92 | ||||
-rw-r--r-- | svg/Centrifugal Pump.svg | 104 | ||||
-rw-r--r-- | svg/Cooler.svg | 84 | ||||
-rw-r--r-- | svg/Heater.svg | 101 | ||||
-rw-r--r-- | svg/Pump.svg | 86 | ||||
-rw-r--r-- | umlet.uxf | 1497 |
105 files changed, 7841 insertions, 1403 deletions
@@ -8,4 +8,6 @@ Simulator/PlotGraph.mos Simulator/simulateEQN.mos .vscode/settings.json __pycache__/* -.idea/*
\ No newline at end of file +.idea/* +DockWidgets/__pycache__/* +undo.dat
\ No newline at end of file diff --git a/Bin_Phase_env.py b/Bin_Phase_env.py index a02c0e2..a63ba1c 100644 --- a/Bin_Phase_env.py +++ b/Bin_Phase_env.py @@ -17,17 +17,15 @@ import PyQt5.QtWidgets as QtWidgets import pyqtgraph as pg import pyqtgraph.exporters - - ui_dialog,_ = loadUiType('Binary_Phase_Env.ui') -class Bin_Phase_env(QWidget,ui_dialog): +class BinPhaseEnv(QWidget,ui_dialog): def __init__(self,comp): QWidget.__init__(self) self.setupUi(self) self.comp = comp - self.compunds = self.comp.getComp() + self.compunds = self.comp.get_compounds() for i in self.compunds: self.comboBox.addItem(str(i)) @@ -46,18 +44,12 @@ class Bin_Phase_env(QWidget,ui_dialog): self.radioButton_2.setChecked(False) self.button_handler() - self.counter = 1 - - - - def button_handler(self): self.radioButton.clicked.connect(lambda:self.T_xy()) self.radioButton_2.clicked.connect(lambda:self.P_xy()) self.pushButton_2.clicked.connect(lambda:self.plot()) - def T_xy(self): self.radioButton.setChecked(True) @@ -90,6 +82,7 @@ class Bin_Phase_env(QWidget,ui_dialog): self.formLayout.addRow(QLabel("T(K)"),self.first) self.formLayout.addRow(QLabel("Number of data points"),self.points) #print("") + def get_omc_path(self): try: self.omhome = os.environ.get('OPENMODELICAHOME') @@ -104,8 +97,6 @@ class Bin_Phase_env(QWidget,ui_dialog): print("The OpenModelica compiler is missing in the System path please install it" ) raise - - def plot(self): #print(self.type) @@ -153,10 +144,8 @@ class Bin_Phase_env(QWidget,ui_dialog): mosFile.write("loadFile(\"Graph.mo\");\n") mosFile.write("simulate(Graph, outputFormat=\"csv\", stopTime=1.0, numberOfIntervals=1);\n") - print(self.data) - self.resdata = [] self.omc_path = self.get_omc_path() simpath = self.plot_mos_path @@ -185,34 +174,24 @@ class Bin_Phase_env(QWidget,ui_dialog): print("SIMULATION DONE") - - - - if self.type=='T': for k in range(len(self.rows[0])): if self.rows[0][k][0]=='P': self.datay.append(float(self.rows[1][k])) #print(col) length = len(self.rows[0][k]) - if self.rows[0][k][0]=='x' and self.rows[0][k][length-2]=='1': self.datax1.append(float(self.rows[1][k])) # k+=1 - if self.rows[0][k][0]=='y' and self.rows[0][k][length-2]=='1': self.datax2.append(float(self.rows[1][k])) #k+=1 - #k+=1 - - else: - + else: for k in range(len(self.rows[0])): if self.rows[0][k][0]=='T': self.datay.append(float(self.rows[1][k])) #print(col) - #print(self.rows[0][k]) length = len(self.rows[0][k]) if self.rows[0][k][0]=='x' and self.rows[0][k][length-2]=='1': @@ -229,28 +208,20 @@ class Bin_Phase_env(QWidget,ui_dialog): plt.addLegend() plt.setXRange(0,1) - # print("SIZE UP AHEAD") # print(len(self.datay)) # print(len(self.datax1)) # print(len(self.datax2)) # print("SIZES DONE") - c1 = plt.plot(self.datax1, self.datay,pen=pg.mkPen('b',width = 1), name='dew points') c2 = plt.plot(self.datax2, self.datay,pen=pg.mkPen('r',width = 1), name='bubble points') - - view_box = plt.plotItem.vb - self.tool_tip = "" - - def pressEvent(evt): + def press_event(evt): #print("HELLO") a = 10 pos = evt - - mousepoint = view_box.mapSceneToView(pos) roi = pg.ROI(pos) find_color = plt.mapToGlobal(pos.toPoint()) @@ -270,9 +241,7 @@ class Bin_Phase_env(QWidget,ui_dialog): self.lineEdit_y.setText("") self.tool_tip = "" QApplication.setOverrideCursor(QCursor(QtCore.Qt.ArrowCursor)) - - - + #self.prev = None def entered(items): for i in items: @@ -283,20 +252,13 @@ class Bin_Phase_env(QWidget,ui_dialog): QApplication.setOverrideCursor(QCursor(QtCore.Qt.ArrowCursor)) else: i.setToolTip(self.tool_tip) - - - # print(items) - - #proxy = pg.SignalProxy(plt.scene().sigMouseMoved, rateLimit = 60, slot = pressEvent) - plt.scene().sigMouseMoved.connect(pressEvent) + # print(items) + #proxy = pg.SignalProxy(plt.scene().sigMouseMoved, rateLimit = 60, slot = press_event) + plt.scene().sigMouseMoved.connect(press_event) plt.scene().sigMouseHover.connect(entered) #c1.setAcceptHoverEvents(True) #c2.setAcceptHoverEvents(True) - - - - # def hoverEnterEvent(c1,event): # print("Object ZONE") @@ -306,7 +268,6 @@ class Bin_Phase_env(QWidget,ui_dialog): #c1.hoverMoveEvent.connect(item) #c2.hoverMoveEvent.connect(item) - plt.setLabel('left',self.other+self.otherunit,units = '') plt.setLabel('bottom',self.comp1+'(mol. frac.)',units = '') @@ -315,19 +276,3 @@ class Bin_Phase_env(QWidget,ui_dialog): self.tabWidget.addTab(self.new_tab,"Plot "+str(self.counter)) self.counter+=1 - - - - - - - - - - - - - - - - diff --git a/Chemical-Simulator-GUI b/Chemical-Simulator-GUI deleted file mode 160000 -Subproject 79c81eaa67a545db570c083c3852e09b26e5bf8 diff --git a/component_selector.py b/ComponentSelector.py index 600b5f2..64ca167 100644 --- a/component_selector.py +++ b/ComponentSelector.py @@ -4,29 +4,27 @@ from PyQt5.QtGui import * from PyQt5.uic import loadUiType import pandas as pd from Simulator.Databases.Databases import ChemsepDatabase -ui_dialog,_ = loadUiType('comp_selector.ui') +ui_dialog,_ = loadUiType('ComponentSelector.ui') #df = pd.read_csv("compoundsDatabase.csv") compound_selected = [] #list storing components that are selected inintialised as empty -class componentSelector(QDialog,ui_dialog): - def __init__(self,parent=None): - #super(componentSelector,self).__init__(parent) - +class ComponentSelector(QDialog,ui_dialog): + def __init__(self,parent=None): QDialog.__init__(self,parent) self.setupUi(self) - self.Dict1=dict()#empty dictionary which will store the obj and its compound + self.dict1=dict()#empty dictionary which will store the obj and its compound #self.DB1=#instance of Database class in Database.py module self.instance=[ChemsepDatabase()] #list of all the instances self.lines=[] for i in self.instance: x=i.get_comp_name_list() - self.Dict1[i]=x + self.dict1[i]=x self.lines+=x print(self.lines) @@ -34,7 +32,7 @@ class componentSelector(QDialog,ui_dialog): #self.DB1_list=self.DB1.get_comp_name_list() #storingchemsep #database compound list in DB1_list - #self.Dict1[self.DB1]=self.DB1_list #storing the list as a value and the db as key in dictionary + #self.dict1[self.DB1]=self.DB1_list #storing the list as a value and the db as key in dictionary #self.lines=self.DB1_list #combined list of all the edited compounds self.model = QStringListModel() @@ -43,15 +41,15 @@ class componentSelector(QDialog,ui_dialog): self.completer = QCompleter() self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setModel(self.model) + #QCompleter completes the text written in lineedit self.lineEdit.setCompleter(self.completer) - self.compoundSelectButton.clicked.connect(self.compoundSelection) + self.compoundSelectButton.clicked.connect(self.compound_selection) self.compoundSelectButton.setAutoDefault(False) self.pushButton.clicked.connect(self.accept) self.pushButton_2.clicked.connect(self.cancel) - self.pushButton_3.clicked.connect(self.removeItems) - + self.pushButton_3.clicked.connect(self.remove_items) def final_list(self,*list_name): self.list_final=[] @@ -60,7 +58,7 @@ class componentSelector(QDialog,ui_dialog): self.list_final+=i return (self.list_final) - def isCompSelected(self): + def is_compound_selected(self): if not compound_selected: return False else: @@ -76,8 +74,8 @@ class componentSelector(QDialog,ui_dialog): #of the corresponding database def get_object(self,component): - for ele in self.Dict1: - values=self.Dict1[ele] + for ele in self.dict1: + values=self.dict1[ele] for ind in values: if ind ==component: return(ele) @@ -88,10 +86,7 @@ class componentSelector(QDialog,ui_dialog): self.temp_comp= component.replace(removing_attrib,'') return(self.temp_comp) - - - def compoundSelection(self): - + def compound_selection(self): self.comp = self.lineEdit.text() #gets entered text if self.comp in self.lines: #matches with the db self.obj=self.get_object(self.comp) #obj will store the key of the dictionary @@ -110,49 +105,52 @@ class componentSelector(QDialog,ui_dialog): print(compound_selected) self.CAS=self.obj.get_value(self.comp,'CAS') - self.Name=self.comp - self.MolecularFormula=self.obj.get_value(self.comp,'Smiles') - self.MolecularWeight=self.obj.get_value(self.comp,'MolecularWeight') + self.name=self.comp + self.molecular_formula=self.obj.get_value(self.comp,'Smiles') + self.molecular_weight=self.obj.get_value(self.comp,'MolecularWeight') - Dict={'CAS':self.CAS,'Name':self.Name,'Molecular Formula':self.MolecularFormula,'Molecular Weight':self.MolecularWeight} + dict={'CAS':self.CAS,'Name':self.name,'Molecular Formula':self.molecular_formula,'Molecular Weight':self.molecular_weight} #converted everything to a dictionary which will be passes to addtable #function as a parameter. - print(Dict) - self.addToTable(Dict) + print(dict) + self.add_to_table(dict) else: - self.Show_Error() + self.show_error() @staticmethod - def setCompounds(compounds): + def set_compounds(compounds): #compound_selected = compounds for i in compounds: compound_selected.append(i) - def addToTable(self,a): + def add_to_table(self,a): try: - rowPosition = self.tableWidget.rowCount() - self.tableWidget.insertRow(rowPosition) - self.tableWidget.setItem(rowPosition , 0, QTableWidgetItem(str(a['CAS']))) - self.tableWidget.setItem(rowPosition , 1, QTableWidgetItem(str(a['Name']))) - self.tableWidget.setItem(rowPosition , 2, QTableWidgetItem(str(a['Molecular Formula']))) - self.tableWidget.setItem(rowPosition , 3, QTableWidgetItem(str(a['Molecular Weight']))) + row_position = self.tableWidget.rowCount() + self.tableWidget.insertRow(row_position) + self.tableWidget.setItem(row_position , 0, QTableWidgetItem(str(a['CAS']))) + self.tableWidget.setItem(row_position , 1, QTableWidgetItem(str(a['Name']))) + self.tableWidget.setItem(row_position , 2, QTableWidgetItem(str(a['Molecular Formula']))) + self.tableWidget.setItem(row_position , 3, QTableWidgetItem(str(a['Molecular Weight']))) except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] print(exc_type, fname, exc_tb.tb_lineno) - def addCompToList(self,comp): # which list? + def add_compounds_to_list(self,comp): # which list? self.item = QListWidgetItem() self.item.setText(comp) self.listWidget.addItem(self.item) - def removeItems(self): - item = self.tableWidget.item(self.tableWidget.currentRow(),1).text() - self.tableWidget.removeRow(self.tableWidget.currentRow()) - - compound_selected.remove(item) + def remove_items(self): + try: + item = self.tableWidget.item(self.tableWidget.currentRow(),1).text() + self.tableWidget.removeRow(self.tableWidget.currentRow()) + + compound_selected.remove(item) + except Exception as e: + print(e) - def Show_Error(self): + def show_error(self): QMessageBox.about(self, 'Important', "Selected Compound is not Available") def cancel(self): @@ -160,7 +158,7 @@ class componentSelector(QDialog,ui_dialog): self.tableWidget.setRowCount(0) self.reject() - def getComp(self): + def get_compounds(self): return compound_selected def final_mo(self): @@ -171,11 +169,4 @@ class componentSelector(QDialog,ui_dialog): self.f_mo.write('\n') self.f_mo.write('\nend database;') self.f_mo.close() - - - - - - - - +
\ No newline at end of file diff --git a/comp_selector.ui b/ComponentSelector.ui index 09d8c78..7a43206 100644 --- a/comp_selector.ui +++ b/ComponentSelector.ui @@ -27,8 +27,9 @@ <widget class="QLabel" name="label"> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>12</pointsize> + <pointsize>9</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="text"> @@ -43,11 +44,6 @@ </item> <item> <widget class="QPushButton" name="compoundSelectButton"> - <property name="font"> - <font> - <family>Comic Sans MS</family> - </font> - </property> <property name="text"> <string>Select</string> </property> @@ -58,11 +54,6 @@ </item> <item> <widget class="QPushButton" name="pushButton_3"> - <property name="font"> - <font> - <family>Comic Sans MS</family> - </font> - </property> <property name="text"> <string>Remove</string> </property> diff --git a/container.py b/Container.py index 6b4bcbe..26f6250 100644 --- a/container.py +++ b/Container.py @@ -1,5 +1,5 @@ from OMChem.Flowsheet import Flowsheet -from component_selector import * +from ComponentSelector import * from collections import defaultdict from PyQt5.QtCore import * from PyQt5.QtWidgets import * @@ -19,29 +19,30 @@ import sys from Graphics import * class Container(): - def __init__(self,msgbrowser): - self.unitOp = [] - self.thermoPackage = None + def __init__(self,msgbrowser, graphicsView): + self.unit_operations = [] + self.thermo_package = None self.compounds = None self.flowsheet = None self.conn = defaultdict(list) self.op=defaultdict(list) self.ip=defaultdict(list) self.msg = msgbrowser + self.graphicsView = graphicsView self.msg.setText("") self.opl=[] self.result=[] - self.graphics = Graphics(self.unitOp) - self.scene = self.graphics.getScene() + self.graphics = Graphics(self.unit_operations, self.graphicsView) + self.scene = self.graphics.get_scene() - def currentTime(self): + def current_time(self): now = datetime.datetime.now() time = str(now.hour) + ":" + str(now.minute) + ":" +str(now.second) return time # def updateConn(self,key,value): # self.conn[key].append(value) - # self.msg.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+key.name+" </b> output is connected to input of<b> "+value.name +" </b></span>") + # self.msg.append("<span style=\"color:blue\">["+str(self.current_time())+"]<b> "+key.name+" </b> output is connected to input of<b> "+value.name +" </b></span>") # # def connection(self): # try: @@ -61,81 +62,95 @@ class Container(): # i.connect(InputStms=self.ip[i],OutputStms=self.op[i]) # # self.opl.append([self.op[i] for i in self.op]) - # self.opl=flatlist(flatlist(self.opl)) + # self.opl=flat_list(flat_list(self.opl)) # except Exception as e: # print(e) # @staticmethod # def addUnitOpObj(obj): - # self.unitOp.append(obj) + # self.unit_operations.append(obj) - def addUnitOp(self,obj): + def add_unit_operation(self, obj): box = None self.obj = obj - self.scene = self.graphics.getScene() - box = self.graphics.createNodeItem(self.obj, self) + self.scene = self.graphics.get_scene() + #self.graphicsView = graphicsView + box = self.graphics.create_node_item(self.obj, self) self.scene.addItem(box) box.setPos(2500-30, 2500-30) - if(obj in self.unitOp): + if(obj in self.unit_operations): pass else: - self.unitOp.append(obj) - data = self.unitOp[:] + self.unit_operations.append(obj) + data = self.unit_operations[:] data.append(compound_selected) - PUSH('Undo', data) - self.msg.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+obj.name+" </b>is instantiated .""</span>") + push('Undo', data) + self.msg.append("<span style=\"color:blue\">["+str(self.current_time())+"]<b> "+obj.name+" </b>is instantiated .""</span>") ''' Deletes the selected item from the canvas and also the objects created for that type. ''' def delete(self,l): for item in l: + print('deleted objects ', item) self.scene.removeItem(item) - if hasattr(item,'Input'): - for x in item.Input: - if x.newLine: - self.scene.removeItem(x.newLine) - del x.newLine - if x.otherLine: - self.scene.removeItem(x.otherLine) - del x.otherLine - if hasattr(item,'Output'): - for x in item.Output: - if x.newLine: - self.scene.removeItem(x.newLine) - del x.newLine - if x.otherLine: - self.scene.removeItem(x.otherLine) - del x.otherLine + for i in dock_widget_lst: + if i.name == item.name: + i.hide() + del i + break + for i in dock_widget_lst: + print(i.name) + print("delete ", dock_widget_lst) + if hasattr(item,'input'): + print("In input ") + print(item.input) + for x in item.input: + if x.new_line: + self.scene.removeItem(x.new_line) + del x.new_line + if x.other_line: + self.scene.removeItem(x.other_line) + del x.other_line + if hasattr(item,'output'): + print("in output ") + print(item.output) + for x in item.output: + if x.new_line: + self.scene.removeItem(x.new_line) + del x.new_line + if x.other_line: + self.scene.removeItem(x.other_line) + del x.other_line if hasattr(item,'obj'): - self.unitOp.remove(item.obj) + self.unit_operations.remove(item.obj) for k in list(self.conn): if item.obj==k: del self.conn[k] elif item.obj in self.conn[k]: self.conn[k].remove(item.obj) - self.msg.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+item.obj.name+" </b>is deleted .""</span>") + self.msg.append("<span style=\"color:blue\">["+str(self.current_time())+"]<b> "+item.obj.name+" </b>is deleted .""</span>") del item.obj del item - CLEAN_FILE('Redo') - data = self.unitOp[:] + clean_file('Redo') + data = self.unit_operations[:] data.append(compound_selected) - PUSH('Undo', data) + push('Undo', data) - def fetchObject(self,name): - for i in self.unitOp: + def fetch_object(self,name): + for i in self.unit_operations: if(i.name==name): return i - def addCompounds(self,comp): + def add_aompounds(self,comp): self.compounds = comp - def add_thermoPackage(self,thermo): - self.thermoPackage = thermo + def add_thermo_package(self,thermo): + self.thermo_package = thermo - def msgBrowser(self): + def msg_browser(self): std = self.flowsheet.stdout.decode("utf-8") if(std): stdout = str(std) @@ -153,47 +168,51 @@ class Container(): print(mode) self.compounds = compound_selected self.flowsheet = Flowsheet() - self.flowsheet.add_comp_list(self.compounds) + self.flowsheet.add_compound_list(self.compounds) print("######## connection master#########\n",self.conn) - for i in self.unitOp : + for i in self.unit_operations : print("here",i) - self.flowsheet.add_UnitOpn(i) + self.flowsheet.add_unit_operations(i) if mode=='SM': - self.msg.append("<span>["+str(self.currentTime())+"] Simulating in <b>Sequential</b> mode ... </span>") - self.flowsheet.simulateSM(self.ip,self.op) - self.msgBrowser() - self.result=self.flowsheet.resdata + self.msg.append("<span>["+str(self.current_time())+"] Simulating in <b>Sequential</b> mode ... </span>") + self.flowsheet.simulate_SM(self.ip,self.op) + self.msg_browser() + self.result=self.flowsheet.result_data print("under SEQ mode simulation") elif mode=='EQN': - self.msg.append("<span>["+str(self.currentTime())+"] Simulating in <b>equation</b> mode ... </span>") - self.flowsheet.simulateEQN() - self.msgBrowser() - self.result=self.flowsheet.resdata + self.msg.append("<span>["+str(self.current_time())+"] Simulating in <b>equation</b> mode ... </span>") + self.flowsheet.simulate_EQN() + self.msg_browser() + self.result=self.flowsheet.result_data print("under Eqn mode simulation") - DockWidget.showResult(NodeItem.getDockWidget()) + try: + DockWidget.show_result(NodeItem.get_dock_widget()) + except AttributeError: + print(NodeItem.name + ' does not have dockwidget') + pass -def flatlist(lst): - flat_list=[] +def flat_list(lst): + flat_lst=[] for sublist in lst: for item in sublist: - flat_list.append(item) - return flat_list + flat_lst.append(item) + return flat_lst -def PUSH(fileName, data): - with open(f"{fileName}.dat", "ab") as obj: +def push(file_name, data): + with open(f"{file_name}.dat", "ab") as obj: pickle.dump(data, obj) -def CLEAN_FILE(fileName): - with open(f"{fileName}.dat", "wb") as clean: +def clean_file(file_name): + with open(f"{file_name}.dat", "wb") as clean: pass -def POP(fileName): +def pop(file_name): last_command = None - if os.stat(f"{fileName}.dat").st_size != 0: + if os.stat(f"{file_name}.dat").st_size != 0: commands = [] - with open(f"{fileName}.dat", "rb") as objs: + with open(f"{file_name}.dat", "rb") as objs: while True: try: command = pickle.load(objs) @@ -204,18 +223,18 @@ def POP(fileName): last_command = commands[-1] commands.remove(commands[-1]) if len(commands) != 0: - with open(f"{fileName}.dat", "wb") as updated_data: + with open(f"{file_name}.dat", "wb") as updated_data: for i in range(len(commands)): pickle.dump(commands[i], updated_data) else: - CLEAN_FILE(fileName) + clean_file(file_name) return last_command -def get_last_list(fileName): +def get_last_list(file_name): commands = [] - if os.stat(f"{fileName}.dat").st_size != 0: - with open(f"{fileName}.dat", "rb") as objs: + if os.stat(f"{file_name}.dat").st_size != 0: + with open(f"{file_name}.dat", "rb") as objs: while True: try: command = pickle.load(objs) @@ -225,4 +244,4 @@ def get_last_list(fileName): if len(commands) is not 0: return commands[-1] else: - return None
\ No newline at end of file + return None diff --git a/dockWidget.py b/DockWidgets/DockWidget.py index 36fbc32..6fc7731 100644 --- a/dockWidget.py +++ b/DockWidgets/DockWidget.py @@ -4,78 +4,92 @@ from PyQt5.QtGui import * from PyQt5.uic import loadUiType import pandas as pd from functools import partial -from component_selector import * +from ComponentSelector import * from collections import defaultdict from Graphics import * -ui_dialog,_ = loadUiType('DockWidget.ui') +ui_dialog,_ = loadUiType('DockWidgets/DockWidget.ui') class DockWidget(QDockWidget,ui_dialog): - def __init__(self,name,comptype,obj,container,parent=None): + def __init__(self,name,comptype,obj,container, parent=None): QDockWidget.__init__(self,parent) self.setupUi(self) self.setWindowTitle(obj.name) self.name=name self.obj=obj self.type = comptype - self.inputdict = {} + self.input_dict = {} self.x_pclist = [] self.modes() - self.comboBox.currentIndexChanged.connect(self.modeSelection) - print("constructor ", self.inputdict) + self.comboBox.currentIndexChanged.connect(self.mode_selection) + + print("constructor ", self.input_dict) self.pushButton_2.clicked.connect(self.param) self.dict = {} - self.nameType = None + self.name_type = None self.container = container - + # input data tab def modes(self): - modesList = self.obj.modesList - if(modesList): - for j in modesList: - self.comboBox.addItem(str(j)) - self.modeSelection() + modes_list = self.obj.modes_list + if(modes_list): + for j in modes_list: + self.comboBox.addItem(str(self.obj.variables[j]['name'])) + self.mode_selection() else: - self.inputdict= {} - self.inputdict = self.obj.paramgetter() - self.inputparamslist() + self.comboBox.setDisabled(True) + self.input_dict= {} + self.input_dict = self.obj.param_getter() + self.input_params_list() - def modeSelection(self): - self.inputdict= {} + def mode_selection(self): + self.input_dict= {} for i in reversed(range(self.formLayout.count())): self.formLayout.removeRow(i) - self.inputdict = self.obj.paramgetter(self.comboBox.currentText()) - self.inputparamslist() - - def inputparamslist(self): + print(self.comboBox.currentText()) + for i in self.obj.variables: + if self.obj.variables[i]['name'] == self.comboBox.currentText(): + currentText = i + break + self.input_dict = self.obj.param_getter(currentText) + print('mode selection ', self.input_dict) + self.input_params_list() + + def input_params_list(self): try: - print("inputparamslist ", self.inputdict) - for c,i in enumerate(self.inputdict): - if(i=="thermoPackage"): + print("input_params_list ", self.input_dict) + for c,i in enumerate(self.input_dict): + if i == None: + continue + if(i=="thermo_package"): print("thermo1") combo = QComboBox() self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')] print("thermo2") for j in self.lines: combo.addItem(str(j)) + combo.setMinimumContentsLength(15) lay = QGridLayout() lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft) - lay.addWidget(combo, 0, 1, alignment=Qt.AlignRight) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter) self.formLayout.addRow(lay) - self.inputdict[i] = combo + self.input_dict[i] = combo print("thermo") - elif(i=="condType"): + elif(i=="Ctype"): combo = QComboBox() self.lines = ["Total","Partial"] for j in self.lines: combo.addItem(str(j)) + combo.setMinimumContentsLength(15) lay = QGridLayout() - lay.addWidget(QLabel("Condensor Type :"+":"), 0, 0, alignment=Qt.AlignLeft) + lay.addWidget(QLabel("Condensor Type :"), 0, 0, alignment=Qt.AlignLeft) lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter) self.formLayout.addRow(lay) - self.inputdict[i] = combo + self.input_dict[i] = combo elif(i=="x_pc"): noc = len(compound_selected) print(noc) @@ -84,52 +98,59 @@ class DockWidget(QDockWidget,ui_dialog): lay = QGridLayout() for j in range(noc): l = QLineEdit() - self.inputdict[i] = "x_pc" + self.input_dict[i] = "x_pc" lay.addWidget(QLabel(str(compound_selected[j])+":"),j,0, alignment=Qt.AlignLeft) lay.addWidget(l,j,1, alignment=Qt.AlignCenter) lay.addWidget(QLabel(self.obj.variables[i]['unit']),j,2, alignment=Qt.AlignCenter) self.x_pclist.append(l) gp.setLayout(lay) - self.formLayout.addRow(gp) + self.formLayout.addRow(gp) else: print("elseloop") + print(i) + if i == None: + continue l = QLineEdit() - if self.inputdict[i] != None: - l.setText(str(self.inputdict[i])) + if self.input_dict[i] != None: + l.setText(str(self.input_dict[i])) + print('before lay') lay = QGridLayout() - lay.addWidget(QLabel(i+":"),0,0, alignment=Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables[i]['name']+":"),0,0, alignment=Qt.AlignLeft) #self.obj.variables[i]['name'] lay.addWidget(l,0,1, alignment=Qt.AlignCenter) + print('after lay') if(i != 'MolFlow'): lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter) else: - lay.addWidget(QLabel("mol/s"),0,2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel('mol/s'),0,2, alignment=Qt.AlignCenter) + print('after all') self.formLayout.addRow(lay) - self.inputdict[i] = l + self.input_dict[i] = l + except Exception as e: print(e) - - def Show_Error(self): + def show_error(self): QMessageBox.about(self, 'Important', "Please fill all fields with data") def param(self): try: self.dict={} - - print("param.inputdict ", self.inputdict) - for i in self.inputdict: - if(i=="thermoPackage"): - if (self.inputdict[i].currentText()): - self.dict[i] = self.inputdict[i].currentText() + print("param.input_dict ", self.input_dict) + for i in self.input_dict: + if (self.input_dict[i] == None): + continue + if(i=="thermo_package"): + if (self.input_dict[i].currentText()): + self.dict[i] = self.input_dict[i].currentText() else: - self.Show_Error() + self.show_error() break - elif(i=="condType"): - if (self.inputdict[i].currentText()): - self.dict[i] = self.inputdict[i].currentText() + elif(i=="Ctype"): + if (self.input_dict[i].currentText()): + self.dict[i] = self.input_dict[i].currentText() else: - self.Show_Error() + self.show_error() break elif(i =="x_pc"): l=[] @@ -140,44 +161,44 @@ class DockWidget(QDockWidget,ui_dialog): l.append(mol_frac.text()) total_moles += float(l[-1]) else: - self.Show_Error() + self.show_error() break for c in range(len(compound_selected)): mf.append(str(float(l[c])/total_moles)) self.x_pclist[c].setText(mf[-1]) - # self.formLayout.addRow(QLabel(str(compound_selected[c])+" Mole Fraction: "+str(float(l[c])/total_moles))) self.dict[i] = ",".join(mf) - # self.update() + elif(i == 'Pout' and self.obj.type == 'Mixer' or i == '' or i == 'HKey' or i == 'LKey'): + self.dict[i] = self.input_dict[i].currentText() else: - if (self.inputdict[i].text()): - self.dict[i] = self.inputdict[i].text() + print(self.input_dict[i], i, self.obj.type) + if (self.input_dict[i].text()): + self.dict[i] = self.input_dict[i].text() else: - print(self.inputdict[i].text()) - self.Show_Error() + print(self.input_dict[i].text()) + self.show_error() break print("param ", self.dict) - self.obj.paramsetter(self.dict) + self.obj.param_setter(self.dict) self.hide() except Exception as e: print(e) - @staticmethod - def showResult(lst): + def show_result(lst): #DockWidget1.flag = True for i in lst: - i.resultsCategory(i.name) + i.results_category(i.name) #i.show() # result data tab - def resultsCategory(self,name): + def results_category(self,name): flag = True try: print("Under result category name ", name) result=self.container.result - obj = self.container.fetchObject(name) + obj = self.container.fetch_object(name) self.tableWidget.setRowCount(0) variKeys = list(obj.variables.keys()) print(variKeys) @@ -196,7 +217,4 @@ class DockWidget(QDockWidget,ui_dialog): self.tableWidget.resizeColumnsToContents() except Exception as e: - print(e) - - -
\ No newline at end of file + print(e)
\ No newline at end of file diff --git a/DockWidgets/DockWidget.txt b/DockWidgets/DockWidget.txt new file mode 100644 index 0000000..b14eef8 --- /dev/null +++ b/DockWidgets/DockWidget.txt @@ -0,0 +1,636 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from component_selector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidget.ui') + +class DockWidget(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.inputdict = {} + self.x_pclist = [] + self.modes() + self.comboBox.currentIndexChanged.connect(self.modeSelection) + + print("constructor ", self.inputdict) + self.pushButton_2.clicked.connect(self.param) + self.dict = {} + + self.nameType = None + self.container = container + + header = QTreeWidgetItem(['Compound','Value','Unit']) + self.mTreeWidget.setHeaderItem(header) + self.lTreeWidget.setHeaderItem(header) + self.vTreeWidget.setHeaderItem(header) + + self.mTreeWidget.itemClicked.connect(lambda : self.printer(self.mTreeWidget.currentItem())) + self.lTreeWidget.itemClicked.connect(lambda : self.printer(self.lTreeWidget.currentItem())) + self.vTreeWidget.itemClicked.connect(lambda : self.printer(self.vTreeWidget.currentItem())) + + def printer(self, treeItem ): + foldername = treeItem.text(0) + comment = treeItem.text(1) + data = treeItem.text(2) + print(foldername , ': ' , comment , ' (' + data + ')') + + # input data tab + def modes(self): + modesList = self.obj.modesList + if(modesList): + for j in modesList: + self.comboBox.addItem(str(self.obj.variables[j]['name'])) + self.modeSelection() + else: + self.comboBox.setDisabled(True) + self.inputdict= {} + self.inputdict = self.obj.paramgetter() + self.inputparamslist() + + def modeSelection(self): + self.inputdict= {} + for i in reversed(range(self.formLayout.count())): + self.formLayout.removeRow(i) + print(self.comboBox.currentText()) + for i in self.obj.variables: + if self.obj.variables[i]['name'] == self.comboBox.currentText(): + currentText = i + break + self.inputdict = self.obj.paramgetter(currentText) + print('mode selection ', self.inputdict) + self.inputparamslist() + + def inputparamslist(self): + try: + print("inputparamslist ", self.inputdict) + for c,i in enumerate(self.inputdict): + if i == None: + continue + if(i=="thermoPackage"): + print("thermo1") + combo = QComboBox() + self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')] + print("thermo2") + for j in self.lines: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + lay = QGridLayout() + lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter) + self.formLayout.addRow(lay) + self.inputdict[i] = combo + print("thermo") + elif(i=="Ctype"): + combo = QComboBox() + self.lines = ["Total","Partial"] + for j in self.lines: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + lay = QGridLayout() + lay.addWidget(QLabel("Condensor Type :"), 0, 0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter) + self.formLayout.addRow(lay) + self.inputdict[i] = combo + elif(i=="x_pc"): + noc = len(compound_selected) + print(noc) + self.x_pclist.clear() + gp = QGroupBox("Compounds") + lay = QGridLayout() + for j in range(noc): + l = QLineEdit() + self.inputdict[i] = "x_pc" + lay.addWidget(QLabel(str(compound_selected[j])+":"),j,0, alignment=Qt.AlignLeft) + lay.addWidget(l,j,1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables[i]['unit']),j,2, alignment=Qt.AlignCenter) + self.x_pclist.append(l) + gp.setLayout(lay) + self.formLayout.addRow(gp) + elif (self.obj.type == 'Mixer' and i == 'Pout'): + combo = QComboBox() + print("Mixer combo") + for j in self.obj.Pout_modes: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + lay = QGridLayout() + lay.addWidget(QLabel(self.obj.variables[i]['name']+":"), 0,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter) + self.formLayout.addRow(lay) + self.inputdict[i] = combo + elif (self.obj.type == 'Splitter' and i == 'CalcType'): + combo = QComboBox() + print("Splitter combo") + for j in self.obj.CalcType_modes: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + stream1 = QLineEdit() + stream2 = QLineEdit() + unit = QLabel('') + lay = QGridLayout() + lay.addWidget(QLabel(self.obj.variables[i]['name']+":"), 0,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter) + + lay.addWidget(QLabel("Stream 1 : "), 1,0, alignment = Qt.AlignLeft) + lay.addWidget(stream1, 1,1, alignment = Qt.AlignCenter) + lay.addWidget(unit, 1,2, alignment = Qt.AlignRight) + + lay.addWidget(QLabel("Stream 2 : "), 2,0, alignment = Qt.AlignLeft) + lay.addWidget(stream2, 2,1, alignment = Qt.AlignCenter) + lay.addWidget(unit, 2,2, alignment = Qt.AlignRight) + self.formLayout.addRow(lay) + print("daf ", self.formLayout) + #combo.currentIndexChanged.connect(lambda:self.SplitterStreams(combo, lay, unit)) + lst = [combo, stream1, stream2] + #lst = [combo.currentText(), stream1.text(), stream2.text()] + self.inputdict[i] = lst + # self.inputdict[i] = stream1 + # self.inputdict[i] = stream2 + print(self.inputdict[i]) + elif i == 'HKey' or i == 'LKey': + combo = QComboBox() + print("ShortcutColumn combo") + for j in self.obj.compounds: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + lay = QGridLayout() + lay.addWidget(QLabel(self.obj.variables[i]['name']+":"), 0,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter) + self.formLayout.addRow(lay) + self.inputdict[i] = combo + elif self.obj.type == 'CompoundSeparator' and i == 'SepStrm': + print(i) + rlay = QHBoxLayout() + r1 = QRadioButton('Stream 1') + r1.setChecked(True) + r2 = QRadioButton('Stream 2') + r2.setChecked(False) + rlay.addWidget(r1) + rlay.addWidget(r2) + self.formLayout.addRow(rlay) + + lst = [r1, r2] + + lay = QGridLayout() + for k,val in enumerate(self.obj.compounds): + combo = QComboBox() + print("CompoundSeparator combo") + for j in self.obj.SepFact_modes: + combo.addItem(str(j)) + l = QLineEdit() + lay.addWidget(QLabel(val+" :"), k,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, k, 1, alignment=Qt.AlignCenter) + lay.addWidget(l,k,2, alignment=Qt.AlignCenter) + lst.append(combo) + lst.append(l) + self.inputdict[i] = lst + self.formLayout.addRow(lay) + elif self.obj.type == 'Flash' and i == 'Bdef': + print(i) + # rlay = QHBoxLayout() + r1 = QCheckBox() + r1.setChecked(False) + r2 = QCheckBox() + r2.setChecked(False) + # rlay.addWidget(r1) + # rlay.addWidget(r2) + # self.formLayout.addRow(rlay) + + l1 = QLineEdit() + l1.setText(str(self.obj.variables['Tdef']['value'])) + l2 = QLineEdit() + l2.setText(str(self.obj.variables['Pdef']['value'])) + lay = QGridLayout() + lay.addWidget(r1, 0,0, alignment = Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables['Tdef']['name']+":"), 0,1, alignment=Qt.AlignLeft) + lay.addWidget(l1, 0, 2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables['Tdef']['unit']),0,3, alignment=Qt.AlignRight) + l1.setDisabled(True) + + lay.addWidget(r2, 2,0, alignment = Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables['Pdef']['name']+":"), 2,1, alignment=Qt.AlignLeft) + lay.addWidget(l2, 2, 2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables['Pdef']['unit']),2,3, alignment=Qt.AlignRight) + self.formLayout.addRow(lay) + l2.setDisabled(True) + r1.toggled.connect(lambda:l1.setDisabled(not r1.isChecked())) + r2.toggled.connect(lambda:l2.setDisabled(not r2.isChecked())) + + self.inputdict[i] = [r1, r2, l1, l2] + else: + print("elseloop") + print(i) + if i == None: + continue + l = QLineEdit() + if self.inputdict[i] != None: + l.setText(str(self.inputdict[i])) + print('before lay') + lay = QGridLayout() + lay.addWidget(QLabel(self.obj.variables[i]['name']+":"),0,0, alignment=Qt.AlignLeft) #self.obj.variables[i]['name'] + lay.addWidget(l,0,1, alignment=Qt.AlignCenter) + print('after lay') + if(i != 'MolFlow'): + lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter) + else: + lay.addWidget(QLabel('mol/s'),0,2, alignment=Qt.AlignCenter) + print('after all') + self.formLayout.addRow(lay) + self.inputdict[i] = l + + + except Exception as e: + print(e) + + def Show_Error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict={} + print("param.inputdict ", self.inputdict) + for i in self.inputdict: + if (self.inputdict[i] == None): + continue + + if(i=="thermoPackage"): + if (self.inputdict[i].currentText()): + self.dict[i] = self.inputdict[i].currentText() + else: + self.Show_Error() + break + elif(i=="Ctype"): + if (self.inputdict[i].currentText()): + self.dict[i] = self.inputdict[i].currentText() + else: + self.Show_Error() + break + elif(i =="x_pc"): + l=[] + mf = [] + total_moles = 0 + for mol_frac in self.x_pclist: + if (mol_frac.text()): + l.append(mol_frac.text()) + total_moles += float(l[-1]) + else: + self.Show_Error() + break + for c in range(len(compound_selected)): + mf.append(str(float(l[c])/total_moles)) + self.x_pclist[c].setText(mf[-1]) + self.dict[i] = ",".join(mf) + elif(i == 'Pout' and self.obj.type == 'Mixer' or i == '' or i == 'HKey' or i == 'LKey'): + self.dict[i] = self.inputdict[i].currentText() + elif i == 'CalcType' and self.obj.type == 'Splitter': + self.dict[i] = [self.inputdict[i][0].currentText(), self.inputdict[i][1].text(), self.inputdict[i][2].text()] + elif self.obj.type == 'Flash' and i == 'Bdef': + self.dict[i] = [self.inputdict[i][0].isChecked(), self.inputdict[i][1].isChecked(), self.inputdict[i][2].text(), self.inputdict[i][3].text()] + elif self.obj.type == 'CompoundSeparator': + self.dict[i] = [self.inputdict[i][0].isChecked(),self.inputdict[i][1].isChecked()] + j = 2 + for comp in self.obj.compounds: + self.dict[i].append(self.inputdict[i][j].currentText()) + self.dict[i].append(self.inputdict[i][j+1].text()) + j += 2 + else: + print(self.inputdict[i], i, self.obj.type) + if (self.inputdict[i].text()): + self.dict[i] = self.inputdict[i].text() + else: + print(self.inputdict[i].text()) + self.Show_Error() + break + + print("param ", self.dict) + self.obj.paramsetter(self.dict) + self.hide() + + except Exception as e: + print(e) + + + @staticmethod + def showResult(lst): + #DockWidget1.flag = True + for i in lst: + i.resultsCategory(i.name) + #i.show() + + # result data tab + def resultsCategory(self,name): + flag = True + try: + print("Under result category name ", name) + result=self.container.result + obj = self.container.fetchObject(name) + + d = {"Mole Fraction":"x_pc", "Mass Fraction":"xm_pc", "Mole Flow":"F_pc", "Mass Flow":"Fm_pc"} + lst = list(d.keys()) + klst = list(d.values()) + + p = {"Pressure":"P", "Temperature":"T","Vapour Phase Mole Fraction":"xvap", "Phase Molar Enthalpy":"H_p", + "Phase Molar Entropy":"S_p", "Molar Flow Rate":"F_p"} + + # Amounts Tab + if obj.type == 'MaterialStream': + l = [] # list for basis names + for basis in d: + propertyname = name + '.' + d[basis] + print("basis ", basis, propertyname) + for i in result[0]: + if (propertyname in i): + l.append(i) + print(l) + + j = 0 + t = 0 + namee = klst[j] + print("namee ", namee) + + for i,k in enumerate(l): + ind = result[0].index(k) + print("index ", ind) + print("str ", k) + resultval = str(result[-1][ind]) + print("######Resultsfetch####",resultval) + print(k[k.find(".")+1:k.find("[")]) + obj.variables[k.split('.')[1]]['value'] = resultval + if namee in k: + if i%3 == 0: + if(flag): + mroot = QTreeWidgetItem(self.mTreeWidget, [lst[j]]) + child = QTreeWidgetItem(mroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']]) + elif i%3 == 1: + if(flag): + lroot = QTreeWidgetItem(self.lTreeWidget, [lst[j]]) + child = QTreeWidgetItem(lroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']]) + elif i%3 == 2: + if (flag): + vroot = QTreeWidgetItem(self.vTreeWidget, [lst[j]]) + child = QTreeWidgetItem(vroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']]) + t += 1 + flag = False + else: + j += 1 + t = 0 + namee = klst[j] + flag = True + if i%3 == 0: + if (flag): + mroot = QTreeWidgetItem(self.mTreeWidget, [lst[j]]) + child = QTreeWidgetItem(mroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']]) + elif i%3 == 1: + if (flag): + lroot = QTreeWidgetItem(self.lTreeWidget, [lst[j]]) + child = QTreeWidgetItem(lroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']]) + elif i%3 == 2: + if (flag): + vroot = QTreeWidgetItem(self.vTreeWidget, [lst[j]]) + child = QTreeWidgetItem(vroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']]) + t += 1 + flag = False + #print(obj.variables) + + # Phase Properties Tab + phaseResLst = [] + for phase in p: + propertyname = name + '.' + p[phase] + print("phase ", phase, propertyname) + for i in result[0]: + if i.find('['): + if (propertyname == i[0:i.find('[')]): + phaseResLst.append(i) + if propertyname == i: + phaseResLst.append(i) + print(phaseResLst) + + self.mTableWidget.setRowCount(0) + self.lTableWidget.setRowCount(0) + self.vTableWidget.setRowCount(0) + + for i,val in enumerate(phaseResLst): + ind = result[0].index(val) + resultval = str(result[-1][ind]) + print(resultval, i, val) + obj.variables[val.split('.')[1]]['value'] = resultval + if '[' in val: + print(val) + temp = val[val.find('.')+1:val.find('[')] + print(temp) + if '1' in val.split('.')[1]: + print(obj.variables[val.split('.')[1]]['name']) + mrowPosition = self.mTableWidget.rowCount() + self.mTableWidget.insertRow(mrowPosition) + self.mTableWidget.setItem(mrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name'])) + self.mTableWidget.setItem(mrowPosition , 1, QTableWidgetItem(resultval)) + self.mTableWidget.setItem(mrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit'])) + self.mTableWidget.resizeColumnsToContents() + + if '2' in val.split('.')[1]: + lrowPosition = self.lTableWidget.rowCount() + self.lTableWidget.insertRow(lrowPosition) + self.lTableWidget.setItem(lrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name'])) + self.lTableWidget.setItem(lrowPosition , 1, QTableWidgetItem(resultval)) + self.lTableWidget.setItem(lrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit'])) + self.lTableWidget.resizeColumnsToContents() + if '3' in val.split('.')[1]: + vrowPosition = self.vTableWidget.rowCount() + self.vTableWidget.insertRow(vrowPosition) + self.vTableWidget.setItem(vrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name'])) + self.vTableWidget.setItem(vrowPosition , 1, QTableWidgetItem(resultval)) + self.vTableWidget.setItem(vrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit'])) + self.vTableWidget.resizeColumnsToContents() + if not '[' in val: + #print(p[val.split('.')[1]]) + print(obj.variables[val.split('.')[1]]['name']) + mrowPosition = self.mTableWidget.rowCount() + self.mTableWidget.insertRow(mrowPosition) + self.mTableWidget.setItem(mrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name'])) + self.mTableWidget.setItem(mrowPosition , 1, QTableWidgetItem(resultval)) + self.mTableWidget.setItem(mrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit'])) + self.mTableWidget.resizeColumnsToContents() + + print(obj.variables) + + except Exception as e: + print(e) + + +class DockWidgetFlash(DockWidget): + + def __init__(self,name,comptype,obj,container,parent=None): + DockWidget.__init__(self,name,comptype,obj,container,parent=None) + + def inputparamslist(self): + try: + print("inputparamslist ", self.inputdict) + for c,i in enumerate(self.inputdict): + if i == None: + continue + if(i=="thermoPackage"): + print("thermo1") + combo = QComboBox() + self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')] + print("thermo2") + for j in self.lines: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + lay = QGridLayout() + lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter) + self.formLayout.addRow(lay) + self.inputdict[i] = combo + print("thermo") + elif self.obj.type == 'Flash' and i == 'Bdef': + print(i) + r1 = QCheckBox() + r1.setChecked(False) + r2 = QCheckBox() + r2.setChecked(False) + + l1 = QLineEdit() + l1.setText(str(self.obj.variables['Tdef']['value'])) + l2 = QLineEdit() + l2.setText(str(self.obj.variables['Pdef']['value'])) + lay = QGridLayout() + lay.addWidget(r1, 0,0, alignment = Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables['Tdef']['name']+":"), 0,1, alignment=Qt.AlignLeft) + lay.addWidget(l1, 0, 2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables['Tdef']['unit']),0,3, alignment=Qt.AlignRight) + l1.setDisabled(True) + + lay.addWidget(r2, 2,0, alignment = Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables['Pdef']['name']+":"), 2,1, alignment=Qt.AlignLeft) + lay.addWidget(l2, 2, 2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables['Pdef']['unit']),2,3, alignment=Qt.AlignRight) + self.formLayout.addRow(lay) + l2.setDisabled(True) + r1.toggled.connect(lambda:l1.setDisabled(not r1.isChecked())) + r2.toggled.connect(lambda:l2.setDisabled(not r2.isChecked())) + + self.inputdict[i] = [r1, r2, l1, l2] + except Exception as e: + print(e) + + def param(self): + try: + self.dict={} + print("param.inputdict ", self.inputdict) + for i in self.inputdict: + if (self.inputdict[i] == None): + continue + + if(i=="thermoPackage"): + if (self.inputdict[i].currentText()): + self.dict[i] = self.inputdict[i].currentText() + else: + self.Show_Error() + break + elif self.obj.type == 'Flash' and i == 'Bdef': + self.dict[i] = [self.inputdict[i][0].isChecked(), self.inputdict[i][1].isChecked(), self.inputdict[i][2].text(), self.inputdict[i][3].text()] + + print("param ", self.dict) + self.obj.paramsetter(self.dict) + self.hide() + + except Exception as e: + print(e) + +class DockWidgetFlash(DockWidget): + + def __init__(self,name,comptype,obj,container,parent=None): + DockWidget.__init__(self,name,comptype,obj,container,parent=None) + + def inputparamslist(self): + try: + print("inputparamslist ", self.inputdict) + for c,i in enumerate(self.inputdict): + if i == None: + continue + if(i=="thermoPackage"): + print("thermo1") + combo = QComboBox() + self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')] + print("thermo2") + for j in self.lines: + combo.addItem(str(j)) + combo.setMinimumContentsLength(15) + lay = QGridLayout() + lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft) + lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter) + self.formLayout.addRow(lay) + self.inputdict[i] = combo + print("thermo") + elif self.obj.type == 'Flash' and i == 'Bdef': + print(i) + r1 = QCheckBox() + r1.setChecked(False) + r2 = QCheckBox() + r2.setChecked(False) + + l1 = QLineEdit() + l1.setText(str(self.obj.variables['Tdef']['value'])) + l2 = QLineEdit() + l2.setText(str(self.obj.variables['Pdef']['value'])) + lay = QGridLayout() + lay.addWidget(r1, 0,0, alignment = Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables['Tdef']['name']+":"), 0,1, alignment=Qt.AlignLeft) + lay.addWidget(l1, 0, 2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables['Tdef']['unit']),0,3, alignment=Qt.AlignRight) + l1.setDisabled(True) + + lay.addWidget(r2, 2,0, alignment = Qt.AlignLeft) + lay.addWidget(QLabel(self.obj.variables['Pdef']['name']+":"), 2,1, alignment=Qt.AlignLeft) + lay.addWidget(l2, 2, 2, alignment=Qt.AlignCenter) + lay.addWidget(QLabel(self.obj.variables['Pdef']['unit']),2,3, alignment=Qt.AlignRight) + self.formLayout.addRow(lay) + l2.setDisabled(True) + r1.toggled.connect(lambda:l1.setDisabled(not r1.isChecked())) + r2.toggled.connect(lambda:l2.setDisabled(not r2.isChecked())) + + self.inputdict[i] = [r1, r2, l1, l2] + except Exception as e: + print(e) + + def param(self): + try: + self.dict={} + print("param.inputdict ", self.inputdict) + for i in self.inputdict: + if (self.inputdict[i] == None): + continue + + if(i=="thermoPackage"): + if (self.inputdict[i].currentText()): + self.dict[i] = self.inputdict[i].currentText() + else: + self.Show_Error() + break + elif self.obj.type == 'Flash' and i == 'Bdef': + self.dict[i] = [self.inputdict[i][0].isChecked(), self.inputdict[i][1].isChecked(), self.inputdict[i][2].text(), self.inputdict[i][3].text()] + + print("param ", self.dict) + self.obj.paramsetter(self.dict) + self.hide() + + except Exception as e: + print(e)
\ No newline at end of file diff --git a/dockWidget.ui b/DockWidgets/DockWidget.ui index 11855cb..5851d71 100644 --- a/dockWidget.ui +++ b/DockWidgets/DockWidget.ui @@ -28,6 +28,9 @@ <property name="windowTitle"> <string>Form</string> </property> + <property name="autoFillBackground"> + <bool>false</bool> + </property> <widget class="QTabWidget" name="tabWidget"> <property name="geometry"> <rect> @@ -38,7 +41,7 @@ </rect> </property> <property name="autoFillBackground"> - <bool>true</bool> + <bool>false</bool> </property> <property name="currentIndex"> <number>0</number> diff --git a/DockWidgets/DockWidgetCompoundSeparator.py b/DockWidgets/DockWidgetCompoundSeparator.py new file mode 100644 index 0000000..1818290 --- /dev/null +++ b/DockWidgets/DockWidgetCompoundSeparator.py @@ -0,0 +1,99 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from ComponentSelector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetCompoundSeparator.ui') + +class DockWidgetCompoundSeparator(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.input_dict = [] + + print("constructor ", self.input_dict) + self.input_params_list() + self.dict = [] + + def input_params_list(self): + try: + print("input_params_list ", self.input_dict) + if self.type == 'CompoundSeparator': + + # self.gridLayout = QGridLayout() + calculationGroupBox = QGroupBox('Calculation Parameters') + + calculationLayout = QGridLayout() + + r1 = QRadioButton('Stream 1') + r1.setChecked(True) + r1.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + r2 = QRadioButton('Stream 2') + r2.setChecked(False) + r2.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + + lst = [r1, r2] + calculationLayout.addWidget(r1, 0, 1) + calculationLayout.addWidget(r2, 0, 2) + + for k,val in enumerate(self.obj.compounds): + combo = QComboBox() + print("CompoundSeparator combo") + for j in self.obj.SepFact_modes: + combo.addItem(str(j)) + combo.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + l = QLineEdit() + l.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + calculationLayout.addWidget(QLabel(val+" :"), k+1,0, alignment=Qt.AlignLeft) + calculationLayout.addWidget(combo, k+1, 1, alignment=Qt.AlignCenter) + calculationLayout.addWidget(l,k+1,2, alignment=Qt.AlignCenter) + lst.append(combo) + lst.append(l) + + calculationLayout.setColumnStretch(3, len(self.obj.compounds)+1) + calculationGroupBox.setLayout(calculationLayout) + + btn = QPushButton('Submit') + btn.clicked.connect(self.param) + + self.gridLayout.setVerticalSpacing(5) + self.gridLayout.addWidget(calculationGroupBox,0,0) + self.gridLayout.addWidget(btn,1,0) + + self.input_dict = lst + + except Exception as e: + print(e) + + def show_error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict=[] + print("param.input_dict ", self.input_dict) + + self.dict = [self.input_dict[0].isChecked(), self.input_dict[1].isChecked()] + j = 2 + for i in range(len(self.obj.compounds)): + print(j+i) + self.dict.append(self.input_dict[j+i].currentText()) + self.dict.append(self.input_dict[j+i+1].text()) + j += 1 + + print("param ", self.dict) + self.obj.param_setter(self.dict) + self.hide() + + except Exception as e: + print(e) diff --git a/DockWidgets/DockWidgetCompoundSeparator.ui b/DockWidgets/DockWidgetCompoundSeparator.ui new file mode 100644 index 0000000..2d9a4b2 --- /dev/null +++ b/DockWidgets/DockWidgetCompoundSeparator.ui @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>form</class> + <widget class="QWidget" name="form"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>392</width> + <height>700</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>3200</width> + <height>5000</height> + </size> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <widget class="QWidget" name="gridLayoutWidget"> + <property name="geometry"> + <rect> + <x>10</x> + <y>40</y> + <width>331</width> + <height>191</height> + </rect> + </property> + <layout class="QGridLayout" name="gridLayout"/> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/DockWidgets/DockWidgetDistillationColumn.py b/DockWidgets/DockWidgetDistillationColumn.py new file mode 100644 index 0000000..65e9932 --- /dev/null +++ b/DockWidgets/DockWidgetDistillationColumn.py @@ -0,0 +1,120 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from ComponentSelector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetDistillationColumn.ui') + +class DockWidgetDistillationColumn(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.input_dict = [] + print("constructor ", self.input_dict) + self.pushButton_2.clicked.connect(self.param) + self.dict = [] + self.input_params_list() + self.name_type = None + self.container = container + + # input data tab + + def input_params_list(self): + try: + print("input_params_list ", self.input_dict) + + # tab 1 + self.l1.setText(self.obj.variables['Nt']['name']+":") + self.le1.setText(str(self.obj.variables['Nt']['value'])) + self.l2.setText(self.obj.variables['In_s']['name']+":") + self.l3.setText(self.obj.variables['InT_s']['name']+":") + + # tab 2 + self.l4.setText(self.obj.variables['Ctype']['name']+":") + self.u1.setText(self.obj.variables['Ctype']['unit']) + self.l5.setText(self.obj.variables['Pcond']['name']+":") + self.le5.setText(str(self.obj.variables['Pcond']['value'])) + self.u2.setText(self.obj.variables['Pcond']['unit']) + self.l6.setText(self.obj.variables['C_Spec']['name']+":") + self.l7.setText("Compounds :") + + self.cb5.addItem("Total") + self.cb5.addItem("Partial") + for j in self.obj.Cspec_list: + self.cb1.addItem(str(j)) + for j in self.obj.compounds: + self.cb2.addItem(str(j)) + self.cb2.setDisabled(True) + self.cb1.currentIndexChanged.connect(self.fun2) + + + # tab3 + self.l8.setText(self.obj.variables['Preb']['name']+":") + self.le7.setText(str(self.obj.variables['Preb']['value'])) + self.u3.setText(self.obj.variables['Preb']['unit']) + self.l9.setText(self.obj.variables['R_Spec']['name']+":") + self.l10.setText('Compounds') + + for j in self.obj.Rspec_list: + self.cb3.addItem(str(j)) + for j in self.obj.compounds: + self.cb4.addItem(str(j)) + self.cb4.setDisabled(True) + self.cb3.currentIndexChanged.connect(self.fun3) + + self.input_dict = [self.le1, self.le2, self.le3, self.cb5, self.le5, self.cb1, self.cb2, self.le6, self.le7, self.cb3, self.cb4, self.le8] + + except Exception as e: + print(e) + + def fun2(self): + if self.cb1.currentText() == 'Compound Molar Fraction' or self.cb1.currentText() == 'Compound Molar Flow (mol/s)': + self.cb2.setDisabled(False) + else: + self.cb2.setDisabled(True) + + def fun3(self): + if self.cb3.currentText() == 'Compound Molar Fraction' or self.cb3.currentText() == 'Compound Molar Flow (mol/s)': + self.cb4.setDisabled(False) + else: + self.cb4.setDisabled(True) + + def Show_Error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict= [] + print("param.input_dict ", self.input_dict) + self.dict = [self.input_dict[0].text(),self.input_dict[1].text(), self.input_dict[2].text(), self.input_dict[3].currentText(), + self.input_dict[4].text(), self.input_dict[5].currentText(), self.input_dict[6].currentText(), self.input_dict[7].text(), + self.input_dict[8].text(), self.input_dict[9].currentText(), self.input_dict[10].currentText(), self.input_dict[11].text()] + + print("param ", self.dict) + self.obj.param_setter(self.dict) + self.hide() + + except Exception as e: + print(e) + + + @staticmethod + def showResult(lst): + #DockWidget1.flag = True + for i in lst: + i.resultsCategory(i.name) + #i.show() + + # result data tab + def resultsCategory(self,name): + pass
\ No newline at end of file diff --git a/DockWidgets/DockWidgetDistillationColumn.ui b/DockWidgets/DockWidgetDistillationColumn.ui new file mode 100644 index 0000000..0cb1043 --- /dev/null +++ b/DockWidgets/DockWidgetDistillationColumn.ui @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>392</width> + <height>700</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>3200</width> + <height>5000</height> + </size> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <widget class="QTabWidget" name="tabWidget"> + <property name="geometry"> + <rect> + <x>10</x> + <y>30</y> + <width>361</width> + <height>621</height> + </rect> + </property> + <property name="autoFillBackground"> + <bool>true</bool> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Input Data</string> + </attribute> + <widget class="QGroupBox" name="groupBox_2"> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>331</width> + <height>204</height> + </rect> + </property> + <property name="title"> + <string>Parameter Selection</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_10"> + <item> + <widget class="QTabWidget" name="tabWidget_5"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab1"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <layout class="QGridLayout" name="lay1"> + <item row="1" column="0"> + <widget class="QLabel" name="l2"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="le1"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="l1"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="le2"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="l3"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLineEdit" name="le3"/> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab2"> + <attribute name="title"> + <string>Condensor</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <layout class="QGridLayout" name="lay2"> + <item row="3" column="0"> + <widget class="QLabel" name="l7"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="l4"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="l5"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QComboBox" name="cb1"/> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="le5"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="l6"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QComboBox" name="cb2"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLabel" name="u1"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QLabel" name="u2"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="4" column="2"> + <widget class="QLineEdit" name="le6"/> + </item> + <item row="0" column="2"> + <widget class="QComboBox" name="cb5"/> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab3"> + <attribute name="title"> + <string>Reboiler</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <item> + <layout class="QGridLayout" name="lay3"> + <item row="4" column="0"> + <widget class="QLabel" name="l9"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="l8"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="l10"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="5" column="2"> + <widget class="QComboBox" name="cb4"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLineEdit" name="le7"/> + </item> + <item row="4" column="2"> + <widget class="QComboBox" name="cb3"/> + </item> + <item row="6" column="2"> + <widget class="QLineEdit" name="le8"/> + </item> + <item row="3" column="3"> + <widget class="QLabel" name="u3"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <widget class="QPushButton" name="pushButton_2"> + <property name="geometry"> + <rect> + <x>10</x> + <y>220</y> + <width>331</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Results</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout_3"/> + </widget> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/DockWidgets/DockWidgetFlash.py b/DockWidgets/DockWidgetFlash.py new file mode 100644 index 0000000..6098b27 --- /dev/null +++ b/DockWidgets/DockWidgetFlash.py @@ -0,0 +1,74 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from ComponentSelector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetFlash.ui') + +class DockWidgetFlash(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.input_dict = [] + print("constructor ", self.input_dict) + self.input_params_list() + self.btn.clicked.connect(self.param) + self.dict = [] + + def input_params_list(self): + try: + print("input_params_list ", self.input_dict) + + self.l1.setText(self.obj.variables['thermoPackage']['name']+":") + self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')] + for j in self.lines: + self.cb1.addItem(str(j)) + + self.check1.setText(self.obj.variables['Tdef']['name']+":") + self.le2.setText(str(self.obj.variables['Tdef']['value'])) + self.u2.setText(self.obj.variables['Tdef']['unit']) + self.check1.toggled.connect(self.fun) + self.check2.setText(self.obj.variables['Pdef']['name']+":") + self.le3.setText(str(self.obj.variables['Pdef']['value'])) + self.u3.setText(self.obj.variables['Pdef']['unit']) + self.check2.toggled.connect(self.fun) + + self.input_dict = [self.cb1, self.check1, self.le2, self.check2, self.le3] + + except Exception as e: + print(e) + + def fun(self): + if self.check1.isChecked(): + self.le2.setDisabled(False) + else: + self.le2.setDisabled(True) + if self.check2.isChecked(): + self.le3.setDisabled(False) + else: + self.le3.setDisabled(True) + + def show_error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict={} + print("param.input_dict ", self.input_dict) + self.dict = [self.input_dict[0].currentText(),self.input_dict[1].isChecked(), float(self.input_dict[2].text()), self.input_dict[3].isChecked(), float(self.input_dict[4].text())] + print("param ", self.dict) + self.obj.param_setter(self.dict) + self.hide() + + except Exception as e: + print(e)
\ No newline at end of file diff --git a/DockWidgets/DockWidgetFlash.ui b/DockWidgets/DockWidgetFlash.ui new file mode 100644 index 0000000..c781aa6 --- /dev/null +++ b/DockWidgets/DockWidgetFlash.ui @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>392</width> + <height>700</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>3200</width> + <height>5000</height> + </size> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <widget class="QGroupBox" name="groupBox"> + <property name="geometry"> + <rect> + <x>10</x> + <y>40</y> + <width>341</width> + <height>141</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="autoFillBackground"> + <bool>true</bool> + </property> + <property name="styleSheet"> + <string notr="true">Q</string> + </property> + <property name="title"> + <string>Calculation Parameters</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="2" column="2"> + <widget class="QLineEdit" name="le3"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QLabel" name="u3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="le2"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QLabel" name="u2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="l1"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="check2"> + <property name="text"> + <string>CheckBox</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QComboBox" name="cb1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="check1"> + <property name="text"> + <string>CheckBox</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QPushButton" name="btn"> + <property name="geometry"> + <rect> + <x>10</x> + <y>190</y> + <width>341</width> + <height>23</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/DockWidgetMatStm.py b/DockWidgets/DockWidgetMaterialStream.py index 76ecb11..78959fc 100644 --- a/DockWidgetMatStm.py +++ b/DockWidgets/DockWidgetMaterialStream.py @@ -4,13 +4,13 @@ from PyQt5.QtGui import * from PyQt5.uic import loadUiType import pandas as pd from functools import partial -from component_selector import * +from ComponentSelector import * from collections import defaultdict from Graphics import * -ui_dialog,_ = loadUiType('DockWidgetMatStm.ui') +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetMaterialStream.ui') -class DockWidgetMatStm(QDockWidget,ui_dialog): +class DockWidgetMaterialStream(QDockWidget,ui_dialog): def __init__(self,name,comptype,obj,container,parent=None): QDockWidget.__init__(self,parent) @@ -19,16 +19,16 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): self.name=name self.obj=obj self.type = comptype - self.inputdict = {} + self.input_dict = {} self.x_pclist = [] self.modes() - self.comboBox.currentIndexChanged.connect(self.modeSelection) + self.comboBox.currentIndexChanged.connect(self.mode_selection) - print("constructor ", self.inputdict) + print("constructor ", self.input_dict) self.pushButton_2.clicked.connect(self.param) self.dict = {} - self.nameType = None + self.name_type = None self.container = container header = QTreeWidgetItem(['Compound','Value','Unit']) @@ -41,36 +41,36 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): self.vTreeWidget.itemClicked.connect(lambda : self.printer(self.vTreeWidget.currentItem())) - def printer(self, treeItem ): - foldername = treeItem.text(0) - comment = treeItem.text(1) - data = treeItem.text(2) - print(foldername , ': ' , comment , ' (' + data + ')') + # def printer(self, treeItem ): + # foldername = treeItem.text(0) + # comment = treeItem.text(1) + # data = treeItem.text(2) + # print(foldername , ': ' , comment , ' (' + data + ')') # input data tab def modes(self): - modesList = self.obj.modesList - if(modesList): - for j in modesList: + modes_list = self.obj.modes_list + if(modes_list): + for j in modes_list: self.comboBox.addItem(str(j)) - self.modeSelection() + self.mode_selection() else: - self.inputdict= {} - self.inputdict = self.obj.paramgetter() - self.inputparamslist() + self.input_dict= {} + self.input_dict = self.obj.param_getter() + self.input_params_list() - def modeSelection(self): - self.inputdict= {} + def mode_selection(self): + self.input_dict= {} for i in reversed(range(self.formLayout.count())): self.formLayout.removeRow(i) - self.inputdict = self.obj.paramgetter(self.comboBox.currentText()) - self.inputparamslist() + self.input_dict = self.obj.param_getter(self.comboBox.currentText()) + self.input_params_list() - def inputparamslist(self): + def input_params_list(self): try: - print("inputparamslist ", self.inputdict) - for c,i in enumerate(self.inputdict): - if(i=="thermoPackage"): + print("input_params_list ", self.input_dict) + for c,i in enumerate(self.input_dict): + if(i=="thermo_package"): print("thermo1") combo = QComboBox() self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')] @@ -81,7 +81,7 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft) lay.addWidget(combo, 0, 1, alignment=Qt.AlignRight) self.formLayout.addRow(lay) - self.inputdict[i] = combo + self.input_dict[i] = combo print("thermo") elif(i=="condType"): combo = QComboBox() @@ -92,7 +92,7 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): lay.addWidget(QLabel("Condensor Type :"+":"), 0, 0, alignment=Qt.AlignLeft) lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter) self.formLayout.addRow(lay) - self.inputdict[i] = combo + self.input_dict[i] = combo elif(i=="x_pc"): noc = len(compound_selected) print(noc) @@ -102,9 +102,9 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): lay = QGridLayout() for j in range(noc): l = QLineEdit() - if self.inputdict[i] != '': + if self.input_dict[i] != '': l.setText(str(self.obj.variables[compound_selected[j]]['value'])) - self.inputdict[i] = "x_pc" + self.input_dict[i] = "x_pc" lay.addWidget(QLabel(str(compound_selected[j])+":"),j,0, alignment=Qt.AlignLeft) lay.addWidget(l,j,1, alignment=Qt.AlignCenter) self.x_pclist.append(l) @@ -114,8 +114,8 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): else: print("elseloop") l = QLineEdit() - if self.inputdict[i] != None: - l.setText(str(self.inputdict[i])) + if self.input_dict[i] != None: + l.setText(str(self.input_dict[i])) lay = QGridLayout() lay.addWidget(QLabel(i+":"),0,0, alignment=Qt.AlignLeft) lay.addWidget(l,0,1, alignment=Qt.AlignCenter) @@ -124,31 +124,31 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): else: lay.addWidget(QLabel("mol/s"),0,2, alignment=Qt.AlignCenter) self.formLayout.addRow(lay) - self.inputdict[i] = l + self.input_dict[i] = l except Exception as e: print(e) - def Show_Error(self): + def show_error(self): QMessageBox.about(self, 'Important', "Please fill all fields with data") def param(self): try: self.dict={} - print("param.inputdict ", self.inputdict) - for i in self.inputdict: - if(i=="thermoPackage"): - if (self.inputdict[i].currentText()): - self.dict[i] = self.inputdict[i].currentText() + print("param.input_dict ", self.input_dict) + for i in self.input_dict: + if(i=="thermo_package"): + if (self.input_dict[i].currentText()): + self.dict[i] = self.input_dict[i].currentText() else: - self.Show_Error() + self.show_error() break elif(i=="condType"): - if (self.inputdict[i].currentText()): - self.dict[i] = self.inputdict[i].currentText() + if (self.input_dict[i].currentText()): + self.dict[i] = self.input_dict[i].currentText() else: - self.Show_Error() + self.show_error() break elif(i =="x_pc"): l=[] @@ -159,7 +159,7 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): l.append(mol_frac.text()) total_moles += float(l[-1]) else: - self.Show_Error() + self.show_error() break for c in range(len(compound_selected)): mf.append(str(float(l[c])/total_moles)) @@ -167,15 +167,15 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): self.x_pclist[c].setText(mf[-1]) self.dict[i] = ",".join(mf) else: - if (self.inputdict[i].text()): - self.dict[i] = self.inputdict[i].text() + if (self.input_dict[i].text()): + self.dict[i] = self.input_dict[i].text() else: - print(self.inputdict[i].text()) - self.Show_Error() + print(self.input_dict[i].text()) + self.show_error() break print("param ", self.dict) - self.obj.paramsetter(self.dict) + self.obj.param_setter(self.dict) self.hide() except Exception as e: @@ -183,19 +183,19 @@ class DockWidgetMatStm(QDockWidget,ui_dialog): @staticmethod - def showResult(lst): + def show_result(lst): #DockWidget1.flag = True for i in lst: - i.resultsCategory(i.name) + i.results_category(i.name) #i.show() # result data tab - def resultsCategory(self,name): + def results_category(self,name): flag = True try: print("Under result category name ", name) result=self.container.result - obj = self.container.fetchObject(name) + obj = self.container.fetch_object(name) d = {"Mole Fraction":"x_pc", "Mass Fraction":"xm_pc", "Mole Flow":"F_pc", "Mass Flow":"Fm_pc"} lst = list(d.keys()) diff --git a/DockWidgetMatStm.ui b/DockWidgets/DockWidgetMaterialStream.ui index 8995ba6..8995ba6 100644 --- a/DockWidgetMatStm.ui +++ b/DockWidgets/DockWidgetMaterialStream.ui diff --git a/DockWidgets/DockWidgetMixer.py b/DockWidgets/DockWidgetMixer.py new file mode 100644 index 0000000..28cbff0 --- /dev/null +++ b/DockWidgets/DockWidgetMixer.py @@ -0,0 +1,61 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from ComponentSelector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetMixer.ui') + +class DockWidgetMixer(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.input_dict = [] + self.x_pclist = [] + print("constructor ", self.input_dict) + self.input_params_list() + self.btn.clicked.connect(self.param) + self.dict = {} + + # input data tab + def input_params_list(self): + try: + print("input_params_list ", self.input_dict) + + self.l1.setText(self.obj.variables['NI']['name']+":") + self.le1.setText(str(self.obj.variables['NI']['value'])) + self.u1.setText(self.obj.variables['NI']['unit']) + for i in self.obj.Pout_modes: + self.cb2.addItem(str(i)) + + self.l2.setText(self.obj.variables['outPress']['name']+":") + + + self.input_dict = [self.le1, self.cb2] + + except Exception as e: + print(e) + + def show_error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict={} + print("param.input_dict ", self.input_dict) + self.dict = [int(self.input_dict[0].text()),self.input_dict[1].currentText()] + print("param ", self.dict) + self.obj.param_setter(self.dict) + self.hide() + + except Exception as e: + print(e)
\ No newline at end of file diff --git a/DockWidgets/DockWidgetMixer.ui b/DockWidgets/DockWidgetMixer.ui new file mode 100644 index 0000000..e039490 --- /dev/null +++ b/DockWidgets/DockWidgetMixer.ui @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>392</width> + <height>700</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>3200</width> + <height>5000</height> + </size> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <widget class="QGroupBox" name="groupBox"> + <property name="geometry"> + <rect> + <x>10</x> + <y>40</y> + <width>341</width> + <height>101</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="autoFillBackground"> + <bool>true</bool> + </property> + <property name="title"> + <string>Calculation Parameters</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="3"> + <widget class="QLabel" name="u1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QComboBox" name="cb2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="l1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="le1"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="l2"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QPushButton" name="btn"> + <property name="geometry"> + <rect> + <x>10</x> + <y>150</y> + <width>341</width> + <height>23</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/DockWidgets/DockWidgetShortcutColumn.py b/DockWidgets/DockWidgetShortcutColumn.py new file mode 100644 index 0000000..af81441 --- /dev/null +++ b/DockWidgets/DockWidgetShortcutColumn.py @@ -0,0 +1,97 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from ComponentSelector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetShortcutColumn.ui') + +class DockWidgetShortcutColumn(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.input_dict = [] + print("constructor ", self.input_dict) + self.input_params_list() + self.btn.clicked.connect(self.param) + self.dict = [] + + self.name_type = None + self.container = container + + # input data tab + def input_params_list(self): + try: + print("input_params_list ", self.input_dict) + + self.l1.setText(self.obj.variables['HKey']['name']+":") + print(self.obj.compounds) + for i in self.obj.compounds: + self.cb1.addItem(str(i)) + self.cb2.addItem(str(i)) + + self.l2.setText(self.obj.variables['LKey']['name']+":") + + self.l3.setText(self.obj.variables['HKey_x_pc']['name']+":") + self.le3.setText(str(self.obj.variables['HKey_x_pc']['value'])) + self.u3.setText(self.obj.variables['HKey_x_pc']['unit']) + self.l4.setText(self.obj.variables['LKey_x_pc']['name']+":") + self.u4.setText(self.obj.variables['LKey_x_pc']['unit']) + self.le4.setText(str(self.obj.variables['LKey_x_pc']['value'])) + + self.l5.setText(self.obj.variables['Ctype']['name']+":") + self.cb5.addItem('Total') + self.cb5.addItem('Partial') + + self.l6.setText(self.obj.variables['Pcond']['name']+":") + self.le6.setText(str(self.obj.variables['Pcond']['value'])) + self.u6.setText(self.obj.variables['Pcond']['unit']) + self.l7.setText(self.obj.variables['Preb']['name']+":") + self.u7.setText(self.obj.variables['Preb']['unit']) + self.le7.setText(str(self.obj.variables['Preb']['value'])) + + self.l8.setText(self.obj.variables['RR']['name']+":") + self.le8.setText(str(self.obj.variables['RR']['value'])) + + self.input_dict = [self.cb1, self.cb2, self.le3, self.le4, self.cb5, self.le6, self.le7, self.le8] + + except Exception as e: + print(e) + + def show_error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict=[] + print("param.input_dict ", self.input_dict) + self.dict = [self.input_dict[0].currentText(),self.input_dict[1].currentText(),float(self.input_dict[2].text()), float(self.input_dict[3].text()), + self.input_dict[4].currentText(), float(self.input_dict[5].text()), float(self.input_dict[6].text()), float(self.input_dict[7].text())] + + print("param ", self.dict) + self.obj.param_setter(self.dict) + self.hide() + + except Exception as e: + print(e) + + + @staticmethod + def show_result(lst): + #DockWidget1.flag = True + for i in lst: + i.resultsCategory(i.name) + #i.show() + + # result data tab + def results_category(self,name): + pass
\ No newline at end of file diff --git a/DockWidgets/DockWidgetShortcutColumn.ui b/DockWidgets/DockWidgetShortcutColumn.ui new file mode 100644 index 0000000..c66e699 --- /dev/null +++ b/DockWidgets/DockWidgetShortcutColumn.ui @@ -0,0 +1,295 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>392</width> + <height>700</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>3200</width> + <height>5000</height> + </size> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <widget class="QTabWidget" name="tabWidget"> + <property name="geometry"> + <rect> + <x>10</x> + <y>40</y> + <width>351</width> + <height>321</height> + </rect> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Input Data</string> + </attribute> + <widget class="QGroupBox" name="groupBox"> + <property name="geometry"> + <rect> + <x>8</x> + <y>13</y> + <width>331</width> + <height>237</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Calculation Parameters</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="4" column="2"> + <widget class="QComboBox" name="cb5"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="l4"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="3" column="3"> + <widget class="QLabel" name="u4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="l1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QLabel" name="u3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="l3"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLineEdit" name="le3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="l5"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="l6"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="l2"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="5" column="2"> + <widget class="QLineEdit" name="le6"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="6" column="0"> + <widget class="QLabel" name="l7"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="6" column="3"> + <widget class="QLabel" name="u7"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QComboBox" name="cb2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLineEdit" name="le4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="5" column="3"> + <widget class="QLabel" name="u6"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="6" column="2"> + <widget class="QLineEdit" name="le7"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="7" column="0"> + <widget class="QLabel" name="l8"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="7" column="2"> + <widget class="QLineEdit" name="le8"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QComboBox" name="cb1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QPushButton" name="btn"> + <property name="geometry"> + <rect> + <x>10</x> + <y>250</y> + <width>331</width> + <height>23</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Results</string> + </attribute> + </widget> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/DockWidgets/DockWidgetSplitter.py b/DockWidgets/DockWidgetSplitter.py new file mode 100644 index 0000000..262bd45 --- /dev/null +++ b/DockWidgets/DockWidgetSplitter.py @@ -0,0 +1,78 @@ +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.uic import loadUiType +import pandas as pd +from functools import partial +from ComponentSelector import * +from collections import defaultdict +from Graphics import * + +ui_dialog,_ = loadUiType('DockWidgets/DockWidgetSplitter.ui') + +class DockWidgetSplitter(QDockWidget,ui_dialog): + + def __init__(self,name,comptype,obj,container,parent=None): + QDockWidget.__init__(self,parent) + self.setupUi(self) + self.setWindowTitle(obj.name) + self.name=name + self.obj=obj + self.type = comptype + self.input_dict = [] + print("constructor ", self.input_dict) + self.input_params_list() + self.btn.clicked.connect(self.param) + self.dict = {} + + # input data tab + def input_params_list(self): + try: + print("input_params_list ", self.input_dict) + + self.l1.setText(self.obj.variables['NOO']['name']+":") + self.le1.setText(str(self.obj.variables['NOO']['value'])) + self.u1.setText(self.obj.variables['NOO']['unit']) + + for i in self.obj.CalcType_modes: + self.cb2.addItem(str(i)) + + self.l2.setText(self.obj.variables['CalcType']['name']+":") + + self.l3.setText("Stream 1 :") + self.u3.setText('') + self.l4.setText("Stream 2 :") + self.u4.setText('') + self.cb2.currentIndexChanged.connect(self.fun) + + + self.input_dict = [self.le1, self.cb2, self.le3, self.le4] + + except Exception as e: + print(e) + + def fun(self): + if self.cb2.currentText() == 'Mole Flow Specs': + self.u3.setText('mol/s') + self.u4.setText('mol/s') + elif self.cb2.currentText() == 'Mass Flow Specs': + self.u3.setText('kg/s') + self.u4.setText('kg/s') + else: + self.u3.setText('') + self.u4.setText('') + + def show_error(self): + QMessageBox.about(self, 'Important', "Please fill all fields with data") + + def param(self): + try: + self.dict={} + print("param.input_dict ", self.input_dict) + self.dict = [int(self.input_dict[0].text()),self.input_dict[1].currentText(), float(self.input_dict[2].text()), float(self.input_dict[3].text())] + print("param ", self.dict) + self.obj.param_setter(self.dict) + self.hide() + + except Exception as e: + print(e) diff --git a/DockWidgets/DockWidgetSplitter.ui b/DockWidgets/DockWidgetSplitter.ui new file mode 100644 index 0000000..02a865e --- /dev/null +++ b/DockWidgets/DockWidgetSplitter.ui @@ -0,0 +1,200 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>392</width> + <height>700</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>3200</width> + <height>5000</height> + </size> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <widget class="QGroupBox" name="groupBox"> + <property name="geometry"> + <rect> + <x>10</x> + <y>40</y> + <width>341</width> + <height>161</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="autoFillBackground"> + <bool>true</bool> + </property> + <property name="styleSheet"> + <string notr="true">Q</string> + </property> + <property name="title"> + <string>Calculation Parameters</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="0"> + <widget class="QLabel" name="l2"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="l1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="le1"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="l3"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLineEdit" name="le3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QComboBox" name="cb2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLabel" name="u1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="l4"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLineEdit" name="le4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QLabel" name="u3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="3" column="3"> + <widget class="QLabel" name="u4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QPushButton" name="btn"> + <property name="geometry"> + <rect> + <x>10</x> + <y>210</y> + <width>341</width> + <height>23</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/DockWidgets/__pycache__/DockWidget.cpython-36.pyc b/DockWidgets/__pycache__/DockWidget.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..1d47765 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidget.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidget.cpython-37.pyc b/DockWidgets/__pycache__/DockWidget.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..80d0ae1 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidget.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..1101a8e --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..e5023b1 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..ec04f1f --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..0584a29 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..387b27b --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..7eaaef7 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..90799f7 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..a99f092 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..f3fd8b1 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..52a0ca1 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..a56884a --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..85449f8 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc diff --git a/DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..b0983a0 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc diff --git a/DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc Binary files differnew file mode 100644 index 0000000..19250d9 --- /dev/null +++ b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc diff --git a/Graphics.py b/Graphics.py index 467b628..0fa3306 100644 --- a/Graphics.py +++ b/Graphics.py @@ -10,101 +10,121 @@ from PyQt5.QtGui import QTextDocument ,QTextCursor ,QTextCharFormat ,QFont ,QPix from PyQt5.uic import loadUiType from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QGraphicsProxyWidget, QGraphicsObject, QGraphicsEllipseItem ,QGraphicsPixmapItem,QApplication, QGraphicsView, QGraphicsScene, QHBoxLayout, QWidget, QLabel -from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent +from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent, QIcon import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtWidgets -from component_selector import * -from DockWidget import * -from DockWidgetMatStm import * - +from ComponentSelector import * +from DockWidgets.DockWidget import * +from DockWidgets.DockWidgetMaterialStream import * +from DockWidgets.DockWidgetDistillationColumn import * +from DockWidgets.DockWidgetShortcutColumn import * +from DockWidgets.DockWidgetMixer import * +from DockWidgets.DockWidgetSplitter import * +from DockWidgets.DockWidgetFlash import * +from DockWidgets.DockWidgetCompoundSeparator import * import datetime -from container import * -import container +from Container import * +import Container from Streams import * from UnitOperations import * class Graphics(QDialog, QtWidgets.QGraphicsItem): - def __init__(self, unitOp): + def __init__(self, unit_operations, graphicsView): QDialog.__init__(self) QtWidgets.QGraphicsItem.__init__(self) self.scene = QGraphicsScene() self.scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex) + self.graphicsView = graphicsView self.pos = None - self.unitOp = unitOp + self.unit_operations = unit_operations - def getScene(self): + def get_scene(self): return self.scene - def getComponentSelector(self): - return componentSelector(self) + def get_component_selector(self): + return ComponentSelector(self) - def createNodeItem(self,unitOpr, container): - return NodeItem(unitOpr, container) + def create_node_item(self,unit_operation, container): + print("in create node item function") + return NodeItem(unit_operation, container, self.graphicsView) - def boundingRect(self): - return QtCore.QRectF(self.rect) + # def boundingRect(self): + # return QtCore.QRectF(self.rect) - def loadCanvas(self, obj): + def load_canvas(self, obj, container): stm = ['MaterialStream','EngStm'] - + print('in load canvas') compounds = obj[-1] obj.pop() - componentSelector.setCompounds(compounds) + ComponentSelector.set_compounds(compounds) for i in obj: - if(i in self.unitOp): + print("in for loop", i) + if(i in self.unit_operations): pass else: - self.unitOp.append(i) - new_box = self.createNodeItem(i, self) + self.unit_operations.append(i) + print(self.unit_operations) + new_box = self.create_node_item(i, container) + print('after createing node item') new_box.setPos(i.pos.toPoint().x(), i.pos.toPoint().y()) self.scene.addItem(new_box) for i in obj: + print('in i obj line') if i.type == "MaterialStream": - eval(i.type).counter += 1 + print('in i obj line in if') + # print(eval(i.type)) + # eval(i.type).counter += 1 + # print(eval(i.type).counter) elif i.type not in stm: - eval(i.type).counter += 1 - ip = i.InputStms - op = i.OutputStms + print('in i obj line in else') + ip = i.input_stms + op = i.output_stms + print(ip) + print(op) + # print(eval(i.type)) + # eval(i.type).counter += 1 + # print(eval(i.type).counter) for j in ip: - pointA = NodeItem.getInstances(j.name) - pointB = NodeItem.getInstances(i.name) - rect = pointA.Output[0].boundingRect() + print('in j in ip') + pointA = NodeItem.get_instances(j.name) + pointB = NodeItem.get_instances(i.name) + rect = pointA.output[0].boundingRect() pointAA = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2) - pointAA = pointA.Output[0].mapToScene(pointAA) - rectB = pointB.Input[0].boundingRect() + pointAA = pointA.output[0].mapToScene(pointAA) + rectB = pointB.input[0].boundingRect() pointBB = QtCore.QPointF(rectB.x() + rectB.width()/2, rectB.y() + rectB.height()/2) - pointBB = pointB.Input[0].mapToScene(pointBB) + pointBB = pointB.input[0].mapToScene(pointBB) self.new_line = NodeLine(pointAA, pointBB, 'in') - self.new_line.source = pointA.Output[0] - self.new_line.target = pointB.Input[0] - pointA.Output[0].outLines.append(self.new_line) - pointB.Input[0].inLines.append(self.new_line) - pointA.Output[0].otherLine = self.new_line - pointB.Input[0].otherLine = self.new_line + self.new_line.source = pointA.output[0] + self.new_line.target = pointB.input[0] + pointA.output[0].out_lines.append(self.new_line) + pointB.input[0].in_lines.append(self.new_line) + pointA.output[0].other_line = self.new_line + pointB.input[0].other_line = self.new_line self.scene.addItem(self.new_line) self.new_line.updatePath() for k in op: - pointA = NodeItem.getInstances(i.name) - pointB = NodeItem.getInstances(k.name) - rect = pointA.Output[0].boundingRect() + pointA = NodeItem.get_instances(i.name) + pointB = NodeItem.get_instances(k.name) + rect = pointA.output[0].boundingRect() pointAA = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2) - pointAA = pointA.Output[0].mapToScene(pointAA) - rectB = pointB.Input[0].boundingRect() + pointAA = pointA.output[0].mapToScene(pointAA) + rectB = pointB.input[0].boundingRect() pointBB = QtCore.QPointF(rectB.x() + rectB.width()/2, rectB.y() + rectB.height()/2) - pointBB = pointB.Input[0].mapToScene(pointBB) + pointBB = pointB.input[0].mapToScene(pointBB) self.new_line = NodeLine(pointAA, pointBB, 'out') - self.new_line.source = pointA.Output[0] - self.new_line.target = pointB.Input[0] - pointA.Output[0].outLines.append(self.new_line) - pointB.Input[0].inLines.append(self.new_line) - pointA.Output[0].otherLine = self.new_line - pointB.Input[0].otherLine = self.new_line + self.new_line.source = pointA.output[0] + self.new_line.target = pointB.input[0] + pointA.output[0].out_lines.append(self.new_line) + pointB.input[0].in_lines.append(self.new_line) + pointA.output[0].other_line = self.new_line + pointB.input[0].other_line = self.new_line self.scene.addItem(self.new_line) self.new_line.updatePath() @@ -118,11 +138,11 @@ class NodeLine(QtWidgets.QGraphicsPathItem): self._source = None self._target = None self.setZValue(-1) - self.setBrush(QtGui.QColor(0,0,255,255)) + self.setBrush(QtGui.QColor(0,70,70,120)) self.pen = QtGui.QPen() self.pen.setStyle(QtCore.Qt.SolidLine) - self.pen.setWidth(1) - self.pen.setColor(QtGui.QColor(0,0,255,255)) + self.pen.setWidth(2) + self.pen.setColor(QtGui.QColor(0,70,70,220)) self.setPen(self.pen) def updatePath(self): @@ -138,8 +158,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem): path.cubicTo(ctrl1_1, ctrl2_1, pt1) if abs(self.pointB.x()-midptx) > 150: - ctrl1_2 = QtCore.QPointF(midptx, self.pointB.y()) - ctrl2_2 = QtCore.QPointF(midptx, self.pointB.y()) + ctrl1_2 = QtCore.QPointF(midptx, self.pointA.y()) + ctrl2_2 = QtCore.QPointF(midptx, self.pointA.y()) pt2 = QtCore.QPointF(midptx , self.pointA.y()+100) path.cubicTo(ctrl1_2, ctrl2_2, pt2) path.moveTo(pt2) @@ -150,8 +170,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem): path.cubicTo(ctrl1_3, ctrl2_3, pt3) path.moveTo(pt3) - ctrl1_4 = QtCore.QPointF(self.pointB.x()-13, max(self.pointB.y(), self.pointA.y())-(abs(self.pointA.y()-self.pointB.y())/2)) - ctrl2_4 = QtCore.QPointF(self.pointB.x()-13, max(self.pointB.y(), self.pointA.y())-(abs(self.pointA.y()-self.pointB.y())/2)) + ctrl1_4 = QtCore.QPointF(self.pointB.x()-13, self.pointA.y()+100) + ctrl2_4 = QtCore.QPointF(self.pointB.x()-13, self.pointA.y()+100) pt4 = QtCore.QPointF(self.pointB.x()-13, self.pointB.y()) path.cubicTo(ctrl1_4, ctrl2_4, pt4) path.moveTo(pt4) @@ -165,8 +185,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem): self.setPath(path) return else: - ctrl1_2 = QtCore.QPointF(midptx, self.pointB.y()) - ctrl2_2 = QtCore.QPointF(midptx, self.pointB.y()) + ctrl1_2 = QtCore.QPointF(midptx, self.pointA.y()) + ctrl2_2 = QtCore.QPointF(midptx, self.pointA.y()) pt2 = QtCore.QPointF(midptx , max(self.pointB.y(), self.pointA.y())-(abs(self.pointA.y()-self.pointB.y())/2)) path.cubicTo(ctrl1_2, ctrl2_2, pt2) path.moveTo(pt2) @@ -202,8 +222,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem): path.cubicTo(ctrl1_1, ctrl2_1, pt1) path.moveTo(pt1) - ctrl1_2 = QtCore.QPointF(midptx, self.pointB.y()) - ctrl2_2 = QtCore.QPointF(midptx, self.pointB.y()) + ctrl1_2 = QtCore.QPointF(midptx, self.pointA.y()) + ctrl2_2 = QtCore.QPointF(midptx, self.pointA.y()) pt2 = QtCore.QPointF(midptx , self.pointB.y()) path.cubicTo(ctrl1_2, ctrl2_2, pt2) path.moveTo(pt2) @@ -264,22 +284,23 @@ class NodeSocket(QtWidgets.QGraphicsItem): self.rect = rect self.type = socketType self.parent=parent - self.newLine=None - self.otherLine=None + self.setAcceptHoverEvents(True) + self.new_line=None + self.other_line=None # Brush. self.brush = QtGui.QBrush() self.brush.setStyle(QtCore.Qt.SolidPattern) - self.brush.setColor(QtGui.QColor(180,20,90,255)) + self.brush.setColor(QtGui.QColor(220,220,220,220)) #180,20,90,255 # Pen. self.pen = QtGui.QPen() self.pen.setStyle(QtCore.Qt.SolidLine) self.pen.setWidth(1) - self.pen.setColor(QtGui.QColor(20,20,20,255)) + self.pen.setColor(QtGui.QColor(0,70,70,255)) #20,20,20,255 # Lines. - self.outLines = [] - self.inLines = [] + self.out_lines = [] + self.in_lines = [] def shape(self): path = QtGui.QPainterPath() @@ -295,159 +316,199 @@ class NodeSocket(QtWidgets.QGraphicsItem): painter.drawEllipse(self.rect) def mousePressEvent(self, event): + cursor = QCursor( Qt.PointingHandCursor ) + QApplication.instance().setOverrideCursor(cursor) + if self.type == 'op': rect = self.boundingRect() pointA = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2) pointA = self.mapToScene(pointA) pointB = self.mapToScene(event.pos()) - self.newLine = NodeLine(pointA, pointB ,'op') - self.outLines.append(self.newLine) - self.scene().addItem(self.newLine) + self.new_line = NodeLine(pointA, pointB ,'op') + self.out_lines.append(self.new_line) + self.scene().addItem(self.new_line) elif self.type == 'in': rect = self.boundingRect() pointA = self.mapToScene(event.pos()) pointB = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2) pointB = self.mapToScene(pointB) - self.newLine = NodeLine(pointA, pointB, 'in') - self.inLines.append(self.newLine) - self.scene().addItem(self.newLine) + self.new_line = NodeLine(pointA, pointB, 'in') + self.in_lines.append(self.new_line) + self.scene().addItem(self.new_line) else: super(NodeSocket, self).mousePressEvent(event) def mouseMoveEvent(self, event): + if self.type == 'op': pointB = self.mapToScene(event.pos()) - self.newLine.pointB = pointB - if self.otherLine: - self.otherLine.pointB=pointB + self.new_line.pointB = pointB + if self.other_line: + self.other_line.pointB=pointB elif self.type == 'in': pointA = self.mapToScene(event.pos()) - self.newLine.pointA = pointA - if self.otherLine: - self.otherLine.pointA=pointA + self.new_line.pointA = pointA + if self.other_line: + self.other_line.pointA=pointA else: super(NodeSocket, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): + cursor = QCursor( Qt.ArrowCursor ) + QApplication.instance().setOverrideCursor(cursor) + item = self.scene().itemAt(event.scenePos().toPoint(),QtGui.QTransform()) stm = ['MaterialStream','EngStm'] - item.otherLine=self.newLine + item.other_line=self.new_line if (self.type == 'op') and (item.type == 'in'): - self.newLine.source = self - self.newLine.target = item - item.inLines.append(self.newLine) - self.newLine.pointB = item.getCenter() - if self.newLine.source.parent.obj.type not in stm: - self.newLine.source.parent.obj.add_connection(0,self.newLine.target.parent.obj) - if self.newLine.target.parent.obj.type not in stm: - self.newLine.target.parent.obj.add_connection(1,self.newLine.source.parent.obj) # Input stream if flag is 1 + self.new_line.source = self + self.new_line.target = item + item.in_lines.append(self.new_line) + self.new_line.pointB = item.get_center() + if self.new_line.source.parent.obj.type not in stm: + self.new_line.source.parent.obj.add_connection(0,self.new_line.target.parent.obj) + if self.new_line.target.parent.obj.type not in stm: + self.new_line.target.parent.obj.add_connection(1,self.new_line.source.parent.obj) # Input stream if flag is 1 + elif (self.type =='in') and (item.type == 'op'): - self.newLine.source = item - self.newLine.target = self - item.outLines.append(self.newLine) - self.newLine.pointA = item.getCenter() - if self.newLine.source.parent.obj.type not in stm: - self.newLine.source.parent.obj.add_connection(0,self.newLine.target.parent.obj) - if self.newLine.target.parent.obj.type not in stm: - self.newLine.target.parent.obj.add_connection(1,self.newLine.source.parent.obj) + self.new_line.source = item + self.new_line.target = self + item.out_lines.append(self.new_line) + self.new_line.pointA = item.get_center() + if self.new_line.source.parent.obj.type not in stm: + self.new_line.source.parent.obj.add_connection(0,self.new_line.target.parent.obj) + if self.new_line.target.parent.obj.type not in stm: + self.new_line.target.parent.obj.add_connection(1,self.new_line.source.parent.obj) + else: - self.scene().removeItem(self.newLine) - if(self.newLine in self.inLines): - self.inLines.remove(self.newLine) - if(self.newLine in self.outLines): - self.outLines.remove(self.newLine) - del self.newLine + self.scene().removeItem(self.new_line) + if(self.new_line in self.in_lines): + self.in_lines.remove(self.new_line) + if(self.new_line in self.out_lines): + self.out_lines.remove(self.new_line) + del self.new_line super(NodeSocket, self).mouseReleaseEvent(event) try: - data = container.get_last_list('Undo') + data = Container.get_last_list('Undo') comp_selected = data[-1] data.remove(comp_selected) for i in range(len(data)): - if data[i].name == self.newLine.source.parent.obj.name: - data[i] = self.newLine.source.parent.obj - elif data[i].name == self.newLine.target.parent.obj.name: - data[i] = self.newLine.target.parent.obj + if data[i].name == self.new_line.source.parent.obj.name: + data[i] = self.new_line.source.parent.obj + elif data[i].name == self.new_line.target.parent.obj.name: + data[i] = self.new_line.target.parent.obj data.append(comp_selected) - container.PUSH('Undo', data) + Container.push('Undo', data) except Exception as e: print(e) - def getCenter(self): + def get_center(self): rect = self.boundingRect() center = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2) center = self.mapToScene(center) return center + + def hoverEnterEvent(self, event): + print("in hover enter") + cursor = QCursor( Qt.CrossCursor ) + QApplication.instance().setOverrideCursor(cursor) + + def hoverLeaveEvent(self, event): + cursor = QCursor( Qt.ArrowCursor ) + QApplication.instance().setOverrideCursor(cursor) # all created node items will be put inside this list # it is used for recreating the node lines by returning the node item object based on unit operation object's name lst = [] -dockWidgetLst = [] +dock_widget_lst = [] +stack = [] class NodeItem(QtWidgets.QGraphicsItem): @staticmethod - def getInstances(namee): + def get_instances(namee): for i in lst: if i.name == namee: return i @staticmethod - def getDockWidget(): - return dockWidgetLst + def get_dock_widget(): + return dock_widget_lst - def __init__(self,unitOpr, container): - l = ['Mixer','Splitter'] + def __init__(self,unit_operation, container, graphicsView): + l = ['Splitter','Mixer', 'DistillationColumn', 'Flash', 'CompoundSeparator', 'ShortcutColumn'] stm = ['MaterialStream', 'EnergyStream'] super(NodeItem, self).__init__() - - self.obj = unitOpr + print("in node item") + self.obj = unit_operation self.container = container + self.graphicsView = graphicsView self.name = self.obj.name self.type = self.obj.type + print('Before obj.modes_list') - default_tooltip = f"{self.name}\n\n" - default_tooltip_dict = self.obj.paramgetter(self.obj.modesList[0]) - for i, j in default_tooltip_dict.items(): - if j is not None: - default_tooltip = default_tooltip + f" {i} : {j}\n" - self.setToolTip(default_tooltip) + if (self.obj.modes_list): + default_tooltip = f"{self.name}\n\n" + default_tooltip_dict = self.obj.param_getter(self.obj.modes_list[0]) + for i, j in default_tooltip_dict.items(): + if j is not None: + default_tooltip = default_tooltip + f" {i} : {j}\n" + self.setToolTip(default_tooltip) self.nin = self.obj.no_of_inputs self.nop = self.obj.no_of_outputs - - self.dockWidget = None + print('Before mixer') + if self.obj.type == 'Mixer': + text, ok = QInputDialog.getText(self.container.graphicsView, 'Mixer', 'Enter number of input:') + if ok and text: + self.nin = int(text) + self.obj.no_of_inputs = self.nin + self.obj.variables['NI']['value'] = self.nin + elif self.obj.type == 'Splitter': + text, ok = QInputDialog.getText(self.container.graphicsView, 'Splitter', 'Enter number of output:') + if ok and text: + self.nop = int(text) + self.obj.no_of_outputs = self.nop + self.obj.variables['NOO']['value'] = self.nop + + self.dock_widget = None lst.append(self) + print("before DockWidget") + if self.obj.type in l: + self.dock_widget = eval("DockWidget"+self.obj.type)(self.obj.name,self.obj.type,self.obj,self.container) + elif self.obj.type in stm: + self.dock_widget = eval("DockWidget"+self.obj.type)(self.obj.name,self.obj.type,self.obj,self.container) + else: + self.dock_widget = DockWidget(self.obj.name,self.obj.type,self.obj,self.container) + print('in dockwidget') + dock_widget_lst.append(self.dock_widget) + self.main_window= findMainWindow(self) + self.dock_widget.setFixedWidth(360) + self.dock_widget.setFixedHeight(640) + self.dock_widget.DockWidgetFeature(QDockWidget.AllDockWidgetFeatures) + self.main_window.addDockWidget(Qt.LeftDockWidgetArea, self.dock_widget) + self.dock_widget.hide() + + print("after dockwidget") - if(self.obj.type not in l): - if (self.obj.type in stm): - self.dockWidget = DockWidgetMatStm(self.obj.name,self.obj.type,self.obj,self.container) - else: - self.dockWidget = DockWidget(self.obj.name,self.obj.type,self.obj,self.container) - dockWidgetLst.append(self.dockWidget) - self.mainwindow= findMainWindow(self) - self.dockWidget.setFixedWidth(360) - self.dockWidget.setFixedHeight(640) - self.dockWidget.DockWidgetFeature(QDockWidget.AllDockWidgetFeatures) - self.mainwindow.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget) - self.dockWidget.hide() - - self.pic=QtGui.QPixmap("icons/"+self.type+".png") + self.pic=QtGui.QPixmap("Icons/"+self.type+".png") + # self.pic = QIcon("svg/Cooler.svg") self.rect = QtCore.QRect(0,0,self.pic.width(),self.pic.height()) + # self.rect = QtCore.QRect(0,0,100,100) self.text = QGraphicsTextItem(self) f = QFont() f.setPointSize(8) self.text.setFont(f) - self.text.setDefaultTextColor(QtGui.QColor(73,36,73,255)) + self.text.setDefaultTextColor(QtGui.QColor(0,70,70,220)) self.text.setParentItem(self) - self.text.setPos(-2.5, self.rect.height()-15) + self.text.setPos(self.rect.width()-(self.rect.width()*0.9), self.rect.height()) self.text.setPlainText(self.name) self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsMovable) self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsSelectable) - self.initUi() # Brush self.brush = QtGui.QBrush() @@ -459,13 +520,15 @@ class NodeItem(QtWidgets.QGraphicsItem): self.pen.setWidth(1) self.pen.setColor(QtGui.QColor(20,20,20,255)) - self.selPen = QtGui.QPen() - self.selPen.setStyle(QtCore.Qt.SolidLine) - self.selPen.setWidth(2) - self.selPen.setColor(QtGui.QColor(222,192,222)) + self.sel_pen = QtGui.QPen() + self.sel_pen.setStyle(QtCore.Qt.SolidLine) + self.sel_pen.setWidth(1) + self.sel_pen.setColor(QtGui.QColor(220,220,220,255)) - def initUi(self): - self.Input , self.Output = self.initializeSockets(self.type) + # initializing the node sockets + self.input , self.output = self.initialize_sockets(self.type) + + print('after ndoe item') def shape(self): path = QtGui.QPainterPath() @@ -477,57 +540,63 @@ class NodeItem(QtWidgets.QGraphicsItem): def paint(self, painter, option, widget): if self.isSelected(): - painter.setPen(self.selPen) + painter.setPen(self.sel_pen) painter.drawRect(QtCore.QRectF(self.rect)) else: painter.setPen(self.pen) painter.drawPixmap(self.rect,self.pic) - - def initializeSockets(self,type): - if(self.type=="Flash" or self.type=="CompSep"): - Input = [NodeSocket(QtCore.QRect(-2.5+5.5,(self.rect.height()*x/(self.nin+1))-8,4,4), self, 'in') for x in range(1,self.nin+1) ] - Output = [NodeSocket(QtCore.QRect(self.rect.width()-7.5,(self.rect.height()*x*0.90/(self.nop+1))-4,4,4), self, 'op') for x in range(1,self.nop+1)] - return Input,Output + # painter.drawPixmap(self.rect, self.pic.pixmap(QSize(1000,1000))) + + def initialize_sockets(self,type): + print("inside initialization") + if(self.type=="Flash" or self.type=="CompoundSeparator"): + input = [NodeSocket(QtCore.QRect(5,(self.rect.height()*x/(self.nin+1)-2),4,4), self, 'in') for x in range(1,self.nin+1) ] + output = [NodeSocket(QtCore.QRect(self.rect.width()-9,(self.rect.height()*x*1/(self.nop+1)),4,4), self, 'op') for x in range(1,self.nop+1)] + return input,output elif(self.type=="AdiabaticCompressor" or self.type=="AdiabaticExpander" or self.type =="Mixer" or self.type =="Splitter" or self.type =="Valve" ): - Input = [NodeSocket(QtCore.QRect(-3.5,(self.rect.height()*x/(self.nin+1))-6,4,4), self, 'in') for x in range(1,self.nin+1) ] - Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nop+1))-6,4,4), self, 'op') for x in range(1,self.nop+1)] - return Input,Output + input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-2,4,4), self, 'in') for x in range(1,self.nin+1) ] + output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nop+1))-2,4,4), self, 'op') for x in range(1,self.nop+1)] + return input,output elif(self.type=="Cooler" or self.type=="Heater"): - Input = [NodeSocket(QtCore.QRect(3.5,(self.rect.height()*x/(self.nin+1))-4,4,4), self, 'in') for x in range(1,self.nin+1) ] - Output = [NodeSocket(QtCore.QRect(self.rect.width()-8.0,(self.rect.height()*x/(self.nop+1))-4,4,4), self, 'op') for x in range(1,self.nop+1)] - return Input,Output + input = [NodeSocket(QtCore.QRect(3.5,(self.rect.height()*x/(self.nin+1))-2,4,4), self, 'in') for x in range(1,self.nin+1) ] + output = [NodeSocket(QtCore.QRect(self.rect.width()-8.0,(self.rect.height()*x/(self.nop+1))-2,4,4), self, 'op') for x in range(1,self.nop+1)] + return input,output elif(self.type=="Pump"): - Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-10,4,4), self, 'in') for x in range(1,self.nin+1) ] - Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,-2.5,4,4), self, 'op') for x in range(1,self.nop+1)] - return Input,Output - elif(self.type=="DistCol" or self.type=="ShortCol"): - Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-12,5,5), self, 'in') for x in range(1,self.nin+1) ] - Output = [NodeSocket(QtCore.QRect(self.rect.width()-5.5,(self.rect.height()*1.44*x/(self.nop+1))-67,5,5), self, 'op') for x in range(1,self.nop+1)] - return Input,Output + input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-7, 4,4), self, 'in') for x in range(1,self.nin+1) ] + output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,-1.5,4,4), self, 'op') for x in range(1,self.nop+1)] + return input,output + elif(self.type=="DistillationColumn" or self.type=="ShortcutColumn"): + input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1)),5,5), self, 'in') for x in range(1,self.nin+1) ] + output = [NodeSocket(QtCore.QRect(self.rect.width()-5.5,(self.rect.height()*1.44*x/(self.nop+1))-55,5,5), self, 'op') for x in range(1,self.nop+1)] + return input,output elif(self.type=="MaterialStream"): - Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-1,4,4), self, 'in') for x in range(1,self.nin+1) ] - Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nin+1))-1,4,4), self, 'op') for x in range(1,self.nop+1)] - return Input,Output + input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1)-2),4,4), self, 'in') for x in range(1,self.nin+1) ] + output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nin+1)-2),4,4), self, 'op') for x in range(1,self.nop+1)] + return input,output def mouseMoveEvent(self, event): super(NodeItem, self).mouseMoveEvent(event) - for output in self.Output: - for line in output.outLines: - line.pointA = line.source.getCenter() - line.pointB = line.target.getCenter() - for input in self.Input: - for line in input.inLines: - line.pointA = line.source.getCenter() - line.pointB = line.target.getCenter() + for op in self.output: + for line in op.out_lines: + line.pointA = line.source.get_center() + line.pointB = line.target.get_center() + for ip in self.input: + for line in ip.in_lines: + line.pointA = line.source.get_center() + line.pointB = line.target.get_center() self.pos = event.scenePos() - self.obj.setPos(self.pos) + self.obj.set_pos(self.pos) #print(self.name, self.pos) def mouseDoubleClickEvent(self, event): - self.setPos(event.scenePos().x()-250,event.scenePos().y()) - temp = self.obj.pos - self.dockWidget.show() - self.setPos(temp) + + self.graphicsView.setInteractive(False) + if len(stack): + print(stack) + stack[-1].hide() + self.dock_widget.show() + stack.append(self.dock_widget) + self.graphicsView.setInteractive(True) def findMainWindow(self): diff --git a/OMChem/ConvReactor.py b/OMChem/ConvReactor.py index 9ad35da..9061294 100644 --- a/OMChem/ConvReactor.py +++ b/OMChem/ConvReactor.py @@ -8,12 +8,12 @@ class ConvReactor(): self.Z = str(Z) self.a = json.dumps(a).replace('[','{').replace(']','}') self.operation = str(operation) - self.Tdef = str(Tdef) self.name = name self.OM_data_eqn = '' self.OM_data_init = '' self.InputStms = [] - self.OutputStms = [] + self.OutputStms = [] self.Tdef = str(Tdef) + self.type = 'ConvReactor' self.EngStms = EngStms(name="EngStm") diff --git a/OMChem/Flowsheet.py b/OMChem/Flowsheet.py index 25143ce..ab271af 100644 --- a/OMChem/Flowsheet.py +++ b/OMChem/Flowsheet.py @@ -9,7 +9,7 @@ class Flowsheet(): def __init__(self): self.sim_name = 'Simulator' self.sim_method = '' - self.UnitOpn = [] + self.unit_operations = [] self.data = [] self.compounds = [] self.interface = '' @@ -19,7 +19,7 @@ class Flowsheet(): self.Flomo_path = os.path.join(self.sim_dir_path,'Flowsheet.mo') self.eqn_mos_path = os.path.join(self.sim_dir_path,'simulateEQN.mos') self.sm_mos_path = os.path.join(self.sim_dir_path,'simulateSM.mos') - self.resdata = [] + self.result_data = [] self.stdout=None self.stderr=None @@ -37,17 +37,17 @@ class Flowsheet(): print("The OpenModelica compiler is missing in the System path please install it" ) raise - def add_UnitOpn(self,unitop): - self.UnitOpn.append(unitop) + def add_unit_operations(self,unitop): + self.unit_operations.append(unitop) - def remove_UnitOpn(self,unitop): - self.UnitOpn.remove(unitop) + def remove_unit_operations(self,unitop): + self.unit_operations.remove(unitop) - def add_comp_list(self,C): + def add_compound_list(self,C): self.compounds = C - def send_for_simulationEqn(self): - self.resdata = [] + def send_for_simulation_Eqn(self): + self.result_data = [] self.omc_path = self.get_omc_path() print(self.omc_path) @@ -69,18 +69,18 @@ class Flowsheet(): csvpath = os.path.join(self.sim_dir_path,'Flowsheet_res.csv') print("csvPath",csvpath) with open (csvpath,'r') as resultFile: - self.resdata = [] + self.result_data = [] print("opened") csvreader = csv.reader(resultFile,delimiter=',') for row in csvreader: print("124125") - self.resdata.append(row) - print(self.resdata) - #self.ExtData() + self.result_data.append(row) + print(self.result_data) + #self.ext_data() - def send_for_simulationSM(self,unitop): + def send_for_simulation_SM(self,unitop): - self.resdata = [] + self.result_data = [] self.omc_path = self.get_omc_path() os.chdir(self.sim_dir_path) #os.system(self.omc_path + ' -s ' + unitop.name+'.mos') @@ -90,28 +90,28 @@ class Flowsheet(): #print(s) print("############### StdOut ################") print(stdout) - self.resdata = [] + self.result_data = [] print('Simulating '+unitop.name+'...') csvpath = os.path.join(self.sim_dir_path,unitop.name+'_res.csv') with open(csvpath,'r') as resultFile: csvreader = csv.reader(resultFile,delimiter=',') for row in csvreader: - self.resdata.append(row) - self.ExtData() + self.result_data.append(row) + self.ext_data() - def ExtData(self): - for unit in self.UnitOpn: + def ext_data(self): + for unit in self.unit_operations: if unit[0].type == 'MaterialStream': for key, value in unit[0].Prop.items(): - propertyname = unit[0].name + '.' + key - if propertyname in self.resdata[0]: - ind = self.resdata[0].index(propertyname) - resultval = str(self.resdata[-1][ind]) + property_name = unit[0].name + '.' + key + if property_name in self.result_data[0]: + ind = self.result_data[0].index(property_name) + resultval = str(self.result_data[-1][ind]) #resultval = str(omc.sendExpression("val("+unit.name+ "." + value + ", 0.5)")) print(resultval) unit[0].Prop[key] = resultval - def simulateEQN(self): + def simulate_EQN(self): self.data = [] print("##################################################") print("##################################################") @@ -123,7 +123,7 @@ class Flowsheet(): lcase = c.lower() self.data.append("parameter database." + ucase +' '+ ucase + "; \n") - for unitop in self.UnitOpn: + for unitop in self.unit_operations: if unitop.type != 'MaterialStream': self.data.append(unitop.OM_Flowsheet_Initialize()) else: @@ -134,13 +134,13 @@ class Flowsheet(): self.outlist = [] self.stm = ['MaterialStream','EngStm'] - for unitop in self.UnitOpn: + for unitop in self.unit_operations: if unitop.type not in self.stm: - for j in unitop.OutputStms: + for j in unitop.output_stms: self.outlist.append(j) print(j.name) - for unitop in self.UnitOpn: + for unitop in self.unit_operations: if unitop not in self.outlist: if unitop.type == 'MaterialStream': @@ -163,14 +163,14 @@ class Flowsheet(): print('Initiating Simulation in Equation Oriented Mode') - self.send_for_simulationEqn() + self.send_for_simulation_Eqn() - def simulateSM(self,ip,op): + def simulate_SM(self,ip,op): print("ip op = ", ip, op) self.sim_method = 'SM' self.data = [] - self.resdata = [] + self.result_data = [] self.unit = [] self.csvlist = [] print("op list",op) @@ -204,8 +204,8 @@ class Flowsheet(): os.chdir(self.root_dir) self.data = [] if unitop.type not in ['MaterialStream','EngStm']: - inpstms = unitop.InputStms - outstms = unitop.OutputStms + inpstms = unitop.input_stms + outstms = unitop.output_stms try: engstms = unitop.EngStms @@ -267,7 +267,7 @@ class Flowsheet(): mosFile.write("simulate("+unitop.name.lower()+", outputFormat=\"csv\", stopTime=1.0, numberOfIntervals=1);\n") print("Initiating simulation in Sequential Modular Mode") - #self.resdata = [] + #self.result_data = [] self.omc_path = self.get_omc_path() os.chdir(self.sim_dir_path) #os.system(self.omc_path + ' -s ' + unitop[0].name.lower()+"SEQ"+'.mos') @@ -290,43 +290,43 @@ class Flowsheet(): with open(csvpath,'r') as resultFile: csvreader = csv.reader(resultFile,delimiter=',') for row in csvreader: - self.resdata.append(row) + self.result_data.append(row) os.chdir(self.root_dir) if type(inpstms) is list: for stm in inpstms: for key,value in stm.Prop.items(): - propertyname = stm.name + '.' + key - if propertyname in self.resdata[0]: - ind = self.resdata[0].index(propertyname) - resultval = str(self.resdata[-1][ind]) + property_name = stm.name + '.' + key + if property_name in self.result_data[0]: + ind = self.result_data[0].index(property_name) + resultval = str(self.result_data[-1][ind]) stm.Prop[key] = resultval #print("input",stm.Prop[key]) else: for key, value in inpstms.Prop.items(): - propertyname = inpstms.name + '.' + key - if propertyname in self.resdata[0]: - ind = self.resdata[0].index(propertyname) - resultval = str(self.resdata[-1][ind]) + property_name = inpstms.name + '.' + key + if property_name in self.result_data[0]: + ind = self.result_data[0].index(property_name) + resultval = str(self.result_data[-1][ind]) inpstms.Prop[key] = resultval #print("input",inpstms.Prop[key]) if type(outstms) is list: for stm in outstms: for key, value in stm.Prop.items(): - propertyname = stm.name + '.' + key - if propertyname in self.resdata[0]: - ind = self.resdata[0].index(propertyname) - resultval = str(self.resdata[-1][ind]) + property_name = stm.name + '.' + key + if property_name in self.result_data[0]: + ind = self.result_data[0].index(property_name) + resultval = str(self.result_data[-1][ind]) stm.Prop[key] = resultval print("output key:",key,"value:",stm.Prop[key]) else: for key, value in outstms.Prop.items(): - propertyname = outstms.name + '.' + key - if propertyname in self.resdata[0]: - ind = self.resdata[0].index(propertyname) - resultval = str(self.resdata[-1][ind]) + property_name = outstms.name + '.' + key + if property_name in self.result_data[0]: + ind = self.result_data[0].index(property_name) + resultval = str(self.result_data[-1][ind]) outstms.Prop[key] = resultval print("output key:",key,"value:",outstms.Prop[key]) @@ -334,8 +334,8 @@ class Flowsheet(): os.chdir(self.sim_dir_path) dffinal = pd.concat(self.dataframes,axis=1) dffinal.to_csv('FlowsheetSEQ.csv',index=False) - self.resdata.clear() + self.result_data.clear() with open(os.path.join(self.sim_dir_path+'/FlowsheetSEQ.csv'),'r') as resultFile: csvreader = csv.reader(resultFile,delimiter=',') for row in csvreader: - self.resdata.append(row) + self.result_data.append(row) diff --git a/Simulator/Databases/Databases.py b/Simulator/Databases/Databases.py index d7dc797..4b3a4c6 100644 --- a/Simulator/Databases/Databases.py +++ b/Simulator/Databases/Databases.py @@ -17,16 +17,12 @@ class ChemsepDatabase(): self.name = 'chemsep' for comp in compound: self.compName=comp.getElementsByTagName('CompoundID')[0].getAttribute('value') - self.comp_name_list.append(self.compName+'(' + self.name + ')') - - self.comp_prop_list=list() - + self.comp_name_list.append(self.compName+'(' + self.name + ')') + self.comp_prop_list=list() def get_comp_name_list(self): return self.comp_name_list - - #attrib: #CAS fro CAS Number #CompoundID for Name @@ -35,9 +31,7 @@ class ChemsepDatabase(): #GETTING 'ATTRIBUTE''S VALUE OF THE COMPOUND 'COMPS' -#COMP IS AN ITERATING VALUE IN THE XML TAG COMPOUND - - +#COMP IS AN ITERATING VALUE IN THE XML TAG COMPOUND def get_value(self,comps,attrib): self.comps=comps self.x='' @@ -47,8 +41,7 @@ class ChemsepDatabase(): try: self.x=comp.getElementsByTagName(attrib)[0].getAttribute("value") except IndexError: - self.x = "-" - + self.x = "-" return (self.x) #CREATING comp_prop_list LIST OF THE COMPOUND SELECTED @@ -58,9 +51,7 @@ class ChemsepDatabase(): self.comps = comps for comp in compound: compName = comp.getElementsByTagName("CompoundID")[0].getAttribute("value") - if compName==self.comps: - - + if compName==self.comps: CompName = compName.replace(" ","") CompName = CompName.replace("-","") CompName = CompName.replace(",","") @@ -140,8 +131,7 @@ class ChemsepDatabase(): RacketParam = comp.getElementsByTagName("RacketParameter")[0].getAttribute("value") except IndexError: RacketParam = "0" - - + try: LiqDen = comp.getElementsByTagName("LiquidDensity")[0] LiqDenEqn = LiqDen.getElementsByTagName("eqno")[0].getAttribute("value") @@ -358,8 +348,6 @@ class ChemsepDatabase(): except IndexError: ChaoSeadLV = 0 - - #f.write('Package database') self.comp_prop_list.append('model '+CompName) #f.write('\n') @@ -440,7 +428,4 @@ class ChemsepDatabase(): #return self.comp_prop_list return self.comp_prop_list - - - -
\ No newline at end of file +
\ No newline at end of file diff --git a/Simulator/Simulator/UnitOperations/Mixer.mo b/Simulator/Simulator/UnitOperations/Mixer.mo index 1be69eb..ae0a1d9 100644 --- a/Simulator/Simulator/UnitOperations/Mixer.mo +++ b/Simulator/Simulator/UnitOperations/Mixer.mo @@ -26,9 +26,9 @@ model Mixer "Model of a mixer to mix multiple material streams" Real xout_c[Nc](each unit = "-", each min = 0, each max = 1, start = xguess) "Outlet stream component mol fraction"; //================================================================================ // Files.Interfaces.matConn inlet[NI](each Nc = Nc); - Simulator.Files.Interfaces.matConn outlet(Nc = Nc) annotation( + Simulator.Files.Interfaces.matConn Out(Nc = Nc) annotation( Placement(visible = true, transformation(origin = {100, -2}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Simulator.Files.Interfaces.matConn inlet[NI](each Nc = Nc) annotation( + Simulator.Files.Interfaces.matConn In[NI](each Nc = Nc) annotation( Placement(visible = true, transformation(origin = {-100, -2}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); extends GuessModels.InitialGuess; @@ -36,21 +36,21 @@ model Mixer "Model of a mixer to mix multiple material streams" equation //Connector equation for i in 1:NI loop - inlet[i].P = Pin[i]; - inlet[i].T = Tin_s[i]; - inlet[i].F = Fin_s[i]; - inlet[i].H = Hin_s[i]; - inlet[i].S = Sin_s[i]; - inlet[i].x_pc[1, :] = xin_sc[i, :]; - inlet[i].xvap = xvapin_s[i]; + In[i].P = Pin[i]; + In[i].T = Tin_s[i]; + In[i].F = Fin_s[i]; + In[i].H = Hin_s[i]; + In[i].S = Sin_s[i]; + In[i].x_pc[1, :] = xin_sc[i, :]; + In[i].xvap = xvapin_s[i]; end for; - outlet.P = Pout; - outlet.T = Tout; - outlet.F = Fout; - outlet.H = Hout; - outlet.S = Sout; - outlet.x_pc[1, :] = xout_c[:]; - outlet.xvap = xvapout; + Out.P = Pout; + Out.T = Tout; + Out.F = Fout; + Out.H = Hout; + Out.S = Sout; + Out.x_pc[1, :] = xout_c[:]; + Out.xvap = xvapout; //=================================================================================== //Output Pressure if outPress == "Inlet_Minimum" then @@ -1,4 +1,4 @@ -from OMPython import OMCSession +# from OMPython import OMCSession from PyQt5.QtCore import * import json import sys @@ -6,19 +6,19 @@ from collections import defaultdict class MaterialStream(): counter = 1 - def __init__(self, CompNames = []): + def __init__(self, compound_names = []): self.name = 'MaterialStream' + str(MaterialStream.counter) self.type = 'MaterialStream' - self.CompNames = CompNames + self.compound_names = compound_names self.count = MaterialStream.counter - self.thermoPackage ="RaoultsLaw" + self.thermo_package ="RaoultsLaw" self.mode1 = "P" self.mode2 = "T" - self.mode1val = "" - self.mode2val = "" + self.mode1_val = "" + self.mode2_val = "" self.OM_data_init = '' self.OM_data_eqn = '' self.no_of_inputs = 1 @@ -27,9 +27,9 @@ class MaterialStream(): self.y = 2500-30 self.pos = QPointF(self.x, self.y) MaterialStream.counter+=1 - self.startDict = {} - self.eqnDict = {} - self.modesList = ["PT","PH","PVF","TVF","PS"] + self.start_dict = {} + self.eqn_dict = {} + self.modes_list = ["PT","PH","PVF","TVF","PS"] self.variables = { 'P' : {'name':'Pressure', 'value':101325, 'unit':'Pa'}, # {'Pa':1, 'mmHg':0, 'N/m^2':0}}, @@ -54,10 +54,10 @@ class MaterialStream(): 'F_pc' : {'name':'Mole Flow', 'value':100, 'unit':'mol/s'}, 'Fm_pc' : {'name':'Mass Flow', 'value':None, 'unit':'g/s'}, } - self.initVariables() + self.init_variables() - def initVariables(self): - for i, val in enumerate(self.CompNames): + def init_variables(self): + for i, val in enumerate(self.compound_names): self.variables['x_pc[1,'+ str(i+1)+']'] = {'name':val + ' Mixture Mole Fraction', 'value':None, 'unit':'mol/s'} self.variables['xm_pc[1,'+ str(i+1)+']'] = {'name':val + ' Mixture Mass Fraction', 'value':None, 'unit':'g/s'} self.variables['F_pc[1,'+ str(i+1)+']'] = {'name':val + ' Mixture Mole Flow', 'value':None, 'unit':'mol/s'} @@ -73,46 +73,46 @@ class MaterialStream(): self.variables['F_pc[3,'+ str(i+1)+']'] = {'name':[val + ' Vapour Mole Flow'], 'value':None, 'unit':'mol/s'} self.variables['Fm_pc[3,'+ str(i+1)+']'] = {'name':[val + ' Vapour Mass Flow'], 'value':None, 'unit':'g/s'} - for i in self.CompNames: + for i in self.compound_names: self.variables[i] = {'value':''} - def paramgetter(self,mode): + def param_getter(self,mode): dict = {} if(mode=="PT"): self.mode1 = 'P' self.mode2 = 'T' dict = {self.mode1:self.variables['P']['value'], self.mode2:self.variables['T']['value'], - "MolFlow":self.variables['F_pc']['value'],"x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage} + "MolFlow":self.variables['F_pc']['value'],"x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package} elif(mode=="PH"): self.mode1 = 'P' self.mode2 = 'H_p[1]' dict = {self.mode1:self.variables['P']['value'], self.mode2:self.variables['H_p[1]']['value'], - "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage} + "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package} elif(mode=="PVF"): self.mode1 = 'P' self.mode2 = 'xvap' dict = {self.mode1:self.variables['P']['value'], self.mode2:self.variables['xvap']['value'], - "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage} + "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package} elif(mode=="TVF"): self.mode1 = 'T' self.mode2 = 'xvap' dict = {self.mode1:self.variables['T']['value'], self.mode2:self.variables['xvap']['value'], - "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage} + "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package} elif(mode=="PS"): self.mode1 = 'P' self.mode2 = 'S_p[1]' dict = {self.mode1:self.variables['P']['value'], self.mode2: self.variables['S_p[1]']['value'], - "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage} + "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package} return dict - def paramsetter(self,dict): + def param_setter(self,dict): print("inside paramsetter ", dict) self.variables['x_pc']['value'] = dict['x_pc'].split(",") - self.thermoPackage = dict['thermoPackage'] + self.thermo_package = dict['thermo_package'] self.variables['F_p[1]']['value'] = dict['MolFlow'] print("inside") # self.Prop[self.mode2] = dict[self.mode2] @@ -122,7 +122,7 @@ class MaterialStream(): print(self.variables) print(self.variables['x_pc']['value']) - for i in range(len(self.CompNames)): + for i in range(len(self.compound_names)): print('####### x_pc #########\n',self.variables['x_pc']['value'][i]) print('x_pc') if self.variables['x_pc']['value'][i]: @@ -141,7 +141,7 @@ class MaterialStream(): self.variables['Fm_pc[1,'+str(i+1)+']']['value'] = None print('first for') print('secnod for') - for i in range(0,len(self.CompNames)): + for i in range(0,len(self.compound_names)): self.variables['x_pc[2,'+str(i+1)+']']['value'] = None self.variables['xm_pc[2,'+str(i+1)+']']['value'] = None self.variables['F_pc[2,'+str(i+1)+']']['value'] = None @@ -152,12 +152,12 @@ class MaterialStream(): self.variables['F_pc[3,'+str(i+1)+']']['value'] = None self.variables['Fm_pc[3,'+str(i+1)+']']['value'] = None - def setPos(self,pos): + def set_pos(self,pos): self.pos = pos - def GetMinEqnValues(self): + def get_min_eqn_values(self): x_pclist = [] - for i in range(0,len(self.CompNames)): + for i in range(0,len(self.compound_names)): #print(self.Prop['x_pc[1,'+str(i+1)+']']) #x_pclist.append(self.Prop['x_pc[1,'+str(i+1)+']']) x_pclist.append(self.variables['x_pc[1,'+str(i+1)+']']['value']) @@ -175,13 +175,13 @@ class MaterialStream(): x_pcstr = x_pcstr.replace('"','') ''' if self.variables[self.mode1]['value']: - self.eqnDict[self.mode1] = self.variables[self.mode1]['value'] + self.eqn_dict[self.mode1] = self.variables[self.mode1]['value'] if self.variables[self.mode2]['value']: - self.eqnDict[self.mode2] = self.variables[self.mode2]['value'] + self.eqn_dict[self.mode2] = self.variables[self.mode2]['value'] if self.variables['x_pc']['value']: - self.eqnDict['x_pc[1,:]'] = x_pc + self.eqn_dict['x_pc[1,:]'] = x_pc if self.variables['F_pc']['value']: - self.eqnDict['F_p[1]'] = self.variables['F_pc']['value'] + self.eqn_dict['F_p[1]'] = self.variables['F_pc']['value'] print("##############$GetMinVEqnValuesStart$##################") print("P:",self.variables[self.mode1]['value']) @@ -190,66 +190,66 @@ class MaterialStream(): print("F_p",self.variables['F_p[1]']['value']) print("##############$GetMinVEqnValuesEnd$##################") - def GetStartValues(self): + def get_start_values(self): try: if self.variables[self.mode1]['value']: - self.startDict[self.mode1] = self.variables[self.mode1]['value'] + self.start_dict[self.mode1] = self.variables[self.mode1]['value'] if self.variables[self.mode2]['value']: - self.startDict[self.mode2] = self.variables[self.mode2]['value'] + self.start_dict[self.mode2] = self.variables[self.mode2]['value'] if self.variables['x_pc[2,1]']['value'] != None: x_pcarr = [] for i in range(1,4): cmf = [] - for j in range(1,len(self.CompNames)+1): + for j in range(1,len(self.compound_names)+1): cmf.append(str(self.variables['x_pc['+str(i)+','+str(j)+']']['value'])) x_pcarr.append(cmf) x_pcstr = json.dumps(x_pcarr) x_pcstr = x_pcstr.replace('[','{') x_pcstr = x_pcstr.replace(']','}') x_pcstr = x_pcstr.replace('"','') - self.startDict['x_pc'] = x_pcstr + self.start_dict['x_pc'] = x_pcstr if self.variables['xm_pc[2,1]']['value'] != None: xm_pcarr = [] for i in range(1,4): cmf = [] - for j in range(1,len(self.CompNames)+1): + for j in range(1,len(self.compound_names)+1): cmf.append(str(self.variables['xm_pc['+str(i)+','+str(j)+']']['value'])) xm_pcarr.append(cmf) xm_pcstr = json.dumps(x_pcarr) xm_pcstr = xm_pcstr.replace('[','{') xm_pcstr = xm_pcstr.replace(']','}') xm_pcstr = xm_pcstr.replace('"','') - self.startDict['xm_pc'] = xm_pcstr + self.start_dict['xm_pc'] = xm_pcstr if self.variables['Fm_pc[2,1]']['value'] != None: Fm_pcarr = [] for i in range(1,4): cmf = [] - for j in range(1,len(self.CompNames)+1): + for j in range(1,len(self.compound_names)+1): cmf.append(str(self.variables['Fm_pc['+str(i)+','+str(j)+']']['value'])) Fm_pcarr.append(cmf) Fm_pcstr = json.dumps(x_pcarr) Fm_pcstr = Fm_pcstr.replace('[','{') Fm_pcstr = Fm_pcstr.replace(']','}') Fm_pcstr = Fm_pcstr.replace('"','') - self.startDict['Fm_pc'] = Fm_pcstr + self.start_dict['Fm_pc'] = Fm_pcstr if self.variables['F_pc[2,1]']['value'] != None: F_pcarr = [] for i in range(1,4): cmf = [] - for j in range(1,len(self.CompNames)+1): + for j in range(1,len(self.compound_names)+1): cmf.append(str(self.variables['F_pc['+str(i)+','+str(j)+']']['value'])) F_pcarr.append(cmf) F_pcstr = json.dumps(F_pcarr) F_pcstr = F_pcstr.replace('[','{') F_pcstr = F_pcstr.replace(']','}') F_pcstr = F_pcstr.replace('"','') - self.startDict['F_pc'] = F_pcstr + self.start_dict['F_pc'] = F_pcstr if self.variables['MW_p[2]']['value'] != None: MW_pArr = [] @@ -259,7 +259,7 @@ class MaterialStream(): MW_pStr = MW_pStr.replace('[','{') MW_pStr = MW_pStr.replace(']','}') MW_pStr = MW_pStr.replace('"','') - self.startDict['MW_p'] = MW_pStr + self.start_dict['MW_p'] = MW_pStr if self.variables['F_p[2]']['value'] != None: F_pArr = [] @@ -269,7 +269,7 @@ class MaterialStream(): F_pStr = F_pStr.replace('[','{') F_pStr = F_pStr.replace(']','}') F_pStr = F_pStr.replace('"','') - self.startDict['F_p'] = F_pStr + self.start_dict['F_p'] = F_pStr if self.variables['Cp_p[2]']['value'] != None: Cp_pArr = [] @@ -279,7 +279,7 @@ class MaterialStream(): Cp_pStr = Cp_pStr.replace('[','{') Cp_pStr = Cp_pStr.replace(']','}') Cp_pStr = Cp_pStr.replace('"','') - self.startDict['Cp_p'] = Cp_pStr + self.start_dict['Cp_p'] = Cp_pStr if self.variables['H_p[2]']['value'] != None: H_pArr = [] @@ -289,7 +289,7 @@ class MaterialStream(): H_pStr = H_pStr.replace('[','{') H_pStr = H_pStr.replace(']','}') H_pStr = H_pStr.replace('"','') - self.startDict['H_p'] = H_pStr + self.start_dict['H_p'] = H_pStr if self.variables['S_p[2]']['value'] != None: @@ -300,7 +300,7 @@ class MaterialStream(): S_pStr = S_pStr.replace('[','{') S_pStr = S_pStr.replace(']','}') S_pStr = S_pStr.replace('"','') - self.startDict['S_p'] = S_pStr + self.start_dict['S_p'] = S_pStr if self.variables['Fm_p[2]']['value'] != None: Fm_pArr = [] @@ -310,7 +310,7 @@ class MaterialStream(): Fm_pStr = Fm_pStr.replace('[','{') Fm_pStr = Fm_pStr.replace(']','}') Fm_pStr = Fm_pStr.replace('"','') - self.startDict['Fm_p'] = Fm_pStr + self.start_dict['Fm_p'] = Fm_pStr except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() @@ -322,10 +322,10 @@ class MaterialStream(): self.OM_data_init = '' self.OM_data_init = self.OM_data_init + ("model ms"+str(self.count)+"\n") self.OM_data_init = self.OM_data_init + ("extends Simulator.Streams.MaterialStream;\n" ) - self.OM_data_init = self.OM_data_init + ("extends Simulator.Files.ThermodynamicPackages."+self.thermoPackage+";\n") + self.OM_data_init = self.OM_data_init + ("extends Simulator.Files.ThermodynamicPackages."+self.thermo_package+";\n") self.OM_data_init = self.OM_data_init + ("end ms"+str(self.count)+";\n") comp_count = len(addedcomp) - # self.GetStartValues() + # self.get_start_values() #self.OM_data_init = "Simulator.Streams.Mat_Stm_RL " + self.name +"(Nc = " + str(comp_count) self.OM_data_init = self.OM_data_init + "ms"+str(self.count) +" " + self.name +"(Nc = " + str(comp_count) @@ -333,7 +333,7 @@ class MaterialStream(): C = str(addedcomp).strip('[').strip(']') C = C.replace("'","") self.OM_data_init = self.OM_data_init + C + "}," - #for key, value in self.startDict.items(): + #for key, value in self.start_dict.items(): # self.OM_data_init = self.OM_data_init + key + '(start = ' + str(value) + '),' self.OM_data_init = self.OM_data_init[:-1] self.OM_data_init = self.OM_data_init + ');\n' @@ -344,402 +344,14 @@ class MaterialStream(): self.OM_data_eqn = '' self.comp_count = len(addedcomp) if method == 'Eqn': - self.eqnDict = {} - self.GetMinEqnValues() + self.eqn_dict = {} + self.get_min_eqn_values() if method == 'SM': - self.eqnDict = {} - self.GetMinEqnValues() + self.eqn_dict = {} + self.get_min_eqn_values() #self.GetEquationValues() #self.GetEquationValues() - for key,value in self.eqnDict.items(): + for key,value in self.eqn_dict.items(): self.OM_data_eqn = self.OM_data_eqn + self.name + '.'+ key + ' = ' + str(value) + ';\n' return self.OM_data_eqn - - -''' -from OMPython import OMCSession -from PyQt5.QtCore import * -import json -import sys -from collections import defaultdict - -class MaterialStream(): - counter = 1 - def __init__(self,CompNames = [],Temperature=300,Pressure=101325,xvap=None,xmvap=None,xliq=None,xmliq=None,x_pc = [1.0], xm_pc = [], MolFlow=100, MasFlow=None,**kwargs): - self.name = 'MaterialStream' + str(MaterialStream.counter) - self.type = 'MaterialStream' - self.T = Temperature - self.P = Pressure - self.xvap = xvap - self.xmvap = xmvap - self.xliq = xliq - self.xmliq = xmliq - self.CompNames = CompNames - self.x_pc = x_pc - self.xm_pc = xm_pc - self.MolFlow = MolFlow - self.MasFlow = MasFlow - self.OM_data_init = '' - self.OM_data_eqn = '' - self.count = MaterialStream.counter - self.thermoPackage ="RaoultsLaw" - self.mode1 = "P" - self.mode1val = "" - self.mode2 = "T" - self.mode2val = "" - self.no_of_inputs = 1 - self.no_of_outputs = 1 - self.x = 2500-30 - self.y = 2500-30 - self.pos = QPointF(self.x, self.y) - MaterialStream.counter+=1 - self.startDict = {} - self.eqnDict = {} - self.modesList = ["PT","PH","PVF","TVF","PS"] - - self.Prop = { - - self.mode1:self.mode1val, - self.mode2:self.mode2val, - 'xliq':xliq, - 'xmliq':xmliq, - 'xvap':xvap, - 'xmvap':xmvap, - 'F_p[1]':MolFlow, - 'Fm_p[1]':MasFlow, - 'MW_p[1]':None, - 'MW_p[2]':None, - 'MW_p[3]':None, - 'Cp_p[1]':None, - 'H_p[1]':None, - 'S_p[1]':None, - 'Cp_p[2]':None, - 'H_p[2]':None, - 'S_p[2]':None, - 'Cp_p[3]':None, - 'H_p[3]':None, - 'S_p[3]':None, - 'F_p[2]':None, - 'Fm_p[2]':None, - 'F_p[3]':None, - 'Fm_p[3]':None - - } - - self.Prop1 = { - self.mode1:self.mode1val, - self.mode2:self.mode2val, - 'xliq':xliq, - 'xmliq':xmliq, - 'xvap':xvap, - 'xmvap':xmvap, - 'F_p[1]':MolFlow, - 'Fm_p[1]':MasFlow, - 'MW_p[1]':None, - 'MW_p[2]':None, - 'MW_p[3]':None, - 'Cp_p[1]':None, - 'H_p[1]':None, - 'S_p[1]':None, - 'Cp_p[2]':None, - 'H_p[2]':None, - 'S_p[2]':None, - 'Cp_p[3]':None, - 'H_p[3]':None, - 'S_p[3]':None, - 'F_p[2]':None, - 'Fm_p[2]':None, - 'F_p[3]':None, - 'Fm_p[3]':None - - } - - def paramgetter(self,mode): - dict = {} - # print("Hello hello ", mode) - # if(mode == None): - # mode = self.modesList[0] - if(mode=="PT"): - self.mode1 = 'P' - self.mode2 = 'T' - dict = {self.mode2:self.T,self.mode1:self.P,"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage} - elif(mode=="PH"): - self.mode1 = 'P' - self.mode2 = 'H_p[1]' - dict = {self.mode1:self.P,self.mode2:self.Prop['H_p[1]'],"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage} - elif(mode=="PVF"): - self.mode1 = 'P' - self.mode2 = 'xvap' - dict = {self.mode1:self.P,self.mode2:self.xvap,"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage} - elif(mode=="TVF"): - self.mode1 = 'T' - self.mode2 = 'xvap' - dict = {self.mode1:self.T,self.mode2:self.xvap,"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage} - elif(mode=="PS"): - self.mode1 = 'P' - self.mode2 = 'S_p[1]' - dict = {self.mode1:self.P,self.mode2:self.Prop['S_p[1]'],"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage} - - return dict - - def paramsetter(self,dict): - self.mode1val = dict[self.mode1] - self.mode2val = dict[self.mode2] - self.MolFlow = dict['MolFlow'] - self.x_pc = dict['x_pc'].split(",") - self.thermoPackage = dict['thermoPackage'] - self.Prop['F_p[1]'] = self.MolFlow - self.Prop[self.mode2] = dict[self.mode2] - self.Prop[self.mode1] = dict[self.mode1] - for i in range(len(self.CompNames)): - print('####### x_pc #########\n',self.x_pc[i]) - if self.x_pc: - self.Prop['x_pc[1,'+str(i+1)+']'] = self.x_pc[i] - else: - self.Prop['x_pc[1,'+str(i+1)+']'] = None - - if self.xm_pc: - self.Prop['xm_pc[1,'+str(i+1)+']'] = self.xm_pc[i] - else: - self.Prop['xm_pc[1,'+str(i+1)+']'] = None - - self.Prop['F_pc[1,'+str(i+1)+']'] = None - self.Prop['Fm_pc[1,'+str(i+1)+']'] = None - for i in range(0,len(self.CompNames)): - self.Prop['x_pc[2,'+str(i+1)+']'] = None - self.Prop['xm_pc[2,'+str(i+1)+']'] = None - self.Prop['F_pc[2,'+str(i+1)+']'] = None - self.Prop['Fm_pc[2,'+str(i+1)+']'] = None - self.Prop['x_pc[3,'+str(i+1)+']'] = None - self.Prop['xm_pc[3,'+str(i+1)+']'] = None - self.Prop['F_pc[3,'+str(i+1)+']'] = None - self.Prop['Fm_pc[3,'+str(i+1)+']'] = None - - def setPos(self,pos): - self.pos = pos - - def GetMinEqnValues(self): - x_pclist = [] - for i in range(0,len(self.CompNames)): - print(self.Prop['x_pc[1,'+str(i+1)+']']) - x_pclist.append(self.Prop['x_pc[1,'+str(i+1)+']']) - print(x_pclist) - #x_pclist = list(self.Prop(x_pc[1,1)]) - x_pc = json.dumps(x_pclist) - print(x_pc) - x_pc = x_pc.replace('[','{') - x_pc = x_pc.replace(']','}') - x_pc = x_pc.replace('"','') - - # x_pcstr = json.dumps(self.x_pc) - # x_pcstr = x_pcstr.replace('[','{') - # x_pcstr = x_pcstr.replace(']','}') - # x_pcstr = x_pcstr.replace('"','') - - if self.Prop[self.mode1]: - self.eqnDict[self.mode1] = self.Prop[self.mode1] - if self.Prop[self.mode2]: - self.eqnDict[self.mode2] = self.Prop[self.mode2] - if self.x_pc: - self.eqnDict['x_pc[1,:]'] = x_pc - if self.MolFlow: - self.eqnDict['F_p[1]'] = self.Prop['F_p[1]']#self.MolFlow - - print("##############$GetMinVEqnValuesStart$##################") - print("P:",self.Prop[self.mode1]) - print("T:",self.Prop[self.mode2]) - print("x_pc",x_pc) - print("F_p",self.Prop['F_p[1]']) - print("##############$GetMinVEqnValuesEnd$##################") - - # def GetEquationValues(self): # Not being called anywhere - # if self.Prop[self.mode1]: - # self.eqnDict[self.mode1] = self.Prop[self.mode1] - - # if self.Prop[self.mode2]: - # self.eqnDict[self.mode2] = self.Prop[self.mode2] - - # if self.Prop['x_pc[1,1]']: - # cfa = [] - # for i in range(1,len(self.CompNames)+1): - # cfa.append(self.Prop['x_pc[1,'+str(i)+']']) - # cmpMolFracstr = json.dumps(cfa) - # cmpMolFracstr = cmpMolFracstr.replace('[','{') - # cmpMolFracstr = cmpMolFracstr.replace(']','}') - # cmpMolFracstr = cmpMolFracstr.replace('"','') - # self.eqnDict['x_pc[1,:]'] = cmpMolFracstr - - # if self.Prop['F_p[1]']: - # self.eqnDict['F_p[1]'] = self.Prop['F_p[1]'] - - - def GetStartValues(self): - try: - if self.Prop[self.mode1]: - self.startDict[self.mode1] = self.Prop[self.mode1] - - if self.Prop[self.mode2]: - self.startDict[self.mode2] = self.Prop[self.mode2] - - - if self.Prop['x_pc[2,1]'] != None: - x_pcarr = [] - for i in range(1,4): - cmf = [] - for j in range(1,len(self.CompNames)+1): - cmf.append(str(self.Prop['x_pc['+str(i)+','+str(j)+']'])) - x_pcarr.append(cmf) - x_pcstr = json.dumps(x_pcarr) - x_pcstr = x_pcstr.replace('[','{') - x_pcstr = x_pcstr.replace(']','}') - x_pcstr = x_pcstr.replace('"','') - self.startDict['x_pc'] = x_pcstr - - if self.Prop['xm_pc[2,1]'] != None: - xm_pcarr = [] - for i in range(1,4): - cmf = [] - for j in range(1,len(self.CompNames)+1): - cmf.append(str(self.Prop['xm_pc['+str(i)+','+str(j)+']'])) - xm_pcarr.append(cmf) - xm_pcstr = json.dumps(x_pcarr) - xm_pcstr = xm_pcstr.replace('[','{') - xm_pcstr = xm_pcstr.replace(']','}') - xm_pcstr = xm_pcstr.replace('"','') - self.startDict['xm_pc'] = xm_pcstr - - if self.Prop['Fm_pc[2,1]'] != None: - Fm_pcarr = [] - for i in range(1,4): - cmf = [] - for j in range(1,len(self.CompNames)+1): - cmf.append(str(self.Prop['Fm_pc['+str(i)+','+str(j)+']'])) - Fm_pcarr.append(cmf) - Fm_pcstr = json.dumps(x_pcarr) - Fm_pcstr = Fm_pcstr.replace('[','{') - Fm_pcstr = Fm_pcstr.replace(']','}') - Fm_pcstr = Fm_pcstr.replace('"','') - self.startDict['Fm_pc'] = Fm_pcstr - - if self.Prop['F_pc[2,1]'] != None: - F_pcarr = [] - for i in range(1,4): - cmf = [] - for j in range(1,len(self.CompNames)+1): - cmf.append(str(self.Prop['F_pc['+str(i)+','+str(j)+']'])) - F_pcarr.append(cmf) - F_pcstr = json.dumps(F_pcarr) - F_pcstr = F_pcstr.replace('[','{') - F_pcstr = F_pcstr.replace(']','}') - F_pcstr = F_pcstr.replace('"','') - self.startDict['F_pc'] = F_pcstr - - if self.Prop['MW_p[2]'] != None: - MW_pArr = [] - for i in range(1,4): - MW_pArr.append(self.Prop['MW_p['+str(i)+']']) - MW_pStr = json.dumps(MW_pArr) - MW_pStr = MW_pStr.replace('[','{') - MW_pStr = MW_pStr.replace(']','}') - MW_pStr = MW_pStr.replace('"','') - self.startDict['MW_p'] = MW_pStr - - if self.Prop['F_p[2]'] != None: - F_pArr = [] - for i in range(1,4): - F_pArr.append(self.Prop['F_p['+str(i)+']']) - F_pStr = json.dumps(F_pArr) - F_pStr = F_pStr.replace('[','{') - F_pStr = F_pStr.replace(']','}') - F_pStr = F_pStr.replace('"','') - self.startDict['F_p'] = F_pStr - - if self.Prop['Cp_p[2]'] != None: - Cp_pArr = [] - for i in range(1,4): - Cp_pArr.append(self.Prop['Cp_p['+str(i)+']']) - Cp_pStr = json.dumps(Cp_pArr) - Cp_pStr = Cp_pStr.replace('[','{') - Cp_pStr = Cp_pStr.replace(']','}') - Cp_pStr = Cp_pStr.replace('"','') - self.startDict['Cp_p'] = Cp_pStr - - if self.Prop['H_p[2]'] != None: - H_pArr = [] - for i in range(1,4): - H_pArr.append(self.Prop['H_p['+str(i)+']']) - H_pStr = json.dumps(H_pArr) - H_pStr = H_pStr.replace('[','{') - H_pStr = H_pStr.replace(']','}') - H_pStr = H_pStr.replace('"','') - self.startDict['H_p'] = H_pStr - - - if self.Prop['S_p[2]'] != None: - S_pArr = [] - for i in range(1,4): - S_pArr.append(self.Prop['S_p['+str(i)+']']) - S_pStr = json.dumps(S_pArr) - S_pStr = S_pStr.replace('[','{') - S_pStr = S_pStr.replace(']','}') - S_pStr = S_pStr.replace('"','') - self.startDict['S_p'] = S_pStr - - if self.Prop['Fm_p[2]'] != None: - Fm_pArr = [] - for i in range(1,4): - Fm_pArr.append(self.Prop['Fm_p['+str(i)+']']) - Fm_pStr = json.dumps(Fm_pArr) - Fm_pStr = Fm_pStr.replace('[','{') - Fm_pStr = Fm_pStr.replace(']','}') - Fm_pStr = Fm_pStr.replace('"','') - self.startDict['Fm_p'] = Fm_pStr - - except Exception as e: - exc_type, exc_obj, exc_tb = sys.exc_info() - print(exc_type,exc_tb.tb_lineno) - print(e) - print('error') - - - def OM_Flowsheet_Initialize(self,addedcomp): - self.OM_data_init = '' - self.OM_data_init = self.OM_data_init + ("model ms"+str(self.count)+"\n") - self.OM_data_init = self.OM_data_init + ("extends Simulator.Streams.MaterialStream;\n" ) - self.OM_data_init = self.OM_data_init + ("extends Simulator.Files.ThermodynamicPackages."+self.thermoPackage+";\n") - self.OM_data_init = self.OM_data_init + ("end ms"+str(self.count)+";\n") - comp_count = len(addedcomp) - # self.GetStartValues() - - #self.OM_data_init = "Simulator.Streams.Mat_Stm_RL " + self.name +"(Nc = " + str(comp_count) - self.OM_data_init = self.OM_data_init + "ms"+str(self.count) +" " + self.name +"(Nc = " + str(comp_count) - self.OM_data_init = self.OM_data_init + ",C = {" - C = str(addedcomp).strip('[').strip(']') - C = C.replace("'","") - self.OM_data_init = self.OM_data_init + C + "}," - #for key, value in self.startDict.items(): - # self.OM_data_init = self.OM_data_init + key + '(start = ' + str(value) + '),' - self.OM_data_init = self.OM_data_init[:-1] - self.OM_data_init = self.OM_data_init + ');\n' - return self.OM_data_init - - - def OM_Flowsheet_Equation(self,addedcomp,method): - self.OM_data_eqn = '' - self.comp_count = len(addedcomp) - if method == 'Eqn': - self.eqnDict = {} - self.GetMinEqnValues() - if method == 'SM': - self.eqnDict = {} - self.GetMinEqnValues() - #self.GetEquationValues() - #self.GetEquationValues() - - for key,value in self.eqnDict.items(): - self.OM_data_eqn = self.OM_data_eqn + self.name + '.'+ key + ' = ' + str(value) + ';\n' - return self.OM_data_eqn - - -'''
\ No newline at end of file Binary files differdiff --git a/UnitOperations.py b/UnitOperations.py index 92d6f07..006c015 100644 --- a/UnitOperations.py +++ b/UnitOperations.py @@ -1,4 +1,5 @@ from OMChem.Flowsheet import Flowsheet +from OMChem.EngStm import EngStm from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import QTextDocument ,QTextCursor ,QTextCharFormat ,QFont ,QPixmap @@ -9,108 +10,108 @@ from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent from PyQt5.QtGui import * import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtWidgets -from component_selector import * -from container import * +from ComponentSelector import * +from Container import * class UnitOperation(): counter = 1 - def __init__(self): self.OM_data_eqn = '' self.OM_data_init = '' - self.InputStms = [] - self.OutputStms = [] + self.input_stms = [] + self.output_stms = [] self.compounds = compound_selected self.name = '' self.mode = None - self.modeVal = None + self.mode_val = None self.type = '' self.no_of_inputs = 1 self.no_of_outputs = 1 - self.Prop = {} - self.x = 2500-30 + self.x = 2500-30 self.y = 2500-30 self.pos = QPointF(self.x, self.y) - #self.Prop = {} + self.count = UnitOperation.counter self.variables = {} - self.modeslist = [] + self.modes_list = [] self.parameters = [] self.extra = [] - self.ForNaming = [] + self.for_naming = [] self.multidict = [] - self.ThermoPackReq = False - self.thermoPackage = None + self.thermo_pack_req = False + self.thermo_package = None - def paramgetter(self,mode=None): + def param_getter(self,mode=None): params = {} - if mode == None: - self.mode = self.modeslist[0] + if mode == None and self.modes_list: + self.mode = self.modes_list[0] else: self.mode = mode + params[self.mode] = None for i in self.parameters: params[i] = self.variables[i]['value'] - params[self.mode] = None + return params - def paramsetter(self,params): - print("paramsetter ", params) + def param_setter(self,params): + print("param_setter ", params) for k,v in params.items(): print(k,v) if k != self.mode: self.k = v self.variables[k]['value'] = v else: - self.modeVal = params[self.mode] + self.variables[k]['value'] = v + self.mode_val = params[self.mode] + print(self.variables) def add_connection(self,flag,UnitOpr): - if flag==1: - # Input stream if flag is 1 + if flag==1: # Input stream if flag is 1 print("INPUT CONNECTION") - self.InputStms.append(UnitOpr) + self.input_stms.append(UnitOpr) else : print("OUTPUT CONNECTION") - self.OutputStms.append(UnitOpr) + self.output_stms.append(UnitOpr) - def setPos(self,pos): + def set_pos(self,pos): self.pos = pos def OM_Flowsheet_Initialize(self): self.OM_data_init = '' - if(self.ThermoPackReq): + if(self.thermo_pack_req): if len(self.extra)>1: for i in range(len(self.extra)): latest = '' for j in range(self.extra[i]): if self.extra[i][j]!='.': latest += self.extra[i][j] - self.ForNaming[i] = latest + self.for_naming[i] = latest - if(self.ThermoPackReq): + if(self.thermo_pack_req): if len(self.extra)==1: for i in self.extra: self.OM_data_init += ('model '+i+str(self.counter)+'\n') self.OM_data_init += ('extends Simulator.UnitOperations.'+i+';\n') - self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermoPackage+';\n') + self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermo_package+';\n') self.OM_data_init += ('end '+i+str(self.counter)+';\n') self.OM_data_init += i+str(self.counter) + ' ' + self.name + '(Nc = ' + str(len(self.compounds)) else: for i in range(len(self.extra)): if i!=(len(self.extra)-1): - self.OM_data_init += ('model '+self.ForNaming[i]+str(self.counter)+'\n') + self.OM_data_init += ('model '+self.for_naming[i]+str(self.counter)+'\n') self.OM_data_init += ('extends Simulator.UnitOperations.'+self.extra[i]+';\n') - self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermoPackage+';\n') - self.OM_data_init += ('end '+self.ForNaming[i]+str(self.counter)+';\n') + self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermo_package+';\n') + self.OM_data_init += ('end '+self.for_naming[i]+str(self.counter)+';\n') else: - self.OM_data_init += ('model '+self.ForNaming[i]+str(self.counter)+'\n') + self.OM_data_init += ('model '+self.for_naming[i]+str(self.counter)+'\n') self.OM_data_init += ('extends Simulator.UnitOperations.'+self.extra[i]+';\n') for j in range(len(self.extra)-1): - self.OM_data_init += (self.ForNaming[j] + str(self.counter) +' ' + self.ForNaming[j] + '#' + self.multidict[j] + ';\n') + self.OM_data_init += (self.for_naming[j] + str(self.counter) +' ' + self.for_naming[j] + '#' + self.multidict[j] + ';\n') - self.OM_data_init += ('end '+self.ForNaming[i]+str(self.counter)+';\n') + self.OM_data_init += ('end '+self.for_naming[i]+str(self.counter)+';\n') - self.OM_data_init += self.ForNaming[i] + str(self.counter) + ' ' + self.ForNaming + '(Nc = ' + str(len(self.compounds)) + self.OM_data_init += self.for_naming[i] + str(self.counter) + ' ' + self.for_naming + '(Nc = ' + str(len(self.compounds)) C = str(self.compounds).strip('[').strip(']') C = C.replace("'", "") @@ -129,7 +130,8 @@ class UnitOperation(): for k in self.parameters: self.OM_data_init += ', ' - self.OM_data_init += k + ' = ' + str(self.variables[k]['value']) + self.OM_data_init += k + ' = ' + ('"' + self.variables[k]['value'] + '"' if isinstance(self.variables[k]['value'], str) + else str(self.variables[k]['value'])) self.OM_data_init += ');\n' return self.OM_data_init @@ -137,27 +139,296 @@ class UnitOperation(): def OM_Flowsheet_Equation(self): self.OM_data_eqn = '' - if len(self.InputStms)>1: + if len(self.input_stms)>1: strcount = 1 - for strm in self.InputStms: + for strm in self.input_stms: self.OM_data_eqn += ('connect(' + strm.name + '.Out,' + self.name + '.In[' + str(strcount) + ']);\n') strcount += 1 else: - self.OM_data_eqn += ('connect(' + self.name + '.In,' + self.InputStms[0].name + '.Out);\n') + self.OM_data_eqn += ('connect(' + self.name + '.In,' + self.input_stms[0].name + '.Out);\n') - if len(self.OutputStms)>1: + if len(self.output_stms)>1: strcount = 1 - for strm in self.OutputStms: + for strm in self.output_stms: self.OM_data_eqn += ('connect(' + strm.name + '.In,' + self.name + '.Out[' + str(strcount) + ']);\n') strcount += 1 else: - self.OM_data_eqn += ('connect(' + self.name + '.Out,' + self.OutputStms[0].name + '.In);\n') + self.OM_data_eqn += ('connect(' + self.name + '.Out,' + self.output_stms[0].name + '.In);\n') if self.mode: - self.OM_data_eqn += (self.name + '.' + self.mode + '=' + self.modeVal + ';\n') + self.OM_data_eqn += (self.name + '.' + self.mode + '=' + self.mode_val + ';\n') return self.OM_data_eqn +class ShortcutColumn(UnitOperation): + def __init__(self, CompNames = [], name='ShortcutColumn'): + UnitOperation.__init__(self) + self.name = name + str(ShortcutColumn.counter) + self.type = 'ShortcutColumn' + self.no_of_inputs = 1 + self.no_of_outputs = 2 + self.input_stms = None + self.output_stms = None + self.EngStm1 = EngStm(name='EngStm1'+self.name) + self.EngStm2 = EngStm(name='EngStm2'+self.name) + self.count = ShortcutColumn.counter + + self.parameters = ['HKey', 'LKey', 'HKey_x_pc', 'LKey_x_pc', 'Ctype', 'Pcond', 'Preb', 'RR'] + type(self).counter += 1 + + self.variables = { + 'HKey' : {'name':'Heavy Key', 'value':None, 'unit':''}, + 'LKey' : {'name':'Light Key', 'value':None, 'unit':''}, + 'HKey_x_pc' : {'name':'Heavy Key Mole Fraction', 'value':0.01, 'unit':'mol/s'}, + 'LKey_x_pc' : {'name':'Light Key Mole Fraction', 'value':0.01, 'unit':'mol/s'}, + 'Ctype' : {'name':'Condensor Type', 'value':None, 'unit':''}, + 'thermo_package' : {'name':'Thermo Package', 'value':'Raoults_Law', 'unit':''}, + 'Pcond' : {'name':'Condensor Pressure', 'value':101325, 'unit':'Pa'}, + 'Preb' : {'name':'Reboiler Pressure', 'value':101325, 'unit':'Pa'}, + 'RR' : {'name':'Reflux Ratio', 'value':1.5, 'unit':''}, + } + + def param_setter(self,params): + print("param_setter ", params) + self.variables['HKey']['value'] = params[0] + self.variables['LKey']['value'] = params[1] + self.variables['HKey_x_pc']['value'] = params[2] + self.variables['LKey_x_pc']['value'] = params[3] + self.variables['Ctype']['value'] = params[4] + self.variables['Pcond']['value'] = params[5] + self.variables['Preb']['value'] = params[6] + self.variables['RR']['value'] = params[7] + + print(self.variables) + + +class DistillationColumn(UnitOperation): + def __init__(self,name='DistillationColumn'): + self.name = name + str(DistillationColumn.counter) + self.type = 'DistillationColumn' + self.no_of_inputs = 2 + self.no_of_outputs = 2 + + self.compounds = compound_selected + + self.EngStm1 = EngStm(name='EngStm1'+self.name) + self.EngStm2 = EngStm(name='EngStm2'+self.name) + self.count = DistillationColumn.counter + + self.input_stms = None + self.output_stms = None + # self.modes_list = ['RR', 'Nout', 'T'] + self.modes_list = [] + self.parameters = [''] + #self.parameters = ['Nt', 'InT_s', 'In_s', 'thermo_package', 'Ctype', 'Pcond', 'Preb'] + self.Cspec_list = ['Reflux Ratio','Product Molar Flow (mol/s)', 'Temperature (K)', 'Compound Molar Fraction', 'Compound Molar Flow (mol/s)'] + self.Rspec_list = ['Product Molar Flow (mol/s)', 'Temperature (K)', 'Compound Molar Fraction', 'Compound Molar Flow (mol/s)'] + + type(self).counter += 1 + self.variables = { + 'RR' : {'name':'Reflux Ratio', 'value':None, 'unit':''}, + 'T' : {'name':'Temperature', 'value':300, 'unit':'K'}, + 'Nout' : {'name':'No of Sidedraws', 'value':None, 'unit':''}, + 'Nt' : {'name':'No of Stages', 'value':12, 'unit':''}, + 'InT_s' : {'name':'No of Feed Stages', 'value':None, 'unit':''}, + 'In_s' : {'name':'No of Feeds', 'value':None, 'unit':''}, + 'thermo_package' : {'name':'Thermo Package', 'value':'Raoults_Law', 'unit':''}, + 'Ctype' : {'name':'Condensor Type', 'value':'', 'unit':''}, + 'Pcond' : {'name':'Condensor Pressure', 'value':101325, 'unit':'Pa'}, + 'Preb' : {'name':'Reboiler Pressure', 'value':101325, 'unit':'Pa'}, + 'C_Spec': {'name':'Condensor Specification', 'type':'Reflux Ratio', 'value':'', 'comp':'', 'unit':''}, + 'R_Spec': {'name':'Reboiler Specification', 'type':'', 'value':'', 'comp':'', 'unit':''}, + } + def param_setter(self,params): + print("param_setter ", params) + self.variables['Nt']['value'] = params[0] + self.variables['In_s']['value'] = params[1] + self.variables['InT_s']['value'] = params[2] + self.variables['Ctype']['value'] = params[3] + self.variables['Pcond']['value'] = params[4] + self.variables['C_Spec']['type'] = params[5] + if 'Compound' in self.variables['C_Spec']['type']: + self.variables['C_Spec']['comp'] = params[6] + self.variables['C_Spec']['value'] = params[7] + self.variables['Preb']['value'] = params[8] + self.variables['R_Spec']['type'] = params[9] + if 'Compound' in self.variables['R_Spec']['type']: + self.variables['R_Spec']['comp'] = params[10] + self.variables['R_Spec']['value'] = params[11] + print(self.variables) + +class ConvertionReactor(UnitOperation): + def __init__(self,name='',Nr=None,b=None,X=None,Z=None,a=[],operation=None,Tdef=None): + UnitOperation.__init__(self) + self.name = name + self.type = 'ConvertionReactor' + + self.Nr = str(Nr) + self.b = str(b) + self.X = str(X) + self.Z = str(Z) + self.a = json.dumps(a).replace('[','{').replace(']','}') + self.operation = str(operation) + self.Tdef = str(Tdef) + +class CompoundSeparator(UnitOperation): + def __init__(self, name='CompoundSeparator'): + UnitOperation.__init__(self) + self.name = name + str(CompoundSeparator.counter) + self.type = 'CompoundSeparator' + self.no_of_inputs = 1 + self.no_of_outputs = 2 + + self.SepFact_modes = ['Molar_Flow (mol/s)', 'Mass_Flow (kg/s)', 'Inlet_Molar_Flow_Percent', 'Outlet_Molar_Flow_Percent'] + + type(self).counter += 1 + self.variables = { + 'SepStrm' : {'name':'Separation Stream', 'value':1, 'unit':''}, + #'SepVal' : {'name':'Separation Value', 'value':[], 'unit':''}, + #'SepFact' : {'name':'Separaction Factor', 'value':'', 'unit':''}, + } + + for i in self.compounds: + self.variables[i] = {'name':'SepVal_'+i, 'value':'', 'type':'', 'unit':''} + + # self.SepFact = json.dumps(self.variables['SepFact']['value']).replace('[','{').replace(']','}') + # self.SepStrm = str(self.variables['SepStrm']['value']) + # self.SepVal = json.dumps(self.variables['SepVal']['value']).replace('[','{').replace(']','}') + def param_setter(self,params): + print("param_setter ", params) + if params[0]: + self.variables['SepStrm']['value'] = 1 + elif params[1]: + self.variables['SepStrm']['value'] = 2 + + j = 2 + for i in self.compounds: + self.variables[i]['type'] = params[j] + self.variables[i]['value'] = float(params[j+1]) + j += 2 + print(self.variables) + +class Flash(UnitOperation): + def __init__(self,name='Flash'): + UnitOperation.__init__(self) + self.name = name + str(Flash.counter) + self.type = 'Flash' + self.no_of_inputs = 1 + self.no_of_outputs = 2 + self.input_stms = [] + self.output_stms = [] + self.count = Flash.counter + + type(self).counter += 1 + self.variables = { + 'thermo_package' : {'name':'Thermo Package', 'value':None, 'unit':''}, + 'BTdef' : {'name':'Separation Temperature Boolean', 'value':False, 'unit':''}, + 'BPdef' : {'name':'Separation Pressure Boolean', 'value':False, 'unit':''}, + 'Tdef' : {'name':'Separation Temperature', 'value':298.15, 'unit':'K'}, + 'Pdef' : {'name':'Separation Pressure', 'value':101325, 'unit':'Pa'} + } + def param_setter(self,params): + print("param_setter ", params) + self.variables['thermo_package']['value'] = params[0] + self.variables['BTdef']['value'] = params[1] + self.variables['Tdef']['value'] = params[2] + self.variables['BPdef']['value'] = params[3] + self.variables['Pdef']['value'] = params[4] + print(self.variables) + +class Pump(UnitOperation): + def __init__(self,name='Pump'): + UnitOperation.__init__(self) + self.name = name + str(Pump.counter) + self.type = 'Pump' + self.input_stms = None + self.output_stms = None + self.modes_list = ['Pdel', 'Pout', 'Q'] #"enFlo" + self.parameters = ['Eff'] + + type(self).counter += 1 + self.variables = { + 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''}, + 'Pdel' : {'name':'Pressure Increase', 'value':None, 'unit':'Pa'}, + 'Pout' : {'name':'Outlet Pressure', 'value':None, 'unit':'Pa'}, + 'Q' : {'name':'Power Required', 'value':None, 'unit':'W'}, + } + +class Valve(UnitOperation): + def __init__(self,name='Valve'): + UnitOperation.__init__(self) + self.name = name + str(Valve.counter) + self.type = 'Valve' + self.input_stms = None + self.output_stms = None + self.modes_list = ['Pdel', 'Pout'] + + type(self).counter += 1 + self.variables = { + 'Pdel' : {'name':'Pressure Drop', 'value':None, 'unit':'Pa'}, + 'Pout' : {'name':'Outlet Pressure', 'value':None, 'unit':'Pa'} + } + +class Splitter(UnitOperation): + def __init__(self,name='Splitter'): + UnitOperation.__init__(self) + self.name = name + str(Splitter.counter) + self.type = 'Splitter' + self.no_of_outputs = 3 + + # self.input_stms = None + self.CalcType_modes = ['Split Ratios', 'Mole Flow Specs', 'Mass Flow Specs'] + + self.parameters = ['NOO', 'CalcType']#, 'SpecVal_s' + type(self).counter += 1 + + self.variables = { + 'NOO' : {'name':'No. of Output', 'value':3, 'unit':''}, + 'CalcType' : {'name':'Calculation Type', 'value':self.CalcType_modes[0], 'unit':''}, + 'SpecVal_s' : {'name':'Specification Value', 'value':[50,50], 'unit':''} + } + + specval = self.variables['SpecVal_s']['value'] # [50,50] + self.specval = json.dumps(specval).replace('[','{').replace(']','}') + + def param_setter(self,params): + print("param_setter ", params) + self.variables['NOO']['value'] = int(params[0]) + self.variables['CalcType']['value'] = params[1] + self.variables['SpecVal_s']['value'] = [float(params[2]), float(params[3])] + if self.variables['CalcType']['value'] == 'Mole Flow Specs': + self.variables['SpecVal_s']['unit'] = 'mol/s' + elif self.variables['CalcType']['value'] == 'Mass Flow Specs': + self.variables['SpecVal_s']['unit'] = 'kg/s' + print(self.variables) + +class Mixer(UnitOperation): + + def __init__(self,name='Mixer'): + UnitOperation.__init__(self) + self.name = name + str(Mixer.counter) + self.type = 'Mixer' + self.no_of_inputs = 6 + + self.Pout_modes = ['Inlet Minimum', 'Inlet Average', 'Inlet Maximum'] + self.parameters = ['NI', 'outPress'] + # self.output_stms = None + type(self).counter += 1 + + self.variables = { + 'NI' : {'name':'Number of Input', 'value':6, 'unit':''}, + 'outPress' : {'name':'Outlet Pressure', 'value':'Inlet_Average', 'unit':''}, + } + def param_setter(self, params): + print(self.input_stms, self.output_stms) + self.output_stms = [] + print(self.input_stms, self.output_stms) + print("param_setter ", params) + self.variables['NI']['value'] = int(params[0]) + self.variables['outPress']['value'] = params[1] + print(self.variables) + + class Heater(UnitOperation): def __init__(self, name='Heater'): @@ -166,10 +437,10 @@ class Heater(UnitOperation): self.type = 'Heater' self.no_of_inputs = 1 self.no_of_outputs = 1 - self.modesList = ['Q','Tout','xvapout','Tdel'] + self.modes_list = ['Q','Tout','xvapout','Tdel'] self.parameters = ['Pdel', 'Eff'] self.extra = None - self.ForNaming = None + self.for_naming = None type(self).counter += 1 self.variables = { @@ -178,6 +449,7 @@ class Heater(UnitOperation): 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'}, 'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'}, 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'}, + 'xvapout': {'name':'Outlet Vapour', 'value':None, 'unit':''} } class Cooler(UnitOperation): @@ -188,18 +460,19 @@ class Cooler(UnitOperation): self.type = 'Cooler' self.no_of_inputs = 1 self.no_of_outputs = 1 - self.modesList = ["Q","Tout","xvapout","Tdel"] + self.modes_list = ['Q','Tout','Tdel','xvap'] self.extra = None - self.ForNaming = None + self.for_naming = None self.parameters = ['Pdel', 'Eff'] type(self).counter += 1 self.variables = { - 'Pdel' : {'name':'Pressure Drop', 'value':0, 'unit':'Pa'}, - 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''}, - 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'}, - 'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'}, - 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'}, + 'Pdel' : {'name':'Pressure Drop', 'value':0, 'unit':'Pa'}, + 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''}, + 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'}, + 'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'}, + 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'}, + 'xvap' : {'name':'Vapour Phase Mole Fraction', 'value':None, 'unit':'g/s'}, } class AdiabaticCompressor(UnitOperation): @@ -210,19 +483,20 @@ class AdiabaticCompressor(UnitOperation): self.type = 'AdiabaticCompressor' self.no_of_inputs = 1 self.no_of_outputs = 1 - self.modesList = ["Pdel","Pout","Q"] + self.modes_list = ["Pdel","Pout","Q"] self.extra = ['AdiabaticCompressor'] - self.ForNaming = ['AdiabaticCompressor'] - self.ThermoPackReq = True - self.thermoPackage ="RaoultsLaw" + self.for_naming = ['AdiabaticCompressor'] + self.thermo_pack_req = True + self.thermo_package ="RaoultsLaw" self.parameters = ['Eff'] type(self).counter += 1 self.variables = { 'Pdel' : {'name':'Pressure Drop', 'value':0, 'unit':'Pa'}, 'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'}, - 'Pout' : {'name':'Outlet Pressure', 'value':101325, 'unit':'Pa'}, - 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'}, + 'Pout' : {'name':'Outlet Pressure', 'value':101325, 'unit':'Pa'}, + 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'}, 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'}, + 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''} } class AdiabaticExpander(UnitOperation): @@ -233,11 +507,11 @@ class AdiabaticExpander(UnitOperation): self.type = 'AdiabaticExpander' self.no_of_inputs = 1 self.no_of_outputs = 1 - self.modesList = ["Pdel","Pout","Q"] + self.modes_list = ["Pdel","Pout","Q"] self.extra = ['AdiabaticExpander'] - self.ForNaming = ['AdiabaticExpander'] - self.ThermoPackReq = True - self.thermoPackage ="RaoultsLaw" + self.for_naming = ['AdiabaticExpander'] + self.thermo_pack_req = True + self.thermo_package ="RaoultsLaw" self.parameters = ['Eff'] type(self).counter += 1 self.variables = { @@ -246,6 +520,7 @@ class AdiabaticExpander(UnitOperation): 'Pout' : {'name':'Outlet Pressure', 'value':101325, 'unit':'Pa'}, 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'}, 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'}, + 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''} }
\ No newline at end of file diff --git a/class_diagram.pdf b/class_diagram.pdf Binary files differnew file mode 100644 index 0000000..c2c1134 --- /dev/null +++ b/class_diagram.pdf diff --git a/icon/AdiabaticCompressor.png b/icon/AdiabaticCompressor.png Binary files differnew file mode 100644 index 0000000..08a874c --- /dev/null +++ b/icon/AdiabaticCompressor.png diff --git a/icon/AdiabaticExpander.png b/icon/AdiabaticExpander.png Binary files differnew file mode 100644 index 0000000..aaec6dc --- /dev/null +++ b/icon/AdiabaticExpander.png diff --git a/icons/CompSep.png b/icon/CompoundSeparator.png Binary files differindex 6fd2d0c..6fd2d0c 100644 --- a/icons/CompSep.png +++ b/icon/CompoundSeparator.png diff --git a/icon/Cooler.png b/icon/Cooler.png Binary files differnew file mode 100644 index 0000000..08519ea --- /dev/null +++ b/icon/Cooler.png diff --git a/icons/DistCol.png b/icon/DistillationColumn.png Binary files differindex 32a06b3..32a06b3 100644 --- a/icons/DistCol.png +++ b/icon/DistillationColumn.png diff --git a/icons/Equation.png b/icon/Equation.png Binary files differindex 687be3c..687be3c 100644 --- a/icons/Equation.png +++ b/icon/Equation.png diff --git a/icon/Flash.png b/icon/Flash.png Binary files differnew file mode 100644 index 0000000..4c38d8d --- /dev/null +++ b/icon/Flash.png diff --git a/icon/Heater.png b/icon/Heater.png Binary files differnew file mode 100644 index 0000000..18b891a --- /dev/null +++ b/icon/Heater.png diff --git a/icon/MaterialStream.png b/icon/MaterialStream.png Binary files differnew file mode 100644 index 0000000..ac543e4 --- /dev/null +++ b/icon/MaterialStream.png diff --git a/icon/Mixer.png b/icon/Mixer.png Binary files differnew file mode 100644 index 0000000..ee4b507 --- /dev/null +++ b/icon/Mixer.png diff --git a/icon/Pump.png b/icon/Pump.png Binary files differnew file mode 100644 index 0000000..daf804b --- /dev/null +++ b/icon/Pump.png diff --git a/icons/Sequential.png b/icon/Sequential.png Binary files differindex 3b08856..3b08856 100644 --- a/icons/Sequential.png +++ b/icon/Sequential.png diff --git a/icons/ShortCol.png b/icon/ShortcutColumn.png Binary files differindex 32a06b3..32a06b3 100644 --- a/icons/ShortCol.png +++ b/icon/ShortcutColumn.png diff --git a/icon/Splitter.png b/icon/Splitter.png Binary files differnew file mode 100644 index 0000000..28f6d52 --- /dev/null +++ b/icon/Splitter.png diff --git a/icon/Valve.png b/icon/Valve.png Binary files differnew file mode 100644 index 0000000..63bd362 --- /dev/null +++ b/icon/Valve.png diff --git a/icons/compoundSelector.png b/icon/compoundSelector.png Binary files differindex cc878eb..cc878eb 100644 --- a/icons/compoundSelector.png +++ b/icon/compoundSelector.png diff --git a/icon/icon_1.svg b/icon/icon_1.svg new file mode 100644 index 0000000..1da1384 --- /dev/null +++ b/icon/icon_1.svg @@ -0,0 +1,732 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="594mm" + height="420mm" + viewBox="0 0 594 420" + version="1.1" + id="svg8" + inkscape:version="0.92.4 (unknown)" + sodipodi:docname="icon_1.svg"> + <defs + id="defs2" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.47318645" + inkscape:cx="1085.0351" + inkscape:cy="870.44478" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1865" + inkscape:window-height="1056" + inkscape:window-x="55" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:snap-global="false"> + <sodipodi:guide + position="38.306975,232.31858" + orientation="1,0" + id="guide2011" + inkscape:locked="false" /> + <sodipodi:guide + position="64.835656,235.07052" + orientation="1,0" + id="guide2013" + inkscape:locked="false" /> + <sodipodi:guide + position="122.67041,244.71812" + orientation="1,0" + id="guide2015" + inkscape:locked="false" /> + <sodipodi:guide + position="149.13484,251.56774" + orientation="1,0" + id="guide2017" + inkscape:locked="false" /> + </sodipodi:namedview> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,123)"> + <rect + style="opacity:1;vector-effect:none;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.51917696;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect2029" + width="43.993099" + height="30.633631" + x="-6.1643405" + y="-217.32184" /> + <rect + style="opacity:1;vector-effect:none;fill:#fff6d5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.70616245;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect394" + width="66.145836" + height="201.51312" + x="766.57684" + y="-313.47989" /> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2253848;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1049" + width="39.462116" + height="39.462116" + x="-74.921936" + y="70.041443" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /> + <g + id="g2027" + transform="matrix(0.5,0,0,0.5,26.82059,-32.083134)"> + <g + transform="translate(0,12.142503)" + id="g1890"> + <g + id="g436" + transform="translate(74.573546,-175.45207)"> + <g + inkscape:export-ydpi="300" + inkscape:export-xdpi="300" + transform="translate(-2.0545634e-6,5.7992693e-6)" + id="g1073"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path392" + d="M 74.222905,94.546573 H 48.760335" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + id="g422"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path396" + d="m 74.1844,94.545543 -5.845362,4.242013" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + transform="matrix(1,0,0,-1,0,188.06436)" + id="g428"> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 74.1844,93.498902 -5.845362,4.242013" + id="path424" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(1.0131489,-1.0238188,1.0238188,1.0131489,-4.2710557,13.822723)" + id="g469"> + <g + id="g459" + transform="translate(-2.0545634e-6,5.7992693e-6)" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /> + <g + id="g463" /> + <g + id="g467" + transform="matrix(1,0,0,-1,0,188.06436)" /> + </g> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path471" + cx="154.63138" + cy="46.335262" + r="0" /> + <circle + r="12.87918" + cy="-84.209984" + cx="798.29523" + id="circle1343" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69997323;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1345" + d="M 823.58145,-84.147368 H 773.51281" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + d="m 816.45781,-89.224968 7.04793,5.09514 -7.04793,5.15469" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1351" /> + <g + id="g1851" + transform="matrix(0.5,0,0,0.5,15.961607,-20.655148)"> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + d="m 40.17402,99.982004 13.01746,9.639106 -13.01746,9.75174 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1414" /> + <path + id="path1416" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 66.17938,99.982004 -13.01747,9.639106 13.01747,9.75174 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + </g> + <g + id="g1881" + transform="matrix(0.5,0,0,0.5,17.128285,-19.87535)"> + <g + transform="translate(-223.95846,235.07091)" + id="g1623"> + <g + id="g1370" + transform="rotate(-52.431815,166.72402,-104.61321)"> + <g + id="g1341"> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1306" + cx="155.64589" + cy="45.839531" + r="12.87918" /> + <g + id="g1331"> + <g + style="stroke:#ff0000" + id="g1320" + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)"> + <g + style="stroke:#ff0000" + inkscape:export-ydpi="300" + inkscape:export-xdpi="300" + transform="translate(-2.0545634e-6,5.7992693e-6)" + id="g1310"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1308" + d="M 74.222905,94.546573 H 48.760335" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + style="stroke:#ff0000" + id="g1314" /> + <g + style="stroke:#ff0000" + transform="matrix(1,0,0,-1,0,188.06436)" + id="g1318"> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1316" /> + </g> + </g> + </g> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.85591602px;line-height:16.1558075px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#492449;fill-opacity:1;stroke:none;stroke-width:1.11419368px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="274.11319" + y="1.5254955" + id="text1374"><tspan + sodipodi:role="line" + id="tspan1372" + x="274.11319" + y="1.5254955" + style="fill:#492449;fill-opacity:1;stroke-width:1.11419368px">H</tspan></text> + </g> + </g> + <g + id="g1866" + transform="matrix(0.5,0,0,0.5,17.046258,-19.979869)"> + <g + transform="translate(-83.05765,135.18057)" + id="g1412"> + <g + transform="matrix(0.6097052,0.79262827,0.79262827,-0.6097052,6.9260527,-59.433115)" + id="g1394"> + <g + id="g1392"> + <circle + r="12.87918" + cy="45.839531" + cx="155.64589" + id="circle1376" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <g + id="g1390"> + <g + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)" + id="g1388" + style="stroke:#ff0000"> + <g + id="g1380" + transform="translate(-2.0545634e-6,5.7992693e-6)" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" + style="stroke:#ff0000"> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 74.222905,94.546573 H 48.760335" + id="path1378" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + <g + id="g1382" + style="stroke:#ff0000" /> + <g + id="g1386" + transform="matrix(1,0,0,-1,0,188.06436)" + style="stroke:#ff0000"> + <path + id="path1384" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + </g> + </g> + </g> + </g> + </g> + <text + id="text1398" + y="41.936649" + x="133.04834" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.85591602px;line-height:16.1558075px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#492449;fill-opacity:1;stroke:none;stroke-width:1.11419368px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="fill:#492449;fill-opacity:1;stroke-width:1.11419368px" + y="41.936649" + x="133.04834" + id="tspan1396" + sodipodi:role="line">C</tspan></text> + </g> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35299999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 43.669706,-33.941755 c -3.420356,0 -6.173783,1.67604 -6.173783,3.757909 v 0.557591 H 50.43725 v -0.557591 c 0,-2.081869 -2.753426,-3.757909 -6.173782,-3.757909 z m -6.173783,5.858558 V -13.39624 H 50.43725 v -14.686957 z m 0,16.230015 v 0.324011 c 0,2.0818715 2.753427,3.7579116 6.173783,3.7579116 h 0.593762 c 3.420356,0 6.173782,-1.6760401 6.173782,-3.7579116 v -0.324011 z" + id="rect1451" + inkscape:connector-curvature="0" /> + <g + id="g1847" + transform="matrix(0.5,0,0,0.5,17.761179,-19.772226)"> + <g + transform="translate(-36.185666,-15.387545)" + id="g1531"> + <g + id="g1507" + transform="translate(19.84375)" + style="stroke:#492449;stroke-opacity:1"> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1494" + width="25.831001" + height="3.1642954" + x="55.012814" + y="85.833954" + ry="0" /> + <circle + r="10.438661" + cy="73.683235" + cx="68.088394" + id="circle1488" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.78197443;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1490" + d="M 68.072509,73.683235 H 55.045533" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 100.68254,63.240216 H 87.655564" + id="path1509" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35040316;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 88.361702,-37.886812 v 4.7625 0.517798 4.233333 l 12.878798,-2.102973 v -2.13036 -0.517798 -2.659528 z" + id="path1533" + inkscape:connector-curvature="0" /> + <path + inkscape:connector-curvature="0" + id="path1544" + d="m 101.08203,-6.3428385 v 4.7625 0.517795 4.233335 L 88.203232,1.0678165 v -2.13036 -0.517795 -2.65953 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35040316;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 164.96484 192.87305 C 152.03752 192.87305 141.63086 199.20769 141.63086 207.07617 L 141.63086 209.18555 L 190.54297 209.18555 L 190.54297 207.07617 C 190.54297 199.20769 180.13436 192.87305 167.20703 192.87305 L 164.96484 192.87305 z M 141.63086 215.01758 L 141.63086 270.52734 L 190.54297 270.52734 L 190.54297 215.01758 L 141.63086 215.01758 z M 141.63086 276.35938 L 141.63086 277.58398 C 141.63086 285.45247 152.03752 291.78711 164.96484 291.78711 L 167.20703 291.78711 C 180.13436 291.78711 190.54297 285.45247 190.54297 277.58398 L 190.54297 276.35938 L 141.63086 276.35938 z " + transform="matrix(0.26458333,0,0,0.26458333,0,-123)" + id="rect1546" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.29405668;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 50.367322,-59.593005 c -0.909315,0 -0.712255,1.419033 -1.621569,1.419033 -0.909315,0 -0.71225,-1.419033 -1.621565,-1.419033 -0.909315,0 -0.712255,1.419033 -1.621571,1.419033 -0.909316,0 -0.712253,-1.419033 -1.62157,-1.419033 -0.909316,0 -0.712253,1.419033 -1.621569,1.419033 -0.909317,0 -0.712255,-1.419033 -1.621571,-1.419033 -0.909316,0 -0.712254,1.419033 -1.62157,1.419033 -0.909316,0 -0.712254,-1.419033 -1.62157,-1.419033" + id="path1552" + inkscape:connector-curvature="0" + sodipodi:nodetypes="czzzzzzzc" /> + <g + id="g1931" + transform="matrix(0.5,0,0,0.5,30.664016,-14.875669)"> + <g + transform="translate(173.43664,-129.08319)" + id="g1823"> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2253848;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1070" + width="39.462116" + height="39.462116" + x="66.408394" + y="79.791267" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 57.154697,58.824045 h 1.186983 c 6.84071,0 12.347852,3.35204 12.347852,7.51578 v 70.675665 62.41297 c 0,4.16374 -5.507142,7.51577 -12.347852,7.51577 h -1.186983 c -6.84071,0 -12.347852,-3.35203 -12.347852,-7.51577 v -62.9215 -70.167135 c 0,-4.16374 5.507142,-7.51578 12.347852,-7.51578 z" + id="rect1575" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ssscsssscss" /> + <g + id="g1649" + transform="translate(-182.42801,52.455977)"> + <g + id="g1643" + transform="rotate(-52.431815,166.72402,-104.61321)"> + <g + id="g1641"> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="circle1625" + cx="155.64589" + cy="45.839531" + r="12.87918" /> + <g + id="g1639"> + <g + style="stroke:#ff0000" + id="g1637" + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)"> + <g + style="stroke:#ff0000" + inkscape:export-ydpi="300" + inkscape:export-xdpi="300" + transform="translate(-2.0545634e-6,5.7992693e-6)" + id="g1629"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1627" + d="M 74.222905,94.546573 H 48.760335" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + style="stroke:#ff0000" + id="g1631" /> + <g + style="stroke:#ff0000" + transform="matrix(1,0,0,-1,0,188.06436)" + id="g1635"> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1633" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(-1,0,0,1,374.22351,220.94571)" + id="g1675"> + <g + transform="rotate(-52.431815,166.72402,-104.61321)" + id="g1669"> + <g + id="g1667"> + <circle + r="12.87918" + cy="45.839531" + cx="155.64589" + id="circle1651" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <g + id="g1665"> + <g + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)" + id="g1663" + style="stroke:#ff0000"> + <g + id="g1655" + transform="translate(-2.0545634e-6,5.7992693e-6)" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" + style="stroke:#ff0000"> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 74.222905,94.546573 H 48.760335" + id="path1653" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + <g + id="g1657" + style="stroke:#ff0000" /> + <g + id="g1661" + transform="matrix(1,0,0,-1,0,188.06436)" + style="stroke:#ff0000"> + <path + id="path1659" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + </g> + </g> + </g> + </g> + </g> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 82.089856,217.18513 H 57.748189 v -10.15632" + id="path1709" + inkscape:connector-curvature="0" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 57.748189,58.700631 V 48.583146 h 26.02996" + id="path1682" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1703" + d="M 70.448189,82.431634 H 110.23648" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 97.14005,61.295994 V 82.136052" + id="path1715" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <g + id="g1739" + transform="matrix(-1,0,0,1,84.846711,-0.30335508)"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1711" + d="m 14.448838,91.201636 h 18.09246" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1713" + d="M 20.79884,105.33795 H 39.420466" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 14.448838,119.47426 h 18.09246" + id="path1719" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 21.328006,133.61058 h 18.09246" + id="path1721" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1723" + d="m 14.448838,147.74689 h 18.09246" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1725" + d="m 21.328006,161.88321 h 18.09246" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 14.448838,176.01953 h 18.09246" + id="path1727" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 70.448189,182.97335 H 110.23648" + id="path1741" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1743" + d="m 97.14005,183.00438 v 20.84007" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + </g> + <path + inkscape:connector-curvature="0" + id="path1825" + d="m 88.634922,28.795099 v 12.82324 h 6.27611 l 6.547158,-6.41162 -6.547158,-6.41162 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + sodipodi:nodetypes="cccccc" /> + <path + sodipodi:nodetypes="cccccc" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 100.83549,71.723329 v 12.82324 h -6.276108 l -6.54716,-6.41162 6.54716,-6.41162 z" + id="path1827" + inkscape:connector-curvature="0" /> + <g + id="g2009" + transform="translate(-137.55149,8.7979388)"> + <rect + ry="3.3609526" + y="-74.577286" + x="370.66953" + height="25.470205" + width="43.075089" + id="rect1933" + style="opacity:1;vector-effect:none;fill:#c8c4b7;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <text + id="text1937" + y="-53.083542" + x="372.93628" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.10041618px;line-height:27.29670143px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88253105px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1.88253105px" + y="-53.083542" + x="372.93628" + id="tspan1935" + sodipodi:role="line">SQ</tspan></text> + </g> + <g + id="g2004" + transform="translate(-137.55149,23.489355)"> + <rect + style="opacity:1;vector-effect:none;fill:#c8c4b7;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1945" + width="43.075089" + height="25.470205" + x="370.8223" + y="-41.2733" + ry="3.3609526" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.10041618px;line-height:27.29670143px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.88253105px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="373.08905" + y="-19.779552" + id="text1949"><tspan + sodipodi:role="line" + id="tspan1947" + x="373.08905" + y="-19.779552" + style="stroke-width:1.88253105px">EQ</tspan></text> + </g> + <g + id="g1999" + transform="translate(-137.55149,31.267163)"> + <rect + ry="3.3609526" + y="-2.3513699" + x="371.12784" + height="25.470205" + width="43.075089" + id="rect1951" + style="opacity:1;vector-effect:none;fill:#c8c4b7;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <rect + style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50269556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1957" + width="29.853903" + height="17.652548" + x="377.73843" + y="1.5574627" + ry="2.3293638" /> + <text + id="text1961" + y="15.759001" + x="381.56311" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.27015781px;line-height:15.51879597px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.07026172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1.07026172px" + y="15.759001" + x="381.56311" + id="tspan1959" + sodipodi:role="line">PW</tspan></text> + </g> + <g + id="g1993" + transform="translate(-137.55149,39.909171)"> + <rect + style="opacity:1;vector-effect:none;fill:#c8c4b7;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1963" + width="43.075089" + height="25.470205" + x="371.12784" + y="39.220215" + ry="3.3609526" /> + <circle + r="10.986364" + cy="-279.5603" + cx="-280.59134" + id="circle1971" + style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60186213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + transform="matrix(-0.60970512,-0.79262833,-0.79262833,0.60970512,0,0)" /> + <rect + y="43.313293" + x="391.04501" + height="17.284018" + width="3.2407534" + id="rect1988" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <path + inkscape:connector-curvature="0" + id="rect1453" + d="m 35.59113,-29.626264 v 1.543061 h 16.750914 v -1.543061 z m 0,16.230011 v 1.54306 h 16.750914 v -1.54306 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + inkscape:connector-curvature="0" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 35.567855,-67.652992 v 1.54306 h 16.751432 v -1.54306 z m 0,16.23001 v 1.54306 h 16.751432 v -1.54306 z" + id="rect1548" /> + </g> +</svg> diff --git a/icon/logo.png b/icon/logo.png Binary files differnew file mode 100644 index 0000000..541e99e --- /dev/null +++ b/icon/logo.png diff --git a/icons/new.svg b/icon/new.svg index bd566f3..bd566f3 100644 --- a/icons/new.svg +++ b/icon/new.svg diff --git a/icons/package-icon.svg b/icon/package-icon.svg index 43382a3..43382a3 100644 --- a/icons/package-icon.svg +++ b/icon/package-icon.svg diff --git a/icons/plus.png b/icon/plus.png Binary files differindex 08a6564..08a6564 100644 --- a/icons/plus.png +++ b/icon/plus.png diff --git a/icons/zoomIn.png b/icon/zoomIn.png Binary files differindex b10c61a..b10c61a 100644 --- a/icons/zoomIn.png +++ b/icon/zoomIn.png diff --git a/icons/zoomOut.png b/icon/zoomOut.png Binary files differindex 6c60a02..6c60a02 100644 --- a/icons/zoomOut.png +++ b/icon/zoomOut.png diff --git a/icons/zoomReset.png b/icon/zoomReset.png Binary files differindex 62fc917..62fc917 100644 --- a/icons/zoomReset.png +++ b/icon/zoomReset.png diff --git a/icons/AdiabaticCompressor.png b/icons/AdiabaticCompressor.png Binary files differindex 08a874c..1fd7bb0 100644 --- a/icons/AdiabaticCompressor.png +++ b/icons/AdiabaticCompressor.png diff --git a/icons/AdiabaticExpander.png b/icons/AdiabaticExpander.png Binary files differindex aaec6dc..615a638 100644 --- a/icons/AdiabaticExpander.png +++ b/icons/AdiabaticExpander.png diff --git a/icons/Column.png b/icons/Column.png Binary files differnew file mode 100644 index 0000000..84c0bcc --- /dev/null +++ b/icons/Column.png diff --git a/icons/CompoundSeparator.png b/icons/CompoundSeparator.png Binary files differnew file mode 100644 index 0000000..3435dcf --- /dev/null +++ b/icons/CompoundSeparator.png diff --git a/icons/Cooler.png b/icons/Cooler.png Binary files differindex 08519ea..4dcb802 100644 --- a/icons/Cooler.png +++ b/icons/Cooler.png diff --git a/icons/DistillationColumn.png b/icons/DistillationColumn.png Binary files differnew file mode 100644 index 0000000..f65150b --- /dev/null +++ b/icons/DistillationColumn.png diff --git a/icons/Flash.png b/icons/Flash.png Binary files differindex 4c38d8d..9a84def 100644 --- a/icons/Flash.png +++ b/icons/Flash.png diff --git a/icons/Heater.png b/icons/Heater.png Binary files differindex 18b891a..52b8c00 100644 --- a/icons/Heater.png +++ b/icons/Heater.png diff --git a/icons/MaterialStream.png b/icons/MaterialStream.png Binary files differindex ac543e4..b548d3f 100644 --- a/icons/MaterialStream.png +++ b/icons/MaterialStream.png diff --git a/icons/Mixer.png b/icons/Mixer.png Binary files differindex ee4b507..6656945 100644 --- a/icons/Mixer.png +++ b/icons/Mixer.png diff --git a/icons/Pump.png b/icons/Pump.png Binary files differindex daf804b..a2d3e8e 100644 --- a/icons/Pump.png +++ b/icons/Pump.png diff --git a/icons/ShortcutColumn.png b/icons/ShortcutColumn.png Binary files differnew file mode 100644 index 0000000..f65150b --- /dev/null +++ b/icons/ShortcutColumn.png diff --git a/icons/Splitter.png b/icons/Splitter.png Binary files differindex 28f6d52..778bcda 100644 --- a/icons/Splitter.png +++ b/icons/Splitter.png diff --git a/icons/Valve.png b/icons/Valve.png Binary files differindex 63bd362..3cfd5c4 100644 --- a/icons/Valve.png +++ b/icons/Valve.png diff --git a/icons/compound.png b/icons/compound.png Binary files differnew file mode 100644 index 0000000..a9c946d --- /dev/null +++ b/icons/compound.png diff --git a/icons/eq.png b/icons/eq.png Binary files differnew file mode 100644 index 0000000..cb0485a --- /dev/null +++ b/icons/eq.png diff --git a/icons/icon_1.svg b/icons/icon_1.svg new file mode 100644 index 0000000..7f6acd7 --- /dev/null +++ b/icons/icon_1.svg @@ -0,0 +1,868 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="594mm" + height="420mm" + viewBox="0 0 594 420" + version="1.1" + id="svg8" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + sodipodi:docname="icon_1.svg"> + <defs + id="defs2"> + <linearGradient + inkscape:collect="always" + id="linearGradient7271"> + <stop + style="stop-color:#dcdcdc;stop-opacity:1;" + offset="0" + id="stop7267" /> + <stop + style="stop-color:#dcdcdc;stop-opacity:0;" + offset="1" + id="stop7269" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient7271" + id="linearGradient7273" + x1="370.30686" + y1="-61.842183" + x2="414.10727" + y2="-61.842183" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.9570334,1.9570334)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.6767468" + inkscape:cx="167.48347" + inkscape:cy="827.81667" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1304" + inkscape:window-height="745" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-global="false"> + <sodipodi:guide + position="38.306975,232.31858" + orientation="1,0" + id="guide2011" + inkscape:locked="false" /> + <sodipodi:guide + position="64.835656,235.07052" + orientation="1,0" + id="guide2013" + inkscape:locked="false" /> + <sodipodi:guide + position="122.67041,244.71812" + orientation="1,0" + id="guide2015" + inkscape:locked="false" /> + <sodipodi:guide + position="149.13484,251.56774" + orientation="1,0" + id="guide2017" + inkscape:locked="false" /> + </sodipodi:namedview> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,123)"> + <rect + style="opacity:1;vector-effect:none;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.51917696;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect2029" + width="43.993099" + height="30.633631" + x="-6.1643405" + y="-217.32184" /> + <rect + style="opacity:1;vector-effect:none;fill:#fff6d5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.70616245;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect394" + width="66.145836" + height="201.51312" + x="766.57684" + y="-313.47989" /> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2253848;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1049" + width="39.462116" + height="39.462116" + x="-74.921936" + y="70.041443" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /> + <g + id="g2027" + transform="matrix(0.5,0,0,0.5,26.82059,-32.083134)" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\MaterialStream.png"> + <g + transform="translate(0,12.142503)" + id="g1890"> + <g + id="g436" + transform="translate(68.42287,-171.538)" + style="fill:#004646;fill-opacity:0;stroke:#004646;stroke-opacity:1"> + <g + inkscape:export-ydpi="300" + inkscape:export-xdpi="300" + transform="translate(-2.0545634e-6,5.7992693e-6)" + id="g1073" + style="fill:#004646;fill-opacity:0;stroke:#004646;stroke-opacity:1"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path392" + d="M 74.222905,94.546573 H 48.760335" + style="opacity:1;vector-effect:none;fill:#004646;fill-opacity:0;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + id="g422" + style="fill:#004646;fill-opacity:0;stroke:#004646;stroke-opacity:1"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path396" + d="m 74.1844,94.545543 -5.845362,4.242013" + style="opacity:1;vector-effect:none;fill:#004646;fill-opacity:0;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + transform="matrix(1,0,0,-1,0,188.06436)" + id="g428" + style="fill:#004646;fill-opacity:0;stroke:#004646;stroke-opacity:1"> + <path + style="opacity:1;vector-effect:none;fill:#004646;fill-opacity:0;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 74.1844,93.498902 -5.845362,4.242013" + id="path424" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(1.0131489,-1.0238188,1.0238188,1.0131489,-4.2710557,13.822723)" + id="g469"> + <g + id="g459" + transform="translate(-2.0545634e-6,5.7992693e-6)" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" /> + <g + id="g463" /> + <g + id="g467" + transform="matrix(1,0,0,-1,0,188.06436)" /> + </g> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path471" + cx="154.63138" + cy="46.335262" + r="0" /> + <circle + r="12.87918" + cy="-84.209984" + cx="798.29523" + id="circle1343" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69997323;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1345" + d="M 823.58145,-84.147368 H 773.51281" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + d="m 816.45781,-89.224968 7.04793,5.09514 -7.04793,5.15469" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1351" /> + <g + id="g1851" + transform="matrix(0.5,0,0,0.5,15.961607,-20.655148)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Valve.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + d="m 40.17402,99.982004 13.01746,9.639106 -13.01746,9.75174 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1414" /> + <path + id="path1416" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 66.17938,99.982004 -13.01747,9.639106 13.01747,9.75174 z" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + </g> + <g + id="g1881" + transform="matrix(0.5,0,0,0.5,16.83175,-19.87535)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Heater.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + style="stroke-width:0.84666667;stroke-miterlimit:4;stroke-dasharray:none"> + <g + transform="translate(-223.95846,235.07091)" + id="g1623" + style="stroke-width:0.84666667;stroke-miterlimit:4;stroke-dasharray:none"> + <g + id="g1370" + transform="rotate(-52.431815,166.72402,-104.61321)" + style="stroke-width:0.84666667;stroke-miterlimit:4;stroke-dasharray:none"> + <g + id="g1341" + style="stroke-width:0.84666667;stroke-miterlimit:4;stroke-dasharray:none"> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.84666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1306" + cx="155.64589" + cy="45.839531" + r="12.87918" /> + <g + id="g1331" + style="stroke-width:0.84666667;stroke-miterlimit:4;stroke-dasharray:none"> + <g + style="stroke:#ff0000;stroke-width:0.43057511;stroke-miterlimit:4;stroke-dasharray:none" + id="g1320" + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)"> + <g + style="stroke:#ff0000;stroke-width:0.43057511;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:export-ydpi="300" + inkscape:export-xdpi="300" + transform="translate(-2.0545634e-6,5.7992693e-6)" + id="g1310"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1308" + d="M 74.222905,94.546573 H 48.760335" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.43057511;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + style="stroke:#ff0000;stroke-width:0.43057511;stroke-miterlimit:4;stroke-dasharray:none" + id="g1314" /> + <g + style="stroke:#ff0000;stroke-width:0.43057511;stroke-miterlimit:4;stroke-dasharray:none" + transform="matrix(1,0,0,-1,0,188.06436)" + id="g1318"> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.43057511;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1316" /> + </g> + </g> + </g> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.85591602px;line-height:16.1558075px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#004646;fill-opacity:1;stroke:none;stroke-width:0.84666667;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + x="274.11319" + y="1.5254955" + id="text1374"><tspan + sodipodi:role="line" + id="tspan1372" + x="274.11319" + y="1.5254955" + style="fill:#004646;fill-opacity:1;stroke-width:0.84666667;stroke-miterlimit:4;stroke-dasharray:none">H</tspan></text> + </g> + </g> + <g + id="g1866" + transform="matrix(0.5,0,0,0.5,17.046258,-19.979869)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Cooler.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <g + transform="translate(-83.05765,135.18057)" + id="g1412"> + <g + transform="matrix(0.6097052,0.79262827,0.79262827,-0.6097052,6.9260527,-59.433115)" + id="g1394"> + <g + id="g1392"> + <circle + r="12.87918" + cy="45.839531" + cx="155.64589" + id="circle1376" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <g + id="g1390"> + <g + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)" + id="g1388" + style="stroke:#ff0000"> + <g + id="g1380" + transform="translate(-2.0545634e-6,5.7992693e-6)" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" + style="stroke:#ff0000"> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 74.222905,94.546573 H 48.760335" + id="path1378" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + <g + id="g1382" + style="stroke:#ff0000" /> + <g + id="g1386" + transform="matrix(1,0,0,-1,0,188.06436)" + style="stroke:#ff0000"> + <path + id="path1384" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.3588126;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + </g> + </g> + </g> + </g> + </g> + <text + id="text1398" + y="41.936649" + x="133.04834" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.85591602px;line-height:16.1558075px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#004646;fill-opacity:1;stroke:none;stroke-width:1.11419368px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" + xml:space="preserve"><tspan + style="fill:#004646;fill-opacity:1;stroke-width:1.11419368px;" + y="41.936649" + x="133.04834" + id="tspan1396" + sodipodi:role="line">C</tspan></text> + </g> + </g> + <path + style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:0;fill-rule:nonzero;stroke:#004646;stroke-width:0.35299999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 43.669706,-33.941755 c -3.420356,0 -6.173783,1.67604 -6.173783,3.757909 v 0.557591 H 50.43725 v -0.557591 c 0,-2.081869 -2.753426,-3.757909 -6.173782,-3.757909 z m -6.173783,5.858558 V -13.39624 H 50.43725 v -14.686957 z m 0,16.230015 v 0.324011 c 0,2.0818715 2.753427,3.7579116 6.173783,3.7579116 h 0.593762 c 3.420356,0 6.173782,-1.6760401 6.173782,-3.7579116 v -0.324011 z" + id="rect1451" + inkscape:connector-curvature="0" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\CompoundSeparator.png" /> + <g + id="g1847" + transform="matrix(0.5,0,0,0.5,17.761179,-19.772226)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Pump.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <g + transform="translate(-36.185666,-15.387545)" + id="g1531"> + <g + id="g1507" + transform="translate(19.84375)" + style="stroke:#004646;stroke-opacity:1"> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1494" + width="25.831001" + height="3.1642954" + x="55.012814" + y="85.833954" + ry="0" /> + <circle + r="10.438661" + cy="73.683235" + cx="68.088394" + id="circle1488" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.78197443;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1490" + d="M 68.072509,73.683235 H 55.045533" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 100.68254,63.240216 H 87.655564" + id="path1509" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + </g> + <path + style="opacity:1;vector-effect:none;fill:#004646;fill-opacity:0;fill-rule:nonzero;stroke:#004646;stroke-width:0.35;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 88.361702,-37.886812 v 4.7625 0.517798 4.233333 l 12.878798,-2.102973 v -2.13036 -0.517798 -2.659528 z" + id="path1533" + inkscape:connector-curvature="0" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\AdiabaticCompressor.png" /> + <path + inkscape:connector-curvature="0" + id="path1544" + d="m 101.08203,-6.3428385 v 4.7625 0.517795 4.233335 L 88.203232,1.0678165 v -2.13036 -0.517795 -2.65953 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.35040316;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\AdiabaticExpander.png" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 164.96484 192.87305 C 152.03752 192.87305 141.63086 199.20769 141.63086 207.07617 L 141.63086 209.18555 L 190.54297 209.18555 L 190.54297 207.07617 C 190.54297 199.20769 180.13436 192.87305 167.20703 192.87305 L 164.96484 192.87305 z M 141.63086 215.01758 L 141.63086 270.52734 L 190.54297 270.52734 L 190.54297 215.01758 L 141.63086 215.01758 z M 141.63086 276.35938 L 141.63086 277.58398 C 141.63086 285.45247 152.03752 291.78711 164.96484 291.78711 L 167.20703 291.78711 C 180.13436 291.78711 190.54297 285.45247 190.54297 277.58398 L 190.54297 276.35938 L 141.63086 276.35938 z " + id="rect1546" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + transform="matrix(0.26458333,0,0,0.26458333,0,-123)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Flash.png" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.29405668;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 50.367322,-59.593005 c -0.909315,0 -0.712255,1.419033 -1.621569,1.419033 -0.909315,0 -0.71225,-1.419033 -1.621565,-1.419033 -0.909315,0 -0.712255,1.419033 -1.621571,1.419033 -0.909316,0 -0.712253,-1.419033 -1.62157,-1.419033 -0.909316,0 -0.712253,1.419033 -1.621569,1.419033 -0.909317,0 -0.712255,-1.419033 -1.621571,-1.419033 -0.909316,0 -0.712254,1.419033 -1.62157,1.419033 -0.909316,0 -0.712254,-1.419033 -1.62157,-1.419033" + id="path1552" + inkscape:connector-curvature="0" + sodipodi:nodetypes="czzzzzzzc" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Flash.png" /> + <g + id="g1931" + transform="matrix(0.5,0,0,0.5,59.180788,-12.359483)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + style="stroke-width:1.69333333;stroke-miterlimit:4;stroke-dasharray:none"> + <g + transform="translate(173.43664,-129.08319)" + id="g1823" + style="stroke-width:1.69333333;stroke-miterlimit:4;stroke-dasharray:none"> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1070" + width="39.462116" + height="39.462116" + x="66.408394" + y="79.791267" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 57.154697,58.824045 h 1.186983 c 6.84071,0 12.347852,3.35204 12.347852,7.51578 v 70.675665 62.41297 c 0,4.16374 -5.507142,7.51577 -12.347852,7.51577 h -1.186983 c -6.84071,0 -12.347852,-3.35203 -12.347852,-7.51577 v -62.9215 -70.167135 c 0,-4.16374 5.507142,-7.51578 12.347852,-7.51578 z" + id="rect1575" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ssscsssscss" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <g + id="g1649" + transform="translate(-182.42801,52.455977)" + style="stroke:#004646;stroke-opacity:1;stroke-width:3.38666667;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127"> + <g + id="g1643" + transform="rotate(-52.431815,166.72402,-104.61321)" + style="stroke:#004646;stroke-opacity:1;stroke-width:3.38666667;stroke-miterlimit:4;stroke-dasharray:none"> + <g + id="g1641" + style="stroke:#004646;stroke-opacity:1;stroke-width:3.38666667;stroke-miterlimit:4;stroke-dasharray:none"> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="circle1625" + cx="155.64589" + cy="45.839531" + r="12.87918" /> + <g + id="g1639" + style="stroke:#004646;stroke-opacity:1;stroke-width:3.38666667;stroke-miterlimit:4;stroke-dasharray:none"> + <g + style="stroke:#004646;stroke-opacity:1;stroke-width:1.72230045;stroke-miterlimit:4;stroke-dasharray:none" + id="g1637" + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)"> + <g + style="stroke:#004646;stroke-opacity:1;stroke-width:1.72230045;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:export-ydpi="300" + inkscape:export-xdpi="300" + transform="translate(-2.0545634e-6,5.7992693e-6)" + id="g1629"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1627" + d="M 74.222905,94.546573 H 48.760335" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:1.72230045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <g + style="stroke:#004646;stroke-opacity:1;stroke-width:1.72230045;stroke-miterlimit:4;stroke-dasharray:none" + id="g1631" /> + <g + style="stroke:#ff0000;stroke-opacity:1;stroke-width:1.72230045;stroke-miterlimit:4;stroke-dasharray:none" + transform="matrix(1,0,0,-1,0,188.06436)" + id="g1635"> + <path + sodipodi:nodetypes="ccc" + inkscape:connector-curvature="0" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:1.72230045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="path1633" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(-1,0,0,1,374.22351,220.94571)" + id="g1675" + style="stroke-width:1.69333333;stroke-miterlimit:4;stroke-dasharray:none"> + <g + transform="rotate(-52.431815,166.72402,-104.61321)" + id="g1669" + style="stroke-width:1.69333333;stroke-miterlimit:4;stroke-dasharray:none"> + <g + id="g1667" + style="stroke:#004646;stroke-opacity:1;stroke-width:1.69333333;stroke-miterlimit:4;stroke-dasharray:none"> + <circle + r="12.87918" + cy="45.839531" + cx="155.64589" + id="circle1651" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <g + id="g1665" + style="stroke:#004646;stroke-opacity:1;stroke-width:1.69333333;stroke-miterlimit:4;stroke-dasharray:none"> + <g + transform="matrix(1.9663623,0,0,1.9663623,34.983,-140.01067)" + id="g1663" + style="stroke:#004646;stroke-opacity:1;stroke-width:0.86115022;stroke-miterlimit:4;stroke-dasharray:none"> + <g + id="g1655" + transform="translate(-2.0545634e-6,5.7992693e-6)" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" + style="stroke:#004646;stroke-opacity:1;stroke-width:1.72230045;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png"> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:1.72230045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 74.222905,94.546573 H 48.760335" + id="path1653" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + <g + id="g1657" + style="stroke:#004646;stroke-opacity:1;stroke-width:0.86115022;stroke-miterlimit:4;stroke-dasharray:none" /> + <g + id="g1661" + transform="matrix(1,0,0,-1,0,188.06436)" + style="stroke:#ff0000;stroke-opacity:1;stroke-width:1.72230045;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127"> + <path + id="path1659" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:1.72230045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 70.600153,96.100011 74.1844,93.508859 70.600153,90.887428" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + </g> + </g> + </g> + </g> + </g> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 82.089856,217.18513 H 57.748189 v -10.15632" + id="path1709" + inkscape:connector-curvature="0" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 57.748189,58.700631 V 48.583146 h 26.02996" + id="path1682" + inkscape:connector-curvature="0" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1703" + d="M 70.448189,82.431634 H 110.23648" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 97.14005,61.295994 V 82.136052" + id="path1715" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <g + id="g1739" + transform="matrix(-1,0,0,1,84.846711,-0.30335508)" + style="stroke:#004646;stroke-opacity:1;stroke-width:3.38666667;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127"> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1711" + d="m 14.448838,91.201636 h 18.09246" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1713" + d="M 20.79884,105.33795 H 39.420466" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 14.448838,119.47426 h 18.09246" + id="path1719" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 21.328006,133.61058 h 18.09246" + id="path1721" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1723" + d="m 14.448838,147.74689 h 18.09246" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1725" + d="m 21.328006,161.88321 h 18.09246" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 14.448838,176.01953 h 18.09246" + id="path1727" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + </g> + <path + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="M 70.448189,182.97335 H 110.23648" + id="path1741" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + <path + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + id="path1743" + d="m 97.14005,183.00438 v 20.84007" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:3.38666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\ShortcutColumn.png" + inkscape:export-xdpi="48.442127" + inkscape:export-ydpi="48.442127" /> + </g> + </g> + <path + inkscape:connector-curvature="0" + id="path1825" + d="m 88.634922,28.795099 v 12.82324 h 6.27611 l 6.547158,-6.41162 -6.547158,-6.41162 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + sodipodi:nodetypes="cccccc" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Mixer.png" /> + <path + sodipodi:nodetypes="cccccc" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 100.83549,71.723329 v 12.82324 h -6.276108 l -6.54716,-6.41162 6.54716,-6.41162 z" + id="path1827" + inkscape:connector-curvature="0" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Splitter.png" /> + <g + id="g2009" + transform="translate(-137.55149,8.7979388)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\sq.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <rect + ry="3.3609526" + y="-72.620255" + x="372.62656" + height="25.470205" + width="43.075089" + id="rect1933" + style="opacity:1;vector-effect:none;fill:#004646;fill-opacity:0.8627451;fill-rule:nonzero;stroke:url(#linearGradient7273);stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\sq.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" /> + <text + id="text1937" + y="-51.126507" + x="374.89331" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.10041618px;line-height:27.29670143px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88253105px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\sq.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"><tspan + style="fill:#ffffff;fill-opacity:1;stroke-width:1.88253105px" + y="-51.126507" + x="374.89331" + id="tspan1935" + sodipodi:role="line">SQ</tspan></text> + </g> + <g + id="g2004" + transform="translate(-125.52971,22.650626)" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\eq.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <rect + style="opacity:1;vector-effect:none;fill:#004646;fill-opacity:0.8627451;fill-rule:nonzero;stroke:#dcdcdc;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1945" + width="43.075089" + height="25.470205" + x="370.8223" + y="-41.2733" + ry="3.3609526" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.10041618px;line-height:27.29670143px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88253105px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="373.08905" + y="-19.779552" + id="text1949"><tspan + sodipodi:role="line" + id="tspan1947" + x="373.08905" + y="-19.779552" + style="fill:#ffffff;fill-opacity:1;stroke-width:1.88253105px">EQ</tspan></text> + </g> + <g + id="g1999" + transform="translate(-137.55149,31.267163)"> + <rect + ry="3.3609526" + y="-2.3513699" + x="371.12784" + height="25.470205" + width="43.075089" + id="rect1951" + style="opacity:1;vector-effect:none;fill:#c8c4b7;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + <rect + style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50269556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1957" + width="29.853903" + height="17.652548" + x="377.73843" + y="1.5574627" + ry="2.3293638" /> + <text + id="text1961" + y="15.759001" + x="381.56311" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.27015781px;line-height:15.51879597px;font-family:Arial;-inkscape-font-specification:Arial;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.07026172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1.07026172px" + y="15.759001" + x="381.56311" + id="tspan1959" + sodipodi:role="line">PW</tspan></text> + </g> + <g + id="g1993" + transform="translate(-137.55149,39.909171)"> + <rect + style="opacity:1;vector-effect:none;fill:#c8c4b7;fill-opacity:1;fill-rule:nonzero;stroke:#492449;stroke-width:0.72532076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + id="rect1963" + width="43.075089" + height="25.470205" + x="371.12784" + y="39.220215" + ry="3.3609526" /> + <circle + r="10.986364" + cy="-279.5603" + cx="-280.59134" + id="circle1971" + style="opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60186213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + transform="matrix(-0.60970512,-0.79262833,-0.79262833,0.60970512,0,0)" /> + <rect + y="43.313293" + x="391.04501" + height="17.284018" + width="3.2407534" + id="rect1988" + style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.70555556;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" /> + </g> + <path + inkscape:connector-curvature="0" + id="rect1453" + d="m 35.59113,-29.626264 v 1.543061 h 16.750914 v -1.543061 z m 0,16.230011 v 1.54306 h 16.750914 v -1.54306 z" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\CompoundSeparator.png" /> + <path + inkscape:connector-curvature="0" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#004646;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" + d="m 35.567855,-67.652992 v 1.54306 h 16.751432 v -1.54306 z m 0,16.23001 v 1.54306 h 16.751432 v -1.54306 z" + id="rect1548" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:export-filename="C:\Users\Lucas Zhao\Desktop\Chemical-Simulator-GUI\Icons\Flash.png" /> + </g> +</svg> diff --git a/icons/images.png b/icons/images.png Binary files differnew file mode 100644 index 0000000..559fdbb --- /dev/null +++ b/icons/images.png diff --git a/icons/logo.png b/icons/logo.png Binary files differindex 541e99e..60d94d8 100644 --- a/icons/logo.png +++ b/icons/logo.png diff --git a/icons/new.png b/icons/new.png Binary files differnew file mode 100644 index 0000000..f4343a7 --- /dev/null +++ b/icons/new.png diff --git a/icons/sq.png b/icons/sq.png Binary files differnew file mode 100644 index 0000000..b963402 --- /dev/null +++ b/icons/sq.png diff --git a/icons/zoo.png b/icons/zoo.png Binary files differnew file mode 100644 index 0000000..1de4314 --- /dev/null +++ b/icons/zoo.png diff --git a/icons/zoom_in.png b/icons/zoom_in.png Binary files differnew file mode 100644 index 0000000..cdf3e3f --- /dev/null +++ b/icons/zoom_in.png diff --git a/icons/zoom_out.png b/icons/zoom_out.png Binary files differnew file mode 100644 index 0000000..b6dbcc9 --- /dev/null +++ b/icons/zoom_out.png diff --git a/icons/zoom_reset.png b/icons/zoom_reset.png Binary files differnew file mode 100644 index 0000000..ca9d36f --- /dev/null +++ b/icons/zoom_reset.png @@ -155,8 +155,8 @@ <property name="title"> <string>File</string> </property> - <addaction name="actionNew_Flowsheet"/> - <addaction name="actionSave_2"/> + <addaction name="actionNew"/> + <addaction name="actionSave"/> <addaction name="actionOpen"/> </widget> <widget class="QMenu" name="menuEdit"> @@ -178,8 +178,8 @@ <property name="title"> <string>Simulation</string> </property> - <addaction name="actionEquation_oriented"/> - <addaction name="actionSequential_mode"/> + <addaction name="actionEquationOriented"/> + <addaction name="actionSequentialMode"/> <addaction name="separator"/> <addaction name="actionTerminate"/> </widget> @@ -187,7 +187,7 @@ <property name="title"> <string>Compounds</string> </property> - <addaction name="actionSelect_compounds"/> + <addaction name="actionSelectCompounds"/> </widget> <widget class="QMenu" name="menuHelp"> <property name="title"> @@ -199,7 +199,7 @@ <property name="title"> <string>Utility</string> </property> - <addaction name="actionBinary_Phase_Envelope"/> + <addaction name="actionBinaryPhaseEnvelope"/> </widget> <addaction name="menuFile"/> <addaction name="menuEdit"/> @@ -228,6 +228,13 @@ <height>524287</height> </size> </property> + <property name="font"> + <font> + <family>Microsoft JhengHei</family> + <weight>75</weight> + <bold>true</bold> + </font> + </property> <property name="windowTitle"> <string>Component Selector</string> </property> @@ -294,7 +301,8 @@ </property> <property name="font"> <font> - <pointsize>18</pointsize> + <family>Microsoft JhengHei UI</family> + <pointsize>14</pointsize> <weight>75</weight> <bold>true</bold> </font> @@ -335,9 +343,11 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> - <italic>true</italic> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <italic>false</italic> + <bold>true</bold> </font> </property> <property name="acceptDrops"> @@ -347,7 +357,7 @@ <string notr="true">Text-align:left;</string> </property> <property name="text"> - <string>MaterialStream</string> + <string> MaterialStream</string> </property> <property name="icon"> <iconset> @@ -355,8 +365,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -381,9 +391,425 @@ <height>16777215</height> </size> </property> + <property name="palette"> + <palette> + <active> + <colorrole role="WindowText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Button"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Light"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>69</green> + <blue>69</blue> + </color> + </brush> + </colorrole> + <colorrole role="Midlight"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>57</green> + <blue>57</blue> + </color> + </brush> + </colorrole> + <colorrole role="Dark"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>23</green> + <blue>23</blue> + </color> + </brush> + </colorrole> + <colorrole role="Mid"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>30</green> + <blue>30</blue> + </color> + </brush> + </colorrole> + <colorrole role="Text"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="BrightText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="ButtonText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Shadow"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="AlternateBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>23</green> + <blue>23</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>220</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + </active> + <inactive> + <colorrole role="WindowText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Button"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Light"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>69</green> + <blue>69</blue> + </color> + </brush> + </colorrole> + <colorrole role="Midlight"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>57</green> + <blue>57</blue> + </color> + </brush> + </colorrole> + <colorrole role="Dark"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>23</green> + <blue>23</blue> + </color> + </brush> + </colorrole> + <colorrole role="Mid"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>30</green> + <blue>30</blue> + </color> + </brush> + </colorrole> + <colorrole role="Text"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="BrightText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="ButtonText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Shadow"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="AlternateBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>23</green> + <blue>23</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>220</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + </inactive> + <disabled> + <colorrole role="WindowText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Button"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Light"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>69</green> + <blue>69</blue> + </color> + </brush> + </colorrole> + <colorrole role="Midlight"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>57</green> + <blue>57</blue> + </color> + </brush> + </colorrole> + <colorrole role="Dark"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>23</green> + <blue>23</blue> + </color> + </brush> + </colorrole> + <colorrole role="Mid"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>30</green> + <blue>30</blue> + </color> + </brush> + </colorrole> + <colorrole role="Text"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="BrightText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="ButtonText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Shadow"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="AlternateBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>220</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + </disabled> + </palette> + </property> <property name="font"> <font> - <pointsize>18</pointsize> + <family>Microsoft JhengHei UI</family> + <pointsize>14</pointsize> <weight>75</weight> <bold>true</bold> </font> @@ -424,15 +850,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Mixer</string> + <string> Mixer</string> </property> <property name="icon"> <iconset> @@ -440,8 +868,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -468,15 +896,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Splitter</string> + <string> Splitter</string> </property> <property name="icon"> <iconset> @@ -484,8 +914,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -510,9 +940,425 @@ <height>16777215</height> </size> </property> + <property name="palette"> + <palette> + <active> + <colorrole role="WindowText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Button"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Light"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>105</green> + <blue>105</blue> + </color> + </brush> + </colorrole> + <colorrole role="Midlight"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>87</green> + <blue>87</blue> + </color> + </brush> + </colorrole> + <colorrole role="Dark"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>35</green> + <blue>35</blue> + </color> + </brush> + </colorrole> + <colorrole role="Mid"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Text"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="BrightText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="ButtonText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Shadow"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="AlternateBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>35</green> + <blue>35</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>220</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + </active> + <inactive> + <colorrole role="WindowText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Button"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Light"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>105</green> + <blue>105</blue> + </color> + </brush> + </colorrole> + <colorrole role="Midlight"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>87</green> + <blue>87</blue> + </color> + </brush> + </colorrole> + <colorrole role="Dark"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>35</green> + <blue>35</blue> + </color> + </brush> + </colorrole> + <colorrole role="Mid"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Text"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="BrightText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="ButtonText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Shadow"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="AlternateBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>35</green> + <blue>35</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>220</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + </inactive> + <disabled> + <colorrole role="WindowText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Button"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Light"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>105</green> + <blue>105</blue> + </color> + </brush> + </colorrole> + <colorrole role="Midlight"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>87</green> + <blue>87</blue> + </color> + </brush> + </colorrole> + <colorrole role="Dark"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>35</green> + <blue>35</blue> + </color> + </brush> + </colorrole> + <colorrole role="Mid"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>46</green> + <blue>46</blue> + </color> + </brush> + </colorrole> + <colorrole role="Text"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="BrightText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="ButtonText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>73</red> + <green>36</green> + <blue>73</blue> + </color> + </brush> + </colorrole> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="Shadow"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + <colorrole role="AlternateBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>70</green> + <blue>70</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipBase"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>220</blue> + </color> + </brush> + </colorrole> + <colorrole role="ToolTipText"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </brush> + </colorrole> + </disabled> + </palette> + </property> <property name="font"> <font> - <pointsize>18</pointsize> + <family>Microsoft JhengHei UI</family> + <pointsize>14</pointsize> <weight>75</weight> <bold>true</bold> </font> @@ -553,15 +1399,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Heater</string> + <string> Heater</string> </property> <property name="icon"> <iconset> @@ -569,10 +1417,19 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>40</width> + <height>40</height> </size> </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="default"> + <bool>false</bool> + </property> + <property name="flat"> + <bool>false</bool> + </property> </widget> </item> <item> @@ -597,15 +1454,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Cooler</string> + <string> Cooler</string> </property> <property name="icon"> <iconset> @@ -613,10 +1472,13 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>40</width> + <height>40</height> </size> </property> + <property name="flat"> + <bool>false</bool> + </property> </widget> </item> <item> @@ -641,7 +1503,8 @@ </property> <property name="font"> <font> - <pointsize>18</pointsize> + <family>Microsoft JhengHei UI</family> + <pointsize>14</pointsize> <weight>75</weight> <bold>true</bold> </font> @@ -682,15 +1545,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Flash</string> + <string> Flash</string> </property> <property name="icon"> <iconset> @@ -698,8 +1563,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>40</width> + <height>40</height> </size> </property> </widget> @@ -726,24 +1591,26 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Component Seperator</string> + <string> Compound Seperator</string> </property> <property name="icon"> <iconset> - <normaloff>icons/CompSep.png</normaloff>icons/CompSep.png</iconset> + <normaloff>icons/CompoundSeparator.png</normaloff>icons/CompoundSeparator.png</iconset> </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>40</width> + <height>40</height> </size> </property> </widget> @@ -770,7 +1637,8 @@ </property> <property name="font"> <font> - <pointsize>15</pointsize> + <family>Microsoft JhengHei UI</family> + <pointsize>14</pointsize> <weight>75</weight> <bold>true</bold> </font> @@ -808,15 +1676,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Valve</string> + <string> Valve</string> </property> <property name="icon"> <iconset> @@ -824,8 +1694,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -852,15 +1722,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Centrifugal Pump</string> + <string> Centrifugal Pump</string> </property> <property name="icon"> <iconset> @@ -868,8 +1740,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -896,15 +1768,17 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Adiabatic Compressor</string> + <string> Adiabatic Compressor</string> </property> <property name="icon"> <iconset> @@ -912,8 +1786,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -940,8 +1814,10 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="autoFillBackground"> @@ -951,7 +1827,7 @@ <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Adiabatic Expander</string> + <string> Adiabatic Expander</string> </property> <property name="icon"> <iconset> @@ -959,8 +1835,8 @@ </property> <property name="iconSize"> <size> - <width>50</width> - <height>50</height> + <width>30</width> + <height>30</height> </size> </property> </widget> @@ -987,7 +1863,8 @@ </property> <property name="font"> <font> - <pointsize>18</pointsize> + <family>Microsoft JhengHei UI</family> + <pointsize>14</pointsize> <weight>75</weight> <bold>true</bold> </font> @@ -1025,19 +1902,21 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Distillation Column</string> + <string> Distillation Column</string> </property> <property name="icon"> <iconset> - <normaloff>icons/DistCol.png</normaloff>icons/DistCol.png</iconset> + <normaloff>Icons/Column.png</normaloff>Icons/Column.png</iconset> </property> <property name="iconSize"> <size> @@ -1069,19 +1948,21 @@ </property> <property name="font"> <font> - <family>Comic Sans MS</family> - <pointsize>11</pointsize> + <family>Microsoft JhengHei</family> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true">Text-align:left</string> </property> <property name="text"> - <string>Shortcut Column</string> + <string> Shortcut Column</string> </property> <property name="icon"> <iconset> - <normaloff>icons/ShortCol.png</normaloff>icons/ShortCol.png</iconset> + <normaloff>Icons/Column.png</normaloff>Icons/Column.png</iconset> </property> <property name="iconSize"> <size> @@ -1111,21 +1992,21 @@ <attribute name="toolBarBreak"> <bool>false</bool> </attribute> - <addaction name="actionNew_Flowsheet"/> + <addaction name="actionNew"/> <addaction name="separator"/> <addaction name="actionZoomIn"/> <addaction name="actionZoomOut"/> <addaction name="actionResetZoom"/> <addaction name="separator"/> - <addaction name="actionEquation_oriented"/> - <addaction name="actionSequential_mode"/> + <addaction name="actionEquationOriented"/> + <addaction name="actionSequentialMode"/> <addaction name="separator"/> - <addaction name="actionSelect_compounds"/> + <addaction name="actionSelectCompounds"/> </widget> <action name="actionZoomIn"> <property name="icon"> <iconset> - <normaloff>icons/zoomIn.png</normaloff>icons/zoomIn.png</iconset> + <normaloff>Icons/zoom_in.png</normaloff>Icons/zoom_in.png</iconset> </property> <property name="text"> <string>ZoomIn</string> @@ -1134,7 +2015,7 @@ <action name="actionZoomOut"> <property name="icon"> <iconset> - <normaloff>icons/zoomOut.png</normaloff>icons/zoomOut.png</iconset> + <normaloff>Icons/zoom_out.png</normaloff>Icons/zoom_out.png</iconset> </property> <property name="text"> <string>ZoomOut</string> @@ -1143,43 +2024,43 @@ <action name="actionResetZoom"> <property name="icon"> <iconset> - <normaloff>icons/zoomReset.png</normaloff>icons/zoomReset.png</iconset> + <normaloff>Icons/zoom_reset.png</normaloff>Icons/zoom_reset.png</iconset> </property> <property name="text"> <string>ResetZoom</string> </property> </action> - <action name="actionEquation_oriented"> + <action name="actionEquationOriented"> <property name="icon"> <iconset> - <normaloff>icons/Equation.png</normaloff>icons/Equation.png</iconset> + <normaloff>Icons/eq.png</normaloff>Icons/eq.png</iconset> </property> <property name="text"> <string>Equation oriented</string> </property> </action> - <action name="actionSequential_mode"> + <action name="actionSequentialMode"> <property name="icon"> <iconset> - <normaloff>icons/Sequential.png</normaloff>icons/Sequential.png</iconset> + <normaloff>Icons/sq.png</normaloff>Icons/sq.png</iconset> </property> <property name="text"> <string>Sequential mode</string> </property> </action> - <action name="actionSelect_compounds"> + <action name="actionSelectCompounds"> <property name="icon"> <iconset> - <normaloff>icons/compoundSelector.png</normaloff>icons/compoundSelector.png</iconset> + <normaloff>Icons/compound.png</normaloff>Icons/compound.png</iconset> </property> <property name="text"> <string>Select Compounds</string> </property> </action> - <action name="actionNew_Flowsheet"> + <action name="actionNew"> <property name="icon"> <iconset> - <normaloff>icons/new.svg</normaloff>icons/new.svg</iconset> + <normaloff>Icons/new.png</normaloff>Icons/new.png</iconset> </property> <property name="text"> <string>New</string> @@ -1192,11 +2073,6 @@ </action> <action name="actionSave"> <property name="text"> - <string>save</string> - </property> - </action> - <action name="actionSave_2"> - <property name="text"> <string>Save</string> </property> </action> @@ -1205,7 +2081,7 @@ <string>Open</string> </property> </action> - <action name="actionBinary_Phase_Envelope"> + <action name="actionBinaryPhaseEnvelope"> <property name="text"> <string>Binary Phase Envelope</string> </property> @@ -14,12 +14,12 @@ from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtWidgets -from component_selector import * +from ComponentSelector import * from Bin_Phase_env import * from UnitOperations import * from Streams import * import datetime -from container import * +from Container import * from Graphics import * import pickle import threading @@ -46,81 +46,77 @@ class MainApp(QMainWindow,ui): # self.setStyleSheet(style) # Initializing attributes - self.zoomcount = 0 + self.zoom_count = 0 self.thrd = None # Creating instances of classes for the main app - self.Container = Container(self.textBrowser) - self.comp = componentSelector(self) + self.container = Container.Container(self.textBrowser, self.graphicsView) + self.comp = ComponentSelector(self) # Setting up interactive canvas - self.scene = self.Container.graphics.getScene() + self.scene = self.container.graphics.get_scene() ### self.graphicsView.setScene(self.scene) self.graphicsView.setMouseTracking(True) - self.graphicsView.keyPressEvent=self.deleteCall + self.graphicsView.keyPressEvent=self.delete_call self.setDockNestingEnabled(True) self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea) self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea) self.addDockWidget(Qt.BottomDockWidgetArea,self.dockWidget_2) - # Setting up undo stack - # self.undoStack = QUndoStack(self) - # Calling initialisation functions - self.buttonHandler() - self.menuBar() + # Calling initialisation + self.menu_bar() + self.button_handler() self.comp.show() ''' MenuBar function handels all the all the operations of menu bar like new,zoom,comounds selector, simulation options. ''' - def menuBar(self): - self.actionSelect_compounds.triggered.connect(self.selectCompounds) - self.actionSelect_compounds.setShortcut('Ctrl+C') - self.actionZoomIn.triggered.connect(self.zoomin) + def menu_bar(self): + self.actionSelectCompounds.triggered.connect(self.select_compounds) + self.actionSelectCompounds.setShortcut('Ctrl+C') + self.actionZoomIn.triggered.connect(self.zoom_in) self.actionZoomIn.setShortcut('Ctrl++') - self.actionNew_Flowsheet.triggered.connect(self.new) - self.actionNew_Flowsheet.setShortcut('Ctrl+N') - self.actionZoomOut.triggered.connect(self.zoomout) + self.actionNew.triggered.connect(self.new) + self.actionNew.setShortcut('Ctrl+N') + self.actionZoomOut.triggered.connect(self.zoom_out) self.actionZoomOut.setShortcut('Ctrl+-') - self.actionResetZoom.triggered.connect(self.zoomReset) + self.actionResetZoom.triggered.connect(self.zoom_reset) self.actionResetZoom.setShortcut('Ctrl+R') self.actionHelp.triggered.connect(self.help) self.actionHelp.setShortcut('Ctrl+H') - self.actionSequential_mode.triggered.connect(partial(self.simulate,'SM')) - self.actionSequential_mode.setShortcut('Ctrl+M') - self.actionEquation_oriented.triggered.connect(partial(self.simulate,'EQN')) - self.actionEquation_oriented.setShortcut('Ctrl+E') + self.actionSequentialMode.triggered.connect(partial(self.simulate,'SM')) + self.actionSequentialMode.setShortcut('Ctrl+M') + self.actionEquationOriented.triggered.connect(partial(self.simulate,'EQN')) + self.actionEquationOriented.setShortcut('Ctrl+E') self.actionUndo.triggered.connect(self.undo) self.actionUndo.setShortcut('Ctrl+Z') self.actionRedo.triggered.connect(self.redo) self.actionRedo.setShortcut('Ctrl+Y') - # self.actionUndo_2.triggered.connect(self.undoStack.undo) - # self.actionRedo.triggered.connect(self.undoStack.redo) - self.actionSave_2.triggered.connect(self.save) - self.actionSave_2.setShortcut('Ctrl+S') + self.actionSave.triggered.connect(self.save) + self.actionSave.setShortcut('Ctrl+S') self.actionOpen.triggered.connect(self.open) self.actionOpen.setShortcut('Ctrl+O') self.actionTerminate.triggered.connect(self.terminate) self.actionTerminate.setShortcut('Ctrl+T') - self.actionBinary_Phase_Envelope.triggered.connect(self.BinPhaseEnv) + self.actionBinaryPhaseEnvelope.triggered.connect(self.bin_phase_env) ''' Handles all the buttons of different components. ''' - def buttonHandler(self): + def button_handler(self): self.pushButton.clicked.connect(partial(self.component,'MaterialStream')) self.pushButton_7.clicked.connect(partial(self.component,'Mixer')) self.pushButton_14.clicked.connect(partial(self.component,'Pump')) - self.pushButton_26.clicked.connect(partial(self.component,'DistCol')) - self.pushButton_18.clicked.connect(partial(self.component,'ShortCol')) + self.pushButton_26.clicked.connect(partial(self.component,'DistillationColumn')) + self.pushButton_18.clicked.connect(partial(self.component,'ShortcutColumn')) self.pushButton_11.clicked.connect(partial(self.component,'Heater')) self.pushButton_10.clicked.connect(partial(self.component,'Splitter')) self.pushButton_9.clicked.connect(partial(self.component,'Flash')) self.pushButton_25.clicked.connect(partial(self.component,'Valve')) self.pushButton_12.clicked.connect(partial(self.component,'Cooler')) - self.pushButton_13.clicked.connect(partial(self.component,'CompSep')) + self.pushButton_13.clicked.connect(partial(self.component,'CompoundSeparator')) self.pushButton_15.clicked.connect(partial(self.component,'AdiabaticCompressor')) self.pushButton_16.clicked.connect(partial(self.component,'AdiabaticExpander')) @@ -135,27 +131,27 @@ class MainApp(QMainWindow,ui): msgBox.setStandardButtons(QMessageBox.Ok) msgBox.exec_() - def BinPhaseEnv(self): + def bin_phase_env(self): #compounds = self.comp.getComp() - if len(self.comp.getComp())<2: + if len(self.comp.get_compounds())<2: QMessageBox.about(self, 'Important', "Please select at least 2 Compounds first") self.comp.show() #compunds = self.comp.getComp() else: - self.bin_phase = Bin_Phase_env(self.comp) + self.bin_phase = BinPhaseEnv(self.comp) self.bin_phase.show() ''' Shows Compounds Selector Dialog ''' - def selectCompounds(self): + def select_compounds(self): self.comp.show() ''' - Returns currenttime in a required particular format + Returns current time in a required particular format ''' - def currentTime(self): + def current_time(self): now = datetime.datetime.now() time = str(now.hour) + ":" + str(now.minute) + ":" +str(now.second) return time @@ -166,19 +162,19 @@ class MainApp(QMainWindow,ui): selected by the user. ''' def simulate(self,mode): - self.thrd = threading.Thread(target=self.Container.simulate, args=(mode,)) + self.thrd = threading.Thread(target=self.container.simulate, args=(mode,)) self.thrd.start() def terminate(self): - os.chdir(self.Container.flowsheet.root_dir) + os.chdir(self.container.flowsheet.root_dir) if self.thrd: thread_id = self.thrd.ident print('____________________Going to terminate simulation thread with Thread ID:',thread_id,'____________________') print('____________________Going to terminate the new process created for omc____________________') - self.Container.flowsheet.process.terminate() + self.container.flowsheet.process.terminate() print('____________________New process created for omc is terminated.____________________') res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit)) - self.textBrowser.append("<span style=\"color:red\">["+str(self.currentTime())+"]<b> Terminating the simulation </b></span>") + self.textBrowser.append("<span style=\"color:red\">["+str(self.current_time())+"]<b> Terminating the simulation </b></span>") print('____________________Simulation thread terminated____________________') if res > 1: ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0) @@ -187,40 +183,40 @@ class MainApp(QMainWindow,ui): ''' Resets the zoom level to default scaling ''' - def zoomReset(self): - if(self.zoomcount>0): - for i in range(self.zoomcount): + def zoom_reset(self): + if(self.zoom_count>0): + for i in range(self.zoom_count): self.zoomout() - elif(self.zoomcount<0): - for i in range(abs(self.zoomcount)): + elif(self.zoom_count<0): + for i in range(abs(self.zoom_count)): self.zoomin() ''' ZoomOut the canvas ''' - def zoomout(self): + def zoom_out(self): self.graphicsView.scale(1.0/1.15,1.0/1.15) - self.zoomcount -=1 + self.zoom_count -=1 ''' ZoomIn the canvas ''' - def zoomin(self): + def zoom_in(self): self.graphicsView.scale(1.15,1.15) - self.zoomcount +=1 + self.zoom_count +=1 ''' Instantiate a NodeItem object for selected type of component and added that on canvas/flowsheeting area. ''' - def component(self,unitOpType): - if(self.comp.isCompSelected()): - self.type = unitOpType + def component(self,unit_operation_type): + if(self.comp.is_compound_selected()): + self.type = unit_operation_type if(self.type=="MaterialStream"): - self.obj = MaterialStream(CompNames=compound_selected) + self.obj = MaterialStream(compound_names = compound_selected) else: self.obj = eval(self.type)() - self.Container.addUnitOp(self.obj) + self.container.add_unit_operation(self.obj) else: QMessageBox.about(self, 'Important', "Please Select Compounds first") @@ -232,48 +228,54 @@ class MainApp(QMainWindow,ui): def new(self): self.undo_redo_helper() self.comp.tableWidget.setRowCount(0) - self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>New</b> flowsheet is created ... </span>") + self.textBrowser.append("<span>[" + str(self.current_time()) + "] <b>New</b> flowsheet is created ... </span>") + dock_widget_lst.clear() + + ''' + Handels all the operations which will happen when delete button is pressed. + ''' + def delete_call(self,event): + try: + if event.key() == QtCore.Qt.Key_Delete: + l=self.scene.selectedItems() + # for i in l: + # eval(i.type).counter -= 1 + self.container.delete(l) + except Exception as e: + print(e) ''' It helps by clearing screen and loading the objects by undo redo methods ''' def undo_redo_helper(self): - for i in self.Container.unitOp: + for i in self.container.unit_operations: type(i).counter = 1 - del self.Container + del self.container + for i in dock_widget_lst: + i.hide() + del i lst.clear() - self.Container = Container(self.textBrowser) + self.container = Container.Container(self.textBrowser, self.graphicsView) compound_selected.clear() - self.scene = self.Container.graphics.getScene() + self.scene = self.container.graphics.get_scene() self.graphicsView.setScene(self.scene) self.graphicsView.setMouseTracking(True) - self.graphicsView.keyPressEvent=self.deleteCall + self.graphicsView.keyPressEvent=self.delete_call + - ''' - Handels all the operations which will happen when delete button is pressed. - ''' - def deleteCall(self,event): - try: - if event.key() == QtCore.Qt.Key_Delete: - l=self.scene.selectedItems() - for i in l: - eval(i.type).counter -= 1 - self.Container.delete(l) - except Exception as e: - print(e) ''' Function for undo ''' def undo(self): - redo_data = POP('Undo') + redo_data = pop('Undo') if redo_data is not None: - PUSH('Redo', redo_data) + push('Redo', redo_data) undo_data = get_last_list('Undo') messages = self.textBrowser.toPlainText() try: self.undo_redo_helper() - self.Container.graphics.loadCanvas(undo_data) + self.container.graphics.load_canvas(undo_data, self.container) self.textBrowser.setText(messages) except Exception as e: print(e) @@ -281,72 +283,75 @@ class MainApp(QMainWindow,ui): else: messages = self.textBrowser.toPlainText() self.textBrowser.setText(messages) - self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>No more undo can be done!</b>... </span>") + self.textBrowser.append("<span>[" + str(self.current_time()) + "] <b>No more undo can be done!</b>... </span>") ''' Function for redo ''' def redo(self): - redo_data = POP('Redo') + redo_data = pop('Redo') if redo_data is not None: - PUSH('Undo', redo_data) + push('Undo', redo_data) messages = self.textBrowser.toPlainText() self.undo_redo_helper() - self.Container.graphics.loadCanvas(redo_data) + self.container.graphics.load_canvas(redo_data, self.container) self.textBrowser.setText(messages) else: messages = self.textBrowser.toPlainText() self.textBrowser.setText(messages) - self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>No more redo can be done!</b>... </span>") + self.textBrowser.append("<span>[" + str(self.current_time()) + "] <b>No more redo can be done!</b>... </span>") ''' Function for saving the current canvas items and compound_selected ''' def save(self): data = [] - for i in self.Container.unitOp: + for i in self.container.unit_operations: data.append(i) print(i.pos) data.append(compound_selected) print(data) - fileFormat = 'sim' - initialPath = QDir.currentPath() + 'untitled.' + fileFormat - fileName, _ = QFileDialog.getSaveFileName(self, "Save As", - initialPath, "%s Files (*.%s);; All Files (*)" % - (fileFormat.upper(), fileFormat)) - if fileName != "": - with open(fileName, 'wb') as f: #'saved_file.sim' + file_format = 'sim' + initial_path = QDir.currentPath() + 'untitled.' + file_format + file_name, _ = QFileDialog.getSaveFileName(self, "Save As", + initial_path, "%s Files (*.%s);; All Files (*)" % + (file_format.upper(), file_format)) + #if file_name != "": + try: + with open(file_name, 'wb') as f: #'saved_file.sim' pickle.dump(data, f, pickle.HIGHEST_PROTOCOL) + except Exception as e: + pass ''' Function for loading previous saved canvas and simulation ''' def open(self): try: - fileFormat = 'sim' - initialPath = QDir.currentPath() + 'untitled.' + fileFormat + file_format = 'sim' + initial_path = QDir.currentPath() + 'untitled.' + file_format - fileName, _ = QFileDialog.getOpenFileName(self, "Open As", - initialPath, "%s Files (*.%s);; All Files (*)" % - (fileFormat.upper(), fileFormat)) + file_name, _ = QFileDialog.getOpenFileName(self, "Open As", + initial_path, "%s Files (*.%s);; All Files (*)" % + (file_format.upper(), file_format)) # if fileName != "": # self.new() self.undo_redo_helper() - with open(fileName, 'rb') as f: + with open(file_name, 'rb') as f: obj = pickle.load(f) - - self.Container.graphics.loadCanvas(obj) + print(obj) + self.container.graphics.load_canvas(obj, self.container) except Exception as e: pass def main(): - CLEAN_FILE('Undo') - CLEAN_FILE('Redo') + clean_file('Undo') + clean_file('Redo') app = QApplication(sys.argv) window = MainApp() diff --git a/resDockWidget.py b/resDockWidget.py deleted file mode 100644 index 9466b4e..0000000 --- a/resDockWidget.py +++ /dev/null @@ -1,92 +0,0 @@ -from PyQt5.QtCore import * -from PyQt5.QtWidgets import * -from PyQt5.QtGui import * -from PyQt5.uic import loadUiType -import pandas as pd -from functools import partial -from component_selector import * -from collections import defaultdict -from container import * - -ui_dialog,_ = loadUiType('resDock.ui') - -class resdockWidget(QDockWidget,ui_dialog): - - def __init__(self,containerobj,parent=None): - QDockWidget.__init__(self,parent) - self.setupUi(self) - self.setWindowTitle("Results") - self.nameType = None - self.Container = containerobj - self.results() - - self.pushButton_3.clicked.connect(self.resultTree) - - def abriveation(self,key): - d ={"P":"Pressure","T":"Temperature", - "xliq":"Liquid Phase Mol Fraction","xmliq":"Liquid Pase Mass Fraction", - "xvap":"Vapour Phase Mol Fracrion","xmvap":"Vapour Phase Mass Fracrion", - "F_p[1]":"Molar Flow","Fm_p[1]":"Mass Flow","MW_p[1]":"Mixer Phase Molecular Weight", - "MW_p[2]":"Liquid Phase Molecular Weight","MW_p[3]":"Vapour Phase Molecular Weight", - "Cp_p[1]":"Mixer Phase molar Heat Capacity","Cp_p[2]":"Liquid Phase molar Heat Capacity", - "Cp_p[3]":"Vapour Phase molar Heat Capacity","H_p[1]":"Mixer Phase Molar Enthalpy", - "H_p[2]":"Liquid Phase Molar Enthalpy","H_p[3]":"Vapour Phase Molar Enthalpy", - "S_p[1]":"Mixer Phase Molar Entropy","S_p[2]":"Liquid Phase Molar Entropy", - "S_p[3]":"Vapour Phase Molar Entropy","F_p[2]":"Liquid Phase Molar Flow Rate", - "F_p[3]":"Vapour Phase Molar Flow Rate","Fm_p[2]":"Liquid Phase Mass Flow Rate", - "F_p[3]":"Liquid Phase Mass Flow Rate", - } - - for i in range(len(compound_selected)): - d["compMolFrac[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mole fraction" - d["compMolFrac[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mole fraction" - d["compMolFrac[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mole fraction" - - d["compMasFrac[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mass fraction" - d["compMasFrac[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mass fraction" - d["compMasFrac[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mass fraction" - - d["compMasFlo[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mass flo" - d["compMasFlo[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mass flo" - d["compMasFlo[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mass flo" - - d["compMolFlo[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mole flo" - d["compMolFlo[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mole flo" - d["compMolFlo[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mole flo" - if key in d.keys(): - return d[key] - else: - return key - - def resultsCategory(self,name): - try: - print("Under result category") - result=self.Container.result - obj = self.Container.fetchObject(name) - self.tableWidget.setRowCount(0) - for key, value in obj.Prop.items(): - propertyname = name + '.' + key - print(key,value) - if propertyname in result[0]: - ind = result[0].index(propertyname) - resultval = str(result[-1][ind]) - #stm.Prop[key] = resultval - print("######Resultsfetch####",key,resultval) - rowPosition = self.tableWidget.rowCount() - self.tableWidget.insertRow(rowPosition) - self.tableWidget.setItem(rowPosition , 0, QTableWidgetItem(str(self.abriveation(key)))) - self.tableWidget.setItem(rowPosition , 1, QTableWidgetItem(str(resultval))) - self.tableWidget.resizeColumnsToContents() - except Exception as e: - print(e) - - - def resultTree(self): - self.resultsCategory(self.comboBox.currentText()) - - def results(self): # Should be named as selecting object whose result is to be displayed - self.nameType={} - for i in Container.unitOp: - #nameslist.append(i.name) - self.nameType[i.name] = i.type - self.comboBox.addItem(str(i.name))
\ No newline at end of file diff --git a/svg/Centrifugal Pump.svg b/svg/Centrifugal Pump.svg new file mode 100644 index 0000000..5b60256 --- /dev/null +++ b/svg/Centrifugal Pump.svg @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="5.8764515mm" + height="5.1060538mm" + viewBox="0 0 5.8764515 5.1060538" + version="1.1" + id="svg919" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + sodipodi:docname="Centrifugal Pump.svg"> + <defs + id="defs913" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="11.105106" + inkscape:cy="9.6492281" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1304" + inkscape:window-height="745" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" /> + <metadata + id="metadata916"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-102.89511,-146.2803)"> + <g + id="use23667" + transform="matrix(0.26458333,0,0,0.26458333,87.26164,148.76091)"> + <desc + id="desc937">Centrifugal pump</desc> + <title + id="title939">Centrifugal pump</title> + <path + d="m 63.461437,0.93302941 c 0,-4.83160421 3.917761,-8.74995261 8.751431,-8.74995261 4.831585,0 8.749327,3.9183484 8.749327,8.74995261 0,4.83440929 -3.917742,8.75275769 -8.749327,8.75275769 -4.83367,0 -8.751431,-3.9183484 -8.751431,-8.75275769 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381" + id="path941" + inkscape:connector-curvature="0" /> + <g + style="stroke-width:0.96060389" + id="g945" + transform="matrix(0.69599386,0,0,0.6960967,-60.599463,-916.20963)"> + <path + d="m 178.25,1317.551 c 0,-6.942 5.629,-12.571 12.574,-12.571 6.942,0 12.571,5.629 12.571,12.571 0,6.945 -5.629,12.574 -12.571,12.574 -6.945,0 -12.574,-5.629 -12.574,-12.574 z m -6.285,0 h 18.859 m 0,-12.571 h 12.571" + style="fill:none;stroke:#000000;stroke-width:0.68082803;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + id="path943" + inkscape:connector-curvature="0" /> + </g> + <g + style="stroke-width:0.96060389" + id="g949" + transform="matrix(0.69599386,0,0,0.6960967,-60.599463,-916.20963)"> + <path + d="m 189.406,1316.133 1.418,1.418 -1.418,1.418 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.68082803;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + id="path947" + inkscape:connector-curvature="0" /> + </g> + <g + style="stroke-width:0.96060389" + id="g953" + transform="matrix(0.69599386,0,0,0.6960967,-60.599463,-916.20963)"> + <path + d="m 201.977,1303.563 1.418,1.417 -1.418,1.418 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.68082803;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + id="path951" + inkscape:connector-curvature="0" /> + </g> + </g> + </g> +</svg> diff --git a/svg/Cooler.svg b/svg/Cooler.svg new file mode 100644 index 0000000..fd7a4a8 --- /dev/null +++ b/svg/Cooler.svg @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="6.2097631mm" + height="6.957972mm" + viewBox="0 0 6.2097631 6.957972" + version="1.1" + id="svg834" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + sodipodi:docname="Cooler.svg"> + <defs + id="defs828" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="328.87784" + inkscape:cy="-235.4225" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1304" + inkscape:window-height="745" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" /> + <metadata + id="metadata831"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-18.817737,-79.58649)"> + <g + id="use29930" + transform="matrix(0.26458333,0,0,0.26458333,15.449143,40.948477)"> + <desc + id="desc848">Cooler</desc> + <title + id="title850">Cooler</title> + <path + inkscape:connector-curvature="0" + id="path852" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381" + d="m 12.968678,159.18366 c 0,-5.83167 4.727229,-10.55964 10.559596,-10.55964 5.831627,0 10.559615,4.72797 10.559615,10.55964 0,5.83227 -4.727988,10.55957 -10.559615,10.55957 -5.832367,0 -10.559596,-4.7273 -10.559596,-10.55957 z" /> + <g + style="stroke-width:0.91540313" + transform="matrix(0.73041461,0,0,0.73041461,-222.05687,-1910.6315)" + id="g856"> + <path + inkscape:connector-curvature="0" + id="path854" + style="fill:none;stroke:#000000;stroke-width:0.64879197;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 321.77,2833.754 c 0,-7.984 6.472,-14.457 14.457,-14.457 7.984,0 14.457,6.473 14.457,14.457 0,7.984 -6.473,14.457 -14.457,14.457 -7.985,0 -14.457,-6.473 -14.457,-14.457 z m 31.808,-8.676 h -14.457 v 5.781 h 5.781 v 5.786 h -5.781 v 5.781 h 14.457 m -26.023,-26.676 v 36.004" /> + </g> + </g> + </g> +</svg> diff --git a/svg/Heater.svg b/svg/Heater.svg new file mode 100644 index 0000000..7d21cf7 --- /dev/null +++ b/svg/Heater.svg @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="5.3247261mm" + height="6.4700546mm" + viewBox="0 0 5.3247261 6.4700546" + version="1.1" + id="svg781" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + sodipodi:docname="Heater.svg"> + <defs + id="defs775" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="232.91962" + inkscape:cy="-110.63027" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1304" + inkscape:window-height="745" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" /> + <metadata + id="metadata778"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-44.206684,-113.09235)"> + <g + id="use29539" + transform="matrix(0.26458333,0,0,0.26458333,-24.278784,87.432225)"> + <desc + id="desc799">Heater</desc> + <title + id="title801">Heater</title> + <path + inkscape:connector-curvature="0" + id="path803" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381" + d="m 261.57546,109.05859 c 0,-3.75298 3.04023,-6.79588 6.79323,-6.79588 3.75299,0 6.79322,3.0429 6.79322,6.79588 0,3.75099 -3.04023,6.79322 -6.79322,6.79322 -3.753,0 -6.79323,-3.04223 -6.79323,-6.79322 z" /> + <g + transform="matrix(0.66862381,0,0,0.66862381,142.28093,-1940.5551)" + id="g807"> + <path + inkscape:connector-curvature="0" + id="path805" + style="fill:none;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 178.418,3065.152 h 2.543 l 5.078,-4.812 5.586,10.16 4.574,-5.348 h 2.539 m -20.32,0.27 c 0,-5.613 4.547,-10.164 10.16,-10.164 5.613,0 10.16,4.551 10.16,10.164 0,5.609 -4.547,10.16 -10.16,10.16 -5.613,0 -10.16,-4.551 -10.16,-10.16 z" /> + </g> + <g + transform="matrix(0.66862381,0,0,0.66862381,142.28093,-1940.5551)" + id="g811"> + <path + inkscape:connector-curvature="0" + id="path809" + style="fill:none;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 204.156,3047.586 -28.898,35.219" /> + </g> + <g + transform="matrix(0.66862381,0,0,0.66862381,142.28093,-1940.5551)" + id="g815"> + <path + inkscape:connector-curvature="0" + id="path813" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 181.516,3078.16 -6.258,4.645 3.336,-7.043 z" /> + </g> + </g> + </g> +</svg> diff --git a/svg/Pump.svg b/svg/Pump.svg new file mode 100644 index 0000000..dd573ee --- /dev/null +++ b/svg/Pump.svg @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="6.877779mm" + height="4.7104506mm" + viewBox="0 0 6.8777789 4.7104506" + version="1.1" + id="svg875" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + sodipodi:docname="Pump.svg"> + <defs + id="defs869" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6" + inkscape:cx="24.307994" + inkscape:cy="39.562189" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1304" + inkscape:window-height="745" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" /> + <metadata + id="metadata872"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-46.453968,-113.21621)"> + <g + id="use23472" + transform="matrix(0.26458333,0,0,0.26458333,42.705476,115.26531)"> + <desc + id="desc890">Pump</desc> + <title + id="title892">Pump</title> + <g + id="g900"> + <path + inkscape:connector-curvature="0" + id="path894" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381" + d="m 18.500164,1.1580787 c 0,-4.7846574 3.878698,-8.6660282 8.666047,-8.6660282 4.784657,0 8.663356,3.8813708 8.663356,8.6660282 0,4.7853397 -3.878699,8.6633558 -8.663356,8.6633558 -4.787349,0 -8.666047,-3.8780161 -8.666047,-8.6633558 z" /> + <g + transform="matrix(0.66862381,0,0,0.66862381,-389.41514,-1116.0024)" + id="g898"> + <path + inkscape:connector-curvature="0" + id="path896" + style="fill:none;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 610.082,1670.836 c 0,-7.156 5.801,-12.961 12.961,-12.961 7.156,0 12.957,5.805 12.957,12.961 0,7.156 -5.801,12.957 -12.957,12.957 -7.16,0 -12.961,-5.801 -12.961,-12.957 z m 5.184,10.367 20.734,-10.367 -20.734,-10.367 m -5.184,10.367 h -6.48 m 32.398,0 h 6.48" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/umlet.uxf b/umlet.uxf new file mode 100644 index 0000000..89f794e --- /dev/null +++ b/umlet.uxf @@ -0,0 +1,1497 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<diagram program="umlet" version="14.3.0"> + <help_text>// Uncomment the following line to change the fontsize and font: +fontsize=10 +// fontfamily=SansSerif //possible: SansSerif,Serif,Monospaced + + +////////////////////////////////////////////////////////////////////////////////////////////// +// Welcome to UMLet! +// +// Double-click on elements to add them to the diagram, or to copy them +// Edit elements by modifying the text in this panel +// Hold Ctrl to select multiple elements +// Use Ctrl+mouse to select via lasso +// +// Use +/- or Ctrl+mouse wheel to zoom +// Drag a whole relation at its central square icon +// +// Press Ctrl+C to copy the whole diagram to the system clipboard (then just paste it to, eg, Word) +// Edit the files in the "palettes" directory to create your own element palettes +// +// Select "Custom Elements > New..." to create new element types +////////////////////////////////////////////////////////////////////////////////////////////// + + +// This text will be stored with each diagram; use it for notes.</help_text> + <zoom_level>7</zoom_level> + <element> + <id>UMLClass</id> + <coordinates> + <x>217</x> + <y>385</y> + <w>182</w> + <h>245</h> + </coordinates> + <panel_attributes>MainApp +-- ++ zoomcount: int = 0 ++ thrd: Thread = None ++ container: Container() ++ comp: ComponentSelector() ++ scene: Graphics.QGraphicsScene() +-- ++ menuBar() ++ buttonHandler() ++ help() ++ BinPhaseEnv() ++ selectCompounds() ++ currentTime() ++ simulate(mode) ++ terminate() ++ zoomReset() ++ zoomOut() ++ zoomIn() ++ component() ++ new() ++ deleteCall() ++ undo_redo_helper() ++ undo() ++ redo() ++ save() ++ open() + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>231</x> + <y>210</y> + <w>154</w> + <h>119</h> + </coordinates> + <panel_attributes>QMainWindow +-- +graphicsView.keyPressEvent +textBrowser: UC1 +-- +setUpUi() +graphicsView.setScene() +graphicsView.setMouseTracking() +setDockNestingEnabled() +setCorner() +addDockWidget()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>301</x> + <y>322</y> + <w>21</w> + <h>77</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>245</x> + <y>112</y> + <w>119</w> + <h>42</h> + </coordinates> + <panel_attributes>UC1 (textBrowserClass) +-- +setText()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>294</x> + <y>147</y> + <w>21</w> + <h>77</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>455</x> + <y>126</y> + <w>224</w> + <h>189</h> + </coordinates> + <panel_attributes>ComponentSelector +-- ++ Dict1: dictionary = dict() ++ instance: list = [ChemsepDatabase()] ++ lines: list = [] ++ model: QStringListModel() ++ completer: QCompleter() +-- ++ final_list(*list_name) ++ isCompSelected() ++ get_object(component) ++ get_original_name(component, removing_attrib) ++ compoundSelection() +_+ setCompounds(compounds)_ ++ addToTable(a) ++ addCompToList(comp) ++ removeItems() ++ Show_Error() ++ cancel() ++ getComp() ++ final_mo() + + + + + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>469</x> + <y>378</y> + <w>161</w> + <h>252</h> + </coordinates> + <panel_attributes>Container +-- ++ unitOp: list = [] ++ termoPackage = None ++ compounds = None ++ conn: dictionary = defaultdict(list) ++ op: dictionary = defaultdict(list) ++ ip: dictionary = defaultdict(list) ++ msg ++ opl: list = [] ++ result: list = [] ++ graphics: Graphics(unitOp) ++ scene : graphics.getScene() +-- ++ currentTime() ++ addUnitOp(obj, graphicsView) ++ delete(l) ++ fetchObject(name) ++ addCompounds(comp) ++ add_thermoPackage(thermo) ++ msgBrowser() ++ simulate(mode) ++ flatlist(lst) ++ PUSH(fileName, data) ++ CLEAN_FILE(fileName) ++ POP(fileName) ++ get_last_list(fileName) +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>686</x> + <y>434</y> + <w>238</w> + <h>119</h> + </coordinates> + <panel_attributes>Graphics +-- ++ scene: QGraphicsScene() ++ pos: QPointF = None ++ unitOp: list = unitOp +-- ++ getScene() ++ getComponentSelector() ++ createNodeItem(unitOpr, container, graphicsView) ++ boundingRect() ++ loadCanvas(obj) +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>728</x> + <y>238</y> + <w>147</w> + <h>105</h> + </coordinates> + <panel_attributes>QDialog +-- +lineEdit: UC2 +compoundSelectButton: UC3 +pushButton: UC4 +pushButton_2: UC4 +pshButton_3: UC4 +-- +setupUi() +show()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>728</x> + <y>42</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>QStringListModel +-- +setStringList()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>910</x> + <y>231</y> + <w>147</w> + <h>49</h> + </coordinates> + <panel_attributes>UC3 (selectButtonClass) +-- +clicked.connect() +setAutoDefault() +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>728</x> + <y>98</y> + <w>147</w> + <h>49</h> + </coordinates> + <panel_attributes>QCompleter +-- +setCaseSensitivity() +setModel()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>728</x> + <y>175</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>UC2 (lineEditClass) +-- +setCompleter()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>910</x> + <y>294</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>UC4 (pushButtonClass) +-- +clicked.connect()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>665</x> + <y>595</y> + <w>259</w> + <h>315</h> + </coordinates> + <panel_attributes>NodeItem +-- ++ obj: UnitOperation = unitOpr ++ container: Container = container ++ graphicsView: QGraphicsView = graphicsView ++ name: string = obj.name ++ type: string = obj.type ++ default_tooltip: string ++ default_tooltip_dict: dictionary ++ nin: int = obj.no_of_inputs ++ nop: int = obj.no_of_outputs ++ text: string = user_input ++ ok: boolean = user_input ++ dockWidget: DockWidget() or DockWidgetMaterialStream() + or DockWidgetMixer() or DockWidgetSplitter() + or DockWidgetFlash() or DockWidgetCompoundSeparator() + or DockWidgetDistillationColumn() + or DockWidgetShortcutColumn() ++ mainwindow = findMainWindow() ++ pic: QPixmap() ++ rect: QRect() ++ text: QGraphicsTextItem() ++ f: QFont() ++ brush: QBrush() ++ pen: QPen() ++ selPen: QPen() ++ Input:list = [NodeSocket(type)] ++ Output:list = [NodeSocket(type)] +-- +shape() +boundingRect() +paint() +mouseMoveEvent(event) +mouseDoubleClickEvent(event) ++ initializeSockets(type) +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>644</x> + <y>987</y> + <w>119</w> + <h>49</h> + </coordinates> + <panel_attributes>QtWidgets.QGraphicsItem +-- +setTooltip(default_tooltip) +setFlag + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>847</x> + <y>1036</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>QtWidgets.QInputDialog +-- +getText() + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>798</x> + <y>1092</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>QtGui.QFont +-- +setPointSize() + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>644</x> + <y>1064</y> + <w>147</w> + <h>77</h> + </coordinates> + <panel_attributes>QtWidgets.QGraphicTextItem +-- +setFont() +setDefaultTextColor() +setParentItem() +setPos() +setPlainText() + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>483</x> + <y>707</y> + <w>112</w> + <h>42</h> + </coordinates> + <panel_attributes>QtGui.QBrush +-- +setStyle() +setColor() + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>294</x> + <y>707</y> + <w>147</w> + <h>56</h> + </coordinates> + <panel_attributes>QtGui.QPen +-- +setStyle() +setColor() +setWidth() + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>469</x> + <y>805</y> + <w>147</w> + <h>189</h> + </coordinates> + <panel_attributes>NodeSocket +-- ++ rect: QRect = rect ++ type: string = socketType ++ parent: NodeItem = parent ++ newLine: NodeLine = None ++ otherLine: NodeLine = None ++ brush: QBrush() ++ pen: QPen() ++ outLines: list = [] ++ inLines: list = [] +-- +shape() +boundingRect() +paint() +mousePressEvent(event) +mouseMoveEvent(event) +mouseReleaseEvent(event) +hoverEnterEvent(event) +hoverLeaveEvent(event) ++ getCenter() +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>245</x> + <y>805</y> + <w>147</w> + <h>161</h> + </coordinates> + <panel_attributes>NodeLine +-- ++ _pointA: QPointF = pointA ++ _pointB: QPointF = pointB ++ _source: QPointF = None ++ _targer: QPointF = None ++ socket: string = socket ++ pen: QPen() +-- +updatePath() +paint() +__delete__(instance) ++ pointA() ++ pointA(point) ++ pointB() ++ pointB(poing) ++ source() ++ target() +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>140</x> + <y>707</y> + <w>147</w> + <h>56</h> + </coordinates> + <panel_attributes>QtWigets.QGraphicsPathItem +-- +setZValue() +setBrush() +setPen() +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1337</x> + <y>154</y> + <w>168</w> + <h>210</h> + </coordinates> + <panel_attributes>DockWidgetMaterialStream +-- ++ name: string = name ++ obj: UnitOperations = obj ++ type: string = comptype ++ input_dict: dictionary = {} ++ dict: dictionary = {} ++ x_pclist: list = [] ++ name_type: string = None ++ container: Container = container ++ header: QTreeWidgetItem() +-- ++ modes() ++ mode_selection() ++ input_params_list() ++ param() ++ results_category(name) ++ _show_result(lst)_ ++ show_error()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>910</x> + <y>350</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>UC5 (comboBoxClass) +-- +currentIndexChanged.connect()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1092</x> + <y>294</y> + <w>168</w> + <h>182</h> + </coordinates> + <panel_attributes>DockWidget +-- ++ name: string = name ++ obj: UnitOperations = obj ++ type: string = comptype ++ input_dict: dictionary = {} ++ dict: dictionary = {} ++ x_pclist: list = [] ++ name_type: string = None ++ container: Container = container +-- ++ modes() ++ mode_selection() ++ input_params_list() ++ param() ++ show_error() +_+ show_result(lst)_ ++ result_category(name)</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1120</x> + <y>147</y> + <w>147</w> + <h>112</h> + </coordinates> + <panel_attributes>QDockWidget +-- +pushButton_2: UC4 +comboBox: UC5 + +btn:UC4 +-- +setupUi() +setWindowTitle() +hide()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1337</x> + <y>686</y> + <w>168</w> + <h>161</h> + </coordinates> + <panel_attributes>DockWidgetShortcutColumn +-- ++ name: string = name ++ obj: UnitOperations = obj ++ type: string = comptype ++ input_dict: list = [] ++ dict: list = [] ++ name_yype: string = None ++ container: Container = container +-- ++ input_params_list() ++ fun() ++ param() ++ show_error() +_+ show_result(lst)_ ++ result_category(name)</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1337</x> + <y>546</y> + <w>168</w> + <h>126</h> + </coordinates> + <panel_attributes>DockWidgetMixer +DockWidgetCompoundSeparator +-- ++ name: string = name ++ obj: UnitOperations = obj ++ type: string = comptype ++ input_dict: list = [] ++ dict: list = [] +-- ++ input_params_list() ++ param() ++ show_error()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1337</x> + <y>392</y> + <w>168</w> + <h>140</h> + </coordinates> + <panel_attributes>DockWidgetSplitter +DockWidgetFlash +-- ++ name: string = name ++ obj: UnitOperations = obj ++ type: string = comptype ++ input_dict: list = [] ++ dict: list = [] +-- ++ input_params_list() ++ fun() ++ param() ++ show_error()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1022</x> + <y>511</y> + <w>231</w> + <h>231</h> + </coordinates> + <panel_attributes>Flowsheet +-- ++ sim_name: string = 'Simulator' ++ sim_method: string = '' ++ UnitOpn: list = [] ++ data: list = [] ++ compounds: list = [] ++ interface: string = '' ++ omc_path: string = None ++ omc_path: string = cwd() ++ sim_dir_path: string = join(curr_path, sim_name) ++ Flomo_path: string = join(ssim_dir_path, 'Flowsheet.mo') ++ eqn_mos_path: string = join(sim_dir_path, 'simlateEQN.mos') ++ sm_mos_path: string = join(sim_dir_path, 'simulateSM.mos') ++ resdata: list = [] ++ stdout = None ++ stderr = None +-- ++ get_omc_path() ++ add_UnitOpn() ++ remove_UnitOpn() ++ add_comp_list() ++ send_for_simulationEqn() ++ send_for_simulationSM() ++ ExtData() ++ simulateEQN() ++ simulateSM()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1050</x> + <y>980</y> + <w>189</w> + <h>280</h> + </coordinates> + <panel_attributes>MaterialStream +-- +_+ counter: int = 1_ ++ name: string = 'MaterialStream' + counter ++ type: string = 'MaterialStream' ++ CompNames: string = CompNames ++ count: int = counter ++ thermoPackage: string = 'RaoultsLaw' ++ mode1: string = 'P' ++ mode2: string = 'T' ++ mode1val: string = '' ++ mode2Val: string = '' ++ OM_data_init: string = '' ++ OM_data_eqn: string = '' ++ no_of_inputs: int = 1 ++ no_of_outputs: int = 2 ++ x: int = 2500-30 ++ y: int = 2500-30 ++ startDict: dictionary = {} ++ eqnDict: dictionary = {} ++ modesList: list = ['PT',...] ++ variables: dictionary = {'P':{..},...} +-- ++ paramgetter(mode) ++ paramsetter(params) ++ setPos(pos) ++ GetMinEqnValues() ++ GetStartValues() ++ OM_Flowsheet_Initialize() ++ OM_Flowsheet_Equation()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1316</x> + <y>980</y> + <w>189</w> + <h>350</h> + </coordinates> + <panel_attributes>UnitOperations +-- +_+ counter: int = 1_ ++ OM_data_eqn: string = '' ++ OM_data_init: string = '' ++ InputStms: list = [] ++ OutputStms: list = [] ++ compounds: list = compound_selected ++ name: string = '' ++ mode: string = None ++ modeVal: string = None ++ type: string = None ++ no_of_inputs: int = 1 ++ no_of_outputs: int = 1 ++ x: int = 2500-30 ++ y: int = 2500-30 ++ pos: QPointF(x, y) ++ count: int = counter ++ variables: dictionary = {} ++ modesList: list = [] ++ parameters: list = [] ++ extra: list = [] ++ ForNaming: list = [] ++ multidict: list = [] ++ ThermoPackReq: boolean = False ++ thermoPackage: list = None +-- ++ paramgetter(mode) ++ paramsetter(params) ++ setPos(pos) ++ add_connection(flag, UnitOpr) ++ OM_Flowsheet_Initialize() ++ OM_Flowsheet_Equation()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>0</x> + <y>497</y> + <w>175</w> + <h>168</h> + </coordinates> + <panel_attributes>Bin_Phase_env +-- ++ comp: CompoundSelector = comp ++ compounds: list = comp.getComp() ++ lines: list = [line.rstrip('\n')...] ++ counter: int = 1 +-- +setupUi() ++ button_handler() ++ T_xy() ++ P_xy() ++ get_omc_path() ++ plot() ++ pressEvent(evt) ++ entered(items)</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>490</x> + <y>0</y> + <w>147</w> + <h>98</h> + </coordinates> + <panel_attributes>ChemsepDatabase +-- ++ comp_name_list: list = list() ++ name: string = 'chemsep' ++ comp_prop_list: list = list() +-- ++ get_comp_name_list() ++ get_value(comps, attrib) ++ get_comp_prop(comps)</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>392</x> + <y>308</y> + <w>84</w> + <h>126</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>100.0;10.0;100.0;160.0;10.0;160.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>392</x> + <y>476</y> + <w>91</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>110.0;10.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>553</x> + <y>91</y> + <w>21</w> + <h>49</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>672</x> + <y>280</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>80.0;10.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>791</x> + <y>203</y> + <w>21</w> + <h>49</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>791</x> + <y>140</y> + <w>21</w> + <h>49</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>791</x> + <y>70</y> + <w>21</w> + <h>42</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;40.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>868</x> + <y>252</y> + <w>56</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>60.0;10.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>868</x> + <y>301</y> + <w>56</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>60.0;10.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>623</x> + <y>497</y> + <w>77</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>90.0;10.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>791</x> + <y>546</y> + <w>21</w> + <h>63</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;70.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>609</x> + <y>875</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>385</x> + <y>875</y> + <w>98</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;10.0;120.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>217</x> + <y>756</y> + <w>105</w> + <h>63</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;130.0;70.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>315</x> + <y>756</y> + <w>63</w> + <h>63</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>70.0;10.0;10.0;70.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>539</x> + <y>742</y> + <w>21</w> + <h>77</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>588</x> + <y>728</y> + <w>91</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>700</x> + <y>903</y> + <w>21</w> + <h>98</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;120.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>917</x> + <y>903</y> + <w>21</w> + <h>147</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;190.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>819</x> + <y>903</y> + <w>21</w> + <h>203</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;270.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>770</x> + <y>903</y> + <w>21</w> + <h>175</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;230.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>623</x> + <y>560</y> + <w>413</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>570.0;10.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>973</x> + <y>560</y> + <w>448</w> + <h>434</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>620.0;600.0;620.0;520.0;10.0;520.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1134</x> + <y>917</y> + <w>21</w> + <h>77</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;90.0;10.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>917</x> + <y>245</y> + <w>672</w> + <h>651</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>840.0;10.0;940.0;10.0;940.0;910.0;10.0;910.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>448</y> + <w>91</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>602</y> + <w>91</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>763</y> + <w>91</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1253</x> + <y>371</y> + <w>336</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<-</panel_attributes> + <additional_attributes>10.0;10.0;460.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1162</x> + <y>252</y> + <w>21</w> + <h>56</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;10.0;60.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1260</x> + <y>175</y> + <w>91</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1260</x> + <y>196</y> + <w>98</w> + <h>210</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;120.0;280.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1260</x> + <y>224</y> + <w>91</w> + <h>336</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;110.0;460.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1260</x> + <y>252</y> + <w>91</w> + <h>455</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;110.0;630.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>168</x> + <y>546</y> + <w>63</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;70.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1050</x> + <y>308</y> + <w>56</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;60.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1050</x> + <y>364</y> + <w>56</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<.</panel_attributes> + <additional_attributes>10.0;10.0;60.0;10.0</additional_attributes> + </element> + <element> + <id>UMLNote</id> + <coordinates> + <x>14</x> + <y>1008</y> + <w>112</w> + <h>35</h> + </coordinates> + <panel_attributes>UC is the abbreviation +for unknown class. +bg=white +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1141</x> + <y>56</y> + <w>147</w> + <h>49</h> + </coordinates> + <panel_attributes>Graphics.py +-- +findMainWindow()</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1554</x> + <y>1267</y> + <w>147</w> + <h>119</h> + </coordinates> + <panel_attributes>Heater +Cooler +AdiabaticCompressor +AdiabaticExpander +Valve +Pump +Flash +-- +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1554</x> + <y>1127</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>Mixer +-- ++ Pout_modes: list = [...] +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1554</x> + <y>1169</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>Splitter +-- ++ CalcType_modes: list = [...] +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1554</x> + <y>1218</y> + <w>147</w> + <h>35</h> + </coordinates> + <panel_attributes>CompoundSeparator +-- ++ SepFact_modes: list = [...] +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1554</x> + <y>994</y> + <w>175</w> + <h>70</h> + </coordinates> + <panel_attributes>DistillationColumn +-- ++ EngStm1:string = 'EngStm1'+name ++ EngStm2: string = 'EngStm2'+name ++ Cspec_list: list = [...] ++ Rsepc_list: list = [...] + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>UMLClass</id> + <coordinates> + <x>1554</x> + <y>1071</y> + <w>175</w> + <h>49</h> + </coordinates> + <panel_attributes>ShortcutColumn +-- ++ EngStm1:string = 'EngStm1'+name ++ EngStm2: string = 'EngStm2'+name + +</panel_attributes> + <additional_attributes/> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>1022</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>1085</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>1141</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>1190</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>1232</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>1498</x> + <y>1309</y> + <w>70</w> + <h>21</h> + </coordinates> + <panel_attributes>lt=<<-</panel_attributes> + <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>7</x> + <y>1064</y> + <w>133</w> + <h>28</h> + </coordinates> + <panel_attributes>lt=<- +Association</panel_attributes> + <additional_attributes>10.0;20.0;170.0;20.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>7</x> + <y>1106</y> + <w>133</w> + <h>28</h> + </coordinates> + <panel_attributes>lt=<<. +Implements</panel_attributes> + <additional_attributes>10.0;20.0;170.0;20.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>7</x> + <y>1141</y> + <w>133</w> + <h>28</h> + </coordinates> + <panel_attributes>lt=<<- +Inherits</panel_attributes> + <additional_attributes>10.0;20.0;170.0;20.0</additional_attributes> + </element> + <element> + <id>Relation</id> + <coordinates> + <x>7</x> + <y>1169</y> + <w>147</w> + <h>28</h> + </coordinates> + <panel_attributes>+'s are user-defined variables and methods +Qt's methods does not have any symbols</panel_attributes> + <additional_attributes>80.0;20.0;120.0;20.0</additional_attributes> + </element> +</diagram> |