summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Bin_Phase_env.py63
m---------Chemical-Simulator-GUI6
-rw-r--r--ComponentSelector.py (renamed from component_selector.py)19
-rw-r--r--ComponentSelector.ui (renamed from comp_selector.ui)15
-rw-r--r--DockWidget.txt636
-rw-r--r--DockWidgetCompoundSeparator.py99
-rw-r--r--DockWidgetCompoundSeparator.ui45
-rw-r--r--DockWidgetDistillationColumn.py120
-rw-r--r--DockWidgetDistillationColumn.ui270
-rw-r--r--DockWidgetFlash.py74
-rw-r--r--DockWidgetFlash.ui161
-rw-r--r--DockWidgetMaterialStream.py (renamed from DockWidgetMatStm.py)16
-rw-r--r--DockWidgetMaterialStream.ui (renamed from DockWidgetMatStm.ui)0
-rw-r--r--DockWidgetMixer.py61
-rw-r--r--DockWidgetMixer.ui137
-rw-r--r--DockWidgetShortcutColumn.py97
-rw-r--r--DockWidgetShortcutColumn.ui295
-rw-r--r--DockWidgetSplitter.py78
-rw-r--r--DockWidgetSplitter.ui200
-rw-r--r--Graphics.py164
-rw-r--r--OMChem/ConvReactor.py4
-rw-r--r--Simulator/Databases/Databases.py29
-rw-r--r--Streams.py388
-rw-r--r--Undo.datbin39600 -> 11013 bytes
-rw-r--r--UnitOperations.py314
-rw-r--r--container.py15
-rw-r--r--dockWidget.py62
-rw-r--r--dockWidget.ui5
-rw-r--r--icon/AdiabaticCompressor.pngbin0 -> 643 bytes
-rw-r--r--icon/AdiabaticExpander.pngbin0 -> 565 bytes
-rw-r--r--icon/CompoundSeparator.png (renamed from icons/CompSep.png)bin1521 -> 1521 bytes
-rw-r--r--icon/Cooler.pngbin0 -> 2334 bytes
-rw-r--r--icon/DistillationColumn.png (renamed from icons/DistCol.png)bin6006 -> 6006 bytes
-rw-r--r--icon/Equation.png (renamed from icons/Equation.png)bin3889 -> 3889 bytes
-rw-r--r--icon/Flash.pngbin0 -> 2079 bytes
-rw-r--r--icon/Heater.pngbin0 -> 2088 bytes
-rw-r--r--icon/MaterialStream.pngbin0 -> 452 bytes
-rw-r--r--icon/Mixer.pngbin0 -> 911 bytes
-rw-r--r--icon/Pump.pngbin0 -> 1348 bytes
-rw-r--r--icon/Sequential.png (renamed from icons/Sequential.png)bin5827 -> 5827 bytes
-rw-r--r--icon/ShortcutColumn.png (renamed from icons/ShortCol.png)bin6006 -> 6006 bytes
-rw-r--r--icon/Splitter.pngbin0 -> 937 bytes
-rw-r--r--icon/Valve.pngbin0 -> 1195 bytes
-rw-r--r--icon/compoundSelector.png (renamed from icons/compoundSelector.png)bin1249 -> 1249 bytes
-rw-r--r--icon/icon_1.svg732
-rw-r--r--icon/logo.pngbin0 -> 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)bin3337 -> 3337 bytes
-rw-r--r--icon/zoomIn.png (renamed from icons/zoomIn.png)bin32456 -> 32456 bytes
-rw-r--r--icon/zoomOut.png (renamed from icons/zoomOut.png)bin31836 -> 31836 bytes
-rw-r--r--icon/zoomReset.png (renamed from icons/zoomReset.png)bin48307 -> 48307 bytes
-rw-r--r--icons/AdiabaticCompressor.pngbin643 -> 740 bytes
-rw-r--r--icons/AdiabaticExpander.pngbin565 -> 741 bytes
-rw-r--r--icons/Column.pngbin0 -> 4681 bytes
-rw-r--r--icons/CompoundSeparator.pngbin0 -> 1708 bytes
-rw-r--r--icons/Cooler.pngbin2334 -> 3042 bytes
-rw-r--r--icons/DistillationColumn.pngbin0 -> 4361 bytes
-rw-r--r--icons/Flash.pngbin2079 -> 2431 bytes
-rw-r--r--icons/Heater.pngbin2088 -> 2750 bytes
-rw-r--r--icons/MaterialStream.pngbin452 -> 527 bytes
-rw-r--r--icons/Mixer.pngbin911 -> 1008 bytes
-rw-r--r--icons/Pump.pngbin1348 -> 1620 bytes
-rw-r--r--icons/ShortcutColumn.pngbin0 -> 4361 bytes
-rw-r--r--icons/Splitter.pngbin937 -> 1068 bytes
-rw-r--r--icons/Valve.pngbin1195 -> 1498 bytes
-rw-r--r--icons/compound.pngbin0 -> 4849 bytes
-rw-r--r--icons/eq.pngbin0 -> 5162 bytes
-rw-r--r--icons/icon_1.svg868
-rw-r--r--icons/images.pngbin0 -> 2938 bytes
-rw-r--r--icons/logo.pngbin9457 -> 1391 bytes
-rw-r--r--icons/new.pngbin0 -> 2812 bytes
-rw-r--r--icons/sq.pngbin0 -> 8725 bytes
-rw-r--r--icons/zoo.pngbin0 -> 6707 bytes
-rw-r--r--icons/zoom_in.pngbin0 -> 4908 bytes
-rw-r--r--icons/zoom_out.pngbin0 -> 4865 bytes
-rw-r--r--icons/zoom_reset.pngbin0 -> 5052 bytes
-rw-r--r--main.ui10
-rw-r--r--main2.ui415
-rw-r--r--main3.ui2112
-rw-r--r--mainApp.py90
-rw-r--r--umlet.uxf1448
82 files changed, 8385 insertions, 663 deletions
diff --git a/Bin_Phase_env.py b/Bin_Phase_env.py
index a02c0e2..b9228b2 100644
--- a/Bin_Phase_env.py
+++ b/Bin_Phase_env.py
@@ -17,8 +17,6 @@ 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):
@@ -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):
#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)
-
+ # print(items)
#proxy = pg.SignalProxy(plt.scene().sigMouseMoved, rateLimit = 60, slot = pressEvent)
plt.scene().sigMouseMoved.connect(pressEvent)
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..4860c4c 100644
--- a/component_selector.py
+++ b/ComponentSelector.py
@@ -4,17 +4,15 @@ 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)
@@ -43,6 +41,7 @@ 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)
@@ -52,7 +51,6 @@ class componentSelector(QDialog,ui_dialog):
self.pushButton_2.clicked.connect(self.cancel)
self.pushButton_3.clicked.connect(self.removeItems)
-
def final_list(self,*list_name):
self.list_final=[]
#add multiple lists
@@ -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/DockWidget.txt b/DockWidget.txt
new file mode 100644
index 0000000..b14eef8
--- /dev/null
+++ b/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/DockWidgetCompoundSeparator.py b/DockWidgetCompoundSeparator.py
new file mode 100644
index 0000000..24cdbc7
--- /dev/null
+++ b/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('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.inputdict = []
+
+ print("constructor ", self.inputdict)
+ self.inputparamslist()
+ self.dict = []
+
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+ 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.inputdict = 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.inputdict ", self.inputdict)
+
+ self.dict = [self.inputdict[0].isChecked(), self.inputdict[1].isChecked()]
+ j = 2
+ for i in range(len(self.obj.compounds)):
+ print(j+i)
+ self.dict.append(self.inputdict[j+i].currentText())
+ self.dict.append(self.inputdict[j+i+1].text())
+ j += 1
+
+ print("param ", self.dict)
+ self.obj.paramsetter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
diff --git a/DockWidgetCompoundSeparator.ui b/DockWidgetCompoundSeparator.ui
new file mode 100644
index 0000000..2d9a4b2
--- /dev/null
+++ b/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/DockWidgetDistillationColumn.py b/DockWidgetDistillationColumn.py
new file mode 100644
index 0000000..ca2da9c
--- /dev/null
+++ b/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('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.inputdict = []
+ print("constructor ", self.inputdict)
+ self.pushButton_2.clicked.connect(self.param)
+ self.dict = []
+ self.inputparamslist()
+ self.nameType = None
+ self.container = container
+
+ # input data tab
+
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+
+ # 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.inputdict = [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.inputdict ", self.inputdict)
+ self.dict = [self.inputdict[0].text(),self.inputdict[1].text(), self.inputdict[2].text(), self.inputdict[3].currentText(),
+ self.inputdict[4].text(), self.inputdict[5].currentText(), self.inputdict[6].currentText(), self.inputdict[7].text(),
+ self.inputdict[8].text(), self.inputdict[9].currentText(), self.inputdict[10].currentText(), self.inputdict[11].text()]
+
+ 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):
+ pass \ No newline at end of file
diff --git a/DockWidgetDistillationColumn.ui b/DockWidgetDistillationColumn.ui
new file mode 100644
index 0000000..0cb1043
--- /dev/null
+++ b/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/DockWidgetFlash.py b/DockWidgetFlash.py
new file mode 100644
index 0000000..f0fa511
--- /dev/null
+++ b/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('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.inputdict = []
+ print("constructor ", self.inputdict)
+ self.inputparamslist()
+ self.btn.clicked.connect(self.param)
+ self.dict = []
+
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+
+ 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.inputdict = [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.inputdict ", self.inputdict)
+ self.dict = [self.inputdict[0].currentText(),self.inputdict[1].isChecked(), float(self.inputdict[2].text()), self.inputdict[3].isChecked(), float(self.inputdict[4].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/DockWidgetFlash.ui b/DockWidgetFlash.ui
new file mode 100644
index 0000000..c781aa6
--- /dev/null
+++ b/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/DockWidgetMaterialStream.py
index 76ecb11..5fd6261 100644
--- a/DockWidgetMatStm.py
+++ b/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('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)
@@ -41,11 +41,11 @@ 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):
diff --git a/DockWidgetMatStm.ui b/DockWidgetMaterialStream.ui
index 8995ba6..8995ba6 100644
--- a/DockWidgetMatStm.ui
+++ b/DockWidgetMaterialStream.ui
diff --git a/DockWidgetMixer.py b/DockWidgetMixer.py
new file mode 100644
index 0000000..8a00dcd
--- /dev/null
+++ b/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('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.inputdict = []
+ self.x_pclist = []
+ print("constructor ", self.inputdict)
+ self.inputparamslist()
+ self.btn.clicked.connect(self.param)
+ self.dict = {}
+
+ # input data tab
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+
+ self.l1.setText(self.obj.variables['NOI']['name']+":")
+ self.le1.setText(str(self.obj.variables['NOI']['value']))
+ self.u1.setText(self.obj.variables['NOI']['unit'])
+ for i in self.obj.Pout_modes:
+ self.cb2.addItem(str(i))
+
+ self.l2.setText(self.obj.variables['Pout']['name']+":")
+
+
+ self.inputdict = [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.inputdict ", self.inputdict)
+ self.dict = [int(self.inputdict[0].text()),self.inputdict[1].currentText()]
+ 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/DockWidgetMixer.ui b/DockWidgetMixer.ui
new file mode 100644
index 0000000..e039490
--- /dev/null
+++ b/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/DockWidgetShortcutColumn.py b/DockWidgetShortcutColumn.py
new file mode 100644
index 0000000..570cdd1
--- /dev/null
+++ b/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('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.inputdict = []
+ print("constructor ", self.inputdict)
+ self.inputparamslist()
+ self.btn.clicked.connect(self.param)
+ self.dict = []
+
+ self.nameType = None
+ self.container = container
+
+ # input data tab
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+
+ 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.inputdict = [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.inputdict ", self.inputdict)
+ self.dict = [self.inputdict[0].currentText(),self.inputdict[1].currentText(),float(self.inputdict[2].text()), float(self.inputdict[3].text()),
+ self.inputdict[4].currentText(), float(self.inputdict[5].text()), float(self.inputdict[6].text()), float(self.inputdict[7].text())]
+
+ 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):
+ pass \ No newline at end of file
diff --git a/DockWidgetShortcutColumn.ui b/DockWidgetShortcutColumn.ui
new file mode 100644
index 0000000..c66e699
--- /dev/null
+++ b/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/DockWidgetSplitter.py b/DockWidgetSplitter.py
new file mode 100644
index 0000000..9327e16
--- /dev/null
+++ b/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('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.inputdict = []
+ print("constructor ", self.inputdict)
+ self.inputparamslist()
+ self.btn.clicked.connect(self.param)
+ self.dict = {}
+
+ # input data tab
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+
+ 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.inputdict = [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.inputdict ", self.inputdict)
+ self.dict = [int(self.inputdict[0].text()),self.inputdict[1].currentText(), float(self.inputdict[2].text()), float(self.inputdict[3].text())]
+ print("param ", self.dict)
+ self.obj.paramsetter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
diff --git a/DockWidgetSplitter.ui b/DockWidgetSplitter.ui
new file mode 100644
index 0000000..02a865e
--- /dev/null
+++ b/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/Graphics.py b/Graphics.py
index 467b628..07dd43e 100644
--- a/Graphics.py
+++ b/Graphics.py
@@ -14,15 +14,22 @@ 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 DockWidget import *
-from DockWidgetMatStm import *
+from DockWidgetMaterialStream import *
+from DockWidgetDistillationColumn import *
+from DockWidgetShortcutColumn import *
+from DockWidgetMixer import *
+from DockWidgetSplitter import *
+from DockWidgetFlash import *
+from DockWidgetCompoundSeparator import *
+
import datetime
-from container import *
-import container
+from Container import *
+import Container
from Streams import *
from UnitOperations import *
@@ -40,10 +47,10 @@ class Graphics(QDialog, QtWidgets.QGraphicsItem):
return self.scene
def getComponentSelector(self):
- return componentSelector(self)
+ return ComponentSelector(self)
- def createNodeItem(self,unitOpr, container):
- return NodeItem(unitOpr, container)
+ def createNodeItem(self,unitOpr, container, graphicsView):
+ return NodeItem(unitOpr, container, graphicsView)
def boundingRect(self):
return QtCore.QRectF(self.rect)
@@ -53,14 +60,14 @@ class Graphics(QDialog, QtWidgets.QGraphicsItem):
compounds = obj[-1]
obj.pop()
- componentSelector.setCompounds(compounds)
+ ComponentSelector.setCompounds(compounds)
for i in obj:
if(i in self.unitOp):
pass
else:
self.unitOp.append(i)
- new_box = self.createNodeItem(i, self)
+ new_box = self.createNodeItem(i, self.grphicsView)
new_box.setPos(i.pos.toPoint().x(), i.pos.toPoint().y())
self.scene.addItem(new_box)
@@ -118,11 +125,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.setColor(QtGui.QColor(0,70,70,220))
self.setPen(self.pen)
def updatePath(self):
@@ -270,12 +277,12 @@ class NodeSocket(QtWidgets.QGraphicsItem):
# 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 = []
@@ -295,6 +302,9 @@ 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)
@@ -315,6 +325,7 @@ class NodeSocket(QtWidgets.QGraphicsItem):
super(NodeSocket, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
+
if self.type == 'op':
pointB = self.mapToScene(event.pos())
self.newLine.pointB = pointB
@@ -329,6 +340,9 @@ class NodeSocket(QtWidgets.QGraphicsItem):
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
@@ -341,6 +355,7 @@ class NodeSocket(QtWidgets.QGraphicsItem):
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
+
elif (self.type =='in') and (item.type == 'op'):
self.newLine.source = item
self.newLine.target = self
@@ -351,6 +366,7 @@ class NodeSocket(QtWidgets.QGraphicsItem):
if self.newLine.target.parent.obj.type not in stm:
self.newLine.target.parent.obj.add_connection(1,self.newLine.source.parent.obj)
+
else:
self.scene().removeItem(self.newLine)
if(self.newLine in self.inLines):
@@ -379,11 +395,21 @@ class NodeSocket(QtWidgets.QGraphicsItem):
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 = []
+stack = []
class NodeItem(QtWidgets.QGraphicsItem):
@@ -397,57 +423,74 @@ class NodeItem(QtWidgets.QGraphicsItem):
def getDockWidget():
return dockWidgetLst
- def __init__(self,unitOpr, container):
- l = ['Mixer','Splitter']
+ def __init__(self,unitOpr, container, graphicsView):
+ l = ['Splitter','Mixer', 'DistillationColumn', 'Flash', 'CompoundSeparator', 'ShortcutColumn']
stm = ['MaterialStream', 'EnergyStream']
super(NodeItem, self).__init__()
self.obj = unitOpr
self.container = container
+ self.graphicsView = graphicsView
self.name = self.obj.name
self.type = self.obj.type
- 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.modesList):
+ 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)
self.nin = self.obj.no_of_inputs
self.nop = self.obj.no_of_outputs
+ 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['NOI']['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.dockWidget = None
lst.append(self)
- 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")
+ if self.obj.type in l:
+ self.dockWidget = eval("DockWidget"+self.obj.type)(self.obj.name,self.obj.type,self.obj,self.container)
+ elif self.obj.type in stm:
+ self.dockWidget = eval("DockWidget"+self.obj.type)(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.rect = QtCore.QRect(0,0,self.pic.width(),self.pic.height())
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()
@@ -461,10 +504,10 @@ class NodeItem(QtWidgets.QGraphicsItem):
self.selPen = QtGui.QPen()
self.selPen.setStyle(QtCore.Qt.SolidLine)
- self.selPen.setWidth(2)
- self.selPen.setColor(QtGui.QColor(222,192,222))
+ self.selPen.setWidth(1)
+ self.selPen.setColor(QtGui.QColor(220,220,220,255))
- def initUi(self):
+ # initializing the node sockets
self.Input , self.Output = self.initializeSockets(self.type)
def shape(self):
@@ -484,29 +527,30 @@ class NodeItem(QtWidgets.QGraphicsItem):
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)]
+ 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)]
+ 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)]
+ 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)]
+ 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=="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)]
+ 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)]
+ 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):
@@ -524,10 +568,14 @@ class NodeItem(QtWidgets.QGraphicsItem):
#print(self.name, self.pos)
def mouseDoubleClickEvent(self, event):
- self.setPos(event.scenePos().x()-250,event.scenePos().y())
- temp = self.obj.pos
+
+ self.graphicsView.setInteractive(False)
+ if len(stack):
+ print(stack)
+ stack[-1].hide()
self.dockWidget.show()
- self.setPos(temp)
+ stack.append(self.dockWidget)
+ 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/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/Streams.py b/Streams.py
index f35a056..1b76247 100644
--- a/Streams.py
+++ b/Streams.py
@@ -355,391 +355,3 @@ class MaterialStream():
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
-
-
-'''
-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
diff --git a/Undo.dat b/Undo.dat
index a236cae..df0bd43 100644
--- a/Undo.dat
+++ b/Undo.dat
Binary files differ
diff --git a/UnitOperations.py b/UnitOperations.py
index 92d6f07..9591dc2 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,12 +10,11 @@ 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 = ''
@@ -27,13 +27,12 @@ class UnitOperation():
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.modesList = []
self.parameters = []
self.extra = []
self.ForNaming = []
@@ -43,13 +42,14 @@ class UnitOperation():
def paramgetter(self,mode=None):
params = {}
- if mode == None:
- self.mode = self.modeslist[0]
+ if mode == None and self.modesList:
+ self.mode = self.modesList[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):
@@ -60,11 +60,12 @@ class UnitOperation():
self.k = v
self.variables[k]['value'] = v
else:
+ self.variables[k]['value'] = v
self.modeVal = 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)
else :
@@ -158,6 +159,275 @@ class UnitOperation():
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.InputStms = None
+ self.OutputStms = 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':''},
+ 'thermoPackage' : {'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 paramsetter(self,params):
+ print("paramsetter ", 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.InputStms = None
+ self.OutputStms = None
+ # self.modesList = ['RR', 'Nout', 'T']
+ self.modesList = []
+ self.parameters = ['']
+ #self.parameters = ['Nt', 'InT_s', 'In_s', 'thermoPackage', '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':''},
+ 'thermoPackage' : {'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 paramsetter(self,params):
+ print("paramsetter ", 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 paramsetter(self,params):
+ print("paramsetter ", 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.InputStms = None
+ self.OutputStms = None
+ self.count = Flash.counter
+
+ type(self).counter += 1
+ self.variables = {
+ 'thermoPackage' : {'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 paramsetter(self,params):
+ print("paramsetter ", params)
+ self.variables['thermoPackage']['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.InputStms = None
+ self.OutputStms = None
+ self.modesList = ['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.InputStms = None
+ self.OutputStms = None
+ self.modesList = ['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.InputStms = 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 paramsetter(self,params):
+ print("paramsetter ", 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 = ['NOI', 'Pout']
+ # self.OutputStms = None
+ type(self).counter += 1
+
+ self.variables = {
+ 'NOI' : {'name':'Number of Input', 'value':6, 'unit':''},
+ 'Pout' : {'name':'Outlet Pressure', 'value':'Inlet_Average', 'unit':''},
+ }
+ def paramsetter(self, params):
+ print(self.InputStms, self.OutputStms)
+ self.OutputStms = []
+ print(self.InputStms, self.OutputStms)
+ print("paramsetter ", params)
+ self.variables['NOI']['value'] = int(params[0])
+ self.variables['Pout']['value'] = params[1]
+ print(self.variables)
+
+
class Heater(UnitOperation):
def __init__(self, name='Heater'):
@@ -178,6 +448,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 +459,19 @@ class Cooler(UnitOperation):
self.type = 'Cooler'
self.no_of_inputs = 1
self.no_of_outputs = 1
- self.modesList = ["Q","Tout","xvapout","Tdel"]
+ self.modesList = ['Q','Tout','Tdel','xvap']
self.extra = None
self.ForNaming = 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):
@@ -220,9 +492,10 @@ class AdiabaticCompressor(UnitOperation):
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):
@@ -246,6 +519,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/container.py b/container.py
index 6b4bcbe..6f9b0cd 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 *
@@ -69,11 +69,12 @@ class Container():
# def addUnitOpObj(obj):
# self.unitOp.append(obj)
- def addUnitOp(self,obj):
+ def addUnitOp(self,obj, graphicsView):
box = None
self.obj = obj
self.scene = self.graphics.getScene()
- box = self.graphics.createNodeItem(self.obj, self)
+ self.graphicsView = graphicsView
+ box = self.graphics.createNodeItem(self.obj, self, self.graphicsView)
self.scene.addItem(box)
box.setPos(2500-30, 2500-30)
@@ -92,6 +93,14 @@ class Container():
def delete(self,l):
for item in l:
self.scene.removeItem(item)
+ for i in dockWidgetLst:
+ if i.name == item.name:
+ i.hide()
+ del i
+ break
+ for i in dockWidgetLst:
+ print(i.name)
+ print("delete ", dockWidgetLst)
if hasattr(item,'Input'):
for x in item.Input:
if x.newLine:
diff --git a/dockWidget.py b/dockWidget.py
index 36fbc32..8eeff51 100644
--- a/dockWidget.py
+++ b/dockWidget.py
@@ -4,7 +4,7 @@ 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 *
@@ -12,7 +12,7 @@ ui_dialog,_ = loadUiType('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)
@@ -23,21 +23,23 @@ class DockWidget(QDockWidget,ui_dialog):
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
-
+
# input data tab
def modes(self):
modesList = self.obj.modesList
if(modesList):
for j in modesList:
- self.comboBox.addItem(str(j))
+ 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()
@@ -46,13 +48,21 @@ class DockWidget(QDockWidget,ui_dialog):
self.inputdict= {}
for i in reversed(range(self.formLayout.count())):
self.formLayout.removeRow(i)
- self.inputdict = self.obj.paramgetter(self.comboBox.currentText())
+ 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()
@@ -60,20 +70,24 @@ class DockWidget(QDockWidget,ui_dialog):
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
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
elif(i=="x_pc"):
@@ -90,42 +104,49 @@ class DockWidget(QDockWidget,ui_dialog):
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]))
+ 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
+
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=="condType"):
+ elif(i=="Ctype"):
if (self.inputdict[i].currentText()):
self.dict[i] = self.inputdict[i].currentText()
else:
@@ -145,10 +166,11 @@ class DockWidget(QDockWidget,ui_dialog):
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.inputdict[i].currentText()
else:
+ print(self.inputdict[i], i, self.obj.type)
if (self.inputdict[i].text()):
self.dict[i] = self.inputdict[i].text()
else:
@@ -163,7 +185,6 @@ class DockWidget(QDockWidget,ui_dialog):
except Exception as e:
print(e)
-
@staticmethod
def showResult(lst):
#DockWidget1.flag = True
@@ -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/dockWidget.ui b/dockWidget.ui
index 11855cb..5851d71 100644
--- a/dockWidget.ui
+++ b/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/icon/AdiabaticCompressor.png b/icon/AdiabaticCompressor.png
new file mode 100644
index 0000000..08a874c
--- /dev/null
+++ b/icon/AdiabaticCompressor.png
Binary files differ
diff --git a/icon/AdiabaticExpander.png b/icon/AdiabaticExpander.png
new file mode 100644
index 0000000..aaec6dc
--- /dev/null
+++ b/icon/AdiabaticExpander.png
Binary files differ
diff --git a/icons/CompSep.png b/icon/CompoundSeparator.png
index 6fd2d0c..6fd2d0c 100644
--- a/icons/CompSep.png
+++ b/icon/CompoundSeparator.png
Binary files differ
diff --git a/icon/Cooler.png b/icon/Cooler.png
new file mode 100644
index 0000000..08519ea
--- /dev/null
+++ b/icon/Cooler.png
Binary files differ
diff --git a/icons/DistCol.png b/icon/DistillationColumn.png
index 32a06b3..32a06b3 100644
--- a/icons/DistCol.png
+++ b/icon/DistillationColumn.png
Binary files differ
diff --git a/icons/Equation.png b/icon/Equation.png
index 687be3c..687be3c 100644
--- a/icons/Equation.png
+++ b/icon/Equation.png
Binary files differ
diff --git a/icon/Flash.png b/icon/Flash.png
new file mode 100644
index 0000000..4c38d8d
--- /dev/null
+++ b/icon/Flash.png
Binary files differ
diff --git a/icon/Heater.png b/icon/Heater.png
new file mode 100644
index 0000000..18b891a
--- /dev/null
+++ b/icon/Heater.png
Binary files differ
diff --git a/icon/MaterialStream.png b/icon/MaterialStream.png
new file mode 100644
index 0000000..ac543e4
--- /dev/null
+++ b/icon/MaterialStream.png
Binary files differ
diff --git a/icon/Mixer.png b/icon/Mixer.png
new file mode 100644
index 0000000..ee4b507
--- /dev/null
+++ b/icon/Mixer.png
Binary files differ
diff --git a/icon/Pump.png b/icon/Pump.png
new file mode 100644
index 0000000..daf804b
--- /dev/null
+++ b/icon/Pump.png
Binary files differ
diff --git a/icons/Sequential.png b/icon/Sequential.png
index 3b08856..3b08856 100644
--- a/icons/Sequential.png
+++ b/icon/Sequential.png
Binary files differ
diff --git a/icons/ShortCol.png b/icon/ShortcutColumn.png
index 32a06b3..32a06b3 100644
--- a/icons/ShortCol.png
+++ b/icon/ShortcutColumn.png
Binary files differ
diff --git a/icon/Splitter.png b/icon/Splitter.png
new file mode 100644
index 0000000..28f6d52
--- /dev/null
+++ b/icon/Splitter.png
Binary files differ
diff --git a/icon/Valve.png b/icon/Valve.png
new file mode 100644
index 0000000..63bd362
--- /dev/null
+++ b/icon/Valve.png
Binary files differ
diff --git a/icons/compoundSelector.png b/icon/compoundSelector.png
index cc878eb..cc878eb 100644
--- a/icons/compoundSelector.png
+++ b/icon/compoundSelector.png
Binary files differ
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
new file mode 100644
index 0000000..541e99e
--- /dev/null
+++ b/icon/logo.png
Binary files differ
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
index 08a6564..08a6564 100644
--- a/icons/plus.png
+++ b/icon/plus.png
Binary files differ
diff --git a/icons/zoomIn.png b/icon/zoomIn.png
index b10c61a..b10c61a 100644
--- a/icons/zoomIn.png
+++ b/icon/zoomIn.png
Binary files differ
diff --git a/icons/zoomOut.png b/icon/zoomOut.png
index 6c60a02..6c60a02 100644
--- a/icons/zoomOut.png
+++ b/icon/zoomOut.png
Binary files differ
diff --git a/icons/zoomReset.png b/icon/zoomReset.png
index 62fc917..62fc917 100644
--- a/icons/zoomReset.png
+++ b/icon/zoomReset.png
Binary files differ
diff --git a/icons/AdiabaticCompressor.png b/icons/AdiabaticCompressor.png
index 08a874c..1fd7bb0 100644
--- a/icons/AdiabaticCompressor.png
+++ b/icons/AdiabaticCompressor.png
Binary files differ
diff --git a/icons/AdiabaticExpander.png b/icons/AdiabaticExpander.png
index aaec6dc..615a638 100644
--- a/icons/AdiabaticExpander.png
+++ b/icons/AdiabaticExpander.png
Binary files differ
diff --git a/icons/Column.png b/icons/Column.png
new file mode 100644
index 0000000..84c0bcc
--- /dev/null
+++ b/icons/Column.png
Binary files differ
diff --git a/icons/CompoundSeparator.png b/icons/CompoundSeparator.png
new file mode 100644
index 0000000..3435dcf
--- /dev/null
+++ b/icons/CompoundSeparator.png
Binary files differ
diff --git a/icons/Cooler.png b/icons/Cooler.png
index 08519ea..4dcb802 100644
--- a/icons/Cooler.png
+++ b/icons/Cooler.png
Binary files differ
diff --git a/icons/DistillationColumn.png b/icons/DistillationColumn.png
new file mode 100644
index 0000000..f65150b
--- /dev/null
+++ b/icons/DistillationColumn.png
Binary files differ
diff --git a/icons/Flash.png b/icons/Flash.png
index 4c38d8d..9a84def 100644
--- a/icons/Flash.png
+++ b/icons/Flash.png
Binary files differ
diff --git a/icons/Heater.png b/icons/Heater.png
index 18b891a..52b8c00 100644
--- a/icons/Heater.png
+++ b/icons/Heater.png
Binary files differ
diff --git a/icons/MaterialStream.png b/icons/MaterialStream.png
index ac543e4..b548d3f 100644
--- a/icons/MaterialStream.png
+++ b/icons/MaterialStream.png
Binary files differ
diff --git a/icons/Mixer.png b/icons/Mixer.png
index ee4b507..6656945 100644
--- a/icons/Mixer.png
+++ b/icons/Mixer.png
Binary files differ
diff --git a/icons/Pump.png b/icons/Pump.png
index daf804b..a2d3e8e 100644
--- a/icons/Pump.png
+++ b/icons/Pump.png
Binary files differ
diff --git a/icons/ShortcutColumn.png b/icons/ShortcutColumn.png
new file mode 100644
index 0000000..f65150b
--- /dev/null
+++ b/icons/ShortcutColumn.png
Binary files differ
diff --git a/icons/Splitter.png b/icons/Splitter.png
index 28f6d52..778bcda 100644
--- a/icons/Splitter.png
+++ b/icons/Splitter.png
Binary files differ
diff --git a/icons/Valve.png b/icons/Valve.png
index 63bd362..3cfd5c4 100644
--- a/icons/Valve.png
+++ b/icons/Valve.png
Binary files differ
diff --git a/icons/compound.png b/icons/compound.png
new file mode 100644
index 0000000..a9c946d
--- /dev/null
+++ b/icons/compound.png
Binary files differ
diff --git a/icons/eq.png b/icons/eq.png
new file mode 100644
index 0000000..cb0485a
--- /dev/null
+++ b/icons/eq.png
Binary files differ
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
new file mode 100644
index 0000000..559fdbb
--- /dev/null
+++ b/icons/images.png
Binary files differ
diff --git a/icons/logo.png b/icons/logo.png
index 541e99e..60d94d8 100644
--- a/icons/logo.png
+++ b/icons/logo.png
Binary files differ
diff --git a/icons/new.png b/icons/new.png
new file mode 100644
index 0000000..f4343a7
--- /dev/null
+++ b/icons/new.png
Binary files differ
diff --git a/icons/sq.png b/icons/sq.png
new file mode 100644
index 0000000..b963402
--- /dev/null
+++ b/icons/sq.png
Binary files differ
diff --git a/icons/zoo.png b/icons/zoo.png
new file mode 100644
index 0000000..1de4314
--- /dev/null
+++ b/icons/zoo.png
Binary files differ
diff --git a/icons/zoom_in.png b/icons/zoom_in.png
new file mode 100644
index 0000000..cdf3e3f
--- /dev/null
+++ b/icons/zoom_in.png
Binary files differ
diff --git a/icons/zoom_out.png b/icons/zoom_out.png
new file mode 100644
index 0000000..b6dbcc9
--- /dev/null
+++ b/icons/zoom_out.png
Binary files differ
diff --git a/icons/zoom_reset.png b/icons/zoom_reset.png
new file mode 100644
index 0000000..ca9d36f
--- /dev/null
+++ b/icons/zoom_reset.png
Binary files differ
diff --git a/main.ui b/main.ui
index fd7045a..7974d9d 100644
--- a/main.ui
+++ b/main.ui
@@ -266,7 +266,7 @@
<property name="geometry">
<rect>
<x>0</x>
- <y>0</y>
+ <y>-246</y>
<width>221</width>
<height>956</height>
</rect>
@@ -734,11 +734,11 @@
<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>
@@ -1037,7 +1037,7 @@
</property>
<property name="icon">
<iconset>
- <normaloff>icons/DistCol.png</normaloff>icons/DistCol.png</iconset>
+ <normaloff>icons/DistillationColumn.png</normaloff>icons/DistillationColumn.png</iconset>
</property>
<property name="iconSize">
<size>
@@ -1081,7 +1081,7 @@
</property>
<property name="icon">
<iconset>
- <normaloff>icons/ShortCol.png</normaloff>icons/ShortCol.png</iconset>
+ <normaloff>icons/ShortcutColumn.png</normaloff>icons/ShortcutColumn.png</iconset>
</property>
<property name="iconSize">
<size>
diff --git a/main2.ui b/main2.ui
new file mode 100644
index 0000000..49b29e6
--- /dev/null
+++ b/main2.ui
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1068</width>
+ <height>829</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>icons/logo.png</normaloff>icons/logo.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QGraphicsView" name="graphicsView">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>12</pointsize>
+ </font>
+ </property>
+ <property name="mouseTracking">
+ <bool>true</bool>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="backgroundBrush">
+ <brush brushstyle="NoBrush">
+ <color alpha="255">
+ <red>170</red>
+ <green>170</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </property>
+ <property name="foregroundBrush">
+ <brush brushstyle="NoBrush">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </property>
+ <property name="sceneRect">
+ <rectf>
+ <x>0.000000000000000</x>
+ <y>0.000000000000000</y>
+ <width>5000.000000000000000</width>
+ <height>5000.000000000000000</height>
+ </rectf>
+ </property>
+ <property name="dragMode">
+ <enum>QGraphicsView::RubberBandDrag</enum>
+ </property>
+ <property name="transformationAnchor">
+ <enum>QGraphicsView::AnchorUnderMouse</enum>
+ </property>
+ <property name="resizeAnchor">
+ <enum>QGraphicsView::AnchorUnderMouse</enum>
+ </property>
+ <property name="viewportUpdateMode">
+ <enum>QGraphicsView::FullViewportUpdate</enum>
+ </property>
+ <property name="optimizationFlags">
+ <set>QGraphicsView::DontClipPainter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QDockWidget" name="dockWidget_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>109</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>524287</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="allowedAreas">
+ <set>Qt::BottomDockWidgetArea</set>
+ </property>
+ <property name="windowTitle">
+ <string>Message Browser</string>
+ </property>
+ <widget class="QWidget" name="dockWidgetContents_2">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTextEdit" name="textBrowser"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1068</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionNew_Flowsheet"/>
+ <addaction name="actionSave_2"/>
+ <addaction name="actionOpen"/>
+ </widget>
+ <widget class="QMenu" name="menuEdit">
+ <property name="title">
+ <string>Edit</string>
+ </property>
+ <addaction name="actionUndo"/>
+ <addaction name="actionRedo"/>
+ </widget>
+ <widget class="QMenu" name="menuView">
+ <property name="title">
+ <string>View</string>
+ </property>
+ <addaction name="actionZoomIn"/>
+ <addaction name="actionZoomOut"/>
+ <addaction name="actionResetZoom"/>
+ </widget>
+ <widget class="QMenu" name="menuSimulation">
+ <property name="title">
+ <string>Simulation</string>
+ </property>
+ <addaction name="actionEquation_oriented"/>
+ <addaction name="actionSequential_mode"/>
+ <addaction name="separator"/>
+ <addaction name="actionTerminate"/>
+ </widget>
+ <widget class="QMenu" name="menuComponds">
+ <property name="title">
+ <string>Compounds</string>
+ </property>
+ <addaction name="actionSelect_compounds"/>
+ </widget>
+ <widget class="QMenu" name="menuHelp">
+ <property name="title">
+ <string>Help</string>
+ </property>
+ <addaction name="actionHelp"/>
+ </widget>
+ <widget class="QMenu" name="menuUtility">
+ <property name="title">
+ <string>Utility</string>
+ </property>
+ <addaction name="actionBinary_Phase_Envelope"/>
+ </widget>
+ <addaction name="menuFile"/>
+ <addaction name="menuEdit"/>
+ <addaction name="menuView"/>
+ <addaction name="menuSimulation"/>
+ <addaction name="menuComponds"/>
+ <addaction name="menuHelp"/>
+ <addaction name="menuUtility"/>
+ </widget>
+ <widget class="QDockWidget" name="dockWidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>270</width>
+ <height>548</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>270</width>
+ <height>524287</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Component Selector</string>
+ </property>
+ <attribute name="dockWidgetArea">
+ <number>2</number>
+ </attribute>
+ <widget class="QWidget" name="dockWidgetContents">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>430</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>240</width>
+ <height>1000</height>
+ </size>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>221</width>
+ <height>732</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <layout class="QGridLayout" name="gl"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <widget class="QToolBar" name="toolBar">
+ <property name="windowTitle">
+ <string>toolBar</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ <addaction name="actionNew_Flowsheet"/>
+ <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="separator"/>
+ <addaction name="actionSelect_compounds"/>
+ </widget>
+ <action name="actionZoomIn">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/zoomIn.png</normaloff>icons/zoomIn.png</iconset>
+ </property>
+ <property name="text">
+ <string>ZoomIn</string>
+ </property>
+ </action>
+ <action name="actionZoomOut">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/zoomOut.png</normaloff>icons/zoomOut.png</iconset>
+ </property>
+ <property name="text">
+ <string>ZoomOut</string>
+ </property>
+ </action>
+ <action name="actionResetZoom">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/zoomReset.png</normaloff>icons/zoomReset.png</iconset>
+ </property>
+ <property name="text">
+ <string>ResetZoom</string>
+ </property>
+ </action>
+ <action name="actionEquation_oriented">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Equation.png</normaloff>icons/Equation.png</iconset>
+ </property>
+ <property name="text">
+ <string>Equation oriented</string>
+ </property>
+ </action>
+ <action name="actionSequential_mode">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Sequential.png</normaloff>icons/Sequential.png</iconset>
+ </property>
+ <property name="text">
+ <string>Sequential mode</string>
+ </property>
+ </action>
+ <action name="actionSelect_compounds">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/compoundSelector.png</normaloff>icons/compoundSelector.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select Compounds</string>
+ </property>
+ </action>
+ <action name="actionNew_Flowsheet">
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/new.svg</normaloff>icons/new.svg</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ </action>
+ <action name="actionHelp">
+ <property name="text">
+ <string>Help</string>
+ </property>
+ </action>
+ <action name="actionSave">
+ <property name="text">
+ <string>save</string>
+ </property>
+ </action>
+ <action name="actionSave_2">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </action>
+ <action name="actionOpen">
+ <property name="text">
+ <string>Open</string>
+ </property>
+ </action>
+ <action name="actionBinary_Phase_Envelope">
+ <property name="text">
+ <string>Binary Phase Envelope</string>
+ </property>
+ </action>
+ <action name="actionTerminate">
+ <property name="text">
+ <string>Terminate</string>
+ </property>
+ </action>
+ <action name="actionUndo">
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ </action>
+ <action name="actionRedo">
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/main3.ui b/main3.ui
new file mode 100644
index 0000000..9d30a8e
--- /dev/null
+++ b/main3.ui
@@ -0,0 +1,2112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1068</width>
+ <height>803</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>icons/logo.png</normaloff>icons/logo.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QGraphicsView" name="graphicsView">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>12</pointsize>
+ </font>
+ </property>
+ <property name="mouseTracking">
+ <bool>true</bool>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="backgroundBrush">
+ <brush brushstyle="NoBrush">
+ <color alpha="255">
+ <red>170</red>
+ <green>170</green>
+ <blue>127</blue>
+ </color>
+ </brush>
+ </property>
+ <property name="foregroundBrush">
+ <brush brushstyle="NoBrush">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </property>
+ <property name="sceneRect">
+ <rectf>
+ <x>0.000000000000000</x>
+ <y>0.000000000000000</y>
+ <width>5000.000000000000000</width>
+ <height>5000.000000000000000</height>
+ </rectf>
+ </property>
+ <property name="dragMode">
+ <enum>QGraphicsView::RubberBandDrag</enum>
+ </property>
+ <property name="transformationAnchor">
+ <enum>QGraphicsView::AnchorUnderMouse</enum>
+ </property>
+ <property name="resizeAnchor">
+ <enum>QGraphicsView::AnchorUnderMouse</enum>
+ </property>
+ <property name="viewportUpdateMode">
+ <enum>QGraphicsView::FullViewportUpdate</enum>
+ </property>
+ <property name="optimizationFlags">
+ <set>QGraphicsView::DontClipPainter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QDockWidget" name="dockWidget_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>109</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>524287</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="allowedAreas">
+ <set>Qt::BottomDockWidgetArea</set>
+ </property>
+ <property name="windowTitle">
+ <string>Message Browser</string>
+ </property>
+ <widget class="QWidget" name="dockWidgetContents_2">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTextEdit" name="textBrowser"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1068</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionNew"/>
+ <addaction name="actionSave_2"/>
+ <addaction name="actionOpen"/>
+ </widget>
+ <widget class="QMenu" name="menuEdit">
+ <property name="title">
+ <string>Edit</string>
+ </property>
+ <addaction name="actionUndo"/>
+ <addaction name="actionRedo"/>
+ </widget>
+ <widget class="QMenu" name="menuView">
+ <property name="title">
+ <string>View</string>
+ </property>
+ <addaction name="actionZoomIn"/>
+ <addaction name="actionZoomOut"/>
+ <addaction name="actionResetZoom"/>
+ </widget>
+ <widget class="QMenu" name="menuSimulation">
+ <property name="title">
+ <string>Simulation</string>
+ </property>
+ <addaction name="actionEquation_oriented"/>
+ <addaction name="actionSequential_mode"/>
+ <addaction name="separator"/>
+ <addaction name="actionTerminate"/>
+ </widget>
+ <widget class="QMenu" name="menuComponds">
+ <property name="title">
+ <string>Compounds</string>
+ </property>
+ <addaction name="actionSelect_compounds"/>
+ </widget>
+ <widget class="QMenu" name="menuHelp">
+ <property name="title">
+ <string>Help</string>
+ </property>
+ <addaction name="actionHelp"/>
+ </widget>
+ <widget class="QMenu" name="menuUtility">
+ <property name="title">
+ <string>Utility</string>
+ </property>
+ <addaction name="actionBinary_Phase_Envelope"/>
+ </widget>
+ <addaction name="menuFile"/>
+ <addaction name="menuEdit"/>
+ <addaction name="menuView"/>
+ <addaction name="menuSimulation"/>
+ <addaction name="menuComponds"/>
+ <addaction name="menuHelp"/>
+ <addaction name="menuUtility"/>
+ </widget>
+ <widget class="QDockWidget" name="dockWidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>270</width>
+ <height>548</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>270</width>
+ <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>
+ <attribute name="dockWidgetArea">
+ <number>2</number>
+ </attribute>
+ <widget class="QWidget" name="dockWidgetContents">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>430</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>240</width>
+ <height>1000</height>
+ </size>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>-251</y>
+ <width>221</width>
+ <height>956</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:rgb(73,36,73,255)</string>
+ </property>
+ <property name="text">
+ <string>Streams</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">Text-align:left;</string>
+ </property>
+ <property name="text">
+ <string> MaterialStream</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/MaterialStream.png</normaloff>icons/MaterialStream.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <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>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:rgb(73,36,73,255)</string>
+ </property>
+ <property name="text">
+ <string>Mixer/Splitter</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_7">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Mixer.png</normaloff>icons/Mixer.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_10">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Splitter.png</normaloff>icons/Splitter.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <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>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:rgb(73,36,73,255)</string>
+ </property>
+ <property name="text">
+ <string>Exchangers</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_11">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Heater.png</normaloff>icons/Heater.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <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>
+ <widget class="QPushButton" name="pushButton_12">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Cooler.png</normaloff>icons/Cooler.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:rgb(73,36,73,255)</string>
+ </property>
+ <property name="text">
+ <string>Separator</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_9">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Flash.png</normaloff>icons/Flash.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_13">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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> Compound Seperator</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/CompoundSeparator.png</normaloff>icons/CompoundSeparator.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:rgb(73,36,73,255)</string>
+ </property>
+ <property name="text">
+ <string>Pressure Changers</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_25">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Valve.png</normaloff>icons/Valve.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_14">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/Pump.png</normaloff>icons/Pump.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_15">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/AdiabaticCompressor.png</normaloff>icons/AdiabaticCompressor.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_16">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">Text-align:left</string>
+ </property>
+ <property name="text">
+ <string> Adiabatic Expander</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>icons/AdiabaticExpander.png</normaloff>icons/AdiabaticExpander.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:rgb(73,36,73,255)</string>
+ </property>
+ <property name="text">
+ <string>Columns</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_26">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/Column.png</normaloff>Icons/Column.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>50</width>
+ <height>50</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_18">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <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>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/Column.png</normaloff>Icons/Column.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>50</width>
+ <height>50</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <widget class="QToolBar" name="toolBar">
+ <property name="windowTitle">
+ <string>toolBar</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ <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="separator"/>
+ <addaction name="actionSelect_compounds"/>
+ </widget>
+ <action name="actionZoomIn">
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/zoom_in.png</normaloff>Icons/zoom_in.png</iconset>
+ </property>
+ <property name="text">
+ <string>ZoomIn</string>
+ </property>
+ </action>
+ <action name="actionZoomOut">
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/zoom_out.png</normaloff>Icons/zoom_out.png</iconset>
+ </property>
+ <property name="text">
+ <string>ZoomOut</string>
+ </property>
+ </action>
+ <action name="actionResetZoom">
+ <property name="icon">
+ <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">
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/eq.png</normaloff>Icons/eq.png</iconset>
+ </property>
+ <property name="text">
+ <string>Equation oriented</string>
+ </property>
+ </action>
+ <action name="actionSequential_mode">
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/sq.png</normaloff>Icons/sq.png</iconset>
+ </property>
+ <property name="text">
+ <string>Sequential mode</string>
+ </property>
+ </action>
+ <action name="actionSelect_compounds">
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/compound.png</normaloff>Icons/compound.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select Compounds</string>
+ </property>
+ </action>
+ <action name="actionNew">
+ <property name="icon">
+ <iconset>
+ <normaloff>Icons/new.png</normaloff>Icons/new.png</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ </action>
+ <action name="actionHelp">
+ <property name="text">
+ <string>Help</string>
+ </property>
+ </action>
+ <action name="actionSave">
+ <property name="text">
+ <string>save</string>
+ </property>
+ </action>
+ <action name="actionSave_2">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </action>
+ <action name="actionOpen">
+ <property name="text">
+ <string>Open</string>
+ </property>
+ </action>
+ <action name="actionBinary_Phase_Envelope">
+ <property name="text">
+ <string>Binary Phase Envelope</string>
+ </property>
+ </action>
+ <action name="actionTerminate">
+ <property name="text">
+ <string>Terminate</string>
+ </property>
+ </action>
+ <action name="actionUndo">
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ </action>
+ <action name="actionRedo">
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/mainApp.py b/mainApp.py
index 7529845..240becb 100644
--- a/mainApp.py
+++ b/mainApp.py
@@ -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
@@ -27,7 +27,7 @@ import os
import ctypes
import sys
-ui,_ = loadUiType('main.ui')
+ui,_ = loadUiType('main3.ui')
'''
MainApp class is responsible for all the main App Ui operations
@@ -50,11 +50,11 @@ class MainApp(QMainWindow,ui):
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.comp = ComponentSelector(self)
# Setting up interactive canvas
- self.scene = self.Container.graphics.getScene()
+ self.scene = self.container.graphics.getScene() ###
self.graphicsView.setScene(self.scene)
self.graphicsView.setMouseTracking(True)
self.graphicsView.keyPressEvent=self.deleteCall
@@ -64,8 +64,6 @@ class MainApp(QMainWindow,ui):
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()
@@ -78,18 +76,18 @@ class MainApp(QMainWindow,ui):
def menuBar(self):
self.actionSelect_compounds.triggered.connect(self.selectCompounds)
self.actionSelect_compounds.setShortcut('Ctrl+C')
- self.actionZoomIn.triggered.connect(self.zoomin)
+ self.actionZoomIn.triggered.connect(self.zoomIn)
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.zoomOut)
self.actionZoomOut.setShortcut('Ctrl+-')
self.actionResetZoom.triggered.connect(self.zoomReset)
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.actionSequential_mode.setShortcut('Ctrl+M')
self.actionEquation_oriented.triggered.connect(partial(self.simulate,'EQN'))
self.actionEquation_oriented.setShortcut('Ctrl+E')
self.actionUndo.triggered.connect(self.undo)
@@ -113,14 +111,14 @@ class MainApp(QMainWindow,ui):
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'))
@@ -166,16 +164,16 @@ 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>")
@@ -198,14 +196,14 @@ class MainApp(QMainWindow,ui):
'''
ZoomOut the canvas
'''
- def zoomout(self):
+ def zoomOut(self):
self.graphicsView.scale(1.0/1.15,1.0/1.15)
self.zoomcount -=1
'''
ZoomIn the canvas
'''
- def zoomin(self):
+ def zoomIn(self):
self.graphicsView.scale(1.15,1.15)
self.zoomcount +=1
@@ -217,10 +215,10 @@ class MainApp(QMainWindow,ui):
if(self.comp.isCompSelected()):
self.type = unitOpType
if(self.type=="MaterialStream"):
- self.obj = MaterialStream(CompNames=compound_selected)
+ self.obj = MaterialStream(CompNames=compound_selected)
else:
self.obj = eval(self.type)()
- self.Container.addUnitOp(self.obj)
+ self.container.addUnitOp(self.obj, self.graphicsView)
else:
QMessageBox.about(self, 'Important', "Please Select Compounds first")
@@ -233,21 +231,7 @@ class MainApp(QMainWindow,ui):
self.undo_redo_helper()
self.comp.tableWidget.setRowCount(0)
self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>New</b> flowsheet is created ... </span>")
-
- '''
- It helps by clearing screen and loading the objects by undo redo methods
- '''
- def undo_redo_helper(self):
- for i in self.Container.unitOp:
- type(i).counter = 1
- del self.Container
- lst.clear()
- self.Container = Container(self.textBrowser)
- compound_selected.clear()
- self.scene = self.Container.graphics.getScene()
- self.graphicsView.setScene(self.scene)
- self.graphicsView.setMouseTracking(True)
- self.graphicsView.keyPressEvent=self.deleteCall
+ dockWidgetLst.clear()
'''
Handels all the operations which will happen when delete button is pressed.
@@ -258,11 +242,31 @@ class MainApp(QMainWindow,ui):
l=self.scene.selectedItems()
for i in l:
eval(i.type).counter -= 1
- self.Container.delete(l)
+ 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:
+ type(i).counter = 1
+ del self.container
+ for i in dockWidgetLst:
+ i.hide()
+ del i
+ lst.clear()
+ self.container = Container.Container(self.textBrowser)
+ compound_selected.clear()
+ self.scene = self.container.graphics.getScene()
+ self.graphicsView.setScene(self.scene)
+ self.graphicsView.setMouseTracking(True)
+ self.graphicsView.keyPressEvent=self.deleteCall
+
+
+
+ '''
Function for undo
'''
def undo(self):
@@ -273,7 +277,7 @@ class MainApp(QMainWindow,ui):
messages = self.textBrowser.toPlainText()
try:
self.undo_redo_helper()
- self.Container.graphics.loadCanvas(undo_data)
+ self.container.graphics.loadCanvas(undo_data)
self.textBrowser.setText(messages)
except Exception as e:
print(e)
@@ -292,7 +296,7 @@ class MainApp(QMainWindow,ui):
PUSH('Undo', redo_data)
messages = self.textBrowser.toPlainText()
self.undo_redo_helper()
- self.Container.graphics.loadCanvas(redo_data)
+ self.container.graphics.loadCanvas(redo_data)
self.textBrowser.setText(messages)
else:
messages = self.textBrowser.toPlainText()
@@ -304,7 +308,7 @@ class MainApp(QMainWindow,ui):
'''
def save(self):
data = []
- for i in self.Container.unitOp:
+ for i in self.container.unitOp:
data.append(i)
print(i.pos)
data.append(compound_selected)
@@ -338,7 +342,7 @@ class MainApp(QMainWindow,ui):
with open(fileName, 'rb') as f:
obj = pickle.load(f)
- self.Container.graphics.loadCanvas(obj)
+ self.container.graphics.loadCanvas(obj)
except Exception as e:
pass
diff --git a/umlet.uxf b/umlet.uxf
new file mode 100644
index 0000000..ed90e4f
--- /dev/null
+++ b/umlet.uxf
@@ -0,0 +1,1448 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<diagram program="umlet" version="14.3.0">
+ <zoom_level>11</zoom_level>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>341</x>
+ <y>759</y>
+ <w>286</w>
+ <h>462</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>363</x>
+ <y>484</y>
+ <w>242</w>
+ <h>187</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>473</x>
+ <y>660</y>
+ <w>33</w>
+ <h>121</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>385</x>
+ <y>330</y>
+ <w>187</w>
+ <h>66</h>
+ </coordinates>
+ <panel_attributes>UC1 (textBrowserClass)
+--
+setText()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>462</x>
+ <y>385</y>
+ <w>33</w>
+ <h>121</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>715</x>
+ <y>352</y>
+ <w>352</w>
+ <h>363</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>737</x>
+ <y>748</y>
+ <w>253</w>
+ <h>462</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>1078</x>
+ <y>836</y>
+ <w>374</w>
+ <h>187</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>1144</x>
+ <y>528</y>
+ <w>231</w>
+ <h>165</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>1144</x>
+ <y>220</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>QStringListModel
+--
+setStringList()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1430</x>
+ <y>517</y>
+ <w>231</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>UC3 (selectButtonClass)
+--
+clicked.connect()
+setAutoDefault()
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1144</x>
+ <y>297</y>
+ <w>231</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>QCompleter
+--
+setCaseSensitivity()
+setModel()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1144</x>
+ <y>407</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>UC2 (lineEditClass)
+--
+setCompleter()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1430</x>
+ <y>616</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>UC4 (pushButtonClass)
+--
+clicked.connect()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1045</x>
+ <y>1089</y>
+ <w>440</w>
+ <h>583</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>1012</x>
+ <y>1705</y>
+ <w>187</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>QtWidgets.QGraphicsItem
+--
+setTooltip(default_tooltip)
+setFlag
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1331</x>
+ <y>1782</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>QtWidgets.QInputDialog
+--
+getText()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1254</x>
+ <y>1870</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>QtGui.QFont
+--
+setPointSize()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1012</x>
+ <y>1826</y>
+ <w>231</w>
+ <h>121</h>
+ </coordinates>
+ <panel_attributes>QtWidgets.QGraphicTextItem
+--
+setFont()
+setDefaultTextColor()
+setParentItem()
+setPos()
+setPlainText()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>759</x>
+ <y>1265</y>
+ <w>176</w>
+ <h>66</h>
+ </coordinates>
+ <panel_attributes>QtGui.QBrush
+--
+setStyle()
+setColor()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>462</x>
+ <y>1265</y>
+ <w>231</w>
+ <h>88</h>
+ </coordinates>
+ <panel_attributes>QtGui.QPen
+--
+setStyle()
+setColor()
+setWidth()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>737</x>
+ <y>1419</y>
+ <w>231</w>
+ <h>363</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>385</x>
+ <y>1419</y>
+ <w>231</w>
+ <h>418</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>220</x>
+ <y>1265</y>
+ <w>231</w>
+ <h>88</h>
+ </coordinates>
+ <panel_attributes>QtWigets.QGraphicsPathItem
+--
+setZValue()
+setBrush()
+setPen()
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2101</x>
+ <y>396</y>
+ <w>264</w>
+ <h>330</h>
+ </coordinates>
+ <panel_attributes>DockWidgetMaterialStream
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ inputdict: dictionary = {}
++ dict: dictionary = {}
++ x_pclist: list = []
++ nameType: string = None
++ container: Container = container
++ header: QTreeWidgetItem()
+--
++ modes()
++ modeSelection()
++ inputparamslist()
++ param()
++ resultsCategory(name)
++ _showResult(lst)_
++ Show_Error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1430</x>
+ <y>704</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>UC5 (comboBoxClass)
+--
+currentIndexChanged.connect()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1716</x>
+ <y>616</y>
+ <w>264</w>
+ <h>308</h>
+ </coordinates>
+ <panel_attributes>DockWidget
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ inputdict: dictionary = {}
++ dict: dictionary = {}
++ x_pclist: list = []
++ nameType: string = None
++ container: Container = container
+--
++ modes()
++ modeSelection()
++ inputparamslist()
++ param()
++ resultsCategory(name)
+_+ showResult(lst)_
++ Show_Error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1760</x>
+ <y>385</y>
+ <w>231</w>
+ <h>176</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>2101</x>
+ <y>1232</y>
+ <w>264</w>
+ <h>275</h>
+ </coordinates>
+ <panel_attributes>DockWidgetShortcutColumn
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ inputdict: list = []
++ dict: list = []
++ nameType: string = None
++ container: Container = container
+--
++ inputparamslist()
++ fun()
++ param()
++ Show_Error()
+_+ showResult(lst)_
++ resultCategory(name)</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2101</x>
+ <y>1012</y>
+ <w>264</w>
+ <h>198</h>
+ </coordinates>
+ <panel_attributes>DockWidgetMixer
+DockWidgetCompoundSeparator
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ inputdict: list = []
++ dict: list = []
+--
++ inputparamslist()
++ param()
++ Show_Error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2101</x>
+ <y>770</y>
+ <w>264</w>
+ <h>220</h>
+ </coordinates>
+ <panel_attributes>DockWidgetSplitter
+DockWidgetFlash
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ inputdict: list = []
++ dict: list = []
+--
++ inputparamslist()
++ fun()
++ param()
++ Show_Error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1606</x>
+ <y>957</y>
+ <w>451</w>
+ <h>473</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>1650</x>
+ <y>1694</y>
+ <w>297</w>
+ <h>517</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>2068</x>
+ <y>1694</y>
+ <w>297</w>
+ <h>572</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>935</y>
+ <w>275</w>
+ <h>264</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>770</x>
+ <y>154</y>
+ <w>231</w>
+ <h>154</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>616</x>
+ <y>704</y>
+ <w>132</w>
+ <h>132</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>100.0;10.0;100.0;100.0;10.0;100.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>616</x>
+ <y>902</y>
+ <w>143</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>110.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>869</x>
+ <y>297</y>
+ <w>33</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1056</x>
+ <y>594</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;&lt;-</panel_attributes>
+ <additional_attributes>80.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1243</x>
+ <y>451</y>
+ <w>33</w>
+ <h>99</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;70.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1243</x>
+ <y>363</y>
+ <w>33</w>
+ <h>66</h>
+ </coordinates>
+ <panel_attributes/>
+ <additional_attributes>10.0;10.0;10.0;40.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1243</x>
+ <y>264</y>
+ <w>33</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes/>
+ <additional_attributes>10.0;10.0;10.0;30.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1364</x>
+ <y>550</y>
+ <w>88</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1364</x>
+ <y>627</y>
+ <w>88</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>979</x>
+ <y>935</y>
+ <w>121</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>90.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1243</x>
+ <y>1012</y>
+ <w>33</w>
+ <h>99</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;70.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>957</x>
+ <y>1529</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>605</x>
+ <y>1529</y>
+ <w>154</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;120.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>341</x>
+ <y>1342</y>
+ <w>165</w>
+ <h>99</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;130.0;70.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>495</x>
+ <y>1342</y>
+ <w>99</w>
+ <h>99</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>70.0;10.0;10.0;70.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>847</x>
+ <y>1320</y>
+ <w>33</w>
+ <h>121</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>924</x>
+ <y>1298</y>
+ <w>143</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1100</x>
+ <y>1661</y>
+ <w>33</w>
+ <h>66</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;40.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1441</x>
+ <y>1661</y>
+ <w>33</w>
+ <h>143</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;110.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1287</x>
+ <y>1661</y>
+ <w>33</w>
+ <h>231</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;190.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1210</x>
+ <y>1661</y>
+ <w>33</w>
+ <h>187</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;150.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>979</x>
+ <y>1034</y>
+ <w>649</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>570.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1529</x>
+ <y>1034</y>
+ <w>704</w>
+ <h>682</h>
+ </coordinates>
+ <panel_attributes>lt=&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>1782</x>
+ <y>1595</y>
+ <w>33</w>
+ <h>121</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;90.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1474</x>
+ <y>539</y>
+ <w>1023</w>
+ <h>1023</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>810.0;10.0;910.0;10.0;910.0;910.0;10.0;910.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>858</y>
+ <w>143</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>1100</y>
+ <w>143</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>1353</y>
+ <w>143</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1969</x>
+ <y>737</y>
+ <w>528</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;460.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1826</x>
+ <y>550</y>
+ <w>33</w>
+ <h>88</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;60.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1980</x>
+ <y>429</y>
+ <w>143</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1980</x>
+ <y>462</y>
+ <w>154</w>
+ <h>330</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;120.0;280.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1980</x>
+ <y>506</y>
+ <w>143</w>
+ <h>528</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;460.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1980</x>
+ <y>550</y>
+ <w>143</w>
+ <h>715</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;630.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>264</x>
+ <y>1012</y>
+ <w>99</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;70.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1650</x>
+ <y>638</y>
+ <w>88</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;60.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1650</x>
+ <y>726</y>
+ <w>88</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;60.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>UMLNote</id>
+ <coordinates>
+ <x>1804</x>
+ <y>165</y>
+ <w>176</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>UC is the abbreviation
+for unknown class.
+bg=white
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1793</x>
+ <y>242</y>
+ <w>231</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>Graphics.py
+--
+findMainWindow()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLNote</id>
+ <coordinates>
+ <x>1100</x>
+ <y>0</y>
+ <w>341</w>
+ <h>187</h>
+ </coordinates>
+ <panel_attributes>OMCS Class Diagram
+--
+Initial version :
+ Author - Saurabh Agarwala
+ Date - 7th December 2019
+ Contact - saur.agarwala@gmail.com
+--
+Current final version :
+ Author - Thiha Min Maung
+ Date - 19th February 2020
+ Contact - lucaszhao999@gmail.com
+bg=white
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2442</x>
+ <y>2145</y>
+ <w>231</w>
+ <h>187</h>
+ </coordinates>
+ <panel_attributes>Heater
+Cooler
+AdiabaticCompressor
+AdiabaticExpander
+Valve
+Pump
+Flash
+--
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2442</x>
+ <y>1925</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>Mixer
+--
++ Pout_modes: list = [...]
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2442</x>
+ <y>1991</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>Splitter
+--
++ CalcType_modes: list = [...]
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2442</x>
+ <y>2068</y>
+ <w>231</w>
+ <h>55</h>
+ </coordinates>
+ <panel_attributes>CompoundSeparator
+--
++ SepFact_modes: list = [...]
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>2442</x>
+ <y>1716</y>
+ <w>275</w>
+ <h>110</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>2442</x>
+ <y>1837</y>
+ <w>275</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>ShortcutColumn
+--
++ EngStm1:string = 'EngStm1'+name
++ EngStm2: string = 'EngStm2'+name
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>1760</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>1859</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>1947</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>2024</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>2090</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>2354</x>
+ <y>2211</y>
+ <w>110</w>
+ <h>33</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+</diagram>