summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--Bin_Phase_env.py73
m---------Chemical-Simulator-GUI6
-rw-r--r--ComponentSelector.py (renamed from component_selector.py)89
-rw-r--r--ComponentSelector.ui (renamed from comp_selector.ui)15
-rw-r--r--Container.py (renamed from container.py)167
-rw-r--r--DockWidgets/DockWidget.py (renamed from dockWidget.py)152
-rw-r--r--DockWidgets/DockWidget.txt636
-rw-r--r--DockWidgets/DockWidget.ui (renamed from dockWidget.ui)5
-rw-r--r--DockWidgets/DockWidgetCompoundSeparator.py99
-rw-r--r--DockWidgets/DockWidgetCompoundSeparator.ui45
-rw-r--r--DockWidgets/DockWidgetDistillationColumn.py120
-rw-r--r--DockWidgets/DockWidgetDistillationColumn.ui270
-rw-r--r--DockWidgets/DockWidgetFlash.py74
-rw-r--r--DockWidgets/DockWidgetFlash.ui161
-rw-r--r--DockWidgets/DockWidgetMaterialStream.py (renamed from DockWidgetMatStm.py)108
-rw-r--r--DockWidgets/DockWidgetMaterialStream.ui (renamed from DockWidgetMatStm.ui)0
-rw-r--r--DockWidgets/DockWidgetMixer.py61
-rw-r--r--DockWidgets/DockWidgetMixer.ui137
-rw-r--r--DockWidgets/DockWidgetShortcutColumn.py97
-rw-r--r--DockWidgets/DockWidgetShortcutColumn.ui295
-rw-r--r--DockWidgets/DockWidgetSplitter.py78
-rw-r--r--DockWidgets/DockWidgetSplitter.ui200
-rw-r--r--DockWidgets/__pycache__/DockWidget.cpython-36.pycbin0 -> 6111 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidget.cpython-37.pycbin0 -> 6125 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pycbin0 -> 3163 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pycbin0 -> 3187 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pycbin0 -> 4180 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pycbin0 -> 4204 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pycbin0 -> 2889 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pycbin0 -> 2913 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pycbin0 -> 8766 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pycbin0 -> 8757 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pycbin0 -> 2206 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pycbin0 -> 2233 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pycbin0 -> 3358 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pycbin0 -> 3382 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pycbin0 -> 2740 bytes
-rw-r--r--DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pycbin0 -> 2764 bytes
-rw-r--r--Graphics.py437
-rw-r--r--OMChem/ConvReactor.py4
-rw-r--r--OMChem/Flowsheet.py108
-rw-r--r--Simulator/Databases/Databases.py29
-rw-r--r--Simulator/Simulator/UnitOperations/Mixer.mo32
-rw-r--r--Streams.py498
-rw-r--r--Undo.datbin39600 -> 64582 bytes
-rw-r--r--UnitOperations.py401
-rw-r--r--class_diagram.pdfbin0 -> 12397 bytes
-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.ui1072
-rw-r--r--mainApp.py207
-rw-r--r--resDockWidget.py92
-rw-r--r--svg/Centrifugal Pump.svg104
-rw-r--r--svg/Cooler.svg84
-rw-r--r--svg/Heater.svg101
-rw-r--r--svg/Pump.svg86
-rw-r--r--umlet.uxf1497
105 files changed, 7841 insertions, 1403 deletions
diff --git a/.gitignore b/.gitignore
index 3ee5ad7..7796682 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,6 @@ Simulator/PlotGraph.mos
Simulator/simulateEQN.mos
.vscode/settings.json
__pycache__/*
-.idea/* \ No newline at end of file
+.idea/*
+DockWidgets/__pycache__/*
+undo.dat \ No newline at end of file
diff --git a/Bin_Phase_env.py b/Bin_Phase_env.py
index a02c0e2..a63ba1c 100644
--- a/Bin_Phase_env.py
+++ b/Bin_Phase_env.py
@@ -17,17 +17,15 @@ import PyQt5.QtWidgets as QtWidgets
import pyqtgraph as pg
import pyqtgraph.exporters
-
-
ui_dialog,_ = loadUiType('Binary_Phase_Env.ui')
-class Bin_Phase_env(QWidget,ui_dialog):
+class BinPhaseEnv(QWidget,ui_dialog):
def __init__(self,comp):
QWidget.__init__(self)
self.setupUi(self)
self.comp = comp
- self.compunds = self.comp.getComp()
+ self.compunds = self.comp.get_compounds()
for i in self.compunds:
self.comboBox.addItem(str(i))
@@ -46,18 +44,12 @@ class Bin_Phase_env(QWidget,ui_dialog):
self.radioButton_2.setChecked(False)
self.button_handler()
-
self.counter = 1
-
-
-
-
def button_handler(self):
self.radioButton.clicked.connect(lambda:self.T_xy())
self.radioButton_2.clicked.connect(lambda:self.P_xy())
self.pushButton_2.clicked.connect(lambda:self.plot())
-
def T_xy(self):
self.radioButton.setChecked(True)
@@ -90,6 +82,7 @@ class Bin_Phase_env(QWidget,ui_dialog):
self.formLayout.addRow(QLabel("T(K)"),self.first)
self.formLayout.addRow(QLabel("Number of data points"),self.points)
#print("")
+
def get_omc_path(self):
try:
self.omhome = os.environ.get('OPENMODELICAHOME')
@@ -104,8 +97,6 @@ class Bin_Phase_env(QWidget,ui_dialog):
print("The OpenModelica compiler is missing in the System path please install it" )
raise
-
-
def plot(self):
#print(self.type)
@@ -153,10 +144,8 @@ class Bin_Phase_env(QWidget,ui_dialog):
mosFile.write("loadFile(\"Graph.mo\");\n")
mosFile.write("simulate(Graph, outputFormat=\"csv\", stopTime=1.0, numberOfIntervals=1);\n")
-
print(self.data)
-
self.resdata = []
self.omc_path = self.get_omc_path()
simpath = self.plot_mos_path
@@ -185,34 +174,24 @@ class Bin_Phase_env(QWidget,ui_dialog):
print("SIMULATION DONE")
-
-
-
-
if self.type=='T':
for k in range(len(self.rows[0])):
if self.rows[0][k][0]=='P':
self.datay.append(float(self.rows[1][k]))
#print(col)
length = len(self.rows[0][k])
-
if self.rows[0][k][0]=='x' and self.rows[0][k][length-2]=='1':
self.datax1.append(float(self.rows[1][k]))
# k+=1
-
if self.rows[0][k][0]=='y' and self.rows[0][k][length-2]=='1':
self.datax2.append(float(self.rows[1][k]))
#k+=1
-
#k+=1
-
- else:
-
+ else:
for k in range(len(self.rows[0])):
if self.rows[0][k][0]=='T':
self.datay.append(float(self.rows[1][k]))
#print(col)
-
#print(self.rows[0][k])
length = len(self.rows[0][k])
if self.rows[0][k][0]=='x' and self.rows[0][k][length-2]=='1':
@@ -229,28 +208,20 @@ class Bin_Phase_env(QWidget,ui_dialog):
plt.addLegend()
plt.setXRange(0,1)
-
# print("SIZE UP AHEAD")
# print(len(self.datay))
# print(len(self.datax1))
# print(len(self.datax2))
# print("SIZES DONE")
-
c1 = plt.plot(self.datax1, self.datay,pen=pg.mkPen('b',width = 1), name='dew points')
c2 = plt.plot(self.datax2, self.datay,pen=pg.mkPen('r',width = 1), name='bubble points')
-
-
view_box = plt.plotItem.vb
-
self.tool_tip = ""
-
- def pressEvent(evt):
+ def press_event(evt):
#print("HELLO")
a = 10
pos = evt
-
-
mousepoint = view_box.mapSceneToView(pos)
roi = pg.ROI(pos)
find_color = plt.mapToGlobal(pos.toPoint())
@@ -270,9 +241,7 @@ class Bin_Phase_env(QWidget,ui_dialog):
self.lineEdit_y.setText("")
self.tool_tip = ""
QApplication.setOverrideCursor(QCursor(QtCore.Qt.ArrowCursor))
-
-
-
+
#self.prev = None
def entered(items):
for i in items:
@@ -283,20 +252,13 @@ class Bin_Phase_env(QWidget,ui_dialog):
QApplication.setOverrideCursor(QCursor(QtCore.Qt.ArrowCursor))
else:
i.setToolTip(self.tool_tip)
-
-
- # print(items)
-
- #proxy = pg.SignalProxy(plt.scene().sigMouseMoved, rateLimit = 60, slot = pressEvent)
- plt.scene().sigMouseMoved.connect(pressEvent)
+ # print(items)
+ #proxy = pg.SignalProxy(plt.scene().sigMouseMoved, rateLimit = 60, slot = press_event)
+ plt.scene().sigMouseMoved.connect(press_event)
plt.scene().sigMouseHover.connect(entered)
#c1.setAcceptHoverEvents(True)
#c2.setAcceptHoverEvents(True)
-
-
-
-
# def hoverEnterEvent(c1,event):
# print("Object ZONE")
@@ -306,7 +268,6 @@ class Bin_Phase_env(QWidget,ui_dialog):
#c1.hoverMoveEvent.connect(item)
#c2.hoverMoveEvent.connect(item)
-
plt.setLabel('left',self.other+self.otherunit,units = '')
plt.setLabel('bottom',self.comp1+'(mol. frac.)',units = '')
@@ -315,19 +276,3 @@ class Bin_Phase_env(QWidget,ui_dialog):
self.tabWidget.addTab(self.new_tab,"Plot "+str(self.counter))
self.counter+=1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Chemical-Simulator-GUI b/Chemical-Simulator-GUI
deleted file mode 160000
-Subproject 79c81eaa67a545db570c083c3852e09b26e5bf8
diff --git a/component_selector.py b/ComponentSelector.py
index 600b5f2..64ca167 100644
--- a/component_selector.py
+++ b/ComponentSelector.py
@@ -4,29 +4,27 @@ from PyQt5.QtGui import *
from PyQt5.uic import loadUiType
import pandas as pd
from Simulator.Databases.Databases import ChemsepDatabase
-ui_dialog,_ = loadUiType('comp_selector.ui')
+ui_dialog,_ = loadUiType('ComponentSelector.ui')
#df = pd.read_csv("compoundsDatabase.csv")
compound_selected = [] #list storing components that are selected inintialised as empty
-class componentSelector(QDialog,ui_dialog):
- def __init__(self,parent=None):
- #super(componentSelector,self).__init__(parent)
-
+class ComponentSelector(QDialog,ui_dialog):
+ def __init__(self,parent=None):
QDialog.__init__(self,parent)
self.setupUi(self)
- self.Dict1=dict()#empty dictionary which will store the obj and its compound
+ self.dict1=dict()#empty dictionary which will store the obj and its compound
#self.DB1=#instance of Database class in Database.py module
self.instance=[ChemsepDatabase()] #list of all the instances
self.lines=[]
for i in self.instance:
x=i.get_comp_name_list()
- self.Dict1[i]=x
+ self.dict1[i]=x
self.lines+=x
print(self.lines)
@@ -34,7 +32,7 @@ class componentSelector(QDialog,ui_dialog):
#self.DB1_list=self.DB1.get_comp_name_list()
#storingchemsep
#database compound list in DB1_list
- #self.Dict1[self.DB1]=self.DB1_list #storing the list as a value and the db as key in dictionary
+ #self.dict1[self.DB1]=self.DB1_list #storing the list as a value and the db as key in dictionary
#self.lines=self.DB1_list #combined list of all the edited compounds
self.model = QStringListModel()
@@ -43,15 +41,15 @@ class componentSelector(QDialog,ui_dialog):
self.completer = QCompleter()
self.completer.setCaseSensitivity(Qt.CaseInsensitive)
self.completer.setModel(self.model)
+
#QCompleter completes the text written in lineedit
self.lineEdit.setCompleter(self.completer)
- self.compoundSelectButton.clicked.connect(self.compoundSelection)
+ self.compoundSelectButton.clicked.connect(self.compound_selection)
self.compoundSelectButton.setAutoDefault(False)
self.pushButton.clicked.connect(self.accept)
self.pushButton_2.clicked.connect(self.cancel)
- self.pushButton_3.clicked.connect(self.removeItems)
-
+ self.pushButton_3.clicked.connect(self.remove_items)
def final_list(self,*list_name):
self.list_final=[]
@@ -60,7 +58,7 @@ class componentSelector(QDialog,ui_dialog):
self.list_final+=i
return (self.list_final)
- def isCompSelected(self):
+ def is_compound_selected(self):
if not compound_selected:
return False
else:
@@ -76,8 +74,8 @@ class componentSelector(QDialog,ui_dialog):
#of the corresponding database
def get_object(self,component):
- for ele in self.Dict1:
- values=self.Dict1[ele]
+ for ele in self.dict1:
+ values=self.dict1[ele]
for ind in values:
if ind ==component:
return(ele)
@@ -88,10 +86,7 @@ class componentSelector(QDialog,ui_dialog):
self.temp_comp= component.replace(removing_attrib,'')
return(self.temp_comp)
-
-
- def compoundSelection(self):
-
+ def compound_selection(self):
self.comp = self.lineEdit.text() #gets entered text
if self.comp in self.lines: #matches with the db
self.obj=self.get_object(self.comp) #obj will store the key of the dictionary
@@ -110,49 +105,52 @@ class componentSelector(QDialog,ui_dialog):
print(compound_selected)
self.CAS=self.obj.get_value(self.comp,'CAS')
- self.Name=self.comp
- self.MolecularFormula=self.obj.get_value(self.comp,'Smiles')
- self.MolecularWeight=self.obj.get_value(self.comp,'MolecularWeight')
+ self.name=self.comp
+ self.molecular_formula=self.obj.get_value(self.comp,'Smiles')
+ self.molecular_weight=self.obj.get_value(self.comp,'MolecularWeight')
- Dict={'CAS':self.CAS,'Name':self.Name,'Molecular Formula':self.MolecularFormula,'Molecular Weight':self.MolecularWeight}
+ dict={'CAS':self.CAS,'Name':self.name,'Molecular Formula':self.molecular_formula,'Molecular Weight':self.molecular_weight}
#converted everything to a dictionary which will be passes to addtable
#function as a parameter.
- print(Dict)
- self.addToTable(Dict)
+ print(dict)
+ self.add_to_table(dict)
else:
- self.Show_Error()
+ self.show_error()
@staticmethod
- def setCompounds(compounds):
+ def set_compounds(compounds):
#compound_selected = compounds
for i in compounds:
compound_selected.append(i)
- def addToTable(self,a):
+ def add_to_table(self,a):
try:
- rowPosition = self.tableWidget.rowCount()
- self.tableWidget.insertRow(rowPosition)
- self.tableWidget.setItem(rowPosition , 0, QTableWidgetItem(str(a['CAS'])))
- self.tableWidget.setItem(rowPosition , 1, QTableWidgetItem(str(a['Name'])))
- self.tableWidget.setItem(rowPosition , 2, QTableWidgetItem(str(a['Molecular Formula'])))
- self.tableWidget.setItem(rowPosition , 3, QTableWidgetItem(str(a['Molecular Weight'])))
+ row_position = self.tableWidget.rowCount()
+ self.tableWidget.insertRow(row_position)
+ self.tableWidget.setItem(row_position , 0, QTableWidgetItem(str(a['CAS'])))
+ self.tableWidget.setItem(row_position , 1, QTableWidgetItem(str(a['Name'])))
+ self.tableWidget.setItem(row_position , 2, QTableWidgetItem(str(a['Molecular Formula'])))
+ self.tableWidget.setItem(row_position , 3, QTableWidgetItem(str(a['Molecular Weight'])))
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno)
- def addCompToList(self,comp): # which list?
+ def add_compounds_to_list(self,comp): # which list?
self.item = QListWidgetItem()
self.item.setText(comp)
self.listWidget.addItem(self.item)
- def removeItems(self):
- item = self.tableWidget.item(self.tableWidget.currentRow(),1).text()
- self.tableWidget.removeRow(self.tableWidget.currentRow())
-
- compound_selected.remove(item)
+ def remove_items(self):
+ try:
+ item = self.tableWidget.item(self.tableWidget.currentRow(),1).text()
+ self.tableWidget.removeRow(self.tableWidget.currentRow())
+
+ compound_selected.remove(item)
+ except Exception as e:
+ print(e)
- def Show_Error(self):
+ def show_error(self):
QMessageBox.about(self, 'Important', "Selected Compound is not Available")
def cancel(self):
@@ -160,7 +158,7 @@ class componentSelector(QDialog,ui_dialog):
self.tableWidget.setRowCount(0)
self.reject()
- def getComp(self):
+ def get_compounds(self):
return compound_selected
def final_mo(self):
@@ -171,11 +169,4 @@ class componentSelector(QDialog,ui_dialog):
self.f_mo.write('\n')
self.f_mo.write('\nend database;')
self.f_mo.close()
-
-
-
-
-
-
-
-
+ \ No newline at end of file
diff --git a/comp_selector.ui b/ComponentSelector.ui
index 09d8c78..7a43206 100644
--- a/comp_selector.ui
+++ b/ComponentSelector.ui
@@ -27,8 +27,9 @@
<widget class="QLabel" name="label">
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>12</pointsize>
+ <pointsize>9</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="text">
@@ -43,11 +44,6 @@
</item>
<item>
<widget class="QPushButton" name="compoundSelectButton">
- <property name="font">
- <font>
- <family>Comic Sans MS</family>
- </font>
- </property>
<property name="text">
<string>Select</string>
</property>
@@ -58,11 +54,6 @@
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
- <property name="font">
- <font>
- <family>Comic Sans MS</family>
- </font>
- </property>
<property name="text">
<string>Remove</string>
</property>
diff --git a/container.py b/Container.py
index 6b4bcbe..26f6250 100644
--- a/container.py
+++ b/Container.py
@@ -1,5 +1,5 @@
from OMChem.Flowsheet import Flowsheet
-from component_selector import *
+from ComponentSelector import *
from collections import defaultdict
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
@@ -19,29 +19,30 @@ import sys
from Graphics import *
class Container():
- def __init__(self,msgbrowser):
- self.unitOp = []
- self.thermoPackage = None
+ def __init__(self,msgbrowser, graphicsView):
+ self.unit_operations = []
+ self.thermo_package = None
self.compounds = None
self.flowsheet = None
self.conn = defaultdict(list)
self.op=defaultdict(list)
self.ip=defaultdict(list)
self.msg = msgbrowser
+ self.graphicsView = graphicsView
self.msg.setText("")
self.opl=[]
self.result=[]
- self.graphics = Graphics(self.unitOp)
- self.scene = self.graphics.getScene()
+ self.graphics = Graphics(self.unit_operations, self.graphicsView)
+ self.scene = self.graphics.get_scene()
- def currentTime(self):
+ def current_time(self):
now = datetime.datetime.now()
time = str(now.hour) + ":" + str(now.minute) + ":" +str(now.second)
return time
# def updateConn(self,key,value):
# self.conn[key].append(value)
- # self.msg.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+key.name+" </b> output is connected to input of<b> "+value.name +" </b></span>")
+ # self.msg.append("<span style=\"color:blue\">["+str(self.current_time())+"]<b> "+key.name+" </b> output is connected to input of<b> "+value.name +" </b></span>")
#
# def connection(self):
# try:
@@ -61,81 +62,95 @@ class Container():
# i.connect(InputStms=self.ip[i],OutputStms=self.op[i])
#
# self.opl.append([self.op[i] for i in self.op])
- # self.opl=flatlist(flatlist(self.opl))
+ # self.opl=flat_list(flat_list(self.opl))
# except Exception as e:
# print(e)
# @staticmethod
# def addUnitOpObj(obj):
- # self.unitOp.append(obj)
+ # self.unit_operations.append(obj)
- def addUnitOp(self,obj):
+ def add_unit_operation(self, obj):
box = None
self.obj = obj
- self.scene = self.graphics.getScene()
- box = self.graphics.createNodeItem(self.obj, self)
+ self.scene = self.graphics.get_scene()
+ #self.graphicsView = graphicsView
+ box = self.graphics.create_node_item(self.obj, self)
self.scene.addItem(box)
box.setPos(2500-30, 2500-30)
- if(obj in self.unitOp):
+ if(obj in self.unit_operations):
pass
else:
- self.unitOp.append(obj)
- data = self.unitOp[:]
+ self.unit_operations.append(obj)
+ data = self.unit_operations[:]
data.append(compound_selected)
- PUSH('Undo', data)
- self.msg.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+obj.name+" </b>is instantiated .""</span>")
+ push('Undo', data)
+ self.msg.append("<span style=\"color:blue\">["+str(self.current_time())+"]<b> "+obj.name+" </b>is instantiated .""</span>")
'''
Deletes the selected item from the canvas and also the objects created for that type.
'''
def delete(self,l):
for item in l:
+ print('deleted objects ', item)
self.scene.removeItem(item)
- if hasattr(item,'Input'):
- for x in item.Input:
- if x.newLine:
- self.scene.removeItem(x.newLine)
- del x.newLine
- if x.otherLine:
- self.scene.removeItem(x.otherLine)
- del x.otherLine
- if hasattr(item,'Output'):
- for x in item.Output:
- if x.newLine:
- self.scene.removeItem(x.newLine)
- del x.newLine
- if x.otherLine:
- self.scene.removeItem(x.otherLine)
- del x.otherLine
+ for i in dock_widget_lst:
+ if i.name == item.name:
+ i.hide()
+ del i
+ break
+ for i in dock_widget_lst:
+ print(i.name)
+ print("delete ", dock_widget_lst)
+ if hasattr(item,'input'):
+ print("In input ")
+ print(item.input)
+ for x in item.input:
+ if x.new_line:
+ self.scene.removeItem(x.new_line)
+ del x.new_line
+ if x.other_line:
+ self.scene.removeItem(x.other_line)
+ del x.other_line
+ if hasattr(item,'output'):
+ print("in output ")
+ print(item.output)
+ for x in item.output:
+ if x.new_line:
+ self.scene.removeItem(x.new_line)
+ del x.new_line
+ if x.other_line:
+ self.scene.removeItem(x.other_line)
+ del x.other_line
if hasattr(item,'obj'):
- self.unitOp.remove(item.obj)
+ self.unit_operations.remove(item.obj)
for k in list(self.conn):
if item.obj==k:
del self.conn[k]
elif item.obj in self.conn[k]:
self.conn[k].remove(item.obj)
- self.msg.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+item.obj.name+" </b>is deleted .""</span>")
+ self.msg.append("<span style=\"color:blue\">["+str(self.current_time())+"]<b> "+item.obj.name+" </b>is deleted .""</span>")
del item.obj
del item
- CLEAN_FILE('Redo')
- data = self.unitOp[:]
+ clean_file('Redo')
+ data = self.unit_operations[:]
data.append(compound_selected)
- PUSH('Undo', data)
+ push('Undo', data)
- def fetchObject(self,name):
- for i in self.unitOp:
+ def fetch_object(self,name):
+ for i in self.unit_operations:
if(i.name==name):
return i
- def addCompounds(self,comp):
+ def add_aompounds(self,comp):
self.compounds = comp
- def add_thermoPackage(self,thermo):
- self.thermoPackage = thermo
+ def add_thermo_package(self,thermo):
+ self.thermo_package = thermo
- def msgBrowser(self):
+ def msg_browser(self):
std = self.flowsheet.stdout.decode("utf-8")
if(std):
stdout = str(std)
@@ -153,47 +168,51 @@ class Container():
print(mode)
self.compounds = compound_selected
self.flowsheet = Flowsheet()
- self.flowsheet.add_comp_list(self.compounds)
+ self.flowsheet.add_compound_list(self.compounds)
print("######## connection master#########\n",self.conn)
- for i in self.unitOp :
+ for i in self.unit_operations :
print("here",i)
- self.flowsheet.add_UnitOpn(i)
+ self.flowsheet.add_unit_operations(i)
if mode=='SM':
- self.msg.append("<span>["+str(self.currentTime())+"] Simulating in <b>Sequential</b> mode ... </span>")
- self.flowsheet.simulateSM(self.ip,self.op)
- self.msgBrowser()
- self.result=self.flowsheet.resdata
+ self.msg.append("<span>["+str(self.current_time())+"] Simulating in <b>Sequential</b> mode ... </span>")
+ self.flowsheet.simulate_SM(self.ip,self.op)
+ self.msg_browser()
+ self.result=self.flowsheet.result_data
print("under SEQ mode simulation")
elif mode=='EQN':
- self.msg.append("<span>["+str(self.currentTime())+"] Simulating in <b>equation</b> mode ... </span>")
- self.flowsheet.simulateEQN()
- self.msgBrowser()
- self.result=self.flowsheet.resdata
+ self.msg.append("<span>["+str(self.current_time())+"] Simulating in <b>equation</b> mode ... </span>")
+ self.flowsheet.simulate_EQN()
+ self.msg_browser()
+ self.result=self.flowsheet.result_data
print("under Eqn mode simulation")
- DockWidget.showResult(NodeItem.getDockWidget())
+ try:
+ DockWidget.show_result(NodeItem.get_dock_widget())
+ except AttributeError:
+ print(NodeItem.name + ' does not have dockwidget')
+ pass
-def flatlist(lst):
- flat_list=[]
+def flat_list(lst):
+ flat_lst=[]
for sublist in lst:
for item in sublist:
- flat_list.append(item)
- return flat_list
+ flat_lst.append(item)
+ return flat_lst
-def PUSH(fileName, data):
- with open(f"{fileName}.dat", "ab") as obj:
+def push(file_name, data):
+ with open(f"{file_name}.dat", "ab") as obj:
pickle.dump(data, obj)
-def CLEAN_FILE(fileName):
- with open(f"{fileName}.dat", "wb") as clean:
+def clean_file(file_name):
+ with open(f"{file_name}.dat", "wb") as clean:
pass
-def POP(fileName):
+def pop(file_name):
last_command = None
- if os.stat(f"{fileName}.dat").st_size != 0:
+ if os.stat(f"{file_name}.dat").st_size != 0:
commands = []
- with open(f"{fileName}.dat", "rb") as objs:
+ with open(f"{file_name}.dat", "rb") as objs:
while True:
try:
command = pickle.load(objs)
@@ -204,18 +223,18 @@ def POP(fileName):
last_command = commands[-1]
commands.remove(commands[-1])
if len(commands) != 0:
- with open(f"{fileName}.dat", "wb") as updated_data:
+ with open(f"{file_name}.dat", "wb") as updated_data:
for i in range(len(commands)):
pickle.dump(commands[i], updated_data)
else:
- CLEAN_FILE(fileName)
+ clean_file(file_name)
return last_command
-def get_last_list(fileName):
+def get_last_list(file_name):
commands = []
- if os.stat(f"{fileName}.dat").st_size != 0:
- with open(f"{fileName}.dat", "rb") as objs:
+ if os.stat(f"{file_name}.dat").st_size != 0:
+ with open(f"{file_name}.dat", "rb") as objs:
while True:
try:
command = pickle.load(objs)
@@ -225,4 +244,4 @@ def get_last_list(fileName):
if len(commands) is not 0:
return commands[-1]
else:
- return None \ No newline at end of file
+ return None
diff --git a/dockWidget.py b/DockWidgets/DockWidget.py
index 36fbc32..6fc7731 100644
--- a/dockWidget.py
+++ b/DockWidgets/DockWidget.py
@@ -4,78 +4,92 @@ from PyQt5.QtGui import *
from PyQt5.uic import loadUiType
import pandas as pd
from functools import partial
-from component_selector import *
+from ComponentSelector import *
from collections import defaultdict
from Graphics import *
-ui_dialog,_ = loadUiType('DockWidget.ui')
+ui_dialog,_ = loadUiType('DockWidgets/DockWidget.ui')
class DockWidget(QDockWidget,ui_dialog):
- def __init__(self,name,comptype,obj,container,parent=None):
+ def __init__(self,name,comptype,obj,container, parent=None):
QDockWidget.__init__(self,parent)
self.setupUi(self)
self.setWindowTitle(obj.name)
self.name=name
self.obj=obj
self.type = comptype
- self.inputdict = {}
+ self.input_dict = {}
self.x_pclist = []
self.modes()
- self.comboBox.currentIndexChanged.connect(self.modeSelection)
- print("constructor ", self.inputdict)
+ self.comboBox.currentIndexChanged.connect(self.mode_selection)
+
+ print("constructor ", self.input_dict)
self.pushButton_2.clicked.connect(self.param)
self.dict = {}
- self.nameType = None
+ self.name_type = None
self.container = container
-
+
# input data tab
def modes(self):
- modesList = self.obj.modesList
- if(modesList):
- for j in modesList:
- self.comboBox.addItem(str(j))
- self.modeSelection()
+ modes_list = self.obj.modes_list
+ if(modes_list):
+ for j in modes_list:
+ self.comboBox.addItem(str(self.obj.variables[j]['name']))
+ self.mode_selection()
else:
- self.inputdict= {}
- self.inputdict = self.obj.paramgetter()
- self.inputparamslist()
+ self.comboBox.setDisabled(True)
+ self.input_dict= {}
+ self.input_dict = self.obj.param_getter()
+ self.input_params_list()
- def modeSelection(self):
- self.inputdict= {}
+ def mode_selection(self):
+ self.input_dict= {}
for i in reversed(range(self.formLayout.count())):
self.formLayout.removeRow(i)
- self.inputdict = self.obj.paramgetter(self.comboBox.currentText())
- self.inputparamslist()
-
- def inputparamslist(self):
+ print(self.comboBox.currentText())
+ for i in self.obj.variables:
+ if self.obj.variables[i]['name'] == self.comboBox.currentText():
+ currentText = i
+ break
+ self.input_dict = self.obj.param_getter(currentText)
+ print('mode selection ', self.input_dict)
+ self.input_params_list()
+
+ def input_params_list(self):
try:
- print("inputparamslist ", self.inputdict)
- for c,i in enumerate(self.inputdict):
- if(i=="thermoPackage"):
+ print("input_params_list ", self.input_dict)
+ for c,i in enumerate(self.input_dict):
+ if i == None:
+ continue
+ if(i=="thermo_package"):
print("thermo1")
combo = QComboBox()
self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')]
print("thermo2")
for j in self.lines:
combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
lay = QGridLayout()
lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft)
- lay.addWidget(combo, 0, 1, alignment=Qt.AlignRight)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter)
self.formLayout.addRow(lay)
- self.inputdict[i] = combo
+ self.input_dict[i] = combo
print("thermo")
- elif(i=="condType"):
+ elif(i=="Ctype"):
combo = QComboBox()
self.lines = ["Total","Partial"]
for j in self.lines:
combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
lay = QGridLayout()
- lay.addWidget(QLabel("Condensor Type :"+":"), 0, 0, alignment=Qt.AlignLeft)
+ lay.addWidget(QLabel("Condensor Type :"), 0, 0, alignment=Qt.AlignLeft)
lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter)
self.formLayout.addRow(lay)
- self.inputdict[i] = combo
+ self.input_dict[i] = combo
elif(i=="x_pc"):
noc = len(compound_selected)
print(noc)
@@ -84,52 +98,59 @@ class DockWidget(QDockWidget,ui_dialog):
lay = QGridLayout()
for j in range(noc):
l = QLineEdit()
- self.inputdict[i] = "x_pc"
+ self.input_dict[i] = "x_pc"
lay.addWidget(QLabel(str(compound_selected[j])+":"),j,0, alignment=Qt.AlignLeft)
lay.addWidget(l,j,1, alignment=Qt.AlignCenter)
lay.addWidget(QLabel(self.obj.variables[i]['unit']),j,2, alignment=Qt.AlignCenter)
self.x_pclist.append(l)
gp.setLayout(lay)
- self.formLayout.addRow(gp)
+ self.formLayout.addRow(gp)
else:
print("elseloop")
+ print(i)
+ if i == None:
+ continue
l = QLineEdit()
- if self.inputdict[i] != None:
- l.setText(str(self.inputdict[i]))
+ if self.input_dict[i] != None:
+ l.setText(str(self.input_dict[i]))
+ print('before lay')
lay = QGridLayout()
- lay.addWidget(QLabel(i+":"),0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables[i]['name']+":"),0,0, alignment=Qt.AlignLeft) #self.obj.variables[i]['name']
lay.addWidget(l,0,1, alignment=Qt.AlignCenter)
+ print('after lay')
if(i != 'MolFlow'):
lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter)
else:
- lay.addWidget(QLabel("mol/s"),0,2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel('mol/s'),0,2, alignment=Qt.AlignCenter)
+ print('after all')
self.formLayout.addRow(lay)
- self.inputdict[i] = l
+ self.input_dict[i] = l
+
except Exception as e:
print(e)
-
- def Show_Error(self):
+ def show_error(self):
QMessageBox.about(self, 'Important', "Please fill all fields with data")
def param(self):
try:
self.dict={}
-
- print("param.inputdict ", self.inputdict)
- for i in self.inputdict:
- if(i=="thermoPackage"):
- if (self.inputdict[i].currentText()):
- self.dict[i] = self.inputdict[i].currentText()
+ print("param.input_dict ", self.input_dict)
+ for i in self.input_dict:
+ if (self.input_dict[i] == None):
+ continue
+ if(i=="thermo_package"):
+ if (self.input_dict[i].currentText()):
+ self.dict[i] = self.input_dict[i].currentText()
else:
- self.Show_Error()
+ self.show_error()
break
- elif(i=="condType"):
- if (self.inputdict[i].currentText()):
- self.dict[i] = self.inputdict[i].currentText()
+ elif(i=="Ctype"):
+ if (self.input_dict[i].currentText()):
+ self.dict[i] = self.input_dict[i].currentText()
else:
- self.Show_Error()
+ self.show_error()
break
elif(i =="x_pc"):
l=[]
@@ -140,44 +161,44 @@ class DockWidget(QDockWidget,ui_dialog):
l.append(mol_frac.text())
total_moles += float(l[-1])
else:
- self.Show_Error()
+ self.show_error()
break
for c in range(len(compound_selected)):
mf.append(str(float(l[c])/total_moles))
self.x_pclist[c].setText(mf[-1])
- # self.formLayout.addRow(QLabel(str(compound_selected[c])+" Mole Fraction: "+str(float(l[c])/total_moles)))
self.dict[i] = ",".join(mf)
- # self.update()
+ elif(i == 'Pout' and self.obj.type == 'Mixer' or i == '' or i == 'HKey' or i == 'LKey'):
+ self.dict[i] = self.input_dict[i].currentText()
else:
- if (self.inputdict[i].text()):
- self.dict[i] = self.inputdict[i].text()
+ print(self.input_dict[i], i, self.obj.type)
+ if (self.input_dict[i].text()):
+ self.dict[i] = self.input_dict[i].text()
else:
- print(self.inputdict[i].text())
- self.Show_Error()
+ print(self.input_dict[i].text())
+ self.show_error()
break
print("param ", self.dict)
- self.obj.paramsetter(self.dict)
+ self.obj.param_setter(self.dict)
self.hide()
except Exception as e:
print(e)
-
@staticmethod
- def showResult(lst):
+ def show_result(lst):
#DockWidget1.flag = True
for i in lst:
- i.resultsCategory(i.name)
+ i.results_category(i.name)
#i.show()
# result data tab
- def resultsCategory(self,name):
+ def results_category(self,name):
flag = True
try:
print("Under result category name ", name)
result=self.container.result
- obj = self.container.fetchObject(name)
+ obj = self.container.fetch_object(name)
self.tableWidget.setRowCount(0)
variKeys = list(obj.variables.keys())
print(variKeys)
@@ -196,7 +217,4 @@ class DockWidget(QDockWidget,ui_dialog):
self.tableWidget.resizeColumnsToContents()
except Exception as e:
- print(e)
-
-
- \ No newline at end of file
+ print(e) \ No newline at end of file
diff --git a/DockWidgets/DockWidget.txt b/DockWidgets/DockWidget.txt
new file mode 100644
index 0000000..b14eef8
--- /dev/null
+++ b/DockWidgets/DockWidget.txt
@@ -0,0 +1,636 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from component_selector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidget.ui')
+
+class DockWidget(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.inputdict = {}
+ self.x_pclist = []
+ self.modes()
+ self.comboBox.currentIndexChanged.connect(self.modeSelection)
+
+ print("constructor ", self.inputdict)
+ self.pushButton_2.clicked.connect(self.param)
+ self.dict = {}
+
+ self.nameType = None
+ self.container = container
+
+ header = QTreeWidgetItem(['Compound','Value','Unit'])
+ self.mTreeWidget.setHeaderItem(header)
+ self.lTreeWidget.setHeaderItem(header)
+ self.vTreeWidget.setHeaderItem(header)
+
+ self.mTreeWidget.itemClicked.connect(lambda : self.printer(self.mTreeWidget.currentItem()))
+ self.lTreeWidget.itemClicked.connect(lambda : self.printer(self.lTreeWidget.currentItem()))
+ self.vTreeWidget.itemClicked.connect(lambda : self.printer(self.vTreeWidget.currentItem()))
+
+ def printer(self, treeItem ):
+ foldername = treeItem.text(0)
+ comment = treeItem.text(1)
+ data = treeItem.text(2)
+ print(foldername , ': ' , comment , ' (' + data + ')')
+
+ # input data tab
+ def modes(self):
+ modesList = self.obj.modesList
+ if(modesList):
+ for j in modesList:
+ self.comboBox.addItem(str(self.obj.variables[j]['name']))
+ self.modeSelection()
+ else:
+ self.comboBox.setDisabled(True)
+ self.inputdict= {}
+ self.inputdict = self.obj.paramgetter()
+ self.inputparamslist()
+
+ def modeSelection(self):
+ self.inputdict= {}
+ for i in reversed(range(self.formLayout.count())):
+ self.formLayout.removeRow(i)
+ print(self.comboBox.currentText())
+ for i in self.obj.variables:
+ if self.obj.variables[i]['name'] == self.comboBox.currentText():
+ currentText = i
+ break
+ self.inputdict = self.obj.paramgetter(currentText)
+ print('mode selection ', self.inputdict)
+ self.inputparamslist()
+
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+ for c,i in enumerate(self.inputdict):
+ if i == None:
+ continue
+ if(i=="thermoPackage"):
+ print("thermo1")
+ combo = QComboBox()
+ self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')]
+ print("thermo2")
+ for j in self.lines:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ lay = QGridLayout()
+ lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter)
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = combo
+ print("thermo")
+ elif(i=="Ctype"):
+ combo = QComboBox()
+ self.lines = ["Total","Partial"]
+ for j in self.lines:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ lay = QGridLayout()
+ lay.addWidget(QLabel("Condensor Type :"), 0, 0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter)
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = combo
+ elif(i=="x_pc"):
+ noc = len(compound_selected)
+ print(noc)
+ self.x_pclist.clear()
+ gp = QGroupBox("Compounds")
+ lay = QGridLayout()
+ for j in range(noc):
+ l = QLineEdit()
+ self.inputdict[i] = "x_pc"
+ lay.addWidget(QLabel(str(compound_selected[j])+":"),j,0, alignment=Qt.AlignLeft)
+ lay.addWidget(l,j,1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables[i]['unit']),j,2, alignment=Qt.AlignCenter)
+ self.x_pclist.append(l)
+ gp.setLayout(lay)
+ self.formLayout.addRow(gp)
+ elif (self.obj.type == 'Mixer' and i == 'Pout'):
+ combo = QComboBox()
+ print("Mixer combo")
+ for j in self.obj.Pout_modes:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ lay = QGridLayout()
+ lay.addWidget(QLabel(self.obj.variables[i]['name']+":"), 0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter)
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = combo
+ elif (self.obj.type == 'Splitter' and i == 'CalcType'):
+ combo = QComboBox()
+ print("Splitter combo")
+ for j in self.obj.CalcType_modes:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ stream1 = QLineEdit()
+ stream2 = QLineEdit()
+ unit = QLabel('')
+ lay = QGridLayout()
+ lay.addWidget(QLabel(self.obj.variables[i]['name']+":"), 0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter)
+
+ lay.addWidget(QLabel("Stream 1 : "), 1,0, alignment = Qt.AlignLeft)
+ lay.addWidget(stream1, 1,1, alignment = Qt.AlignCenter)
+ lay.addWidget(unit, 1,2, alignment = Qt.AlignRight)
+
+ lay.addWidget(QLabel("Stream 2 : "), 2,0, alignment = Qt.AlignLeft)
+ lay.addWidget(stream2, 2,1, alignment = Qt.AlignCenter)
+ lay.addWidget(unit, 2,2, alignment = Qt.AlignRight)
+ self.formLayout.addRow(lay)
+ print("daf ", self.formLayout)
+ #combo.currentIndexChanged.connect(lambda:self.SplitterStreams(combo, lay, unit))
+ lst = [combo, stream1, stream2]
+ #lst = [combo.currentText(), stream1.text(), stream2.text()]
+ self.inputdict[i] = lst
+ # self.inputdict[i] = stream1
+ # self.inputdict[i] = stream2
+ print(self.inputdict[i])
+ elif i == 'HKey' or i == 'LKey':
+ combo = QComboBox()
+ print("ShortcutColumn combo")
+ for j in self.obj.compounds:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ lay = QGridLayout()
+ lay.addWidget(QLabel(self.obj.variables[i]['name']+":"), 0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter)
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = combo
+ elif self.obj.type == 'CompoundSeparator' and i == 'SepStrm':
+ print(i)
+ rlay = QHBoxLayout()
+ r1 = QRadioButton('Stream 1')
+ r1.setChecked(True)
+ r2 = QRadioButton('Stream 2')
+ r2.setChecked(False)
+ rlay.addWidget(r1)
+ rlay.addWidget(r2)
+ self.formLayout.addRow(rlay)
+
+ lst = [r1, r2]
+
+ lay = QGridLayout()
+ for k,val in enumerate(self.obj.compounds):
+ combo = QComboBox()
+ print("CompoundSeparator combo")
+ for j in self.obj.SepFact_modes:
+ combo.addItem(str(j))
+ l = QLineEdit()
+ lay.addWidget(QLabel(val+" :"), k,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, k, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(l,k,2, alignment=Qt.AlignCenter)
+ lst.append(combo)
+ lst.append(l)
+ self.inputdict[i] = lst
+ self.formLayout.addRow(lay)
+ elif self.obj.type == 'Flash' and i == 'Bdef':
+ print(i)
+ # rlay = QHBoxLayout()
+ r1 = QCheckBox()
+ r1.setChecked(False)
+ r2 = QCheckBox()
+ r2.setChecked(False)
+ # rlay.addWidget(r1)
+ # rlay.addWidget(r2)
+ # self.formLayout.addRow(rlay)
+
+ l1 = QLineEdit()
+ l1.setText(str(self.obj.variables['Tdef']['value']))
+ l2 = QLineEdit()
+ l2.setText(str(self.obj.variables['Pdef']['value']))
+ lay = QGridLayout()
+ lay.addWidget(r1, 0,0, alignment = Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables['Tdef']['name']+":"), 0,1, alignment=Qt.AlignLeft)
+ lay.addWidget(l1, 0, 2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables['Tdef']['unit']),0,3, alignment=Qt.AlignRight)
+ l1.setDisabled(True)
+
+ lay.addWidget(r2, 2,0, alignment = Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables['Pdef']['name']+":"), 2,1, alignment=Qt.AlignLeft)
+ lay.addWidget(l2, 2, 2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables['Pdef']['unit']),2,3, alignment=Qt.AlignRight)
+ self.formLayout.addRow(lay)
+ l2.setDisabled(True)
+ r1.toggled.connect(lambda:l1.setDisabled(not r1.isChecked()))
+ r2.toggled.connect(lambda:l2.setDisabled(not r2.isChecked()))
+
+ self.inputdict[i] = [r1, r2, l1, l2]
+ else:
+ print("elseloop")
+ print(i)
+ if i == None:
+ continue
+ l = QLineEdit()
+ if self.inputdict[i] != None:
+ l.setText(str(self.inputdict[i]))
+ print('before lay')
+ lay = QGridLayout()
+ lay.addWidget(QLabel(self.obj.variables[i]['name']+":"),0,0, alignment=Qt.AlignLeft) #self.obj.variables[i]['name']
+ lay.addWidget(l,0,1, alignment=Qt.AlignCenter)
+ print('after lay')
+ if(i != 'MolFlow'):
+ lay.addWidget(QLabel(self.obj.variables[i]['unit']),0,2, alignment=Qt.AlignCenter)
+ else:
+ lay.addWidget(QLabel('mol/s'),0,2, alignment=Qt.AlignCenter)
+ print('after all')
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = l
+
+
+ except Exception as e:
+ print(e)
+
+ def Show_Error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict={}
+ print("param.inputdict ", self.inputdict)
+ for i in self.inputdict:
+ if (self.inputdict[i] == None):
+ continue
+
+ if(i=="thermoPackage"):
+ if (self.inputdict[i].currentText()):
+ self.dict[i] = self.inputdict[i].currentText()
+ else:
+ self.Show_Error()
+ break
+ elif(i=="Ctype"):
+ if (self.inputdict[i].currentText()):
+ self.dict[i] = self.inputdict[i].currentText()
+ else:
+ self.Show_Error()
+ break
+ elif(i =="x_pc"):
+ l=[]
+ mf = []
+ total_moles = 0
+ for mol_frac in self.x_pclist:
+ if (mol_frac.text()):
+ l.append(mol_frac.text())
+ total_moles += float(l[-1])
+ else:
+ self.Show_Error()
+ break
+ for c in range(len(compound_selected)):
+ mf.append(str(float(l[c])/total_moles))
+ self.x_pclist[c].setText(mf[-1])
+ self.dict[i] = ",".join(mf)
+ elif(i == 'Pout' and self.obj.type == 'Mixer' or i == '' or i == 'HKey' or i == 'LKey'):
+ self.dict[i] = self.inputdict[i].currentText()
+ elif i == 'CalcType' and self.obj.type == 'Splitter':
+ self.dict[i] = [self.inputdict[i][0].currentText(), self.inputdict[i][1].text(), self.inputdict[i][2].text()]
+ elif self.obj.type == 'Flash' and i == 'Bdef':
+ self.dict[i] = [self.inputdict[i][0].isChecked(), self.inputdict[i][1].isChecked(), self.inputdict[i][2].text(), self.inputdict[i][3].text()]
+ elif self.obj.type == 'CompoundSeparator':
+ self.dict[i] = [self.inputdict[i][0].isChecked(),self.inputdict[i][1].isChecked()]
+ j = 2
+ for comp in self.obj.compounds:
+ self.dict[i].append(self.inputdict[i][j].currentText())
+ self.dict[i].append(self.inputdict[i][j+1].text())
+ j += 2
+ else:
+ print(self.inputdict[i], i, self.obj.type)
+ if (self.inputdict[i].text()):
+ self.dict[i] = self.inputdict[i].text()
+ else:
+ print(self.inputdict[i].text())
+ self.Show_Error()
+ break
+
+ print("param ", self.dict)
+ self.obj.paramsetter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
+
+
+ @staticmethod
+ def showResult(lst):
+ #DockWidget1.flag = True
+ for i in lst:
+ i.resultsCategory(i.name)
+ #i.show()
+
+ # result data tab
+ def resultsCategory(self,name):
+ flag = True
+ try:
+ print("Under result category name ", name)
+ result=self.container.result
+ obj = self.container.fetchObject(name)
+
+ d = {"Mole Fraction":"x_pc", "Mass Fraction":"xm_pc", "Mole Flow":"F_pc", "Mass Flow":"Fm_pc"}
+ lst = list(d.keys())
+ klst = list(d.values())
+
+ p = {"Pressure":"P", "Temperature":"T","Vapour Phase Mole Fraction":"xvap", "Phase Molar Enthalpy":"H_p",
+ "Phase Molar Entropy":"S_p", "Molar Flow Rate":"F_p"}
+
+ # Amounts Tab
+ if obj.type == 'MaterialStream':
+ l = [] # list for basis names
+ for basis in d:
+ propertyname = name + '.' + d[basis]
+ print("basis ", basis, propertyname)
+ for i in result[0]:
+ if (propertyname in i):
+ l.append(i)
+ print(l)
+
+ j = 0
+ t = 0
+ namee = klst[j]
+ print("namee ", namee)
+
+ for i,k in enumerate(l):
+ ind = result[0].index(k)
+ print("index ", ind)
+ print("str ", k)
+ resultval = str(result[-1][ind])
+ print("######Resultsfetch####",resultval)
+ print(k[k.find(".")+1:k.find("[")])
+ obj.variables[k.split('.')[1]]['value'] = resultval
+ if namee in k:
+ if i%3 == 0:
+ if(flag):
+ mroot = QTreeWidgetItem(self.mTreeWidget, [lst[j]])
+ child = QTreeWidgetItem(mroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']])
+ elif i%3 == 1:
+ if(flag):
+ lroot = QTreeWidgetItem(self.lTreeWidget, [lst[j]])
+ child = QTreeWidgetItem(lroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']])
+ elif i%3 == 2:
+ if (flag):
+ vroot = QTreeWidgetItem(self.vTreeWidget, [lst[j]])
+ child = QTreeWidgetItem(vroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']])
+ t += 1
+ flag = False
+ else:
+ j += 1
+ t = 0
+ namee = klst[j]
+ flag = True
+ if i%3 == 0:
+ if (flag):
+ mroot = QTreeWidgetItem(self.mTreeWidget, [lst[j]])
+ child = QTreeWidgetItem(mroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']])
+ elif i%3 == 1:
+ if (flag):
+ lroot = QTreeWidgetItem(self.lTreeWidget, [lst[j]])
+ child = QTreeWidgetItem(lroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']])
+ elif i%3 == 2:
+ if (flag):
+ vroot = QTreeWidgetItem(self.vTreeWidget, [lst[j]])
+ child = QTreeWidgetItem(vroot, [compound_selected[t], str(resultval),obj.variables[k.split('.')[1]]['unit']])
+ t += 1
+ flag = False
+ #print(obj.variables)
+
+ # Phase Properties Tab
+ phaseResLst = []
+ for phase in p:
+ propertyname = name + '.' + p[phase]
+ print("phase ", phase, propertyname)
+ for i in result[0]:
+ if i.find('['):
+ if (propertyname == i[0:i.find('[')]):
+ phaseResLst.append(i)
+ if propertyname == i:
+ phaseResLst.append(i)
+ print(phaseResLst)
+
+ self.mTableWidget.setRowCount(0)
+ self.lTableWidget.setRowCount(0)
+ self.vTableWidget.setRowCount(0)
+
+ for i,val in enumerate(phaseResLst):
+ ind = result[0].index(val)
+ resultval = str(result[-1][ind])
+ print(resultval, i, val)
+ obj.variables[val.split('.')[1]]['value'] = resultval
+ if '[' in val:
+ print(val)
+ temp = val[val.find('.')+1:val.find('[')]
+ print(temp)
+ if '1' in val.split('.')[1]:
+ print(obj.variables[val.split('.')[1]]['name'])
+ mrowPosition = self.mTableWidget.rowCount()
+ self.mTableWidget.insertRow(mrowPosition)
+ self.mTableWidget.setItem(mrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name']))
+ self.mTableWidget.setItem(mrowPosition , 1, QTableWidgetItem(resultval))
+ self.mTableWidget.setItem(mrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit']))
+ self.mTableWidget.resizeColumnsToContents()
+
+ if '2' in val.split('.')[1]:
+ lrowPosition = self.lTableWidget.rowCount()
+ self.lTableWidget.insertRow(lrowPosition)
+ self.lTableWidget.setItem(lrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name']))
+ self.lTableWidget.setItem(lrowPosition , 1, QTableWidgetItem(resultval))
+ self.lTableWidget.setItem(lrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit']))
+ self.lTableWidget.resizeColumnsToContents()
+ if '3' in val.split('.')[1]:
+ vrowPosition = self.vTableWidget.rowCount()
+ self.vTableWidget.insertRow(vrowPosition)
+ self.vTableWidget.setItem(vrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name']))
+ self.vTableWidget.setItem(vrowPosition , 1, QTableWidgetItem(resultval))
+ self.vTableWidget.setItem(vrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit']))
+ self.vTableWidget.resizeColumnsToContents()
+ if not '[' in val:
+ #print(p[val.split('.')[1]])
+ print(obj.variables[val.split('.')[1]]['name'])
+ mrowPosition = self.mTableWidget.rowCount()
+ self.mTableWidget.insertRow(mrowPosition)
+ self.mTableWidget.setItem(mrowPosition , 0, QTableWidgetItem(obj.variables[val.split('.')[1]]['name']))
+ self.mTableWidget.setItem(mrowPosition , 1, QTableWidgetItem(resultval))
+ self.mTableWidget.setItem(mrowPosition , 2, QTableWidgetItem(obj.variables[val.split('.')[1]]['unit']))
+ self.mTableWidget.resizeColumnsToContents()
+
+ print(obj.variables)
+
+ except Exception as e:
+ print(e)
+
+
+class DockWidgetFlash(DockWidget):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ DockWidget.__init__(self,name,comptype,obj,container,parent=None)
+
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+ for c,i in enumerate(self.inputdict):
+ if i == None:
+ continue
+ if(i=="thermoPackage"):
+ print("thermo1")
+ combo = QComboBox()
+ self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')]
+ print("thermo2")
+ for j in self.lines:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ lay = QGridLayout()
+ lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter)
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = combo
+ print("thermo")
+ elif self.obj.type == 'Flash' and i == 'Bdef':
+ print(i)
+ r1 = QCheckBox()
+ r1.setChecked(False)
+ r2 = QCheckBox()
+ r2.setChecked(False)
+
+ l1 = QLineEdit()
+ l1.setText(str(self.obj.variables['Tdef']['value']))
+ l2 = QLineEdit()
+ l2.setText(str(self.obj.variables['Pdef']['value']))
+ lay = QGridLayout()
+ lay.addWidget(r1, 0,0, alignment = Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables['Tdef']['name']+":"), 0,1, alignment=Qt.AlignLeft)
+ lay.addWidget(l1, 0, 2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables['Tdef']['unit']),0,3, alignment=Qt.AlignRight)
+ l1.setDisabled(True)
+
+ lay.addWidget(r2, 2,0, alignment = Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables['Pdef']['name']+":"), 2,1, alignment=Qt.AlignLeft)
+ lay.addWidget(l2, 2, 2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables['Pdef']['unit']),2,3, alignment=Qt.AlignRight)
+ self.formLayout.addRow(lay)
+ l2.setDisabled(True)
+ r1.toggled.connect(lambda:l1.setDisabled(not r1.isChecked()))
+ r2.toggled.connect(lambda:l2.setDisabled(not r2.isChecked()))
+
+ self.inputdict[i] = [r1, r2, l1, l2]
+ except Exception as e:
+ print(e)
+
+ def param(self):
+ try:
+ self.dict={}
+ print("param.inputdict ", self.inputdict)
+ for i in self.inputdict:
+ if (self.inputdict[i] == None):
+ continue
+
+ if(i=="thermoPackage"):
+ if (self.inputdict[i].currentText()):
+ self.dict[i] = self.inputdict[i].currentText()
+ else:
+ self.Show_Error()
+ break
+ elif self.obj.type == 'Flash' and i == 'Bdef':
+ self.dict[i] = [self.inputdict[i][0].isChecked(), self.inputdict[i][1].isChecked(), self.inputdict[i][2].text(), self.inputdict[i][3].text()]
+
+ print("param ", self.dict)
+ self.obj.paramsetter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
+
+class DockWidgetFlash(DockWidget):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ DockWidget.__init__(self,name,comptype,obj,container,parent=None)
+
+ def inputparamslist(self):
+ try:
+ print("inputparamslist ", self.inputdict)
+ for c,i in enumerate(self.inputdict):
+ if i == None:
+ continue
+ if(i=="thermoPackage"):
+ print("thermo1")
+ combo = QComboBox()
+ self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')]
+ print("thermo2")
+ for j in self.lines:
+ combo.addItem(str(j))
+ combo.setMinimumContentsLength(15)
+ lay = QGridLayout()
+ lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft)
+ lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(''), 0, 2, alignment = Qt.AlignCenter)
+ self.formLayout.addRow(lay)
+ self.inputdict[i] = combo
+ print("thermo")
+ elif self.obj.type == 'Flash' and i == 'Bdef':
+ print(i)
+ r1 = QCheckBox()
+ r1.setChecked(False)
+ r2 = QCheckBox()
+ r2.setChecked(False)
+
+ l1 = QLineEdit()
+ l1.setText(str(self.obj.variables['Tdef']['value']))
+ l2 = QLineEdit()
+ l2.setText(str(self.obj.variables['Pdef']['value']))
+ lay = QGridLayout()
+ lay.addWidget(r1, 0,0, alignment = Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables['Tdef']['name']+":"), 0,1, alignment=Qt.AlignLeft)
+ lay.addWidget(l1, 0, 2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables['Tdef']['unit']),0,3, alignment=Qt.AlignRight)
+ l1.setDisabled(True)
+
+ lay.addWidget(r2, 2,0, alignment = Qt.AlignLeft)
+ lay.addWidget(QLabel(self.obj.variables['Pdef']['name']+":"), 2,1, alignment=Qt.AlignLeft)
+ lay.addWidget(l2, 2, 2, alignment=Qt.AlignCenter)
+ lay.addWidget(QLabel(self.obj.variables['Pdef']['unit']),2,3, alignment=Qt.AlignRight)
+ self.formLayout.addRow(lay)
+ l2.setDisabled(True)
+ r1.toggled.connect(lambda:l1.setDisabled(not r1.isChecked()))
+ r2.toggled.connect(lambda:l2.setDisabled(not r2.isChecked()))
+
+ self.inputdict[i] = [r1, r2, l1, l2]
+ except Exception as e:
+ print(e)
+
+ def param(self):
+ try:
+ self.dict={}
+ print("param.inputdict ", self.inputdict)
+ for i in self.inputdict:
+ if (self.inputdict[i] == None):
+ continue
+
+ if(i=="thermoPackage"):
+ if (self.inputdict[i].currentText()):
+ self.dict[i] = self.inputdict[i].currentText()
+ else:
+ self.Show_Error()
+ break
+ elif self.obj.type == 'Flash' and i == 'Bdef':
+ self.dict[i] = [self.inputdict[i][0].isChecked(), self.inputdict[i][1].isChecked(), self.inputdict[i][2].text(), self.inputdict[i][3].text()]
+
+ print("param ", self.dict)
+ self.obj.paramsetter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e) \ No newline at end of file
diff --git a/dockWidget.ui b/DockWidgets/DockWidget.ui
index 11855cb..5851d71 100644
--- a/dockWidget.ui
+++ b/DockWidgets/DockWidget.ui
@@ -28,6 +28,9 @@
<property name="windowTitle">
<string>Form</string>
</property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
<widget class="QTabWidget" name="tabWidget">
<property name="geometry">
<rect>
@@ -38,7 +41,7 @@
</rect>
</property>
<property name="autoFillBackground">
- <bool>true</bool>
+ <bool>false</bool>
</property>
<property name="currentIndex">
<number>0</number>
diff --git a/DockWidgets/DockWidgetCompoundSeparator.py b/DockWidgets/DockWidgetCompoundSeparator.py
new file mode 100644
index 0000000..1818290
--- /dev/null
+++ b/DockWidgets/DockWidgetCompoundSeparator.py
@@ -0,0 +1,99 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from ComponentSelector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetCompoundSeparator.ui')
+
+class DockWidgetCompoundSeparator(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.input_dict = []
+
+ print("constructor ", self.input_dict)
+ self.input_params_list()
+ self.dict = []
+
+ def input_params_list(self):
+ try:
+ print("input_params_list ", self.input_dict)
+ if self.type == 'CompoundSeparator':
+
+ # self.gridLayout = QGridLayout()
+ calculationGroupBox = QGroupBox('Calculation Parameters')
+
+ calculationLayout = QGridLayout()
+
+ r1 = QRadioButton('Stream 1')
+ r1.setChecked(True)
+ r1.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ r2 = QRadioButton('Stream 2')
+ r2.setChecked(False)
+ r2.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+
+ lst = [r1, r2]
+ calculationLayout.addWidget(r1, 0, 1)
+ calculationLayout.addWidget(r2, 0, 2)
+
+ for k,val in enumerate(self.obj.compounds):
+ combo = QComboBox()
+ print("CompoundSeparator combo")
+ for j in self.obj.SepFact_modes:
+ combo.addItem(str(j))
+ combo.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ l = QLineEdit()
+ l.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ calculationLayout.addWidget(QLabel(val+" :"), k+1,0, alignment=Qt.AlignLeft)
+ calculationLayout.addWidget(combo, k+1, 1, alignment=Qt.AlignCenter)
+ calculationLayout.addWidget(l,k+1,2, alignment=Qt.AlignCenter)
+ lst.append(combo)
+ lst.append(l)
+
+ calculationLayout.setColumnStretch(3, len(self.obj.compounds)+1)
+ calculationGroupBox.setLayout(calculationLayout)
+
+ btn = QPushButton('Submit')
+ btn.clicked.connect(self.param)
+
+ self.gridLayout.setVerticalSpacing(5)
+ self.gridLayout.addWidget(calculationGroupBox,0,0)
+ self.gridLayout.addWidget(btn,1,0)
+
+ self.input_dict = lst
+
+ except Exception as e:
+ print(e)
+
+ def show_error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict=[]
+ print("param.input_dict ", self.input_dict)
+
+ self.dict = [self.input_dict[0].isChecked(), self.input_dict[1].isChecked()]
+ j = 2
+ for i in range(len(self.obj.compounds)):
+ print(j+i)
+ self.dict.append(self.input_dict[j+i].currentText())
+ self.dict.append(self.input_dict[j+i+1].text())
+ j += 1
+
+ print("param ", self.dict)
+ self.obj.param_setter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
diff --git a/DockWidgets/DockWidgetCompoundSeparator.ui b/DockWidgets/DockWidgetCompoundSeparator.ui
new file mode 100644
index 0000000..2d9a4b2
--- /dev/null
+++ b/DockWidgets/DockWidgetCompoundSeparator.ui
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>form</class>
+ <widget class="QWidget" name="form">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>700</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>3200</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QWidget" name="gridLayoutWidget">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>331</width>
+ <height>191</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" name="gridLayout"/>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/DockWidgets/DockWidgetDistillationColumn.py b/DockWidgets/DockWidgetDistillationColumn.py
new file mode 100644
index 0000000..65e9932
--- /dev/null
+++ b/DockWidgets/DockWidgetDistillationColumn.py
@@ -0,0 +1,120 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from ComponentSelector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetDistillationColumn.ui')
+
+class DockWidgetDistillationColumn(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.input_dict = []
+ print("constructor ", self.input_dict)
+ self.pushButton_2.clicked.connect(self.param)
+ self.dict = []
+ self.input_params_list()
+ self.name_type = None
+ self.container = container
+
+ # input data tab
+
+ def input_params_list(self):
+ try:
+ print("input_params_list ", self.input_dict)
+
+ # tab 1
+ self.l1.setText(self.obj.variables['Nt']['name']+":")
+ self.le1.setText(str(self.obj.variables['Nt']['value']))
+ self.l2.setText(self.obj.variables['In_s']['name']+":")
+ self.l3.setText(self.obj.variables['InT_s']['name']+":")
+
+ # tab 2
+ self.l4.setText(self.obj.variables['Ctype']['name']+":")
+ self.u1.setText(self.obj.variables['Ctype']['unit'])
+ self.l5.setText(self.obj.variables['Pcond']['name']+":")
+ self.le5.setText(str(self.obj.variables['Pcond']['value']))
+ self.u2.setText(self.obj.variables['Pcond']['unit'])
+ self.l6.setText(self.obj.variables['C_Spec']['name']+":")
+ self.l7.setText("Compounds :")
+
+ self.cb5.addItem("Total")
+ self.cb5.addItem("Partial")
+ for j in self.obj.Cspec_list:
+ self.cb1.addItem(str(j))
+ for j in self.obj.compounds:
+ self.cb2.addItem(str(j))
+ self.cb2.setDisabled(True)
+ self.cb1.currentIndexChanged.connect(self.fun2)
+
+
+ # tab3
+ self.l8.setText(self.obj.variables['Preb']['name']+":")
+ self.le7.setText(str(self.obj.variables['Preb']['value']))
+ self.u3.setText(self.obj.variables['Preb']['unit'])
+ self.l9.setText(self.obj.variables['R_Spec']['name']+":")
+ self.l10.setText('Compounds')
+
+ for j in self.obj.Rspec_list:
+ self.cb3.addItem(str(j))
+ for j in self.obj.compounds:
+ self.cb4.addItem(str(j))
+ self.cb4.setDisabled(True)
+ self.cb3.currentIndexChanged.connect(self.fun3)
+
+ self.input_dict = [self.le1, self.le2, self.le3, self.cb5, self.le5, self.cb1, self.cb2, self.le6, self.le7, self.cb3, self.cb4, self.le8]
+
+ except Exception as e:
+ print(e)
+
+ def fun2(self):
+ if self.cb1.currentText() == 'Compound Molar Fraction' or self.cb1.currentText() == 'Compound Molar Flow (mol/s)':
+ self.cb2.setDisabled(False)
+ else:
+ self.cb2.setDisabled(True)
+
+ def fun3(self):
+ if self.cb3.currentText() == 'Compound Molar Fraction' or self.cb3.currentText() == 'Compound Molar Flow (mol/s)':
+ self.cb4.setDisabled(False)
+ else:
+ self.cb4.setDisabled(True)
+
+ def Show_Error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict= []
+ print("param.input_dict ", self.input_dict)
+ self.dict = [self.input_dict[0].text(),self.input_dict[1].text(), self.input_dict[2].text(), self.input_dict[3].currentText(),
+ self.input_dict[4].text(), self.input_dict[5].currentText(), self.input_dict[6].currentText(), self.input_dict[7].text(),
+ self.input_dict[8].text(), self.input_dict[9].currentText(), self.input_dict[10].currentText(), self.input_dict[11].text()]
+
+ print("param ", self.dict)
+ self.obj.param_setter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
+
+
+ @staticmethod
+ def showResult(lst):
+ #DockWidget1.flag = True
+ for i in lst:
+ i.resultsCategory(i.name)
+ #i.show()
+
+ # result data tab
+ def resultsCategory(self,name):
+ pass \ No newline at end of file
diff --git a/DockWidgets/DockWidgetDistillationColumn.ui b/DockWidgets/DockWidgetDistillationColumn.ui
new file mode 100644
index 0000000..0cb1043
--- /dev/null
+++ b/DockWidgets/DockWidgetDistillationColumn.ui
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>700</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>3200</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>361</width>
+ <height>621</height>
+ </rect>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Input Data</string>
+ </attribute>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>331</width>
+ <height>204</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Parameter Selection</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_10">
+ <item>
+ <widget class="QTabWidget" name="tabWidget_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab1">
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <layout class="QGridLayout" name="lay1">
+ <item row="1" column="0">
+ <widget class="QLabel" name="l2">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLineEdit" name="le1"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="l1">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="le2"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="l3">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="le3"/>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab2">
+ <attribute name="title">
+ <string>Condensor</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <layout class="QGridLayout" name="lay2">
+ <item row="3" column="0">
+ <widget class="QLabel" name="l7">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="l4">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="l5">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QComboBox" name="cb1"/>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="le5"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="l6">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QComboBox" name="cb2">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="u1">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="u2">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QLineEdit" name="le6"/>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="cb5"/>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab3">
+ <attribute name="title">
+ <string>Reboiler</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <item>
+ <layout class="QGridLayout" name="lay3">
+ <item row="4" column="0">
+ <widget class="QLabel" name="l9">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="l8">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="l10">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QComboBox" name="cb4">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLineEdit" name="le7"/>
+ </item>
+ <item row="4" column="2">
+ <widget class="QComboBox" name="cb3"/>
+ </item>
+ <item row="6" column="2">
+ <widget class="QLineEdit" name="le8"/>
+ </item>
+ <item row="3" column="3">
+ <widget class="QLabel" name="u3">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QPushButton" name="pushButton_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>220</y>
+ <width>331</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Submit</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget" name="tab_2">
+ <attribute name="title">
+ <string>Results</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout_3"/>
+ </widget>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/DockWidgets/DockWidgetFlash.py b/DockWidgets/DockWidgetFlash.py
new file mode 100644
index 0000000..6098b27
--- /dev/null
+++ b/DockWidgets/DockWidgetFlash.py
@@ -0,0 +1,74 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from ComponentSelector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetFlash.ui')
+
+class DockWidgetFlash(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.input_dict = []
+ print("constructor ", self.input_dict)
+ self.input_params_list()
+ self.btn.clicked.connect(self.param)
+ self.dict = []
+
+ def input_params_list(self):
+ try:
+ print("input_params_list ", self.input_dict)
+
+ self.l1.setText(self.obj.variables['thermoPackage']['name']+":")
+ self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')]
+ for j in self.lines:
+ self.cb1.addItem(str(j))
+
+ self.check1.setText(self.obj.variables['Tdef']['name']+":")
+ self.le2.setText(str(self.obj.variables['Tdef']['value']))
+ self.u2.setText(self.obj.variables['Tdef']['unit'])
+ self.check1.toggled.connect(self.fun)
+ self.check2.setText(self.obj.variables['Pdef']['name']+":")
+ self.le3.setText(str(self.obj.variables['Pdef']['value']))
+ self.u3.setText(self.obj.variables['Pdef']['unit'])
+ self.check2.toggled.connect(self.fun)
+
+ self.input_dict = [self.cb1, self.check1, self.le2, self.check2, self.le3]
+
+ except Exception as e:
+ print(e)
+
+ def fun(self):
+ if self.check1.isChecked():
+ self.le2.setDisabled(False)
+ else:
+ self.le2.setDisabled(True)
+ if self.check2.isChecked():
+ self.le3.setDisabled(False)
+ else:
+ self.le3.setDisabled(True)
+
+ def show_error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict={}
+ print("param.input_dict ", self.input_dict)
+ self.dict = [self.input_dict[0].currentText(),self.input_dict[1].isChecked(), float(self.input_dict[2].text()), self.input_dict[3].isChecked(), float(self.input_dict[4].text())]
+ print("param ", self.dict)
+ self.obj.param_setter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e) \ No newline at end of file
diff --git a/DockWidgets/DockWidgetFlash.ui b/DockWidgets/DockWidgetFlash.ui
new file mode 100644
index 0000000..c781aa6
--- /dev/null
+++ b/DockWidgets/DockWidgetFlash.ui
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>700</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>3200</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>341</width>
+ <height>141</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">Q</string>
+ </property>
+ <property name="title">
+ <string>Calculation Parameters</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="le3">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QLabel" name="u3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="le2">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="u2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="l1">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="check2">
+ <property name="text">
+ <string>CheckBox</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="cb1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="check1">
+ <property name="text">
+ <string>CheckBox</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QPushButton" name="btn">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>190</y>
+ <width>341</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Submit</string>
+ </property>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/DockWidgetMatStm.py b/DockWidgets/DockWidgetMaterialStream.py
index 76ecb11..78959fc 100644
--- a/DockWidgetMatStm.py
+++ b/DockWidgets/DockWidgetMaterialStream.py
@@ -4,13 +4,13 @@ from PyQt5.QtGui import *
from PyQt5.uic import loadUiType
import pandas as pd
from functools import partial
-from component_selector import *
+from ComponentSelector import *
from collections import defaultdict
from Graphics import *
-ui_dialog,_ = loadUiType('DockWidgetMatStm.ui')
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetMaterialStream.ui')
-class DockWidgetMatStm(QDockWidget,ui_dialog):
+class DockWidgetMaterialStream(QDockWidget,ui_dialog):
def __init__(self,name,comptype,obj,container,parent=None):
QDockWidget.__init__(self,parent)
@@ -19,16 +19,16 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
self.name=name
self.obj=obj
self.type = comptype
- self.inputdict = {}
+ self.input_dict = {}
self.x_pclist = []
self.modes()
- self.comboBox.currentIndexChanged.connect(self.modeSelection)
+ self.comboBox.currentIndexChanged.connect(self.mode_selection)
- print("constructor ", self.inputdict)
+ print("constructor ", self.input_dict)
self.pushButton_2.clicked.connect(self.param)
self.dict = {}
- self.nameType = None
+ self.name_type = None
self.container = container
header = QTreeWidgetItem(['Compound','Value','Unit'])
@@ -41,36 +41,36 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
self.vTreeWidget.itemClicked.connect(lambda : self.printer(self.vTreeWidget.currentItem()))
- def printer(self, treeItem ):
- foldername = treeItem.text(0)
- comment = treeItem.text(1)
- data = treeItem.text(2)
- print(foldername , ': ' , comment , ' (' + data + ')')
+ # def printer(self, treeItem ):
+ # foldername = treeItem.text(0)
+ # comment = treeItem.text(1)
+ # data = treeItem.text(2)
+ # print(foldername , ': ' , comment , ' (' + data + ')')
# input data tab
def modes(self):
- modesList = self.obj.modesList
- if(modesList):
- for j in modesList:
+ modes_list = self.obj.modes_list
+ if(modes_list):
+ for j in modes_list:
self.comboBox.addItem(str(j))
- self.modeSelection()
+ self.mode_selection()
else:
- self.inputdict= {}
- self.inputdict = self.obj.paramgetter()
- self.inputparamslist()
+ self.input_dict= {}
+ self.input_dict = self.obj.param_getter()
+ self.input_params_list()
- def modeSelection(self):
- self.inputdict= {}
+ def mode_selection(self):
+ self.input_dict= {}
for i in reversed(range(self.formLayout.count())):
self.formLayout.removeRow(i)
- self.inputdict = self.obj.paramgetter(self.comboBox.currentText())
- self.inputparamslist()
+ self.input_dict = self.obj.param_getter(self.comboBox.currentText())
+ self.input_params_list()
- def inputparamslist(self):
+ def input_params_list(self):
try:
- print("inputparamslist ", self.inputdict)
- for c,i in enumerate(self.inputdict):
- if(i=="thermoPackage"):
+ print("input_params_list ", self.input_dict)
+ for c,i in enumerate(self.input_dict):
+ if(i=="thermo_package"):
print("thermo1")
combo = QComboBox()
self.lines = [line.rstrip('\n') for line in open('thermopackage.txt')]
@@ -81,7 +81,7 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
lay.addWidget(QLabel(i+":"), 0,0, alignment=Qt.AlignLeft)
lay.addWidget(combo, 0, 1, alignment=Qt.AlignRight)
self.formLayout.addRow(lay)
- self.inputdict[i] = combo
+ self.input_dict[i] = combo
print("thermo")
elif(i=="condType"):
combo = QComboBox()
@@ -92,7 +92,7 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
lay.addWidget(QLabel("Condensor Type :"+":"), 0, 0, alignment=Qt.AlignLeft)
lay.addWidget(combo, 0, 1, alignment=Qt.AlignCenter)
self.formLayout.addRow(lay)
- self.inputdict[i] = combo
+ self.input_dict[i] = combo
elif(i=="x_pc"):
noc = len(compound_selected)
print(noc)
@@ -102,9 +102,9 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
lay = QGridLayout()
for j in range(noc):
l = QLineEdit()
- if self.inputdict[i] != '':
+ if self.input_dict[i] != '':
l.setText(str(self.obj.variables[compound_selected[j]]['value']))
- self.inputdict[i] = "x_pc"
+ self.input_dict[i] = "x_pc"
lay.addWidget(QLabel(str(compound_selected[j])+":"),j,0, alignment=Qt.AlignLeft)
lay.addWidget(l,j,1, alignment=Qt.AlignCenter)
self.x_pclist.append(l)
@@ -114,8 +114,8 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
else:
print("elseloop")
l = QLineEdit()
- if self.inputdict[i] != None:
- l.setText(str(self.inputdict[i]))
+ if self.input_dict[i] != None:
+ l.setText(str(self.input_dict[i]))
lay = QGridLayout()
lay.addWidget(QLabel(i+":"),0,0, alignment=Qt.AlignLeft)
lay.addWidget(l,0,1, alignment=Qt.AlignCenter)
@@ -124,31 +124,31 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
else:
lay.addWidget(QLabel("mol/s"),0,2, alignment=Qt.AlignCenter)
self.formLayout.addRow(lay)
- self.inputdict[i] = l
+ self.input_dict[i] = l
except Exception as e:
print(e)
- def Show_Error(self):
+ def show_error(self):
QMessageBox.about(self, 'Important', "Please fill all fields with data")
def param(self):
try:
self.dict={}
- print("param.inputdict ", self.inputdict)
- for i in self.inputdict:
- if(i=="thermoPackage"):
- if (self.inputdict[i].currentText()):
- self.dict[i] = self.inputdict[i].currentText()
+ print("param.input_dict ", self.input_dict)
+ for i in self.input_dict:
+ if(i=="thermo_package"):
+ if (self.input_dict[i].currentText()):
+ self.dict[i] = self.input_dict[i].currentText()
else:
- self.Show_Error()
+ self.show_error()
break
elif(i=="condType"):
- if (self.inputdict[i].currentText()):
- self.dict[i] = self.inputdict[i].currentText()
+ if (self.input_dict[i].currentText()):
+ self.dict[i] = self.input_dict[i].currentText()
else:
- self.Show_Error()
+ self.show_error()
break
elif(i =="x_pc"):
l=[]
@@ -159,7 +159,7 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
l.append(mol_frac.text())
total_moles += float(l[-1])
else:
- self.Show_Error()
+ self.show_error()
break
for c in range(len(compound_selected)):
mf.append(str(float(l[c])/total_moles))
@@ -167,15 +167,15 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
self.x_pclist[c].setText(mf[-1])
self.dict[i] = ",".join(mf)
else:
- if (self.inputdict[i].text()):
- self.dict[i] = self.inputdict[i].text()
+ if (self.input_dict[i].text()):
+ self.dict[i] = self.input_dict[i].text()
else:
- print(self.inputdict[i].text())
- self.Show_Error()
+ print(self.input_dict[i].text())
+ self.show_error()
break
print("param ", self.dict)
- self.obj.paramsetter(self.dict)
+ self.obj.param_setter(self.dict)
self.hide()
except Exception as e:
@@ -183,19 +183,19 @@ class DockWidgetMatStm(QDockWidget,ui_dialog):
@staticmethod
- def showResult(lst):
+ def show_result(lst):
#DockWidget1.flag = True
for i in lst:
- i.resultsCategory(i.name)
+ i.results_category(i.name)
#i.show()
# result data tab
- def resultsCategory(self,name):
+ def results_category(self,name):
flag = True
try:
print("Under result category name ", name)
result=self.container.result
- obj = self.container.fetchObject(name)
+ obj = self.container.fetch_object(name)
d = {"Mole Fraction":"x_pc", "Mass Fraction":"xm_pc", "Mole Flow":"F_pc", "Mass Flow":"Fm_pc"}
lst = list(d.keys())
diff --git a/DockWidgetMatStm.ui b/DockWidgets/DockWidgetMaterialStream.ui
index 8995ba6..8995ba6 100644
--- a/DockWidgetMatStm.ui
+++ b/DockWidgets/DockWidgetMaterialStream.ui
diff --git a/DockWidgets/DockWidgetMixer.py b/DockWidgets/DockWidgetMixer.py
new file mode 100644
index 0000000..28cbff0
--- /dev/null
+++ b/DockWidgets/DockWidgetMixer.py
@@ -0,0 +1,61 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from ComponentSelector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetMixer.ui')
+
+class DockWidgetMixer(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.input_dict = []
+ self.x_pclist = []
+ print("constructor ", self.input_dict)
+ self.input_params_list()
+ self.btn.clicked.connect(self.param)
+ self.dict = {}
+
+ # input data tab
+ def input_params_list(self):
+ try:
+ print("input_params_list ", self.input_dict)
+
+ self.l1.setText(self.obj.variables['NI']['name']+":")
+ self.le1.setText(str(self.obj.variables['NI']['value']))
+ self.u1.setText(self.obj.variables['NI']['unit'])
+ for i in self.obj.Pout_modes:
+ self.cb2.addItem(str(i))
+
+ self.l2.setText(self.obj.variables['outPress']['name']+":")
+
+
+ self.input_dict = [self.le1, self.cb2]
+
+ except Exception as e:
+ print(e)
+
+ def show_error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict={}
+ print("param.input_dict ", self.input_dict)
+ self.dict = [int(self.input_dict[0].text()),self.input_dict[1].currentText()]
+ print("param ", self.dict)
+ self.obj.param_setter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e) \ No newline at end of file
diff --git a/DockWidgets/DockWidgetMixer.ui b/DockWidgets/DockWidgetMixer.ui
new file mode 100644
index 0000000..e039490
--- /dev/null
+++ b/DockWidgets/DockWidgetMixer.ui
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>700</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>3200</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>341</width>
+ <height>101</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Calculation Parameters</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="3">
+ <widget class="QLabel" name="u1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="cb2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="l1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLineEdit" name="le1">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="l2">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QPushButton" name="btn">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>150</y>
+ <width>341</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Submit</string>
+ </property>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/DockWidgets/DockWidgetShortcutColumn.py b/DockWidgets/DockWidgetShortcutColumn.py
new file mode 100644
index 0000000..af81441
--- /dev/null
+++ b/DockWidgets/DockWidgetShortcutColumn.py
@@ -0,0 +1,97 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from ComponentSelector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetShortcutColumn.ui')
+
+class DockWidgetShortcutColumn(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.input_dict = []
+ print("constructor ", self.input_dict)
+ self.input_params_list()
+ self.btn.clicked.connect(self.param)
+ self.dict = []
+
+ self.name_type = None
+ self.container = container
+
+ # input data tab
+ def input_params_list(self):
+ try:
+ print("input_params_list ", self.input_dict)
+
+ self.l1.setText(self.obj.variables['HKey']['name']+":")
+ print(self.obj.compounds)
+ for i in self.obj.compounds:
+ self.cb1.addItem(str(i))
+ self.cb2.addItem(str(i))
+
+ self.l2.setText(self.obj.variables['LKey']['name']+":")
+
+ self.l3.setText(self.obj.variables['HKey_x_pc']['name']+":")
+ self.le3.setText(str(self.obj.variables['HKey_x_pc']['value']))
+ self.u3.setText(self.obj.variables['HKey_x_pc']['unit'])
+ self.l4.setText(self.obj.variables['LKey_x_pc']['name']+":")
+ self.u4.setText(self.obj.variables['LKey_x_pc']['unit'])
+ self.le4.setText(str(self.obj.variables['LKey_x_pc']['value']))
+
+ self.l5.setText(self.obj.variables['Ctype']['name']+":")
+ self.cb5.addItem('Total')
+ self.cb5.addItem('Partial')
+
+ self.l6.setText(self.obj.variables['Pcond']['name']+":")
+ self.le6.setText(str(self.obj.variables['Pcond']['value']))
+ self.u6.setText(self.obj.variables['Pcond']['unit'])
+ self.l7.setText(self.obj.variables['Preb']['name']+":")
+ self.u7.setText(self.obj.variables['Preb']['unit'])
+ self.le7.setText(str(self.obj.variables['Preb']['value']))
+
+ self.l8.setText(self.obj.variables['RR']['name']+":")
+ self.le8.setText(str(self.obj.variables['RR']['value']))
+
+ self.input_dict = [self.cb1, self.cb2, self.le3, self.le4, self.cb5, self.le6, self.le7, self.le8]
+
+ except Exception as e:
+ print(e)
+
+ def show_error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict=[]
+ print("param.input_dict ", self.input_dict)
+ self.dict = [self.input_dict[0].currentText(),self.input_dict[1].currentText(),float(self.input_dict[2].text()), float(self.input_dict[3].text()),
+ self.input_dict[4].currentText(), float(self.input_dict[5].text()), float(self.input_dict[6].text()), float(self.input_dict[7].text())]
+
+ print("param ", self.dict)
+ self.obj.param_setter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
+
+
+ @staticmethod
+ def show_result(lst):
+ #DockWidget1.flag = True
+ for i in lst:
+ i.resultsCategory(i.name)
+ #i.show()
+
+ # result data tab
+ def results_category(self,name):
+ pass \ No newline at end of file
diff --git a/DockWidgets/DockWidgetShortcutColumn.ui b/DockWidgets/DockWidgetShortcutColumn.ui
new file mode 100644
index 0000000..c66e699
--- /dev/null
+++ b/DockWidgets/DockWidgetShortcutColumn.ui
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>700</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>3200</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>351</width>
+ <height>321</height>
+ </rect>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Input Data</string>
+ </attribute>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>8</x>
+ <y>13</y>
+ <width>331</width>
+ <height>237</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Calculation Parameters</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="4" column="2">
+ <widget class="QComboBox" name="cb5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="l4">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QLabel" name="u4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="l1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QLabel" name="u3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="l3">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="le3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="l5">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="l6">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="l2">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QLineEdit" name="le6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="l7">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QLabel" name="u7">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="cb2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLineEdit" name="le4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QLabel" name="u6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QLineEdit" name="le7">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="l8">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QLineEdit" name="le8">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="cb1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QPushButton" name="btn">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>250</y>
+ <width>331</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Submit</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget" name="tab_2">
+ <attribute name="title">
+ <string>Results</string>
+ </attribute>
+ </widget>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/DockWidgets/DockWidgetSplitter.py b/DockWidgets/DockWidgetSplitter.py
new file mode 100644
index 0000000..262bd45
--- /dev/null
+++ b/DockWidgets/DockWidgetSplitter.py
@@ -0,0 +1,78 @@
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.uic import loadUiType
+import pandas as pd
+from functools import partial
+from ComponentSelector import *
+from collections import defaultdict
+from Graphics import *
+
+ui_dialog,_ = loadUiType('DockWidgets/DockWidgetSplitter.ui')
+
+class DockWidgetSplitter(QDockWidget,ui_dialog):
+
+ def __init__(self,name,comptype,obj,container,parent=None):
+ QDockWidget.__init__(self,parent)
+ self.setupUi(self)
+ self.setWindowTitle(obj.name)
+ self.name=name
+ self.obj=obj
+ self.type = comptype
+ self.input_dict = []
+ print("constructor ", self.input_dict)
+ self.input_params_list()
+ self.btn.clicked.connect(self.param)
+ self.dict = {}
+
+ # input data tab
+ def input_params_list(self):
+ try:
+ print("input_params_list ", self.input_dict)
+
+ self.l1.setText(self.obj.variables['NOO']['name']+":")
+ self.le1.setText(str(self.obj.variables['NOO']['value']))
+ self.u1.setText(self.obj.variables['NOO']['unit'])
+
+ for i in self.obj.CalcType_modes:
+ self.cb2.addItem(str(i))
+
+ self.l2.setText(self.obj.variables['CalcType']['name']+":")
+
+ self.l3.setText("Stream 1 :")
+ self.u3.setText('')
+ self.l4.setText("Stream 2 :")
+ self.u4.setText('')
+ self.cb2.currentIndexChanged.connect(self.fun)
+
+
+ self.input_dict = [self.le1, self.cb2, self.le3, self.le4]
+
+ except Exception as e:
+ print(e)
+
+ def fun(self):
+ if self.cb2.currentText() == 'Mole Flow Specs':
+ self.u3.setText('mol/s')
+ self.u4.setText('mol/s')
+ elif self.cb2.currentText() == 'Mass Flow Specs':
+ self.u3.setText('kg/s')
+ self.u4.setText('kg/s')
+ else:
+ self.u3.setText('')
+ self.u4.setText('')
+
+ def show_error(self):
+ QMessageBox.about(self, 'Important', "Please fill all fields with data")
+
+ def param(self):
+ try:
+ self.dict={}
+ print("param.input_dict ", self.input_dict)
+ self.dict = [int(self.input_dict[0].text()),self.input_dict[1].currentText(), float(self.input_dict[2].text()), float(self.input_dict[3].text())]
+ print("param ", self.dict)
+ self.obj.param_setter(self.dict)
+ self.hide()
+
+ except Exception as e:
+ print(e)
diff --git a/DockWidgets/DockWidgetSplitter.ui b/DockWidgets/DockWidgetSplitter.ui
new file mode 100644
index 0000000..02a865e
--- /dev/null
+++ b/DockWidgets/DockWidgetSplitter.ui
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>392</width>
+ <height>700</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>3200</width>
+ <height>5000</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>341</width>
+ <height>161</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground">
+ <bool>true</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">Q</string>
+ </property>
+ <property name="title">
+ <string>Calculation Parameters</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="1" column="0">
+ <widget class="QLabel" name="l2">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="l1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLineEdit" name="le1">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="l3">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLineEdit" name="le3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="cb2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="u1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="l4">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLineEdit" name="le4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QLabel" name="u3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QLabel" name="u4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QPushButton" name="btn">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>210</y>
+ <width>341</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Submit</string>
+ </property>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/DockWidgets/__pycache__/DockWidget.cpython-36.pyc b/DockWidgets/__pycache__/DockWidget.cpython-36.pyc
new file mode 100644
index 0000000..1d47765
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidget.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidget.cpython-37.pyc b/DockWidgets/__pycache__/DockWidget.cpython-37.pyc
new file mode 100644
index 0000000..80d0ae1
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidget.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc
new file mode 100644
index 0000000..1101a8e
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc
new file mode 100644
index 0000000..e5023b1
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetCompoundSeparator.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc
new file mode 100644
index 0000000..ec04f1f
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc
new file mode 100644
index 0000000..0584a29
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetDistillationColumn.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc
new file mode 100644
index 0000000..387b27b
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetFlash.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc
new file mode 100644
index 0000000..7eaaef7
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetFlash.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc
new file mode 100644
index 0000000..90799f7
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc
new file mode 100644
index 0000000..a99f092
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetMaterialStream.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc
new file mode 100644
index 0000000..f3fd8b1
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetMixer.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc
new file mode 100644
index 0000000..52a0ca1
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetMixer.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc
new file mode 100644
index 0000000..a56884a
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc
new file mode 100644
index 0000000..85449f8
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetShortcutColumn.cpython-37.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc
new file mode 100644
index 0000000..b0983a0
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-36.pyc
Binary files differ
diff --git a/DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc
new file mode 100644
index 0000000..19250d9
--- /dev/null
+++ b/DockWidgets/__pycache__/DockWidgetSplitter.cpython-37.pyc
Binary files differ
diff --git a/Graphics.py b/Graphics.py
index 467b628..0fa3306 100644
--- a/Graphics.py
+++ b/Graphics.py
@@ -10,101 +10,121 @@ from PyQt5.QtGui import QTextDocument ,QTextCursor ,QTextCharFormat ,QFont ,QPix
from PyQt5.uic import loadUiType
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QGraphicsProxyWidget, QGraphicsObject, QGraphicsEllipseItem ,QGraphicsPixmapItem,QApplication, QGraphicsView, QGraphicsScene, QHBoxLayout, QWidget, QLabel
-from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent
+from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent, QIcon
import PyQt5.QtGui as QtGui
import PyQt5.QtCore as QtCore
import PyQt5.QtWidgets as QtWidgets
-from component_selector import *
-from DockWidget import *
-from DockWidgetMatStm import *
-
+from ComponentSelector import *
+from DockWidgets.DockWidget import *
+from DockWidgets.DockWidgetMaterialStream import *
+from DockWidgets.DockWidgetDistillationColumn import *
+from DockWidgets.DockWidgetShortcutColumn import *
+from DockWidgets.DockWidgetMixer import *
+from DockWidgets.DockWidgetSplitter import *
+from DockWidgets.DockWidgetFlash import *
+from DockWidgets.DockWidgetCompoundSeparator import *
import datetime
-from container import *
-import container
+from Container import *
+import Container
from Streams import *
from UnitOperations import *
class Graphics(QDialog, QtWidgets.QGraphicsItem):
- def __init__(self, unitOp):
+ def __init__(self, unit_operations, graphicsView):
QDialog.__init__(self)
QtWidgets.QGraphicsItem.__init__(self)
self.scene = QGraphicsScene()
self.scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex)
+ self.graphicsView = graphicsView
self.pos = None
- self.unitOp = unitOp
+ self.unit_operations = unit_operations
- def getScene(self):
+ def get_scene(self):
return self.scene
- def getComponentSelector(self):
- return componentSelector(self)
+ def get_component_selector(self):
+ return ComponentSelector(self)
- def createNodeItem(self,unitOpr, container):
- return NodeItem(unitOpr, container)
+ def create_node_item(self,unit_operation, container):
+ print("in create node item function")
+ return NodeItem(unit_operation, container, self.graphicsView)
- def boundingRect(self):
- return QtCore.QRectF(self.rect)
+ # def boundingRect(self):
+ # return QtCore.QRectF(self.rect)
- def loadCanvas(self, obj):
+ def load_canvas(self, obj, container):
stm = ['MaterialStream','EngStm']
-
+ print('in load canvas')
compounds = obj[-1]
obj.pop()
- componentSelector.setCompounds(compounds)
+ ComponentSelector.set_compounds(compounds)
for i in obj:
- if(i in self.unitOp):
+ print("in for loop", i)
+ if(i in self.unit_operations):
pass
else:
- self.unitOp.append(i)
- new_box = self.createNodeItem(i, self)
+ self.unit_operations.append(i)
+ print(self.unit_operations)
+ new_box = self.create_node_item(i, container)
+ print('after createing node item')
new_box.setPos(i.pos.toPoint().x(), i.pos.toPoint().y())
self.scene.addItem(new_box)
for i in obj:
+ print('in i obj line')
if i.type == "MaterialStream":
- eval(i.type).counter += 1
+ print('in i obj line in if')
+ # print(eval(i.type))
+ # eval(i.type).counter += 1
+ # print(eval(i.type).counter)
elif i.type not in stm:
- eval(i.type).counter += 1
- ip = i.InputStms
- op = i.OutputStms
+ print('in i obj line in else')
+ ip = i.input_stms
+ op = i.output_stms
+ print(ip)
+ print(op)
+ # print(eval(i.type))
+ # eval(i.type).counter += 1
+ # print(eval(i.type).counter)
for j in ip:
- pointA = NodeItem.getInstances(j.name)
- pointB = NodeItem.getInstances(i.name)
- rect = pointA.Output[0].boundingRect()
+ print('in j in ip')
+ pointA = NodeItem.get_instances(j.name)
+ pointB = NodeItem.get_instances(i.name)
+ rect = pointA.output[0].boundingRect()
pointAA = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
- pointAA = pointA.Output[0].mapToScene(pointAA)
- rectB = pointB.Input[0].boundingRect()
+ pointAA = pointA.output[0].mapToScene(pointAA)
+ rectB = pointB.input[0].boundingRect()
pointBB = QtCore.QPointF(rectB.x() + rectB.width()/2, rectB.y() + rectB.height()/2)
- pointBB = pointB.Input[0].mapToScene(pointBB)
+ pointBB = pointB.input[0].mapToScene(pointBB)
self.new_line = NodeLine(pointAA, pointBB, 'in')
- self.new_line.source = pointA.Output[0]
- self.new_line.target = pointB.Input[0]
- pointA.Output[0].outLines.append(self.new_line)
- pointB.Input[0].inLines.append(self.new_line)
- pointA.Output[0].otherLine = self.new_line
- pointB.Input[0].otherLine = self.new_line
+ self.new_line.source = pointA.output[0]
+ self.new_line.target = pointB.input[0]
+ pointA.output[0].out_lines.append(self.new_line)
+ pointB.input[0].in_lines.append(self.new_line)
+ pointA.output[0].other_line = self.new_line
+ pointB.input[0].other_line = self.new_line
self.scene.addItem(self.new_line)
self.new_line.updatePath()
for k in op:
- pointA = NodeItem.getInstances(i.name)
- pointB = NodeItem.getInstances(k.name)
- rect = pointA.Output[0].boundingRect()
+ pointA = NodeItem.get_instances(i.name)
+ pointB = NodeItem.get_instances(k.name)
+ rect = pointA.output[0].boundingRect()
pointAA = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
- pointAA = pointA.Output[0].mapToScene(pointAA)
- rectB = pointB.Input[0].boundingRect()
+ pointAA = pointA.output[0].mapToScene(pointAA)
+ rectB = pointB.input[0].boundingRect()
pointBB = QtCore.QPointF(rectB.x() + rectB.width()/2, rectB.y() + rectB.height()/2)
- pointBB = pointB.Input[0].mapToScene(pointBB)
+ pointBB = pointB.input[0].mapToScene(pointBB)
self.new_line = NodeLine(pointAA, pointBB, 'out')
- self.new_line.source = pointA.Output[0]
- self.new_line.target = pointB.Input[0]
- pointA.Output[0].outLines.append(self.new_line)
- pointB.Input[0].inLines.append(self.new_line)
- pointA.Output[0].otherLine = self.new_line
- pointB.Input[0].otherLine = self.new_line
+ self.new_line.source = pointA.output[0]
+ self.new_line.target = pointB.input[0]
+ pointA.output[0].out_lines.append(self.new_line)
+ pointB.input[0].in_lines.append(self.new_line)
+ pointA.output[0].other_line = self.new_line
+ pointB.input[0].other_line = self.new_line
self.scene.addItem(self.new_line)
self.new_line.updatePath()
@@ -118,11 +138,11 @@ class NodeLine(QtWidgets.QGraphicsPathItem):
self._source = None
self._target = None
self.setZValue(-1)
- self.setBrush(QtGui.QColor(0,0,255,255))
+ self.setBrush(QtGui.QColor(0,70,70,120))
self.pen = QtGui.QPen()
self.pen.setStyle(QtCore.Qt.SolidLine)
- self.pen.setWidth(1)
- self.pen.setColor(QtGui.QColor(0,0,255,255))
+ self.pen.setWidth(2)
+ self.pen.setColor(QtGui.QColor(0,70,70,220))
self.setPen(self.pen)
def updatePath(self):
@@ -138,8 +158,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem):
path.cubicTo(ctrl1_1, ctrl2_1, pt1)
if abs(self.pointB.x()-midptx) > 150:
- ctrl1_2 = QtCore.QPointF(midptx, self.pointB.y())
- ctrl2_2 = QtCore.QPointF(midptx, self.pointB.y())
+ ctrl1_2 = QtCore.QPointF(midptx, self.pointA.y())
+ ctrl2_2 = QtCore.QPointF(midptx, self.pointA.y())
pt2 = QtCore.QPointF(midptx , self.pointA.y()+100)
path.cubicTo(ctrl1_2, ctrl2_2, pt2)
path.moveTo(pt2)
@@ -150,8 +170,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem):
path.cubicTo(ctrl1_3, ctrl2_3, pt3)
path.moveTo(pt3)
- ctrl1_4 = QtCore.QPointF(self.pointB.x()-13, max(self.pointB.y(), self.pointA.y())-(abs(self.pointA.y()-self.pointB.y())/2))
- ctrl2_4 = QtCore.QPointF(self.pointB.x()-13, max(self.pointB.y(), self.pointA.y())-(abs(self.pointA.y()-self.pointB.y())/2))
+ ctrl1_4 = QtCore.QPointF(self.pointB.x()-13, self.pointA.y()+100)
+ ctrl2_4 = QtCore.QPointF(self.pointB.x()-13, self.pointA.y()+100)
pt4 = QtCore.QPointF(self.pointB.x()-13, self.pointB.y())
path.cubicTo(ctrl1_4, ctrl2_4, pt4)
path.moveTo(pt4)
@@ -165,8 +185,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem):
self.setPath(path)
return
else:
- ctrl1_2 = QtCore.QPointF(midptx, self.pointB.y())
- ctrl2_2 = QtCore.QPointF(midptx, self.pointB.y())
+ ctrl1_2 = QtCore.QPointF(midptx, self.pointA.y())
+ ctrl2_2 = QtCore.QPointF(midptx, self.pointA.y())
pt2 = QtCore.QPointF(midptx , max(self.pointB.y(), self.pointA.y())-(abs(self.pointA.y()-self.pointB.y())/2))
path.cubicTo(ctrl1_2, ctrl2_2, pt2)
path.moveTo(pt2)
@@ -202,8 +222,8 @@ class NodeLine(QtWidgets.QGraphicsPathItem):
path.cubicTo(ctrl1_1, ctrl2_1, pt1)
path.moveTo(pt1)
- ctrl1_2 = QtCore.QPointF(midptx, self.pointB.y())
- ctrl2_2 = QtCore.QPointF(midptx, self.pointB.y())
+ ctrl1_2 = QtCore.QPointF(midptx, self.pointA.y())
+ ctrl2_2 = QtCore.QPointF(midptx, self.pointA.y())
pt2 = QtCore.QPointF(midptx , self.pointB.y())
path.cubicTo(ctrl1_2, ctrl2_2, pt2)
path.moveTo(pt2)
@@ -264,22 +284,23 @@ class NodeSocket(QtWidgets.QGraphicsItem):
self.rect = rect
self.type = socketType
self.parent=parent
- self.newLine=None
- self.otherLine=None
+ self.setAcceptHoverEvents(True)
+ self.new_line=None
+ self.other_line=None
# Brush.
self.brush = QtGui.QBrush()
self.brush.setStyle(QtCore.Qt.SolidPattern)
- self.brush.setColor(QtGui.QColor(180,20,90,255))
+ self.brush.setColor(QtGui.QColor(220,220,220,220)) #180,20,90,255
# Pen.
self.pen = QtGui.QPen()
self.pen.setStyle(QtCore.Qt.SolidLine)
self.pen.setWidth(1)
- self.pen.setColor(QtGui.QColor(20,20,20,255))
+ self.pen.setColor(QtGui.QColor(0,70,70,255)) #20,20,20,255
# Lines.
- self.outLines = []
- self.inLines = []
+ self.out_lines = []
+ self.in_lines = []
def shape(self):
path = QtGui.QPainterPath()
@@ -295,159 +316,199 @@ class NodeSocket(QtWidgets.QGraphicsItem):
painter.drawEllipse(self.rect)
def mousePressEvent(self, event):
+ cursor = QCursor( Qt.PointingHandCursor )
+ QApplication.instance().setOverrideCursor(cursor)
+
if self.type == 'op':
rect = self.boundingRect()
pointA = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
pointA = self.mapToScene(pointA)
pointB = self.mapToScene(event.pos())
- self.newLine = NodeLine(pointA, pointB ,'op')
- self.outLines.append(self.newLine)
- self.scene().addItem(self.newLine)
+ self.new_line = NodeLine(pointA, pointB ,'op')
+ self.out_lines.append(self.new_line)
+ self.scene().addItem(self.new_line)
elif self.type == 'in':
rect = self.boundingRect()
pointA = self.mapToScene(event.pos())
pointB = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
pointB = self.mapToScene(pointB)
- self.newLine = NodeLine(pointA, pointB, 'in')
- self.inLines.append(self.newLine)
- self.scene().addItem(self.newLine)
+ self.new_line = NodeLine(pointA, pointB, 'in')
+ self.in_lines.append(self.new_line)
+ self.scene().addItem(self.new_line)
else:
super(NodeSocket, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
+
if self.type == 'op':
pointB = self.mapToScene(event.pos())
- self.newLine.pointB = pointB
- if self.otherLine:
- self.otherLine.pointB=pointB
+ self.new_line.pointB = pointB
+ if self.other_line:
+ self.other_line.pointB=pointB
elif self.type == 'in':
pointA = self.mapToScene(event.pos())
- self.newLine.pointA = pointA
- if self.otherLine:
- self.otherLine.pointA=pointA
+ self.new_line.pointA = pointA
+ if self.other_line:
+ self.other_line.pointA=pointA
else:
super(NodeSocket, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
+ cursor = QCursor( Qt.ArrowCursor )
+ QApplication.instance().setOverrideCursor(cursor)
+
item = self.scene().itemAt(event.scenePos().toPoint(),QtGui.QTransform())
stm = ['MaterialStream','EngStm']
- item.otherLine=self.newLine
+ item.other_line=self.new_line
if (self.type == 'op') and (item.type == 'in'):
- self.newLine.source = self
- self.newLine.target = item
- item.inLines.append(self.newLine)
- self.newLine.pointB = item.getCenter()
- if self.newLine.source.parent.obj.type not in stm:
- self.newLine.source.parent.obj.add_connection(0,self.newLine.target.parent.obj)
- if self.newLine.target.parent.obj.type not in stm:
- self.newLine.target.parent.obj.add_connection(1,self.newLine.source.parent.obj) # Input stream if flag is 1
+ self.new_line.source = self
+ self.new_line.target = item
+ item.in_lines.append(self.new_line)
+ self.new_line.pointB = item.get_center()
+ if self.new_line.source.parent.obj.type not in stm:
+ self.new_line.source.parent.obj.add_connection(0,self.new_line.target.parent.obj)
+ if self.new_line.target.parent.obj.type not in stm:
+ self.new_line.target.parent.obj.add_connection(1,self.new_line.source.parent.obj) # Input stream if flag is 1
+
elif (self.type =='in') and (item.type == 'op'):
- self.newLine.source = item
- self.newLine.target = self
- item.outLines.append(self.newLine)
- self.newLine.pointA = item.getCenter()
- if self.newLine.source.parent.obj.type not in stm:
- self.newLine.source.parent.obj.add_connection(0,self.newLine.target.parent.obj)
- if self.newLine.target.parent.obj.type not in stm:
- self.newLine.target.parent.obj.add_connection(1,self.newLine.source.parent.obj)
+ self.new_line.source = item
+ self.new_line.target = self
+ item.out_lines.append(self.new_line)
+ self.new_line.pointA = item.get_center()
+ if self.new_line.source.parent.obj.type not in stm:
+ self.new_line.source.parent.obj.add_connection(0,self.new_line.target.parent.obj)
+ if self.new_line.target.parent.obj.type not in stm:
+ self.new_line.target.parent.obj.add_connection(1,self.new_line.source.parent.obj)
+
else:
- self.scene().removeItem(self.newLine)
- if(self.newLine in self.inLines):
- self.inLines.remove(self.newLine)
- if(self.newLine in self.outLines):
- self.outLines.remove(self.newLine)
- del self.newLine
+ self.scene().removeItem(self.new_line)
+ if(self.new_line in self.in_lines):
+ self.in_lines.remove(self.new_line)
+ if(self.new_line in self.out_lines):
+ self.out_lines.remove(self.new_line)
+ del self.new_line
super(NodeSocket, self).mouseReleaseEvent(event)
try:
- data = container.get_last_list('Undo')
+ data = Container.get_last_list('Undo')
comp_selected = data[-1]
data.remove(comp_selected)
for i in range(len(data)):
- if data[i].name == self.newLine.source.parent.obj.name:
- data[i] = self.newLine.source.parent.obj
- elif data[i].name == self.newLine.target.parent.obj.name:
- data[i] = self.newLine.target.parent.obj
+ if data[i].name == self.new_line.source.parent.obj.name:
+ data[i] = self.new_line.source.parent.obj
+ elif data[i].name == self.new_line.target.parent.obj.name:
+ data[i] = self.new_line.target.parent.obj
data.append(comp_selected)
- container.PUSH('Undo', data)
+ Container.push('Undo', data)
except Exception as e:
print(e)
- def getCenter(self):
+ def get_center(self):
rect = self.boundingRect()
center = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
center = self.mapToScene(center)
return center
+
+ def hoverEnterEvent(self, event):
+ print("in hover enter")
+ cursor = QCursor( Qt.CrossCursor )
+ QApplication.instance().setOverrideCursor(cursor)
+
+ def hoverLeaveEvent(self, event):
+ cursor = QCursor( Qt.ArrowCursor )
+ QApplication.instance().setOverrideCursor(cursor)
# all created node items will be put inside this list
# it is used for recreating the node lines by returning the node item object based on unit operation object's name
lst = []
-dockWidgetLst = []
+dock_widget_lst = []
+stack = []
class NodeItem(QtWidgets.QGraphicsItem):
@staticmethod
- def getInstances(namee):
+ def get_instances(namee):
for i in lst:
if i.name == namee:
return i
@staticmethod
- def getDockWidget():
- return dockWidgetLst
+ def get_dock_widget():
+ return dock_widget_lst
- def __init__(self,unitOpr, container):
- l = ['Mixer','Splitter']
+ def __init__(self,unit_operation, container, graphicsView):
+ l = ['Splitter','Mixer', 'DistillationColumn', 'Flash', 'CompoundSeparator', 'ShortcutColumn']
stm = ['MaterialStream', 'EnergyStream']
super(NodeItem, self).__init__()
-
- self.obj = unitOpr
+ print("in node item")
+ self.obj = unit_operation
self.container = container
+ self.graphicsView = graphicsView
self.name = self.obj.name
self.type = self.obj.type
+ print('Before obj.modes_list')
- default_tooltip = f"{self.name}\n\n"
- default_tooltip_dict = self.obj.paramgetter(self.obj.modesList[0])
- for i, j in default_tooltip_dict.items():
- if j is not None:
- default_tooltip = default_tooltip + f" {i} : {j}\n"
- self.setToolTip(default_tooltip)
+ if (self.obj.modes_list):
+ default_tooltip = f"{self.name}\n\n"
+ default_tooltip_dict = self.obj.param_getter(self.obj.modes_list[0])
+ for i, j in default_tooltip_dict.items():
+ if j is not None:
+ default_tooltip = default_tooltip + f" {i} : {j}\n"
+ self.setToolTip(default_tooltip)
self.nin = self.obj.no_of_inputs
self.nop = self.obj.no_of_outputs
-
- self.dockWidget = None
+ print('Before mixer')
+ if self.obj.type == 'Mixer':
+ text, ok = QInputDialog.getText(self.container.graphicsView, 'Mixer', 'Enter number of input:')
+ if ok and text:
+ self.nin = int(text)
+ self.obj.no_of_inputs = self.nin
+ self.obj.variables['NI']['value'] = self.nin
+ elif self.obj.type == 'Splitter':
+ text, ok = QInputDialog.getText(self.container.graphicsView, 'Splitter', 'Enter number of output:')
+ if ok and text:
+ self.nop = int(text)
+ self.obj.no_of_outputs = self.nop
+ self.obj.variables['NOO']['value'] = self.nop
+
+ self.dock_widget = None
lst.append(self)
+ print("before DockWidget")
+ if self.obj.type in l:
+ self.dock_widget = eval("DockWidget"+self.obj.type)(self.obj.name,self.obj.type,self.obj,self.container)
+ elif self.obj.type in stm:
+ self.dock_widget = eval("DockWidget"+self.obj.type)(self.obj.name,self.obj.type,self.obj,self.container)
+ else:
+ self.dock_widget = DockWidget(self.obj.name,self.obj.type,self.obj,self.container)
+ print('in dockwidget')
+ dock_widget_lst.append(self.dock_widget)
+ self.main_window= findMainWindow(self)
+ self.dock_widget.setFixedWidth(360)
+ self.dock_widget.setFixedHeight(640)
+ self.dock_widget.DockWidgetFeature(QDockWidget.AllDockWidgetFeatures)
+ self.main_window.addDockWidget(Qt.LeftDockWidgetArea, self.dock_widget)
+ self.dock_widget.hide()
+
+ print("after dockwidget")
- if(self.obj.type not in l):
- if (self.obj.type in stm):
- self.dockWidget = DockWidgetMatStm(self.obj.name,self.obj.type,self.obj,self.container)
- else:
- self.dockWidget = DockWidget(self.obj.name,self.obj.type,self.obj,self.container)
- dockWidgetLst.append(self.dockWidget)
- self.mainwindow= findMainWindow(self)
- self.dockWidget.setFixedWidth(360)
- self.dockWidget.setFixedHeight(640)
- self.dockWidget.DockWidgetFeature(QDockWidget.AllDockWidgetFeatures)
- self.mainwindow.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)
- self.dockWidget.hide()
-
- self.pic=QtGui.QPixmap("icons/"+self.type+".png")
+ self.pic=QtGui.QPixmap("Icons/"+self.type+".png")
+ # self.pic = QIcon("svg/Cooler.svg")
self.rect = QtCore.QRect(0,0,self.pic.width(),self.pic.height())
+ # self.rect = QtCore.QRect(0,0,100,100)
self.text = QGraphicsTextItem(self)
f = QFont()
f.setPointSize(8)
self.text.setFont(f)
- self.text.setDefaultTextColor(QtGui.QColor(73,36,73,255))
+ self.text.setDefaultTextColor(QtGui.QColor(0,70,70,220))
self.text.setParentItem(self)
- self.text.setPos(-2.5, self.rect.height()-15)
+ self.text.setPos(self.rect.width()-(self.rect.width()*0.9), self.rect.height())
self.text.setPlainText(self.name)
self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsMovable)
self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsSelectable)
- self.initUi()
# Brush
self.brush = QtGui.QBrush()
@@ -459,13 +520,15 @@ class NodeItem(QtWidgets.QGraphicsItem):
self.pen.setWidth(1)
self.pen.setColor(QtGui.QColor(20,20,20,255))
- self.selPen = QtGui.QPen()
- self.selPen.setStyle(QtCore.Qt.SolidLine)
- self.selPen.setWidth(2)
- self.selPen.setColor(QtGui.QColor(222,192,222))
+ self.sel_pen = QtGui.QPen()
+ self.sel_pen.setStyle(QtCore.Qt.SolidLine)
+ self.sel_pen.setWidth(1)
+ self.sel_pen.setColor(QtGui.QColor(220,220,220,255))
- def initUi(self):
- self.Input , self.Output = self.initializeSockets(self.type)
+ # initializing the node sockets
+ self.input , self.output = self.initialize_sockets(self.type)
+
+ print('after ndoe item')
def shape(self):
path = QtGui.QPainterPath()
@@ -477,57 +540,63 @@ class NodeItem(QtWidgets.QGraphicsItem):
def paint(self, painter, option, widget):
if self.isSelected():
- painter.setPen(self.selPen)
+ painter.setPen(self.sel_pen)
painter.drawRect(QtCore.QRectF(self.rect))
else:
painter.setPen(self.pen)
painter.drawPixmap(self.rect,self.pic)
-
- def initializeSockets(self,type):
- if(self.type=="Flash" or self.type=="CompSep"):
- Input = [NodeSocket(QtCore.QRect(-2.5+5.5,(self.rect.height()*x/(self.nin+1))-8,4,4), self, 'in') for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-7.5,(self.rect.height()*x*0.90/(self.nop+1))-4,4,4), self, 'op') for x in range(1,self.nop+1)]
- return Input,Output
+ # painter.drawPixmap(self.rect, self.pic.pixmap(QSize(1000,1000)))
+
+ def initialize_sockets(self,type):
+ print("inside initialization")
+ if(self.type=="Flash" or self.type=="CompoundSeparator"):
+ input = [NodeSocket(QtCore.QRect(5,(self.rect.height()*x/(self.nin+1)-2),4,4), self, 'in') for x in range(1,self.nin+1) ]
+ output = [NodeSocket(QtCore.QRect(self.rect.width()-9,(self.rect.height()*x*1/(self.nop+1)),4,4), self, 'op') for x in range(1,self.nop+1)]
+ return input,output
elif(self.type=="AdiabaticCompressor" or self.type=="AdiabaticExpander" or self.type =="Mixer" or self.type =="Splitter" or self.type =="Valve" ):
- Input = [NodeSocket(QtCore.QRect(-3.5,(self.rect.height()*x/(self.nin+1))-6,4,4), self, 'in') for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nop+1))-6,4,4), self, 'op') for x in range(1,self.nop+1)]
- return Input,Output
+ input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-2,4,4), self, 'in') for x in range(1,self.nin+1) ]
+ output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nop+1))-2,4,4), self, 'op') for x in range(1,self.nop+1)]
+ return input,output
elif(self.type=="Cooler" or self.type=="Heater"):
- Input = [NodeSocket(QtCore.QRect(3.5,(self.rect.height()*x/(self.nin+1))-4,4,4), self, 'in') for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-8.0,(self.rect.height()*x/(self.nop+1))-4,4,4), self, 'op') for x in range(1,self.nop+1)]
- return Input,Output
+ input = [NodeSocket(QtCore.QRect(3.5,(self.rect.height()*x/(self.nin+1))-2,4,4), self, 'in') for x in range(1,self.nin+1) ]
+ output = [NodeSocket(QtCore.QRect(self.rect.width()-8.0,(self.rect.height()*x/(self.nop+1))-2,4,4), self, 'op') for x in range(1,self.nop+1)]
+ return input,output
elif(self.type=="Pump"):
- Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-10,4,4), self, 'in') for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,-2.5,4,4), self, 'op') for x in range(1,self.nop+1)]
- return Input,Output
- elif(self.type=="DistCol" or self.type=="ShortCol"):
- Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-12,5,5), self, 'in') for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-5.5,(self.rect.height()*1.44*x/(self.nop+1))-67,5,5), self, 'op') for x in range(1,self.nop+1)]
- return Input,Output
+ input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-7, 4,4), self, 'in') for x in range(1,self.nin+1) ]
+ output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,-1.5,4,4), self, 'op') for x in range(1,self.nop+1)]
+ return input,output
+ elif(self.type=="DistillationColumn" or self.type=="ShortcutColumn"):
+ input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1)),5,5), self, 'in') for x in range(1,self.nin+1) ]
+ output = [NodeSocket(QtCore.QRect(self.rect.width()-5.5,(self.rect.height()*1.44*x/(self.nop+1))-55,5,5), self, 'op') for x in range(1,self.nop+1)]
+ return input,output
elif(self.type=="MaterialStream"):
- Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-1,4,4), self, 'in') for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nin+1))-1,4,4), self, 'op') for x in range(1,self.nop+1)]
- return Input,Output
+ input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1)-2),4,4), self, 'in') for x in range(1,self.nin+1) ]
+ output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,(self.rect.height()*x/(self.nin+1)-2),4,4), self, 'op') for x in range(1,self.nop+1)]
+ return input,output
def mouseMoveEvent(self, event):
super(NodeItem, self).mouseMoveEvent(event)
- for output in self.Output:
- for line in output.outLines:
- line.pointA = line.source.getCenter()
- line.pointB = line.target.getCenter()
- for input in self.Input:
- for line in input.inLines:
- line.pointA = line.source.getCenter()
- line.pointB = line.target.getCenter()
+ for op in self.output:
+ for line in op.out_lines:
+ line.pointA = line.source.get_center()
+ line.pointB = line.target.get_center()
+ for ip in self.input:
+ for line in ip.in_lines:
+ line.pointA = line.source.get_center()
+ line.pointB = line.target.get_center()
self.pos = event.scenePos()
- self.obj.setPos(self.pos)
+ self.obj.set_pos(self.pos)
#print(self.name, self.pos)
def mouseDoubleClickEvent(self, event):
- self.setPos(event.scenePos().x()-250,event.scenePos().y())
- temp = self.obj.pos
- self.dockWidget.show()
- self.setPos(temp)
+
+ self.graphicsView.setInteractive(False)
+ if len(stack):
+ print(stack)
+ stack[-1].hide()
+ self.dock_widget.show()
+ stack.append(self.dock_widget)
+ self.graphicsView.setInteractive(True)
def findMainWindow(self):
diff --git a/OMChem/ConvReactor.py b/OMChem/ConvReactor.py
index 9ad35da..9061294 100644
--- a/OMChem/ConvReactor.py
+++ b/OMChem/ConvReactor.py
@@ -8,12 +8,12 @@ class ConvReactor():
self.Z = str(Z)
self.a = json.dumps(a).replace('[','{').replace(']','}')
self.operation = str(operation)
- self.Tdef = str(Tdef)
self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = []
- self.OutputStms = []
+ self.OutputStms = [] self.Tdef = str(Tdef)
+
self.type = 'ConvReactor'
self.EngStms = EngStms(name="EngStm")
diff --git a/OMChem/Flowsheet.py b/OMChem/Flowsheet.py
index 25143ce..ab271af 100644
--- a/OMChem/Flowsheet.py
+++ b/OMChem/Flowsheet.py
@@ -9,7 +9,7 @@ class Flowsheet():
def __init__(self):
self.sim_name = 'Simulator'
self.sim_method = ''
- self.UnitOpn = []
+ self.unit_operations = []
self.data = []
self.compounds = []
self.interface = ''
@@ -19,7 +19,7 @@ class Flowsheet():
self.Flomo_path = os.path.join(self.sim_dir_path,'Flowsheet.mo')
self.eqn_mos_path = os.path.join(self.sim_dir_path,'simulateEQN.mos')
self.sm_mos_path = os.path.join(self.sim_dir_path,'simulateSM.mos')
- self.resdata = []
+ self.result_data = []
self.stdout=None
self.stderr=None
@@ -37,17 +37,17 @@ class Flowsheet():
print("The OpenModelica compiler is missing in the System path please install it" )
raise
- def add_UnitOpn(self,unitop):
- self.UnitOpn.append(unitop)
+ def add_unit_operations(self,unitop):
+ self.unit_operations.append(unitop)
- def remove_UnitOpn(self,unitop):
- self.UnitOpn.remove(unitop)
+ def remove_unit_operations(self,unitop):
+ self.unit_operations.remove(unitop)
- def add_comp_list(self,C):
+ def add_compound_list(self,C):
self.compounds = C
- def send_for_simulationEqn(self):
- self.resdata = []
+ def send_for_simulation_Eqn(self):
+ self.result_data = []
self.omc_path = self.get_omc_path()
print(self.omc_path)
@@ -69,18 +69,18 @@ class Flowsheet():
csvpath = os.path.join(self.sim_dir_path,'Flowsheet_res.csv')
print("csvPath",csvpath)
with open (csvpath,'r') as resultFile:
- self.resdata = []
+ self.result_data = []
print("opened")
csvreader = csv.reader(resultFile,delimiter=',')
for row in csvreader:
print("124125")
- self.resdata.append(row)
- print(self.resdata)
- #self.ExtData()
+ self.result_data.append(row)
+ print(self.result_data)
+ #self.ext_data()
- def send_for_simulationSM(self,unitop):
+ def send_for_simulation_SM(self,unitop):
- self.resdata = []
+ self.result_data = []
self.omc_path = self.get_omc_path()
os.chdir(self.sim_dir_path)
#os.system(self.omc_path + ' -s ' + unitop.name+'.mos')
@@ -90,28 +90,28 @@ class Flowsheet():
#print(s)
print("############### StdOut ################")
print(stdout)
- self.resdata = []
+ self.result_data = []
print('Simulating '+unitop.name+'...')
csvpath = os.path.join(self.sim_dir_path,unitop.name+'_res.csv')
with open(csvpath,'r') as resultFile:
csvreader = csv.reader(resultFile,delimiter=',')
for row in csvreader:
- self.resdata.append(row)
- self.ExtData()
+ self.result_data.append(row)
+ self.ext_data()
- def ExtData(self):
- for unit in self.UnitOpn:
+ def ext_data(self):
+ for unit in self.unit_operations:
if unit[0].type == 'MaterialStream':
for key, value in unit[0].Prop.items():
- propertyname = unit[0].name + '.' + key
- if propertyname in self.resdata[0]:
- ind = self.resdata[0].index(propertyname)
- resultval = str(self.resdata[-1][ind])
+ property_name = unit[0].name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
#resultval = str(omc.sendExpression("val("+unit.name+ "." + value + ", 0.5)"))
print(resultval)
unit[0].Prop[key] = resultval
- def simulateEQN(self):
+ def simulate_EQN(self):
self.data = []
print("##################################################")
print("##################################################")
@@ -123,7 +123,7 @@ class Flowsheet():
lcase = c.lower()
self.data.append("parameter database." + ucase +' '+ ucase + "; \n")
- for unitop in self.UnitOpn:
+ for unitop in self.unit_operations:
if unitop.type != 'MaterialStream':
self.data.append(unitop.OM_Flowsheet_Initialize())
else:
@@ -134,13 +134,13 @@ class Flowsheet():
self.outlist = []
self.stm = ['MaterialStream','EngStm']
- for unitop in self.UnitOpn:
+ for unitop in self.unit_operations:
if unitop.type not in self.stm:
- for j in unitop.OutputStms:
+ for j in unitop.output_stms:
self.outlist.append(j)
print(j.name)
- for unitop in self.UnitOpn:
+ for unitop in self.unit_operations:
if unitop not in self.outlist:
if unitop.type == 'MaterialStream':
@@ -163,14 +163,14 @@ class Flowsheet():
print('Initiating Simulation in Equation Oriented Mode')
- self.send_for_simulationEqn()
+ self.send_for_simulation_Eqn()
- def simulateSM(self,ip,op):
+ def simulate_SM(self,ip,op):
print("ip op = ", ip, op)
self.sim_method = 'SM'
self.data = []
- self.resdata = []
+ self.result_data = []
self.unit = []
self.csvlist = []
print("op list",op)
@@ -204,8 +204,8 @@ class Flowsheet():
os.chdir(self.root_dir)
self.data = []
if unitop.type not in ['MaterialStream','EngStm']:
- inpstms = unitop.InputStms
- outstms = unitop.OutputStms
+ inpstms = unitop.input_stms
+ outstms = unitop.output_stms
try:
engstms = unitop.EngStms
@@ -267,7 +267,7 @@ class Flowsheet():
mosFile.write("simulate("+unitop.name.lower()+", outputFormat=\"csv\", stopTime=1.0, numberOfIntervals=1);\n")
print("Initiating simulation in Sequential Modular Mode")
- #self.resdata = []
+ #self.result_data = []
self.omc_path = self.get_omc_path()
os.chdir(self.sim_dir_path)
#os.system(self.omc_path + ' -s ' + unitop[0].name.lower()+"SEQ"+'.mos')
@@ -290,43 +290,43 @@ class Flowsheet():
with open(csvpath,'r') as resultFile:
csvreader = csv.reader(resultFile,delimiter=',')
for row in csvreader:
- self.resdata.append(row)
+ self.result_data.append(row)
os.chdir(self.root_dir)
if type(inpstms) is list:
for stm in inpstms:
for key,value in stm.Prop.items():
- propertyname = stm.name + '.' + key
- if propertyname in self.resdata[0]:
- ind = self.resdata[0].index(propertyname)
- resultval = str(self.resdata[-1][ind])
+ property_name = stm.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
stm.Prop[key] = resultval
#print("input",stm.Prop[key])
else:
for key, value in inpstms.Prop.items():
- propertyname = inpstms.name + '.' + key
- if propertyname in self.resdata[0]:
- ind = self.resdata[0].index(propertyname)
- resultval = str(self.resdata[-1][ind])
+ property_name = inpstms.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
inpstms.Prop[key] = resultval
#print("input",inpstms.Prop[key])
if type(outstms) is list:
for stm in outstms:
for key, value in stm.Prop.items():
- propertyname = stm.name + '.' + key
- if propertyname in self.resdata[0]:
- ind = self.resdata[0].index(propertyname)
- resultval = str(self.resdata[-1][ind])
+ property_name = stm.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
stm.Prop[key] = resultval
print("output key:",key,"value:",stm.Prop[key])
else:
for key, value in outstms.Prop.items():
- propertyname = outstms.name + '.' + key
- if propertyname in self.resdata[0]:
- ind = self.resdata[0].index(propertyname)
- resultval = str(self.resdata[-1][ind])
+ property_name = outstms.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
outstms.Prop[key] = resultval
print("output key:",key,"value:",outstms.Prop[key])
@@ -334,8 +334,8 @@ class Flowsheet():
os.chdir(self.sim_dir_path)
dffinal = pd.concat(self.dataframes,axis=1)
dffinal.to_csv('FlowsheetSEQ.csv',index=False)
- self.resdata.clear()
+ self.result_data.clear()
with open(os.path.join(self.sim_dir_path+'/FlowsheetSEQ.csv'),'r') as resultFile:
csvreader = csv.reader(resultFile,delimiter=',')
for row in csvreader:
- self.resdata.append(row)
+ self.result_data.append(row)
diff --git a/Simulator/Databases/Databases.py b/Simulator/Databases/Databases.py
index d7dc797..4b3a4c6 100644
--- a/Simulator/Databases/Databases.py
+++ b/Simulator/Databases/Databases.py
@@ -17,16 +17,12 @@ class ChemsepDatabase():
self.name = 'chemsep'
for comp in compound:
self.compName=comp.getElementsByTagName('CompoundID')[0].getAttribute('value')
- self.comp_name_list.append(self.compName+'(' + self.name + ')')
-
- self.comp_prop_list=list()
-
+ self.comp_name_list.append(self.compName+'(' + self.name + ')')
+ self.comp_prop_list=list()
def get_comp_name_list(self):
return self.comp_name_list
-
-
#attrib:
#CAS fro CAS Number
#CompoundID for Name
@@ -35,9 +31,7 @@ class ChemsepDatabase():
#GETTING 'ATTRIBUTE''S VALUE OF THE COMPOUND 'COMPS'
-#COMP IS AN ITERATING VALUE IN THE XML TAG COMPOUND
-
-
+#COMP IS AN ITERATING VALUE IN THE XML TAG COMPOUND
def get_value(self,comps,attrib):
self.comps=comps
self.x=''
@@ -47,8 +41,7 @@ class ChemsepDatabase():
try:
self.x=comp.getElementsByTagName(attrib)[0].getAttribute("value")
except IndexError:
- self.x = "-"
-
+ self.x = "-"
return (self.x)
#CREATING comp_prop_list LIST OF THE COMPOUND SELECTED
@@ -58,9 +51,7 @@ class ChemsepDatabase():
self.comps = comps
for comp in compound:
compName = comp.getElementsByTagName("CompoundID")[0].getAttribute("value")
- if compName==self.comps:
-
-
+ if compName==self.comps:
CompName = compName.replace(" ","")
CompName = CompName.replace("-","")
CompName = CompName.replace(",","")
@@ -140,8 +131,7 @@ class ChemsepDatabase():
RacketParam = comp.getElementsByTagName("RacketParameter")[0].getAttribute("value")
except IndexError:
RacketParam = "0"
-
-
+
try:
LiqDen = comp.getElementsByTagName("LiquidDensity")[0]
LiqDenEqn = LiqDen.getElementsByTagName("eqno")[0].getAttribute("value")
@@ -358,8 +348,6 @@ class ChemsepDatabase():
except IndexError:
ChaoSeadLV = 0
-
-
#f.write('Package database')
self.comp_prop_list.append('model '+CompName)
#f.write('\n')
@@ -440,7 +428,4 @@ class ChemsepDatabase():
#return self.comp_prop_list
return self.comp_prop_list
-
-
-
- \ No newline at end of file
+ \ No newline at end of file
diff --git a/Simulator/Simulator/UnitOperations/Mixer.mo b/Simulator/Simulator/UnitOperations/Mixer.mo
index 1be69eb..ae0a1d9 100644
--- a/Simulator/Simulator/UnitOperations/Mixer.mo
+++ b/Simulator/Simulator/UnitOperations/Mixer.mo
@@ -26,9 +26,9 @@ model Mixer "Model of a mixer to mix multiple material streams"
Real xout_c[Nc](each unit = "-", each min = 0, each max = 1, start = xguess) "Outlet stream component mol fraction";
//================================================================================
// Files.Interfaces.matConn inlet[NI](each Nc = Nc);
- Simulator.Files.Interfaces.matConn outlet(Nc = Nc) annotation(
+ Simulator.Files.Interfaces.matConn Out(Nc = Nc) annotation(
Placement(visible = true, transformation(origin = {100, -2}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
- Simulator.Files.Interfaces.matConn inlet[NI](each Nc = Nc) annotation(
+ Simulator.Files.Interfaces.matConn In[NI](each Nc = Nc) annotation(
Placement(visible = true, transformation(origin = {-100, -2}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
extends GuessModels.InitialGuess;
@@ -36,21 +36,21 @@ model Mixer "Model of a mixer to mix multiple material streams"
equation
//Connector equation
for i in 1:NI loop
- inlet[i].P = Pin[i];
- inlet[i].T = Tin_s[i];
- inlet[i].F = Fin_s[i];
- inlet[i].H = Hin_s[i];
- inlet[i].S = Sin_s[i];
- inlet[i].x_pc[1, :] = xin_sc[i, :];
- inlet[i].xvap = xvapin_s[i];
+ In[i].P = Pin[i];
+ In[i].T = Tin_s[i];
+ In[i].F = Fin_s[i];
+ In[i].H = Hin_s[i];
+ In[i].S = Sin_s[i];
+ In[i].x_pc[1, :] = xin_sc[i, :];
+ In[i].xvap = xvapin_s[i];
end for;
- outlet.P = Pout;
- outlet.T = Tout;
- outlet.F = Fout;
- outlet.H = Hout;
- outlet.S = Sout;
- outlet.x_pc[1, :] = xout_c[:];
- outlet.xvap = xvapout;
+ Out.P = Pout;
+ Out.T = Tout;
+ Out.F = Fout;
+ Out.H = Hout;
+ Out.S = Sout;
+ Out.x_pc[1, :] = xout_c[:];
+ Out.xvap = xvapout;
//===================================================================================
//Output Pressure
if outPress == "Inlet_Minimum" then
diff --git a/Streams.py b/Streams.py
index f35a056..81586f1 100644
--- a/Streams.py
+++ b/Streams.py
@@ -1,4 +1,4 @@
-from OMPython import OMCSession
+# from OMPython import OMCSession
from PyQt5.QtCore import *
import json
import sys
@@ -6,19 +6,19 @@ from collections import defaultdict
class MaterialStream():
counter = 1
- def __init__(self, CompNames = []):
+ def __init__(self, compound_names = []):
self.name = 'MaterialStream' + str(MaterialStream.counter)
self.type = 'MaterialStream'
- self.CompNames = CompNames
+ self.compound_names = compound_names
self.count = MaterialStream.counter
- self.thermoPackage ="RaoultsLaw"
+ self.thermo_package ="RaoultsLaw"
self.mode1 = "P"
self.mode2 = "T"
- self.mode1val = ""
- self.mode2val = ""
+ self.mode1_val = ""
+ self.mode2_val = ""
self.OM_data_init = ''
self.OM_data_eqn = ''
self.no_of_inputs = 1
@@ -27,9 +27,9 @@ class MaterialStream():
self.y = 2500-30
self.pos = QPointF(self.x, self.y)
MaterialStream.counter+=1
- self.startDict = {}
- self.eqnDict = {}
- self.modesList = ["PT","PH","PVF","TVF","PS"]
+ self.start_dict = {}
+ self.eqn_dict = {}
+ self.modes_list = ["PT","PH","PVF","TVF","PS"]
self.variables = {
'P' : {'name':'Pressure', 'value':101325, 'unit':'Pa'}, # {'Pa':1, 'mmHg':0, 'N/m^2':0}},
@@ -54,10 +54,10 @@ class MaterialStream():
'F_pc' : {'name':'Mole Flow', 'value':100, 'unit':'mol/s'},
'Fm_pc' : {'name':'Mass Flow', 'value':None, 'unit':'g/s'},
}
- self.initVariables()
+ self.init_variables()
- def initVariables(self):
- for i, val in enumerate(self.CompNames):
+ def init_variables(self):
+ for i, val in enumerate(self.compound_names):
self.variables['x_pc[1,'+ str(i+1)+']'] = {'name':val + ' Mixture Mole Fraction', 'value':None, 'unit':'mol/s'}
self.variables['xm_pc[1,'+ str(i+1)+']'] = {'name':val + ' Mixture Mass Fraction', 'value':None, 'unit':'g/s'}
self.variables['F_pc[1,'+ str(i+1)+']'] = {'name':val + ' Mixture Mole Flow', 'value':None, 'unit':'mol/s'}
@@ -73,46 +73,46 @@ class MaterialStream():
self.variables['F_pc[3,'+ str(i+1)+']'] = {'name':[val + ' Vapour Mole Flow'], 'value':None, 'unit':'mol/s'}
self.variables['Fm_pc[3,'+ str(i+1)+']'] = {'name':[val + ' Vapour Mass Flow'], 'value':None, 'unit':'g/s'}
- for i in self.CompNames:
+ for i in self.compound_names:
self.variables[i] = {'value':''}
- def paramgetter(self,mode):
+ def param_getter(self,mode):
dict = {}
if(mode=="PT"):
self.mode1 = 'P'
self.mode2 = 'T'
dict = {self.mode1:self.variables['P']['value'], self.mode2:self.variables['T']['value'],
- "MolFlow":self.variables['F_pc']['value'],"x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage}
+ "MolFlow":self.variables['F_pc']['value'],"x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package}
elif(mode=="PH"):
self.mode1 = 'P'
self.mode2 = 'H_p[1]'
dict = {self.mode1:self.variables['P']['value'], self.mode2:self.variables['H_p[1]']['value'],
- "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage}
+ "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package}
elif(mode=="PVF"):
self.mode1 = 'P'
self.mode2 = 'xvap'
dict = {self.mode1:self.variables['P']['value'], self.mode2:self.variables['xvap']['value'],
- "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage}
+ "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package}
elif(mode=="TVF"):
self.mode1 = 'T'
self.mode2 = 'xvap'
dict = {self.mode1:self.variables['T']['value'], self.mode2:self.variables['xvap']['value'],
- "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage}
+ "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package}
elif(mode=="PS"):
self.mode1 = 'P'
self.mode2 = 'S_p[1]'
dict = {self.mode1:self.variables['P']['value'], self.mode2: self.variables['S_p[1]']['value'],
- "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermoPackage":self.thermoPackage}
+ "MolFlow":self.variables['F_pc']['value'], "x_pc":self.variables['x_pc']['value'], "thermo_package":self.thermo_package}
return dict
- def paramsetter(self,dict):
+ def param_setter(self,dict):
print("inside paramsetter ", dict)
self.variables['x_pc']['value'] = dict['x_pc'].split(",")
- self.thermoPackage = dict['thermoPackage']
+ self.thermo_package = dict['thermo_package']
self.variables['F_p[1]']['value'] = dict['MolFlow']
print("inside")
# self.Prop[self.mode2] = dict[self.mode2]
@@ -122,7 +122,7 @@ class MaterialStream():
print(self.variables)
print(self.variables['x_pc']['value'])
- for i in range(len(self.CompNames)):
+ for i in range(len(self.compound_names)):
print('####### x_pc #########\n',self.variables['x_pc']['value'][i])
print('x_pc')
if self.variables['x_pc']['value'][i]:
@@ -141,7 +141,7 @@ class MaterialStream():
self.variables['Fm_pc[1,'+str(i+1)+']']['value'] = None
print('first for')
print('secnod for')
- for i in range(0,len(self.CompNames)):
+ for i in range(0,len(self.compound_names)):
self.variables['x_pc[2,'+str(i+1)+']']['value'] = None
self.variables['xm_pc[2,'+str(i+1)+']']['value'] = None
self.variables['F_pc[2,'+str(i+1)+']']['value'] = None
@@ -152,12 +152,12 @@ class MaterialStream():
self.variables['F_pc[3,'+str(i+1)+']']['value'] = None
self.variables['Fm_pc[3,'+str(i+1)+']']['value'] = None
- def setPos(self,pos):
+ def set_pos(self,pos):
self.pos = pos
- def GetMinEqnValues(self):
+ def get_min_eqn_values(self):
x_pclist = []
- for i in range(0,len(self.CompNames)):
+ for i in range(0,len(self.compound_names)):
#print(self.Prop['x_pc[1,'+str(i+1)+']'])
#x_pclist.append(self.Prop['x_pc[1,'+str(i+1)+']'])
x_pclist.append(self.variables['x_pc[1,'+str(i+1)+']']['value'])
@@ -175,13 +175,13 @@ class MaterialStream():
x_pcstr = x_pcstr.replace('"','')
'''
if self.variables[self.mode1]['value']:
- self.eqnDict[self.mode1] = self.variables[self.mode1]['value']
+ self.eqn_dict[self.mode1] = self.variables[self.mode1]['value']
if self.variables[self.mode2]['value']:
- self.eqnDict[self.mode2] = self.variables[self.mode2]['value']
+ self.eqn_dict[self.mode2] = self.variables[self.mode2]['value']
if self.variables['x_pc']['value']:
- self.eqnDict['x_pc[1,:]'] = x_pc
+ self.eqn_dict['x_pc[1,:]'] = x_pc
if self.variables['F_pc']['value']:
- self.eqnDict['F_p[1]'] = self.variables['F_pc']['value']
+ self.eqn_dict['F_p[1]'] = self.variables['F_pc']['value']
print("##############$GetMinVEqnValuesStart$##################")
print("P:",self.variables[self.mode1]['value'])
@@ -190,66 +190,66 @@ class MaterialStream():
print("F_p",self.variables['F_p[1]']['value'])
print("##############$GetMinVEqnValuesEnd$##################")
- def GetStartValues(self):
+ def get_start_values(self):
try:
if self.variables[self.mode1]['value']:
- self.startDict[self.mode1] = self.variables[self.mode1]['value']
+ self.start_dict[self.mode1] = self.variables[self.mode1]['value']
if self.variables[self.mode2]['value']:
- self.startDict[self.mode2] = self.variables[self.mode2]['value']
+ self.start_dict[self.mode2] = self.variables[self.mode2]['value']
if self.variables['x_pc[2,1]']['value'] != None:
x_pcarr = []
for i in range(1,4):
cmf = []
- for j in range(1,len(self.CompNames)+1):
+ for j in range(1,len(self.compound_names)+1):
cmf.append(str(self.variables['x_pc['+str(i)+','+str(j)+']']['value']))
x_pcarr.append(cmf)
x_pcstr = json.dumps(x_pcarr)
x_pcstr = x_pcstr.replace('[','{')
x_pcstr = x_pcstr.replace(']','}')
x_pcstr = x_pcstr.replace('"','')
- self.startDict['x_pc'] = x_pcstr
+ self.start_dict['x_pc'] = x_pcstr
if self.variables['xm_pc[2,1]']['value'] != None:
xm_pcarr = []
for i in range(1,4):
cmf = []
- for j in range(1,len(self.CompNames)+1):
+ for j in range(1,len(self.compound_names)+1):
cmf.append(str(self.variables['xm_pc['+str(i)+','+str(j)+']']['value']))
xm_pcarr.append(cmf)
xm_pcstr = json.dumps(x_pcarr)
xm_pcstr = xm_pcstr.replace('[','{')
xm_pcstr = xm_pcstr.replace(']','}')
xm_pcstr = xm_pcstr.replace('"','')
- self.startDict['xm_pc'] = xm_pcstr
+ self.start_dict['xm_pc'] = xm_pcstr
if self.variables['Fm_pc[2,1]']['value'] != None:
Fm_pcarr = []
for i in range(1,4):
cmf = []
- for j in range(1,len(self.CompNames)+1):
+ for j in range(1,len(self.compound_names)+1):
cmf.append(str(self.variables['Fm_pc['+str(i)+','+str(j)+']']['value']))
Fm_pcarr.append(cmf)
Fm_pcstr = json.dumps(x_pcarr)
Fm_pcstr = Fm_pcstr.replace('[','{')
Fm_pcstr = Fm_pcstr.replace(']','}')
Fm_pcstr = Fm_pcstr.replace('"','')
- self.startDict['Fm_pc'] = Fm_pcstr
+ self.start_dict['Fm_pc'] = Fm_pcstr
if self.variables['F_pc[2,1]']['value'] != None:
F_pcarr = []
for i in range(1,4):
cmf = []
- for j in range(1,len(self.CompNames)+1):
+ for j in range(1,len(self.compound_names)+1):
cmf.append(str(self.variables['F_pc['+str(i)+','+str(j)+']']['value']))
F_pcarr.append(cmf)
F_pcstr = json.dumps(F_pcarr)
F_pcstr = F_pcstr.replace('[','{')
F_pcstr = F_pcstr.replace(']','}')
F_pcstr = F_pcstr.replace('"','')
- self.startDict['F_pc'] = F_pcstr
+ self.start_dict['F_pc'] = F_pcstr
if self.variables['MW_p[2]']['value'] != None:
MW_pArr = []
@@ -259,7 +259,7 @@ class MaterialStream():
MW_pStr = MW_pStr.replace('[','{')
MW_pStr = MW_pStr.replace(']','}')
MW_pStr = MW_pStr.replace('"','')
- self.startDict['MW_p'] = MW_pStr
+ self.start_dict['MW_p'] = MW_pStr
if self.variables['F_p[2]']['value'] != None:
F_pArr = []
@@ -269,7 +269,7 @@ class MaterialStream():
F_pStr = F_pStr.replace('[','{')
F_pStr = F_pStr.replace(']','}')
F_pStr = F_pStr.replace('"','')
- self.startDict['F_p'] = F_pStr
+ self.start_dict['F_p'] = F_pStr
if self.variables['Cp_p[2]']['value'] != None:
Cp_pArr = []
@@ -279,7 +279,7 @@ class MaterialStream():
Cp_pStr = Cp_pStr.replace('[','{')
Cp_pStr = Cp_pStr.replace(']','}')
Cp_pStr = Cp_pStr.replace('"','')
- self.startDict['Cp_p'] = Cp_pStr
+ self.start_dict['Cp_p'] = Cp_pStr
if self.variables['H_p[2]']['value'] != None:
H_pArr = []
@@ -289,7 +289,7 @@ class MaterialStream():
H_pStr = H_pStr.replace('[','{')
H_pStr = H_pStr.replace(']','}')
H_pStr = H_pStr.replace('"','')
- self.startDict['H_p'] = H_pStr
+ self.start_dict['H_p'] = H_pStr
if self.variables['S_p[2]']['value'] != None:
@@ -300,7 +300,7 @@ class MaterialStream():
S_pStr = S_pStr.replace('[','{')
S_pStr = S_pStr.replace(']','}')
S_pStr = S_pStr.replace('"','')
- self.startDict['S_p'] = S_pStr
+ self.start_dict['S_p'] = S_pStr
if self.variables['Fm_p[2]']['value'] != None:
Fm_pArr = []
@@ -310,7 +310,7 @@ class MaterialStream():
Fm_pStr = Fm_pStr.replace('[','{')
Fm_pStr = Fm_pStr.replace(']','}')
Fm_pStr = Fm_pStr.replace('"','')
- self.startDict['Fm_p'] = Fm_pStr
+ self.start_dict['Fm_p'] = Fm_pStr
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
@@ -322,10 +322,10 @@ class MaterialStream():
self.OM_data_init = ''
self.OM_data_init = self.OM_data_init + ("model ms"+str(self.count)+"\n")
self.OM_data_init = self.OM_data_init + ("extends Simulator.Streams.MaterialStream;\n" )
- self.OM_data_init = self.OM_data_init + ("extends Simulator.Files.ThermodynamicPackages."+self.thermoPackage+";\n")
+ self.OM_data_init = self.OM_data_init + ("extends Simulator.Files.ThermodynamicPackages."+self.thermo_package+";\n")
self.OM_data_init = self.OM_data_init + ("end ms"+str(self.count)+";\n")
comp_count = len(addedcomp)
- # self.GetStartValues()
+ # self.get_start_values()
#self.OM_data_init = "Simulator.Streams.Mat_Stm_RL " + self.name +"(Nc = " + str(comp_count)
self.OM_data_init = self.OM_data_init + "ms"+str(self.count) +" " + self.name +"(Nc = " + str(comp_count)
@@ -333,7 +333,7 @@ class MaterialStream():
C = str(addedcomp).strip('[').strip(']')
C = C.replace("'","")
self.OM_data_init = self.OM_data_init + C + "},"
- #for key, value in self.startDict.items():
+ #for key, value in self.start_dict.items():
# self.OM_data_init = self.OM_data_init + key + '(start = ' + str(value) + '),'
self.OM_data_init = self.OM_data_init[:-1]
self.OM_data_init = self.OM_data_init + ');\n'
@@ -344,402 +344,14 @@ class MaterialStream():
self.OM_data_eqn = ''
self.comp_count = len(addedcomp)
if method == 'Eqn':
- self.eqnDict = {}
- self.GetMinEqnValues()
+ self.eqn_dict = {}
+ self.get_min_eqn_values()
if method == 'SM':
- self.eqnDict = {}
- self.GetMinEqnValues()
+ self.eqn_dict = {}
+ self.get_min_eqn_values()
#self.GetEquationValues()
#self.GetEquationValues()
- for key,value in self.eqnDict.items():
+ for key,value in self.eqn_dict.items():
self.OM_data_eqn = self.OM_data_eqn + self.name + '.'+ key + ' = ' + str(value) + ';\n'
return self.OM_data_eqn
-
-
-'''
-from OMPython import OMCSession
-from PyQt5.QtCore import *
-import json
-import sys
-from collections import defaultdict
-
-class MaterialStream():
- counter = 1
- def __init__(self,CompNames = [],Temperature=300,Pressure=101325,xvap=None,xmvap=None,xliq=None,xmliq=None,x_pc = [1.0], xm_pc = [], MolFlow=100, MasFlow=None,**kwargs):
- self.name = 'MaterialStream' + str(MaterialStream.counter)
- self.type = 'MaterialStream'
- self.T = Temperature
- self.P = Pressure
- self.xvap = xvap
- self.xmvap = xmvap
- self.xliq = xliq
- self.xmliq = xmliq
- self.CompNames = CompNames
- self.x_pc = x_pc
- self.xm_pc = xm_pc
- self.MolFlow = MolFlow
- self.MasFlow = MasFlow
- self.OM_data_init = ''
- self.OM_data_eqn = ''
- self.count = MaterialStream.counter
- self.thermoPackage ="RaoultsLaw"
- self.mode1 = "P"
- self.mode1val = ""
- self.mode2 = "T"
- self.mode2val = ""
- self.no_of_inputs = 1
- self.no_of_outputs = 1
- self.x = 2500-30
- self.y = 2500-30
- self.pos = QPointF(self.x, self.y)
- MaterialStream.counter+=1
- self.startDict = {}
- self.eqnDict = {}
- self.modesList = ["PT","PH","PVF","TVF","PS"]
-
- self.Prop = {
-
- self.mode1:self.mode1val,
- self.mode2:self.mode2val,
- 'xliq':xliq,
- 'xmliq':xmliq,
- 'xvap':xvap,
- 'xmvap':xmvap,
- 'F_p[1]':MolFlow,
- 'Fm_p[1]':MasFlow,
- 'MW_p[1]':None,
- 'MW_p[2]':None,
- 'MW_p[3]':None,
- 'Cp_p[1]':None,
- 'H_p[1]':None,
- 'S_p[1]':None,
- 'Cp_p[2]':None,
- 'H_p[2]':None,
- 'S_p[2]':None,
- 'Cp_p[3]':None,
- 'H_p[3]':None,
- 'S_p[3]':None,
- 'F_p[2]':None,
- 'Fm_p[2]':None,
- 'F_p[3]':None,
- 'Fm_p[3]':None
-
- }
-
- self.Prop1 = {
- self.mode1:self.mode1val,
- self.mode2:self.mode2val,
- 'xliq':xliq,
- 'xmliq':xmliq,
- 'xvap':xvap,
- 'xmvap':xmvap,
- 'F_p[1]':MolFlow,
- 'Fm_p[1]':MasFlow,
- 'MW_p[1]':None,
- 'MW_p[2]':None,
- 'MW_p[3]':None,
- 'Cp_p[1]':None,
- 'H_p[1]':None,
- 'S_p[1]':None,
- 'Cp_p[2]':None,
- 'H_p[2]':None,
- 'S_p[2]':None,
- 'Cp_p[3]':None,
- 'H_p[3]':None,
- 'S_p[3]':None,
- 'F_p[2]':None,
- 'Fm_p[2]':None,
- 'F_p[3]':None,
- 'Fm_p[3]':None
-
- }
-
- def paramgetter(self,mode):
- dict = {}
- # print("Hello hello ", mode)
- # if(mode == None):
- # mode = self.modesList[0]
- if(mode=="PT"):
- self.mode1 = 'P'
- self.mode2 = 'T'
- dict = {self.mode2:self.T,self.mode1:self.P,"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage}
- elif(mode=="PH"):
- self.mode1 = 'P'
- self.mode2 = 'H_p[1]'
- dict = {self.mode1:self.P,self.mode2:self.Prop['H_p[1]'],"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage}
- elif(mode=="PVF"):
- self.mode1 = 'P'
- self.mode2 = 'xvap'
- dict = {self.mode1:self.P,self.mode2:self.xvap,"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage}
- elif(mode=="TVF"):
- self.mode1 = 'T'
- self.mode2 = 'xvap'
- dict = {self.mode1:self.T,self.mode2:self.xvap,"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage}
- elif(mode=="PS"):
- self.mode1 = 'P'
- self.mode2 = 'S_p[1]'
- dict = {self.mode1:self.P,self.mode2:self.Prop['S_p[1]'],"x_pc":self.x_pc,"MolFlow":self.MolFlow,"thermoPackage":self.thermoPackage}
-
- return dict
-
- def paramsetter(self,dict):
- self.mode1val = dict[self.mode1]
- self.mode2val = dict[self.mode2]
- self.MolFlow = dict['MolFlow']
- self.x_pc = dict['x_pc'].split(",")
- self.thermoPackage = dict['thermoPackage']
- self.Prop['F_p[1]'] = self.MolFlow
- self.Prop[self.mode2] = dict[self.mode2]
- self.Prop[self.mode1] = dict[self.mode1]
- for i in range(len(self.CompNames)):
- print('####### x_pc #########\n',self.x_pc[i])
- if self.x_pc:
- self.Prop['x_pc[1,'+str(i+1)+']'] = self.x_pc[i]
- else:
- self.Prop['x_pc[1,'+str(i+1)+']'] = None
-
- if self.xm_pc:
- self.Prop['xm_pc[1,'+str(i+1)+']'] = self.xm_pc[i]
- else:
- self.Prop['xm_pc[1,'+str(i+1)+']'] = None
-
- self.Prop['F_pc[1,'+str(i+1)+']'] = None
- self.Prop['Fm_pc[1,'+str(i+1)+']'] = None
- for i in range(0,len(self.CompNames)):
- self.Prop['x_pc[2,'+str(i+1)+']'] = None
- self.Prop['xm_pc[2,'+str(i+1)+']'] = None
- self.Prop['F_pc[2,'+str(i+1)+']'] = None
- self.Prop['Fm_pc[2,'+str(i+1)+']'] = None
- self.Prop['x_pc[3,'+str(i+1)+']'] = None
- self.Prop['xm_pc[3,'+str(i+1)+']'] = None
- self.Prop['F_pc[3,'+str(i+1)+']'] = None
- self.Prop['Fm_pc[3,'+str(i+1)+']'] = None
-
- def setPos(self,pos):
- self.pos = pos
-
- def GetMinEqnValues(self):
- x_pclist = []
- for i in range(0,len(self.CompNames)):
- print(self.Prop['x_pc[1,'+str(i+1)+']'])
- x_pclist.append(self.Prop['x_pc[1,'+str(i+1)+']'])
- print(x_pclist)
- #x_pclist = list(self.Prop(x_pc[1,1)])
- x_pc = json.dumps(x_pclist)
- print(x_pc)
- x_pc = x_pc.replace('[','{')
- x_pc = x_pc.replace(']','}')
- x_pc = x_pc.replace('"','')
-
- # x_pcstr = json.dumps(self.x_pc)
- # x_pcstr = x_pcstr.replace('[','{')
- # x_pcstr = x_pcstr.replace(']','}')
- # x_pcstr = x_pcstr.replace('"','')
-
- if self.Prop[self.mode1]:
- self.eqnDict[self.mode1] = self.Prop[self.mode1]
- if self.Prop[self.mode2]:
- self.eqnDict[self.mode2] = self.Prop[self.mode2]
- if self.x_pc:
- self.eqnDict['x_pc[1,:]'] = x_pc
- if self.MolFlow:
- self.eqnDict['F_p[1]'] = self.Prop['F_p[1]']#self.MolFlow
-
- print("##############$GetMinVEqnValuesStart$##################")
- print("P:",self.Prop[self.mode1])
- print("T:",self.Prop[self.mode2])
- print("x_pc",x_pc)
- print("F_p",self.Prop['F_p[1]'])
- print("##############$GetMinVEqnValuesEnd$##################")
-
- # def GetEquationValues(self): # Not being called anywhere
- # if self.Prop[self.mode1]:
- # self.eqnDict[self.mode1] = self.Prop[self.mode1]
-
- # if self.Prop[self.mode2]:
- # self.eqnDict[self.mode2] = self.Prop[self.mode2]
-
- # if self.Prop['x_pc[1,1]']:
- # cfa = []
- # for i in range(1,len(self.CompNames)+1):
- # cfa.append(self.Prop['x_pc[1,'+str(i)+']'])
- # cmpMolFracstr = json.dumps(cfa)
- # cmpMolFracstr = cmpMolFracstr.replace('[','{')
- # cmpMolFracstr = cmpMolFracstr.replace(']','}')
- # cmpMolFracstr = cmpMolFracstr.replace('"','')
- # self.eqnDict['x_pc[1,:]'] = cmpMolFracstr
-
- # if self.Prop['F_p[1]']:
- # self.eqnDict['F_p[1]'] = self.Prop['F_p[1]']
-
-
- def GetStartValues(self):
- try:
- if self.Prop[self.mode1]:
- self.startDict[self.mode1] = self.Prop[self.mode1]
-
- if self.Prop[self.mode2]:
- self.startDict[self.mode2] = self.Prop[self.mode2]
-
-
- if self.Prop['x_pc[2,1]'] != None:
- x_pcarr = []
- for i in range(1,4):
- cmf = []
- for j in range(1,len(self.CompNames)+1):
- cmf.append(str(self.Prop['x_pc['+str(i)+','+str(j)+']']))
- x_pcarr.append(cmf)
- x_pcstr = json.dumps(x_pcarr)
- x_pcstr = x_pcstr.replace('[','{')
- x_pcstr = x_pcstr.replace(']','}')
- x_pcstr = x_pcstr.replace('"','')
- self.startDict['x_pc'] = x_pcstr
-
- if self.Prop['xm_pc[2,1]'] != None:
- xm_pcarr = []
- for i in range(1,4):
- cmf = []
- for j in range(1,len(self.CompNames)+1):
- cmf.append(str(self.Prop['xm_pc['+str(i)+','+str(j)+']']))
- xm_pcarr.append(cmf)
- xm_pcstr = json.dumps(x_pcarr)
- xm_pcstr = xm_pcstr.replace('[','{')
- xm_pcstr = xm_pcstr.replace(']','}')
- xm_pcstr = xm_pcstr.replace('"','')
- self.startDict['xm_pc'] = xm_pcstr
-
- if self.Prop['Fm_pc[2,1]'] != None:
- Fm_pcarr = []
- for i in range(1,4):
- cmf = []
- for j in range(1,len(self.CompNames)+1):
- cmf.append(str(self.Prop['Fm_pc['+str(i)+','+str(j)+']']))
- Fm_pcarr.append(cmf)
- Fm_pcstr = json.dumps(x_pcarr)
- Fm_pcstr = Fm_pcstr.replace('[','{')
- Fm_pcstr = Fm_pcstr.replace(']','}')
- Fm_pcstr = Fm_pcstr.replace('"','')
- self.startDict['Fm_pc'] = Fm_pcstr
-
- if self.Prop['F_pc[2,1]'] != None:
- F_pcarr = []
- for i in range(1,4):
- cmf = []
- for j in range(1,len(self.CompNames)+1):
- cmf.append(str(self.Prop['F_pc['+str(i)+','+str(j)+']']))
- F_pcarr.append(cmf)
- F_pcstr = json.dumps(F_pcarr)
- F_pcstr = F_pcstr.replace('[','{')
- F_pcstr = F_pcstr.replace(']','}')
- F_pcstr = F_pcstr.replace('"','')
- self.startDict['F_pc'] = F_pcstr
-
- if self.Prop['MW_p[2]'] != None:
- MW_pArr = []
- for i in range(1,4):
- MW_pArr.append(self.Prop['MW_p['+str(i)+']'])
- MW_pStr = json.dumps(MW_pArr)
- MW_pStr = MW_pStr.replace('[','{')
- MW_pStr = MW_pStr.replace(']','}')
- MW_pStr = MW_pStr.replace('"','')
- self.startDict['MW_p'] = MW_pStr
-
- if self.Prop['F_p[2]'] != None:
- F_pArr = []
- for i in range(1,4):
- F_pArr.append(self.Prop['F_p['+str(i)+']'])
- F_pStr = json.dumps(F_pArr)
- F_pStr = F_pStr.replace('[','{')
- F_pStr = F_pStr.replace(']','}')
- F_pStr = F_pStr.replace('"','')
- self.startDict['F_p'] = F_pStr
-
- if self.Prop['Cp_p[2]'] != None:
- Cp_pArr = []
- for i in range(1,4):
- Cp_pArr.append(self.Prop['Cp_p['+str(i)+']'])
- Cp_pStr = json.dumps(Cp_pArr)
- Cp_pStr = Cp_pStr.replace('[','{')
- Cp_pStr = Cp_pStr.replace(']','}')
- Cp_pStr = Cp_pStr.replace('"','')
- self.startDict['Cp_p'] = Cp_pStr
-
- if self.Prop['H_p[2]'] != None:
- H_pArr = []
- for i in range(1,4):
- H_pArr.append(self.Prop['H_p['+str(i)+']'])
- H_pStr = json.dumps(H_pArr)
- H_pStr = H_pStr.replace('[','{')
- H_pStr = H_pStr.replace(']','}')
- H_pStr = H_pStr.replace('"','')
- self.startDict['H_p'] = H_pStr
-
-
- if self.Prop['S_p[2]'] != None:
- S_pArr = []
- for i in range(1,4):
- S_pArr.append(self.Prop['S_p['+str(i)+']'])
- S_pStr = json.dumps(S_pArr)
- S_pStr = S_pStr.replace('[','{')
- S_pStr = S_pStr.replace(']','}')
- S_pStr = S_pStr.replace('"','')
- self.startDict['S_p'] = S_pStr
-
- if self.Prop['Fm_p[2]'] != None:
- Fm_pArr = []
- for i in range(1,4):
- Fm_pArr.append(self.Prop['Fm_p['+str(i)+']'])
- Fm_pStr = json.dumps(Fm_pArr)
- Fm_pStr = Fm_pStr.replace('[','{')
- Fm_pStr = Fm_pStr.replace(']','}')
- Fm_pStr = Fm_pStr.replace('"','')
- self.startDict['Fm_p'] = Fm_pStr
-
- except Exception as e:
- exc_type, exc_obj, exc_tb = sys.exc_info()
- print(exc_type,exc_tb.tb_lineno)
- print(e)
- print('error')
-
-
- def OM_Flowsheet_Initialize(self,addedcomp):
- self.OM_data_init = ''
- self.OM_data_init = self.OM_data_init + ("model ms"+str(self.count)+"\n")
- self.OM_data_init = self.OM_data_init + ("extends Simulator.Streams.MaterialStream;\n" )
- self.OM_data_init = self.OM_data_init + ("extends Simulator.Files.ThermodynamicPackages."+self.thermoPackage+";\n")
- self.OM_data_init = self.OM_data_init + ("end ms"+str(self.count)+";\n")
- comp_count = len(addedcomp)
- # self.GetStartValues()
-
- #self.OM_data_init = "Simulator.Streams.Mat_Stm_RL " + self.name +"(Nc = " + str(comp_count)
- self.OM_data_init = self.OM_data_init + "ms"+str(self.count) +" " + self.name +"(Nc = " + str(comp_count)
- self.OM_data_init = self.OM_data_init + ",C = {"
- C = str(addedcomp).strip('[').strip(']')
- C = C.replace("'","")
- self.OM_data_init = self.OM_data_init + C + "},"
- #for key, value in self.startDict.items():
- # self.OM_data_init = self.OM_data_init + key + '(start = ' + str(value) + '),'
- self.OM_data_init = self.OM_data_init[:-1]
- self.OM_data_init = self.OM_data_init + ');\n'
- return self.OM_data_init
-
-
- def OM_Flowsheet_Equation(self,addedcomp,method):
- self.OM_data_eqn = ''
- self.comp_count = len(addedcomp)
- if method == 'Eqn':
- self.eqnDict = {}
- self.GetMinEqnValues()
- if method == 'SM':
- self.eqnDict = {}
- self.GetMinEqnValues()
- #self.GetEquationValues()
- #self.GetEquationValues()
-
- for key,value in self.eqnDict.items():
- self.OM_data_eqn = self.OM_data_eqn + self.name + '.'+ key + ' = ' + str(value) + ';\n'
- return self.OM_data_eqn
-
-
-''' \ No newline at end of file
diff --git a/Undo.dat b/Undo.dat
index a236cae..9adaab5 100644
--- a/Undo.dat
+++ b/Undo.dat
Binary files differ
diff --git a/UnitOperations.py b/UnitOperations.py
index 92d6f07..006c015 100644
--- a/UnitOperations.py
+++ b/UnitOperations.py
@@ -1,4 +1,5 @@
from OMChem.Flowsheet import Flowsheet
+from OMChem.EngStm import EngStm
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QTextDocument ,QTextCursor ,QTextCharFormat ,QFont ,QPixmap
@@ -9,108 +10,108 @@ from PyQt5.QtGui import QBrush ,QTransform ,QMouseEvent
from PyQt5.QtGui import *
import PyQt5.QtCore as QtCore
import PyQt5.QtWidgets as QtWidgets
-from component_selector import *
-from container import *
+from ComponentSelector import *
+from Container import *
class UnitOperation():
counter = 1
-
def __init__(self):
self.OM_data_eqn = ''
self.OM_data_init = ''
- self.InputStms = []
- self.OutputStms = []
+ self.input_stms = []
+ self.output_stms = []
self.compounds = compound_selected
self.name = ''
self.mode = None
- self.modeVal = None
+ self.mode_val = None
self.type = ''
self.no_of_inputs = 1
self.no_of_outputs = 1
- self.Prop = {}
- self.x = 2500-30
+ self.x = 2500-30
self.y = 2500-30
self.pos = QPointF(self.x, self.y)
- #self.Prop = {}
+ self.count = UnitOperation.counter
self.variables = {}
- self.modeslist = []
+ self.modes_list = []
self.parameters = []
self.extra = []
- self.ForNaming = []
+ self.for_naming = []
self.multidict = []
- self.ThermoPackReq = False
- self.thermoPackage = None
+ self.thermo_pack_req = False
+ self.thermo_package = None
- def paramgetter(self,mode=None):
+ def param_getter(self,mode=None):
params = {}
- if mode == None:
- self.mode = self.modeslist[0]
+ if mode == None and self.modes_list:
+ self.mode = self.modes_list[0]
else:
self.mode = mode
+ params[self.mode] = None
for i in self.parameters:
params[i] = self.variables[i]['value']
- params[self.mode] = None
+
return params
- def paramsetter(self,params):
- print("paramsetter ", params)
+ def param_setter(self,params):
+ print("param_setter ", params)
for k,v in params.items():
print(k,v)
if k != self.mode:
self.k = v
self.variables[k]['value'] = v
else:
- self.modeVal = params[self.mode]
+ self.variables[k]['value'] = v
+ self.mode_val = params[self.mode]
+ print(self.variables)
def add_connection(self,flag,UnitOpr):
- if flag==1:
- # Input stream if flag is 1
+ if flag==1: # Input stream if flag is 1
print("INPUT CONNECTION")
- self.InputStms.append(UnitOpr)
+ self.input_stms.append(UnitOpr)
else :
print("OUTPUT CONNECTION")
- self.OutputStms.append(UnitOpr)
+ self.output_stms.append(UnitOpr)
- def setPos(self,pos):
+ def set_pos(self,pos):
self.pos = pos
def OM_Flowsheet_Initialize(self):
self.OM_data_init = ''
- if(self.ThermoPackReq):
+ if(self.thermo_pack_req):
if len(self.extra)>1:
for i in range(len(self.extra)):
latest = ''
for j in range(self.extra[i]):
if self.extra[i][j]!='.':
latest += self.extra[i][j]
- self.ForNaming[i] = latest
+ self.for_naming[i] = latest
- if(self.ThermoPackReq):
+ if(self.thermo_pack_req):
if len(self.extra)==1:
for i in self.extra:
self.OM_data_init += ('model '+i+str(self.counter)+'\n')
self.OM_data_init += ('extends Simulator.UnitOperations.'+i+';\n')
- self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermoPackage+';\n')
+ self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermo_package+';\n')
self.OM_data_init += ('end '+i+str(self.counter)+';\n')
self.OM_data_init += i+str(self.counter) + ' ' + self.name + '(Nc = ' + str(len(self.compounds))
else:
for i in range(len(self.extra)):
if i!=(len(self.extra)-1):
- self.OM_data_init += ('model '+self.ForNaming[i]+str(self.counter)+'\n')
+ self.OM_data_init += ('model '+self.for_naming[i]+str(self.counter)+'\n')
self.OM_data_init += ('extends Simulator.UnitOperations.'+self.extra[i]+';\n')
- self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermoPackage+';\n')
- self.OM_data_init += ('end '+self.ForNaming[i]+str(self.counter)+';\n')
+ self.OM_data_init += ('extends Simulator.Files.ThermodynamicPackages.'+self.thermo_package+';\n')
+ self.OM_data_init += ('end '+self.for_naming[i]+str(self.counter)+';\n')
else:
- self.OM_data_init += ('model '+self.ForNaming[i]+str(self.counter)+'\n')
+ self.OM_data_init += ('model '+self.for_naming[i]+str(self.counter)+'\n')
self.OM_data_init += ('extends Simulator.UnitOperations.'+self.extra[i]+';\n')
for j in range(len(self.extra)-1):
- self.OM_data_init += (self.ForNaming[j] + str(self.counter) +' ' + self.ForNaming[j] + '#' + self.multidict[j] + ';\n')
+ self.OM_data_init += (self.for_naming[j] + str(self.counter) +' ' + self.for_naming[j] + '#' + self.multidict[j] + ';\n')
- self.OM_data_init += ('end '+self.ForNaming[i]+str(self.counter)+';\n')
+ self.OM_data_init += ('end '+self.for_naming[i]+str(self.counter)+';\n')
- self.OM_data_init += self.ForNaming[i] + str(self.counter) + ' ' + self.ForNaming + '(Nc = ' + str(len(self.compounds))
+ self.OM_data_init += self.for_naming[i] + str(self.counter) + ' ' + self.for_naming + '(Nc = ' + str(len(self.compounds))
C = str(self.compounds).strip('[').strip(']')
C = C.replace("'", "")
@@ -129,7 +130,8 @@ class UnitOperation():
for k in self.parameters:
self.OM_data_init += ', '
- self.OM_data_init += k + ' = ' + str(self.variables[k]['value'])
+ self.OM_data_init += k + ' = ' + ('"' + self.variables[k]['value'] + '"' if isinstance(self.variables[k]['value'], str)
+ else str(self.variables[k]['value']))
self.OM_data_init += ');\n'
return self.OM_data_init
@@ -137,27 +139,296 @@ class UnitOperation():
def OM_Flowsheet_Equation(self):
self.OM_data_eqn = ''
- if len(self.InputStms)>1:
+ if len(self.input_stms)>1:
strcount = 1
- for strm in self.InputStms:
+ for strm in self.input_stms:
self.OM_data_eqn += ('connect(' + strm.name + '.Out,' + self.name + '.In[' + str(strcount) + ']);\n')
strcount += 1
else:
- self.OM_data_eqn += ('connect(' + self.name + '.In,' + self.InputStms[0].name + '.Out);\n')
+ self.OM_data_eqn += ('connect(' + self.name + '.In,' + self.input_stms[0].name + '.Out);\n')
- if len(self.OutputStms)>1:
+ if len(self.output_stms)>1:
strcount = 1
- for strm in self.OutputStms:
+ for strm in self.output_stms:
self.OM_data_eqn += ('connect(' + strm.name + '.In,' + self.name + '.Out[' + str(strcount) + ']);\n')
strcount += 1
else:
- self.OM_data_eqn += ('connect(' + self.name + '.Out,' + self.OutputStms[0].name + '.In);\n')
+ self.OM_data_eqn += ('connect(' + self.name + '.Out,' + self.output_stms[0].name + '.In);\n')
if self.mode:
- self.OM_data_eqn += (self.name + '.' + self.mode + '=' + self.modeVal + ';\n')
+ self.OM_data_eqn += (self.name + '.' + self.mode + '=' + self.mode_val + ';\n')
return self.OM_data_eqn
+class ShortcutColumn(UnitOperation):
+ def __init__(self, CompNames = [], name='ShortcutColumn'):
+ UnitOperation.__init__(self)
+ self.name = name + str(ShortcutColumn.counter)
+ self.type = 'ShortcutColumn'
+ self.no_of_inputs = 1
+ self.no_of_outputs = 2
+ self.input_stms = None
+ self.output_stms = None
+ self.EngStm1 = EngStm(name='EngStm1'+self.name)
+ self.EngStm2 = EngStm(name='EngStm2'+self.name)
+ self.count = ShortcutColumn.counter
+
+ self.parameters = ['HKey', 'LKey', 'HKey_x_pc', 'LKey_x_pc', 'Ctype', 'Pcond', 'Preb', 'RR']
+ type(self).counter += 1
+
+ self.variables = {
+ 'HKey' : {'name':'Heavy Key', 'value':None, 'unit':''},
+ 'LKey' : {'name':'Light Key', 'value':None, 'unit':''},
+ 'HKey_x_pc' : {'name':'Heavy Key Mole Fraction', 'value':0.01, 'unit':'mol/s'},
+ 'LKey_x_pc' : {'name':'Light Key Mole Fraction', 'value':0.01, 'unit':'mol/s'},
+ 'Ctype' : {'name':'Condensor Type', 'value':None, 'unit':''},
+ 'thermo_package' : {'name':'Thermo Package', 'value':'Raoults_Law', 'unit':''},
+ 'Pcond' : {'name':'Condensor Pressure', 'value':101325, 'unit':'Pa'},
+ 'Preb' : {'name':'Reboiler Pressure', 'value':101325, 'unit':'Pa'},
+ 'RR' : {'name':'Reflux Ratio', 'value':1.5, 'unit':''},
+ }
+
+ def param_setter(self,params):
+ print("param_setter ", params)
+ self.variables['HKey']['value'] = params[0]
+ self.variables['LKey']['value'] = params[1]
+ self.variables['HKey_x_pc']['value'] = params[2]
+ self.variables['LKey_x_pc']['value'] = params[3]
+ self.variables['Ctype']['value'] = params[4]
+ self.variables['Pcond']['value'] = params[5]
+ self.variables['Preb']['value'] = params[6]
+ self.variables['RR']['value'] = params[7]
+
+ print(self.variables)
+
+
+class DistillationColumn(UnitOperation):
+ def __init__(self,name='DistillationColumn'):
+ self.name = name + str(DistillationColumn.counter)
+ self.type = 'DistillationColumn'
+ self.no_of_inputs = 2
+ self.no_of_outputs = 2
+
+ self.compounds = compound_selected
+
+ self.EngStm1 = EngStm(name='EngStm1'+self.name)
+ self.EngStm2 = EngStm(name='EngStm2'+self.name)
+ self.count = DistillationColumn.counter
+
+ self.input_stms = None
+ self.output_stms = None
+ # self.modes_list = ['RR', 'Nout', 'T']
+ self.modes_list = []
+ self.parameters = ['']
+ #self.parameters = ['Nt', 'InT_s', 'In_s', 'thermo_package', 'Ctype', 'Pcond', 'Preb']
+ self.Cspec_list = ['Reflux Ratio','Product Molar Flow (mol/s)', 'Temperature (K)', 'Compound Molar Fraction', 'Compound Molar Flow (mol/s)']
+ self.Rspec_list = ['Product Molar Flow (mol/s)', 'Temperature (K)', 'Compound Molar Fraction', 'Compound Molar Flow (mol/s)']
+
+ type(self).counter += 1
+ self.variables = {
+ 'RR' : {'name':'Reflux Ratio', 'value':None, 'unit':''},
+ 'T' : {'name':'Temperature', 'value':300, 'unit':'K'},
+ 'Nout' : {'name':'No of Sidedraws', 'value':None, 'unit':''},
+ 'Nt' : {'name':'No of Stages', 'value':12, 'unit':''},
+ 'InT_s' : {'name':'No of Feed Stages', 'value':None, 'unit':''},
+ 'In_s' : {'name':'No of Feeds', 'value':None, 'unit':''},
+ 'thermo_package' : {'name':'Thermo Package', 'value':'Raoults_Law', 'unit':''},
+ 'Ctype' : {'name':'Condensor Type', 'value':'', 'unit':''},
+ 'Pcond' : {'name':'Condensor Pressure', 'value':101325, 'unit':'Pa'},
+ 'Preb' : {'name':'Reboiler Pressure', 'value':101325, 'unit':'Pa'},
+ 'C_Spec': {'name':'Condensor Specification', 'type':'Reflux Ratio', 'value':'', 'comp':'', 'unit':''},
+ 'R_Spec': {'name':'Reboiler Specification', 'type':'', 'value':'', 'comp':'', 'unit':''},
+ }
+ def param_setter(self,params):
+ print("param_setter ", params)
+ self.variables['Nt']['value'] = params[0]
+ self.variables['In_s']['value'] = params[1]
+ self.variables['InT_s']['value'] = params[2]
+ self.variables['Ctype']['value'] = params[3]
+ self.variables['Pcond']['value'] = params[4]
+ self.variables['C_Spec']['type'] = params[5]
+ if 'Compound' in self.variables['C_Spec']['type']:
+ self.variables['C_Spec']['comp'] = params[6]
+ self.variables['C_Spec']['value'] = params[7]
+ self.variables['Preb']['value'] = params[8]
+ self.variables['R_Spec']['type'] = params[9]
+ if 'Compound' in self.variables['R_Spec']['type']:
+ self.variables['R_Spec']['comp'] = params[10]
+ self.variables['R_Spec']['value'] = params[11]
+ print(self.variables)
+
+class ConvertionReactor(UnitOperation):
+ def __init__(self,name='',Nr=None,b=None,X=None,Z=None,a=[],operation=None,Tdef=None):
+ UnitOperation.__init__(self)
+ self.name = name
+ self.type = 'ConvertionReactor'
+
+ self.Nr = str(Nr)
+ self.b = str(b)
+ self.X = str(X)
+ self.Z = str(Z)
+ self.a = json.dumps(a).replace('[','{').replace(']','}')
+ self.operation = str(operation)
+ self.Tdef = str(Tdef)
+
+class CompoundSeparator(UnitOperation):
+ def __init__(self, name='CompoundSeparator'):
+ UnitOperation.__init__(self)
+ self.name = name + str(CompoundSeparator.counter)
+ self.type = 'CompoundSeparator'
+ self.no_of_inputs = 1
+ self.no_of_outputs = 2
+
+ self.SepFact_modes = ['Molar_Flow (mol/s)', 'Mass_Flow (kg/s)', 'Inlet_Molar_Flow_Percent', 'Outlet_Molar_Flow_Percent']
+
+ type(self).counter += 1
+ self.variables = {
+ 'SepStrm' : {'name':'Separation Stream', 'value':1, 'unit':''},
+ #'SepVal' : {'name':'Separation Value', 'value':[], 'unit':''},
+ #'SepFact' : {'name':'Separaction Factor', 'value':'', 'unit':''},
+ }
+
+ for i in self.compounds:
+ self.variables[i] = {'name':'SepVal_'+i, 'value':'', 'type':'', 'unit':''}
+
+ # self.SepFact = json.dumps(self.variables['SepFact']['value']).replace('[','{').replace(']','}')
+ # self.SepStrm = str(self.variables['SepStrm']['value'])
+ # self.SepVal = json.dumps(self.variables['SepVal']['value']).replace('[','{').replace(']','}')
+ def param_setter(self,params):
+ print("param_setter ", params)
+ if params[0]:
+ self.variables['SepStrm']['value'] = 1
+ elif params[1]:
+ self.variables['SepStrm']['value'] = 2
+
+ j = 2
+ for i in self.compounds:
+ self.variables[i]['type'] = params[j]
+ self.variables[i]['value'] = float(params[j+1])
+ j += 2
+ print(self.variables)
+
+class Flash(UnitOperation):
+ def __init__(self,name='Flash'):
+ UnitOperation.__init__(self)
+ self.name = name + str(Flash.counter)
+ self.type = 'Flash'
+ self.no_of_inputs = 1
+ self.no_of_outputs = 2
+ self.input_stms = []
+ self.output_stms = []
+ self.count = Flash.counter
+
+ type(self).counter += 1
+ self.variables = {
+ 'thermo_package' : {'name':'Thermo Package', 'value':None, 'unit':''},
+ 'BTdef' : {'name':'Separation Temperature Boolean', 'value':False, 'unit':''},
+ 'BPdef' : {'name':'Separation Pressure Boolean', 'value':False, 'unit':''},
+ 'Tdef' : {'name':'Separation Temperature', 'value':298.15, 'unit':'K'},
+ 'Pdef' : {'name':'Separation Pressure', 'value':101325, 'unit':'Pa'}
+ }
+ def param_setter(self,params):
+ print("param_setter ", params)
+ self.variables['thermo_package']['value'] = params[0]
+ self.variables['BTdef']['value'] = params[1]
+ self.variables['Tdef']['value'] = params[2]
+ self.variables['BPdef']['value'] = params[3]
+ self.variables['Pdef']['value'] = params[4]
+ print(self.variables)
+
+class Pump(UnitOperation):
+ def __init__(self,name='Pump'):
+ UnitOperation.__init__(self)
+ self.name = name + str(Pump.counter)
+ self.type = 'Pump'
+ self.input_stms = None
+ self.output_stms = None
+ self.modes_list = ['Pdel', 'Pout', 'Q'] #"enFlo"
+ self.parameters = ['Eff']
+
+ type(self).counter += 1
+ self.variables = {
+ 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''},
+ 'Pdel' : {'name':'Pressure Increase', 'value':None, 'unit':'Pa'},
+ 'Pout' : {'name':'Outlet Pressure', 'value':None, 'unit':'Pa'},
+ 'Q' : {'name':'Power Required', 'value':None, 'unit':'W'},
+ }
+
+class Valve(UnitOperation):
+ def __init__(self,name='Valve'):
+ UnitOperation.__init__(self)
+ self.name = name + str(Valve.counter)
+ self.type = 'Valve'
+ self.input_stms = None
+ self.output_stms = None
+ self.modes_list = ['Pdel', 'Pout']
+
+ type(self).counter += 1
+ self.variables = {
+ 'Pdel' : {'name':'Pressure Drop', 'value':None, 'unit':'Pa'},
+ 'Pout' : {'name':'Outlet Pressure', 'value':None, 'unit':'Pa'}
+ }
+
+class Splitter(UnitOperation):
+ def __init__(self,name='Splitter'):
+ UnitOperation.__init__(self)
+ self.name = name + str(Splitter.counter)
+ self.type = 'Splitter'
+ self.no_of_outputs = 3
+
+ # self.input_stms = None
+ self.CalcType_modes = ['Split Ratios', 'Mole Flow Specs', 'Mass Flow Specs']
+
+ self.parameters = ['NOO', 'CalcType']#, 'SpecVal_s'
+ type(self).counter += 1
+
+ self.variables = {
+ 'NOO' : {'name':'No. of Output', 'value':3, 'unit':''},
+ 'CalcType' : {'name':'Calculation Type', 'value':self.CalcType_modes[0], 'unit':''},
+ 'SpecVal_s' : {'name':'Specification Value', 'value':[50,50], 'unit':''}
+ }
+
+ specval = self.variables['SpecVal_s']['value'] # [50,50]
+ self.specval = json.dumps(specval).replace('[','{').replace(']','}')
+
+ def param_setter(self,params):
+ print("param_setter ", params)
+ self.variables['NOO']['value'] = int(params[0])
+ self.variables['CalcType']['value'] = params[1]
+ self.variables['SpecVal_s']['value'] = [float(params[2]), float(params[3])]
+ if self.variables['CalcType']['value'] == 'Mole Flow Specs':
+ self.variables['SpecVal_s']['unit'] = 'mol/s'
+ elif self.variables['CalcType']['value'] == 'Mass Flow Specs':
+ self.variables['SpecVal_s']['unit'] = 'kg/s'
+ print(self.variables)
+
+class Mixer(UnitOperation):
+
+ def __init__(self,name='Mixer'):
+ UnitOperation.__init__(self)
+ self.name = name + str(Mixer.counter)
+ self.type = 'Mixer'
+ self.no_of_inputs = 6
+
+ self.Pout_modes = ['Inlet Minimum', 'Inlet Average', 'Inlet Maximum']
+ self.parameters = ['NI', 'outPress']
+ # self.output_stms = None
+ type(self).counter += 1
+
+ self.variables = {
+ 'NI' : {'name':'Number of Input', 'value':6, 'unit':''},
+ 'outPress' : {'name':'Outlet Pressure', 'value':'Inlet_Average', 'unit':''},
+ }
+ def param_setter(self, params):
+ print(self.input_stms, self.output_stms)
+ self.output_stms = []
+ print(self.input_stms, self.output_stms)
+ print("param_setter ", params)
+ self.variables['NI']['value'] = int(params[0])
+ self.variables['outPress']['value'] = params[1]
+ print(self.variables)
+
+
class Heater(UnitOperation):
def __init__(self, name='Heater'):
@@ -166,10 +437,10 @@ class Heater(UnitOperation):
self.type = 'Heater'
self.no_of_inputs = 1
self.no_of_outputs = 1
- self.modesList = ['Q','Tout','xvapout','Tdel']
+ self.modes_list = ['Q','Tout','xvapout','Tdel']
self.parameters = ['Pdel', 'Eff']
self.extra = None
- self.ForNaming = None
+ self.for_naming = None
type(self).counter += 1
self.variables = {
@@ -178,6 +449,7 @@ class Heater(UnitOperation):
'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'},
'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'},
'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'},
+ 'xvapout': {'name':'Outlet Vapour', 'value':None, 'unit':''}
}
class Cooler(UnitOperation):
@@ -188,18 +460,19 @@ class Cooler(UnitOperation):
self.type = 'Cooler'
self.no_of_inputs = 1
self.no_of_outputs = 1
- self.modesList = ["Q","Tout","xvapout","Tdel"]
+ self.modes_list = ['Q','Tout','Tdel','xvap']
self.extra = None
- self.ForNaming = None
+ self.for_naming = None
self.parameters = ['Pdel', 'Eff']
type(self).counter += 1
self.variables = {
- 'Pdel' : {'name':'Pressure Drop', 'value':0, 'unit':'Pa'},
- 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''},
- 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'},
- 'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'},
- 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'},
+ 'Pdel' : {'name':'Pressure Drop', 'value':0, 'unit':'Pa'},
+ 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''},
+ 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'},
+ 'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'},
+ 'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'},
+ 'xvap' : {'name':'Vapour Phase Mole Fraction', 'value':None, 'unit':'g/s'},
}
class AdiabaticCompressor(UnitOperation):
@@ -210,19 +483,20 @@ class AdiabaticCompressor(UnitOperation):
self.type = 'AdiabaticCompressor'
self.no_of_inputs = 1
self.no_of_outputs = 1
- self.modesList = ["Pdel","Pout","Q"]
+ self.modes_list = ["Pdel","Pout","Q"]
self.extra = ['AdiabaticCompressor']
- self.ForNaming = ['AdiabaticCompressor']
- self.ThermoPackReq = True
- self.thermoPackage ="RaoultsLaw"
+ self.for_naming = ['AdiabaticCompressor']
+ self.thermo_pack_req = True
+ self.thermo_package ="RaoultsLaw"
self.parameters = ['Eff']
type(self).counter += 1
self.variables = {
'Pdel' : {'name':'Pressure Drop', 'value':0, 'unit':'Pa'},
'Tdel' : {'name':'Temperature Increase', 'value':0, 'unit':'K'},
- 'Pout' : {'name':'Outlet Pressure', 'value':101325, 'unit':'Pa'},
- 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'},
+ 'Pout' : {'name':'Outlet Pressure', 'value':101325, 'unit':'Pa'},
+ 'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'},
'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'},
+ 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''}
}
class AdiabaticExpander(UnitOperation):
@@ -233,11 +507,11 @@ class AdiabaticExpander(UnitOperation):
self.type = 'AdiabaticExpander'
self.no_of_inputs = 1
self.no_of_outputs = 1
- self.modesList = ["Pdel","Pout","Q"]
+ self.modes_list = ["Pdel","Pout","Q"]
self.extra = ['AdiabaticExpander']
- self.ForNaming = ['AdiabaticExpander']
- self.ThermoPackReq = True
- self.thermoPackage ="RaoultsLaw"
+ self.for_naming = ['AdiabaticExpander']
+ self.thermo_pack_req = True
+ self.thermo_package ="RaoultsLaw"
self.parameters = ['Eff']
type(self).counter += 1
self.variables = {
@@ -246,6 +520,7 @@ class AdiabaticExpander(UnitOperation):
'Pout' : {'name':'Outlet Pressure', 'value':101325, 'unit':'Pa'},
'Tout' : {'name':'Outlet Temperature', 'value':298.15, 'unit':'K'},
'Q' : {'name':'Heat Added', 'value':0, 'unit':'W'},
+ 'Eff' : {'name':'Efficiency', 'value':1, 'unit':''}
}
\ No newline at end of file
diff --git a/class_diagram.pdf b/class_diagram.pdf
new file mode 100644
index 0000000..c2c1134
--- /dev/null
+++ b/class_diagram.pdf
Binary files differ
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..06367ea 100644
--- a/main.ui
+++ b/main.ui
@@ -155,8 +155,8 @@
<property name="title">
<string>File</string>
</property>
- <addaction name="actionNew_Flowsheet"/>
- <addaction name="actionSave_2"/>
+ <addaction name="actionNew"/>
+ <addaction name="actionSave"/>
<addaction name="actionOpen"/>
</widget>
<widget class="QMenu" name="menuEdit">
@@ -178,8 +178,8 @@
<property name="title">
<string>Simulation</string>
</property>
- <addaction name="actionEquation_oriented"/>
- <addaction name="actionSequential_mode"/>
+ <addaction name="actionEquationOriented"/>
+ <addaction name="actionSequentialMode"/>
<addaction name="separator"/>
<addaction name="actionTerminate"/>
</widget>
@@ -187,7 +187,7 @@
<property name="title">
<string>Compounds</string>
</property>
- <addaction name="actionSelect_compounds"/>
+ <addaction name="actionSelectCompounds"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
@@ -199,7 +199,7 @@
<property name="title">
<string>Utility</string>
</property>
- <addaction name="actionBinary_Phase_Envelope"/>
+ <addaction name="actionBinaryPhaseEnvelope"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
@@ -228,6 +228,13 @@
<height>524287</height>
</size>
</property>
+ <property name="font">
+ <font>
+ <family>Microsoft JhengHei</family>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
<property name="windowTitle">
<string>Component Selector</string>
</property>
@@ -294,7 +301,8 @@
</property>
<property name="font">
<font>
- <pointsize>18</pointsize>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
@@ -335,9 +343,11 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
- <italic>true</italic>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
</font>
</property>
<property name="acceptDrops">
@@ -347,7 +357,7 @@
<string notr="true">Text-align:left;</string>
</property>
<property name="text">
- <string>MaterialStream</string>
+ <string> MaterialStream</string>
</property>
<property name="icon">
<iconset>
@@ -355,8 +365,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -381,9 +391,425 @@
<height>16777215</height>
</size>
</property>
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Light">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>69</green>
+ <blue>69</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Midlight">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>57</green>
+ <blue>57</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Dark">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>23</green>
+ <blue>23</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Mid">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>30</green>
+ <blue>30</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Text">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="BrightText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ButtonText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Shadow">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>23</green>
+ <blue>23</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>220</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Light">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>69</green>
+ <blue>69</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Midlight">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>57</green>
+ <blue>57</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Dark">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>23</green>
+ <blue>23</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Mid">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>30</green>
+ <blue>30</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Text">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="BrightText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ButtonText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Shadow">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>23</green>
+ <blue>23</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>220</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Light">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>69</green>
+ <blue>69</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Midlight">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>57</green>
+ <blue>57</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Dark">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>23</green>
+ <blue>23</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Mid">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>30</green>
+ <blue>30</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Text">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="BrightText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ButtonText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Shadow">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>220</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
<property name="font">
<font>
- <pointsize>18</pointsize>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
@@ -424,15 +850,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Mixer</string>
+ <string> Mixer</string>
</property>
<property name="icon">
<iconset>
@@ -440,8 +868,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -468,15 +896,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Splitter</string>
+ <string> Splitter</string>
</property>
<property name="icon">
<iconset>
@@ -484,8 +914,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -510,9 +940,425 @@
<height>16777215</height>
</size>
</property>
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Light">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Midlight">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>87</green>
+ <blue>87</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Dark">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>35</green>
+ <blue>35</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Mid">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Text">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="BrightText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ButtonText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Shadow">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>35</green>
+ <blue>35</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>220</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Light">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Midlight">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>87</green>
+ <blue>87</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Dark">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>35</green>
+ <blue>35</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Mid">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Text">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="BrightText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ButtonText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Shadow">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>35</green>
+ <blue>35</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>220</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Button">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Light">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Midlight">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>87</green>
+ <blue>87</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Dark">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>35</green>
+ <blue>35</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Mid">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>46</green>
+ <blue>46</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Text">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="BrightText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ButtonText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>73</red>
+ <green>36</green>
+ <blue>73</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Base">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Window">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="Shadow">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="AlternateBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>70</green>
+ <blue>70</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipBase">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>255</red>
+ <green>255</green>
+ <blue>220</blue>
+ </color>
+ </brush>
+ </colorrole>
+ <colorrole role="ToolTipText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
<property name="font">
<font>
- <pointsize>18</pointsize>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
@@ -553,15 +1399,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Heater</string>
+ <string> Heater</string>
</property>
<property name="icon">
<iconset>
@@ -569,10 +1417,19 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>40</width>
+ <height>40</height>
</size>
</property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
</widget>
</item>
<item>
@@ -597,15 +1454,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Cooler</string>
+ <string> Cooler</string>
</property>
<property name="icon">
<iconset>
@@ -613,10 +1472,13 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>40</width>
+ <height>40</height>
</size>
</property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
</widget>
</item>
<item>
@@ -641,7 +1503,8 @@
</property>
<property name="font">
<font>
- <pointsize>18</pointsize>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
@@ -682,15 +1545,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Flash</string>
+ <string> Flash</string>
</property>
<property name="icon">
<iconset>
@@ -698,8 +1563,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>40</width>
+ <height>40</height>
</size>
</property>
</widget>
@@ -726,24 +1591,26 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Component Seperator</string>
+ <string> Compound Seperator</string>
</property>
<property name="icon">
<iconset>
- <normaloff>icons/CompSep.png</normaloff>icons/CompSep.png</iconset>
+ <normaloff>icons/CompoundSeparator.png</normaloff>icons/CompoundSeparator.png</iconset>
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>40</width>
+ <height>40</height>
</size>
</property>
</widget>
@@ -770,7 +1637,8 @@
</property>
<property name="font">
<font>
- <pointsize>15</pointsize>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
@@ -808,15 +1676,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Valve</string>
+ <string> Valve</string>
</property>
<property name="icon">
<iconset>
@@ -824,8 +1694,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -852,15 +1722,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Centrifugal Pump</string>
+ <string> Centrifugal Pump</string>
</property>
<property name="icon">
<iconset>
@@ -868,8 +1740,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -896,15 +1768,17 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Adiabatic Compressor</string>
+ <string> Adiabatic Compressor</string>
</property>
<property name="icon">
<iconset>
@@ -912,8 +1786,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -940,8 +1814,10 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
@@ -951,7 +1827,7 @@
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Adiabatic Expander</string>
+ <string> Adiabatic Expander</string>
</property>
<property name="icon">
<iconset>
@@ -959,8 +1835,8 @@
</property>
<property name="iconSize">
<size>
- <width>50</width>
- <height>50</height>
+ <width>30</width>
+ <height>30</height>
</size>
</property>
</widget>
@@ -987,7 +1863,8 @@
</property>
<property name="font">
<font>
- <pointsize>18</pointsize>
+ <family>Microsoft JhengHei UI</family>
+ <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
@@ -1025,19 +1902,21 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Distillation Column</string>
+ <string> Distillation Column</string>
</property>
<property name="icon">
<iconset>
- <normaloff>icons/DistCol.png</normaloff>icons/DistCol.png</iconset>
+ <normaloff>Icons/Column.png</normaloff>Icons/Column.png</iconset>
</property>
<property name="iconSize">
<size>
@@ -1069,19 +1948,21 @@
</property>
<property name="font">
<font>
- <family>Comic Sans MS</family>
- <pointsize>11</pointsize>
+ <family>Microsoft JhengHei</family>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">Text-align:left</string>
</property>
<property name="text">
- <string>Shortcut Column</string>
+ <string> Shortcut Column</string>
</property>
<property name="icon">
<iconset>
- <normaloff>icons/ShortCol.png</normaloff>icons/ShortCol.png</iconset>
+ <normaloff>Icons/Column.png</normaloff>Icons/Column.png</iconset>
</property>
<property name="iconSize">
<size>
@@ -1111,21 +1992,21 @@
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
- <addaction name="actionNew_Flowsheet"/>
+ <addaction name="actionNew"/>
<addaction name="separator"/>
<addaction name="actionZoomIn"/>
<addaction name="actionZoomOut"/>
<addaction name="actionResetZoom"/>
<addaction name="separator"/>
- <addaction name="actionEquation_oriented"/>
- <addaction name="actionSequential_mode"/>
+ <addaction name="actionEquationOriented"/>
+ <addaction name="actionSequentialMode"/>
<addaction name="separator"/>
- <addaction name="actionSelect_compounds"/>
+ <addaction name="actionSelectCompounds"/>
</widget>
<action name="actionZoomIn">
<property name="icon">
<iconset>
- <normaloff>icons/zoomIn.png</normaloff>icons/zoomIn.png</iconset>
+ <normaloff>Icons/zoom_in.png</normaloff>Icons/zoom_in.png</iconset>
</property>
<property name="text">
<string>ZoomIn</string>
@@ -1134,7 +2015,7 @@
<action name="actionZoomOut">
<property name="icon">
<iconset>
- <normaloff>icons/zoomOut.png</normaloff>icons/zoomOut.png</iconset>
+ <normaloff>Icons/zoom_out.png</normaloff>Icons/zoom_out.png</iconset>
</property>
<property name="text">
<string>ZoomOut</string>
@@ -1143,43 +2024,43 @@
<action name="actionResetZoom">
<property name="icon">
<iconset>
- <normaloff>icons/zoomReset.png</normaloff>icons/zoomReset.png</iconset>
+ <normaloff>Icons/zoom_reset.png</normaloff>Icons/zoom_reset.png</iconset>
</property>
<property name="text">
<string>ResetZoom</string>
</property>
</action>
- <action name="actionEquation_oriented">
+ <action name="actionEquationOriented">
<property name="icon">
<iconset>
- <normaloff>icons/Equation.png</normaloff>icons/Equation.png</iconset>
+ <normaloff>Icons/eq.png</normaloff>Icons/eq.png</iconset>
</property>
<property name="text">
<string>Equation oriented</string>
</property>
</action>
- <action name="actionSequential_mode">
+ <action name="actionSequentialMode">
<property name="icon">
<iconset>
- <normaloff>icons/Sequential.png</normaloff>icons/Sequential.png</iconset>
+ <normaloff>Icons/sq.png</normaloff>Icons/sq.png</iconset>
</property>
<property name="text">
<string>Sequential mode</string>
</property>
</action>
- <action name="actionSelect_compounds">
+ <action name="actionSelectCompounds">
<property name="icon">
<iconset>
- <normaloff>icons/compoundSelector.png</normaloff>icons/compoundSelector.png</iconset>
+ <normaloff>Icons/compound.png</normaloff>Icons/compound.png</iconset>
</property>
<property name="text">
<string>Select Compounds</string>
</property>
</action>
- <action name="actionNew_Flowsheet">
+ <action name="actionNew">
<property name="icon">
<iconset>
- <normaloff>icons/new.svg</normaloff>icons/new.svg</iconset>
+ <normaloff>Icons/new.png</normaloff>Icons/new.png</iconset>
</property>
<property name="text">
<string>New</string>
@@ -1192,11 +2073,6 @@
</action>
<action name="actionSave">
<property name="text">
- <string>save</string>
- </property>
- </action>
- <action name="actionSave_2">
- <property name="text">
<string>Save</string>
</property>
</action>
@@ -1205,7 +2081,7 @@
<string>Open</string>
</property>
</action>
- <action name="actionBinary_Phase_Envelope">
+ <action name="actionBinaryPhaseEnvelope">
<property name="text">
<string>Binary Phase Envelope</string>
</property>
diff --git a/mainApp.py b/mainApp.py
index 7529845..e49d4e2 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
@@ -46,81 +46,77 @@ class MainApp(QMainWindow,ui):
# self.setStyleSheet(style)
# Initializing attributes
- self.zoomcount = 0
+ self.zoom_count = 0
self.thrd = None
# Creating instances of classes for the main app
- self.Container = Container(self.textBrowser)
- self.comp = componentSelector(self)
+ self.container = Container.Container(self.textBrowser, self.graphicsView)
+ self.comp = ComponentSelector(self)
# Setting up interactive canvas
- self.scene = self.Container.graphics.getScene()
+ self.scene = self.container.graphics.get_scene() ###
self.graphicsView.setScene(self.scene)
self.graphicsView.setMouseTracking(True)
- self.graphicsView.keyPressEvent=self.deleteCall
+ self.graphicsView.keyPressEvent=self.delete_call
self.setDockNestingEnabled(True)
self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea)
self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea)
self.addDockWidget(Qt.BottomDockWidgetArea,self.dockWidget_2)
- # Setting up undo stack
- # self.undoStack = QUndoStack(self)
- # Calling initialisation functions
- self.buttonHandler()
- self.menuBar()
+ # Calling initialisation
+ self.menu_bar()
+ self.button_handler()
self.comp.show()
'''
MenuBar function handels all the all the operations of
menu bar like new,zoom,comounds selector, simulation options.
'''
- def menuBar(self):
- self.actionSelect_compounds.triggered.connect(self.selectCompounds)
- self.actionSelect_compounds.setShortcut('Ctrl+C')
- self.actionZoomIn.triggered.connect(self.zoomin)
+ def menu_bar(self):
+ self.actionSelectCompounds.triggered.connect(self.select_compounds)
+ self.actionSelectCompounds.setShortcut('Ctrl+C')
+ self.actionZoomIn.triggered.connect(self.zoom_in)
self.actionZoomIn.setShortcut('Ctrl++')
- self.actionNew_Flowsheet.triggered.connect(self.new)
- self.actionNew_Flowsheet.setShortcut('Ctrl+N')
- self.actionZoomOut.triggered.connect(self.zoomout)
+ self.actionNew.triggered.connect(self.new)
+ self.actionNew.setShortcut('Ctrl+N')
+ self.actionZoomOut.triggered.connect(self.zoom_out)
self.actionZoomOut.setShortcut('Ctrl+-')
- self.actionResetZoom.triggered.connect(self.zoomReset)
+ self.actionResetZoom.triggered.connect(self.zoom_reset)
self.actionResetZoom.setShortcut('Ctrl+R')
self.actionHelp.triggered.connect(self.help)
self.actionHelp.setShortcut('Ctrl+H')
- self.actionSequential_mode.triggered.connect(partial(self.simulate,'SM'))
- self.actionSequential_mode.setShortcut('Ctrl+M')
- self.actionEquation_oriented.triggered.connect(partial(self.simulate,'EQN'))
- self.actionEquation_oriented.setShortcut('Ctrl+E')
+ self.actionSequentialMode.triggered.connect(partial(self.simulate,'SM'))
+ self.actionSequentialMode.setShortcut('Ctrl+M')
+ self.actionEquationOriented.triggered.connect(partial(self.simulate,'EQN'))
+ self.actionEquationOriented.setShortcut('Ctrl+E')
self.actionUndo.triggered.connect(self.undo)
self.actionUndo.setShortcut('Ctrl+Z')
self.actionRedo.triggered.connect(self.redo)
self.actionRedo.setShortcut('Ctrl+Y')
- # self.actionUndo_2.triggered.connect(self.undoStack.undo)
- # self.actionRedo.triggered.connect(self.undoStack.redo)
- self.actionSave_2.triggered.connect(self.save)
- self.actionSave_2.setShortcut('Ctrl+S')
+ self.actionSave.triggered.connect(self.save)
+ self.actionSave.setShortcut('Ctrl+S')
self.actionOpen.triggered.connect(self.open)
self.actionOpen.setShortcut('Ctrl+O')
self.actionTerminate.triggered.connect(self.terminate)
self.actionTerminate.setShortcut('Ctrl+T')
- self.actionBinary_Phase_Envelope.triggered.connect(self.BinPhaseEnv)
+ self.actionBinaryPhaseEnvelope.triggered.connect(self.bin_phase_env)
'''
Handles all the buttons of different components.
'''
- def buttonHandler(self):
+ def button_handler(self):
self.pushButton.clicked.connect(partial(self.component,'MaterialStream'))
self.pushButton_7.clicked.connect(partial(self.component,'Mixer'))
self.pushButton_14.clicked.connect(partial(self.component,'Pump'))
- self.pushButton_26.clicked.connect(partial(self.component,'DistCol'))
- self.pushButton_18.clicked.connect(partial(self.component,'ShortCol'))
+ self.pushButton_26.clicked.connect(partial(self.component,'DistillationColumn'))
+ self.pushButton_18.clicked.connect(partial(self.component,'ShortcutColumn'))
self.pushButton_11.clicked.connect(partial(self.component,'Heater'))
self.pushButton_10.clicked.connect(partial(self.component,'Splitter'))
self.pushButton_9.clicked.connect(partial(self.component,'Flash'))
self.pushButton_25.clicked.connect(partial(self.component,'Valve'))
self.pushButton_12.clicked.connect(partial(self.component,'Cooler'))
- self.pushButton_13.clicked.connect(partial(self.component,'CompSep'))
+ self.pushButton_13.clicked.connect(partial(self.component,'CompoundSeparator'))
self.pushButton_15.clicked.connect(partial(self.component,'AdiabaticCompressor'))
self.pushButton_16.clicked.connect(partial(self.component,'AdiabaticExpander'))
@@ -135,27 +131,27 @@ class MainApp(QMainWindow,ui):
msgBox.setStandardButtons(QMessageBox.Ok)
msgBox.exec_()
- def BinPhaseEnv(self):
+ def bin_phase_env(self):
#compounds = self.comp.getComp()
- if len(self.comp.getComp())<2:
+ if len(self.comp.get_compounds())<2:
QMessageBox.about(self, 'Important', "Please select at least 2 Compounds first")
self.comp.show()
#compunds = self.comp.getComp()
else:
- self.bin_phase = Bin_Phase_env(self.comp)
+ self.bin_phase = BinPhaseEnv(self.comp)
self.bin_phase.show()
'''
Shows Compounds Selector Dialog
'''
- def selectCompounds(self):
+ def select_compounds(self):
self.comp.show()
'''
- Returns currenttime in a required particular format
+ Returns current time in a required particular format
'''
- def currentTime(self):
+ def current_time(self):
now = datetime.datetime.now()
time = str(now.hour) + ":" + str(now.minute) + ":" +str(now.second)
return time
@@ -166,19 +162,19 @@ class MainApp(QMainWindow,ui):
selected by the user.
'''
def simulate(self,mode):
- self.thrd = threading.Thread(target=self.Container.simulate, args=(mode,))
+ self.thrd = threading.Thread(target=self.container.simulate, args=(mode,))
self.thrd.start()
def terminate(self):
- os.chdir(self.Container.flowsheet.root_dir)
+ os.chdir(self.container.flowsheet.root_dir)
if self.thrd:
thread_id = self.thrd.ident
print('____________________Going to terminate simulation thread with Thread ID:',thread_id,'____________________')
print('____________________Going to terminate the new process created for omc____________________')
- self.Container.flowsheet.process.terminate()
+ self.container.flowsheet.process.terminate()
print('____________________New process created for omc is terminated.____________________')
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))
- self.textBrowser.append("<span style=\"color:red\">["+str(self.currentTime())+"]<b> Terminating the simulation </b></span>")
+ self.textBrowser.append("<span style=\"color:red\">["+str(self.current_time())+"]<b> Terminating the simulation </b></span>")
print('____________________Simulation thread terminated____________________')
if res > 1:
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
@@ -187,40 +183,40 @@ class MainApp(QMainWindow,ui):
'''
Resets the zoom level to default scaling
'''
- def zoomReset(self):
- if(self.zoomcount>0):
- for i in range(self.zoomcount):
+ def zoom_reset(self):
+ if(self.zoom_count>0):
+ for i in range(self.zoom_count):
self.zoomout()
- elif(self.zoomcount<0):
- for i in range(abs(self.zoomcount)):
+ elif(self.zoom_count<0):
+ for i in range(abs(self.zoom_count)):
self.zoomin()
'''
ZoomOut the canvas
'''
- def zoomout(self):
+ def zoom_out(self):
self.graphicsView.scale(1.0/1.15,1.0/1.15)
- self.zoomcount -=1
+ self.zoom_count -=1
'''
ZoomIn the canvas
'''
- def zoomin(self):
+ def zoom_in(self):
self.graphicsView.scale(1.15,1.15)
- self.zoomcount +=1
+ self.zoom_count +=1
'''
Instantiate a NodeItem object for selected type of
component and added that on canvas/flowsheeting area.
'''
- def component(self,unitOpType):
- if(self.comp.isCompSelected()):
- self.type = unitOpType
+ def component(self,unit_operation_type):
+ if(self.comp.is_compound_selected()):
+ self.type = unit_operation_type
if(self.type=="MaterialStream"):
- self.obj = MaterialStream(CompNames=compound_selected)
+ self.obj = MaterialStream(compound_names = compound_selected)
else:
self.obj = eval(self.type)()
- self.Container.addUnitOp(self.obj)
+ self.container.add_unit_operation(self.obj)
else:
QMessageBox.about(self, 'Important', "Please Select Compounds first")
@@ -232,48 +228,54 @@ class MainApp(QMainWindow,ui):
def new(self):
self.undo_redo_helper()
self.comp.tableWidget.setRowCount(0)
- self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>New</b> flowsheet is created ... </span>")
+ self.textBrowser.append("<span>[" + str(self.current_time()) + "] <b>New</b> flowsheet is created ... </span>")
+ dock_widget_lst.clear()
+
+ '''
+ Handels all the operations which will happen when delete button is pressed.
+ '''
+ def delete_call(self,event):
+ try:
+ if event.key() == QtCore.Qt.Key_Delete:
+ l=self.scene.selectedItems()
+ # for i in l:
+ # eval(i.type).counter -= 1
+ self.container.delete(l)
+ except Exception as e:
+ print(e)
'''
It helps by clearing screen and loading the objects by undo redo methods
'''
def undo_redo_helper(self):
- for i in self.Container.unitOp:
+ for i in self.container.unit_operations:
type(i).counter = 1
- del self.Container
+ del self.container
+ for i in dock_widget_lst:
+ i.hide()
+ del i
lst.clear()
- self.Container = Container(self.textBrowser)
+ self.container = Container.Container(self.textBrowser, self.graphicsView)
compound_selected.clear()
- self.scene = self.Container.graphics.getScene()
+ self.scene = self.container.graphics.get_scene()
self.graphicsView.setScene(self.scene)
self.graphicsView.setMouseTracking(True)
- self.graphicsView.keyPressEvent=self.deleteCall
+ self.graphicsView.keyPressEvent=self.delete_call
+
- '''
- Handels all the operations which will happen when delete button is pressed.
- '''
- def deleteCall(self,event):
- try:
- if event.key() == QtCore.Qt.Key_Delete:
- l=self.scene.selectedItems()
- for i in l:
- eval(i.type).counter -= 1
- self.Container.delete(l)
- except Exception as e:
- print(e)
'''
Function for undo
'''
def undo(self):
- redo_data = POP('Undo')
+ redo_data = pop('Undo')
if redo_data is not None:
- PUSH('Redo', redo_data)
+ push('Redo', redo_data)
undo_data = get_last_list('Undo')
messages = self.textBrowser.toPlainText()
try:
self.undo_redo_helper()
- self.Container.graphics.loadCanvas(undo_data)
+ self.container.graphics.load_canvas(undo_data, self.container)
self.textBrowser.setText(messages)
except Exception as e:
print(e)
@@ -281,72 +283,75 @@ class MainApp(QMainWindow,ui):
else:
messages = self.textBrowser.toPlainText()
self.textBrowser.setText(messages)
- self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>No more undo can be done!</b>... </span>")
+ self.textBrowser.append("<span>[" + str(self.current_time()) + "] <b>No more undo can be done!</b>... </span>")
'''
Function for redo
'''
def redo(self):
- redo_data = POP('Redo')
+ redo_data = pop('Redo')
if redo_data is not None:
- PUSH('Undo', redo_data)
+ push('Undo', redo_data)
messages = self.textBrowser.toPlainText()
self.undo_redo_helper()
- self.Container.graphics.loadCanvas(redo_data)
+ self.container.graphics.load_canvas(redo_data, self.container)
self.textBrowser.setText(messages)
else:
messages = self.textBrowser.toPlainText()
self.textBrowser.setText(messages)
- self.textBrowser.append("<span>[" + str(self.currentTime()) + "] <b>No more redo can be done!</b>... </span>")
+ self.textBrowser.append("<span>[" + str(self.current_time()) + "] <b>No more redo can be done!</b>... </span>")
'''
Function for saving the current canvas items and compound_selected
'''
def save(self):
data = []
- for i in self.Container.unitOp:
+ for i in self.container.unit_operations:
data.append(i)
print(i.pos)
data.append(compound_selected)
print(data)
- fileFormat = 'sim'
- initialPath = QDir.currentPath() + 'untitled.' + fileFormat
- fileName, _ = QFileDialog.getSaveFileName(self, "Save As",
- initialPath, "%s Files (*.%s);; All Files (*)" %
- (fileFormat.upper(), fileFormat))
- if fileName != "":
- with open(fileName, 'wb') as f: #'saved_file.sim'
+ file_format = 'sim'
+ initial_path = QDir.currentPath() + 'untitled.' + file_format
+ file_name, _ = QFileDialog.getSaveFileName(self, "Save As",
+ initial_path, "%s Files (*.%s);; All Files (*)" %
+ (file_format.upper(), file_format))
+ #if file_name != "":
+ try:
+ with open(file_name, 'wb') as f: #'saved_file.sim'
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
+ except Exception as e:
+ pass
'''
Function for loading previous saved canvas and simulation
'''
def open(self):
try:
- fileFormat = 'sim'
- initialPath = QDir.currentPath() + 'untitled.' + fileFormat
+ file_format = 'sim'
+ initial_path = QDir.currentPath() + 'untitled.' + file_format
- fileName, _ = QFileDialog.getOpenFileName(self, "Open As",
- initialPath, "%s Files (*.%s);; All Files (*)" %
- (fileFormat.upper(), fileFormat))
+ file_name, _ = QFileDialog.getOpenFileName(self, "Open As",
+ initial_path, "%s Files (*.%s);; All Files (*)" %
+ (file_format.upper(), file_format))
# if fileName != "":
# self.new()
self.undo_redo_helper()
- with open(fileName, 'rb') as f:
+ with open(file_name, 'rb') as f:
obj = pickle.load(f)
-
- self.Container.graphics.loadCanvas(obj)
+ print(obj)
+ self.container.graphics.load_canvas(obj, self.container)
except Exception as e:
pass
def main():
- CLEAN_FILE('Undo')
- CLEAN_FILE('Redo')
+ clean_file('Undo')
+ clean_file('Redo')
app = QApplication(sys.argv)
window = MainApp()
diff --git a/resDockWidget.py b/resDockWidget.py
deleted file mode 100644
index 9466b4e..0000000
--- a/resDockWidget.py
+++ /dev/null
@@ -1,92 +0,0 @@
-from PyQt5.QtCore import *
-from PyQt5.QtWidgets import *
-from PyQt5.QtGui import *
-from PyQt5.uic import loadUiType
-import pandas as pd
-from functools import partial
-from component_selector import *
-from collections import defaultdict
-from container import *
-
-ui_dialog,_ = loadUiType('resDock.ui')
-
-class resdockWidget(QDockWidget,ui_dialog):
-
- def __init__(self,containerobj,parent=None):
- QDockWidget.__init__(self,parent)
- self.setupUi(self)
- self.setWindowTitle("Results")
- self.nameType = None
- self.Container = containerobj
- self.results()
-
- self.pushButton_3.clicked.connect(self.resultTree)
-
- def abriveation(self,key):
- d ={"P":"Pressure","T":"Temperature",
- "xliq":"Liquid Phase Mol Fraction","xmliq":"Liquid Pase Mass Fraction",
- "xvap":"Vapour Phase Mol Fracrion","xmvap":"Vapour Phase Mass Fracrion",
- "F_p[1]":"Molar Flow","Fm_p[1]":"Mass Flow","MW_p[1]":"Mixer Phase Molecular Weight",
- "MW_p[2]":"Liquid Phase Molecular Weight","MW_p[3]":"Vapour Phase Molecular Weight",
- "Cp_p[1]":"Mixer Phase molar Heat Capacity","Cp_p[2]":"Liquid Phase molar Heat Capacity",
- "Cp_p[3]":"Vapour Phase molar Heat Capacity","H_p[1]":"Mixer Phase Molar Enthalpy",
- "H_p[2]":"Liquid Phase Molar Enthalpy","H_p[3]":"Vapour Phase Molar Enthalpy",
- "S_p[1]":"Mixer Phase Molar Entropy","S_p[2]":"Liquid Phase Molar Entropy",
- "S_p[3]":"Vapour Phase Molar Entropy","F_p[2]":"Liquid Phase Molar Flow Rate",
- "F_p[3]":"Vapour Phase Molar Flow Rate","Fm_p[2]":"Liquid Phase Mass Flow Rate",
- "F_p[3]":"Liquid Phase Mass Flow Rate",
- }
-
- for i in range(len(compound_selected)):
- d["compMolFrac[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mole fraction"
- d["compMolFrac[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mole fraction"
- d["compMolFrac[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mole fraction"
-
- d["compMasFrac[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mass fraction"
- d["compMasFrac[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mass fraction"
- d["compMasFrac[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mass fraction"
-
- d["compMasFlo[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mass flo"
- d["compMasFlo[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mass flo"
- d["compMasFlo[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mass flo"
-
- d["compMolFlo[1,"+str(i+1)+"]"] = str(compound_selected[i]) +" Mixer mole flo"
- d["compMolFlo[2,"+str(i+1)+"]"] = str(compound_selected[i]) +" Liquid mole flo"
- d["compMolFlo[3,"+str(i+1)+"]"] = str(compound_selected[i]) +" Vapour mole flo"
- if key in d.keys():
- return d[key]
- else:
- return key
-
- def resultsCategory(self,name):
- try:
- print("Under result category")
- result=self.Container.result
- obj = self.Container.fetchObject(name)
- self.tableWidget.setRowCount(0)
- for key, value in obj.Prop.items():
- propertyname = name + '.' + key
- print(key,value)
- if propertyname in result[0]:
- ind = result[0].index(propertyname)
- resultval = str(result[-1][ind])
- #stm.Prop[key] = resultval
- print("######Resultsfetch####",key,resultval)
- rowPosition = self.tableWidget.rowCount()
- self.tableWidget.insertRow(rowPosition)
- self.tableWidget.setItem(rowPosition , 0, QTableWidgetItem(str(self.abriveation(key))))
- self.tableWidget.setItem(rowPosition , 1, QTableWidgetItem(str(resultval)))
- self.tableWidget.resizeColumnsToContents()
- except Exception as e:
- print(e)
-
-
- def resultTree(self):
- self.resultsCategory(self.comboBox.currentText())
-
- def results(self): # Should be named as selecting object whose result is to be displayed
- self.nameType={}
- for i in Container.unitOp:
- #nameslist.append(i.name)
- self.nameType[i.name] = i.type
- self.comboBox.addItem(str(i.name)) \ No newline at end of file
diff --git a/svg/Centrifugal Pump.svg b/svg/Centrifugal Pump.svg
new file mode 100644
index 0000000..5b60256
--- /dev/null
+++ b/svg/Centrifugal Pump.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5.8764515mm"
+ height="5.1060538mm"
+ viewBox="0 0 5.8764515 5.1060538"
+ version="1.1"
+ id="svg919"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="Centrifugal Pump.svg">
+ <defs
+ id="defs913" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="11.105106"
+ inkscape:cy="9.6492281"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1304"
+ inkscape:window-height="745"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata916">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-102.89511,-146.2803)">
+ <g
+ id="use23667"
+ transform="matrix(0.26458333,0,0,0.26458333,87.26164,148.76091)">
+ <desc
+ id="desc937">Centrifugal pump</desc>
+ <title
+ id="title939">Centrifugal pump</title>
+ <path
+ d="m 63.461437,0.93302941 c 0,-4.83160421 3.917761,-8.74995261 8.751431,-8.74995261 4.831585,0 8.749327,3.9183484 8.749327,8.74995261 0,4.83440929 -3.917742,8.75275769 -8.749327,8.75275769 -4.83367,0 -8.751431,-3.9183484 -8.751431,-8.75275769 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381"
+ id="path941"
+ inkscape:connector-curvature="0" />
+ <g
+ style="stroke-width:0.96060389"
+ id="g945"
+ transform="matrix(0.69599386,0,0,0.6960967,-60.599463,-916.20963)">
+ <path
+ d="m 178.25,1317.551 c 0,-6.942 5.629,-12.571 12.574,-12.571 6.942,0 12.571,5.629 12.571,12.571 0,6.945 -5.629,12.574 -12.571,12.574 -6.945,0 -12.574,-5.629 -12.574,-12.574 z m -6.285,0 h 18.859 m 0,-12.571 h 12.571"
+ style="fill:none;stroke:#000000;stroke-width:0.68082803;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ id="path943"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="stroke-width:0.96060389"
+ id="g949"
+ transform="matrix(0.69599386,0,0,0.6960967,-60.599463,-916.20963)">
+ <path
+ d="m 189.406,1316.133 1.418,1.418 -1.418,1.418 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.68082803;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ id="path947"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="stroke-width:0.96060389"
+ id="g953"
+ transform="matrix(0.69599386,0,0,0.6960967,-60.599463,-916.20963)">
+ <path
+ d="m 201.977,1303.563 1.418,1.417 -1.418,1.418 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.68082803;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ id="path951"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/svg/Cooler.svg b/svg/Cooler.svg
new file mode 100644
index 0000000..fd7a4a8
--- /dev/null
+++ b/svg/Cooler.svg
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="6.2097631mm"
+ height="6.957972mm"
+ viewBox="0 0 6.2097631 6.957972"
+ version="1.1"
+ id="svg834"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="Cooler.svg">
+ <defs
+ id="defs828" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="328.87784"
+ inkscape:cy="-235.4225"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1304"
+ inkscape:window-height="745"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata831">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-18.817737,-79.58649)">
+ <g
+ id="use29930"
+ transform="matrix(0.26458333,0,0,0.26458333,15.449143,40.948477)">
+ <desc
+ id="desc848">Cooler</desc>
+ <title
+ id="title850">Cooler</title>
+ <path
+ inkscape:connector-curvature="0"
+ id="path852"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381"
+ d="m 12.968678,159.18366 c 0,-5.83167 4.727229,-10.55964 10.559596,-10.55964 5.831627,0 10.559615,4.72797 10.559615,10.55964 0,5.83227 -4.727988,10.55957 -10.559615,10.55957 -5.832367,0 -10.559596,-4.7273 -10.559596,-10.55957 z" />
+ <g
+ style="stroke-width:0.91540313"
+ transform="matrix(0.73041461,0,0,0.73041461,-222.05687,-1910.6315)"
+ id="g856">
+ <path
+ inkscape:connector-curvature="0"
+ id="path854"
+ style="fill:none;stroke:#000000;stroke-width:0.64879197;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ d="m 321.77,2833.754 c 0,-7.984 6.472,-14.457 14.457,-14.457 7.984,0 14.457,6.473 14.457,14.457 0,7.984 -6.473,14.457 -14.457,14.457 -7.985,0 -14.457,-6.473 -14.457,-14.457 z m 31.808,-8.676 h -14.457 v 5.781 h 5.781 v 5.786 h -5.781 v 5.781 h 14.457 m -26.023,-26.676 v 36.004" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/svg/Heater.svg b/svg/Heater.svg
new file mode 100644
index 0000000..7d21cf7
--- /dev/null
+++ b/svg/Heater.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5.3247261mm"
+ height="6.4700546mm"
+ viewBox="0 0 5.3247261 6.4700546"
+ version="1.1"
+ id="svg781"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="Heater.svg">
+ <defs
+ id="defs775" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="232.91962"
+ inkscape:cy="-110.63027"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1304"
+ inkscape:window-height="745"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata778">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-44.206684,-113.09235)">
+ <g
+ id="use29539"
+ transform="matrix(0.26458333,0,0,0.26458333,-24.278784,87.432225)">
+ <desc
+ id="desc799">Heater</desc>
+ <title
+ id="title801">Heater</title>
+ <path
+ inkscape:connector-curvature="0"
+ id="path803"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381"
+ d="m 261.57546,109.05859 c 0,-3.75298 3.04023,-6.79588 6.79323,-6.79588 3.75299,0 6.79322,3.0429 6.79322,6.79588 0,3.75099 -3.04023,6.79322 -6.79322,6.79322 -3.753,0 -6.79323,-3.04223 -6.79323,-6.79322 z" />
+ <g
+ transform="matrix(0.66862381,0,0,0.66862381,142.28093,-1940.5551)"
+ id="g807">
+ <path
+ inkscape:connector-curvature="0"
+ id="path805"
+ style="fill:none;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ d="m 178.418,3065.152 h 2.543 l 5.078,-4.812 5.586,10.16 4.574,-5.348 h 2.539 m -20.32,0.27 c 0,-5.613 4.547,-10.164 10.16,-10.164 5.613,0 10.16,4.551 10.16,10.164 0,5.609 -4.547,10.16 -10.16,10.16 -5.613,0 -10.16,-4.551 -10.16,-10.16 z" />
+ </g>
+ <g
+ transform="matrix(0.66862381,0,0,0.66862381,142.28093,-1940.5551)"
+ id="g811">
+ <path
+ inkscape:connector-curvature="0"
+ id="path809"
+ style="fill:none;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ d="m 204.156,3047.586 -28.898,35.219" />
+ </g>
+ <g
+ transform="matrix(0.66862381,0,0,0.66862381,142.28093,-1940.5551)"
+ id="g815">
+ <path
+ inkscape:connector-curvature="0"
+ id="path813"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ d="m 181.516,3078.16 -6.258,4.645 3.336,-7.043 z" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/svg/Pump.svg b/svg/Pump.svg
new file mode 100644
index 0000000..dd573ee
--- /dev/null
+++ b/svg/Pump.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="6.877779mm"
+ height="4.7104506mm"
+ viewBox="0 0 6.8777789 4.7104506"
+ version="1.1"
+ id="svg875"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="Pump.svg">
+ <defs
+ id="defs869" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="24.307994"
+ inkscape:cy="39.562189"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1304"
+ inkscape:window-height="745"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata872">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-46.453968,-113.21621)">
+ <g
+ id="use23472"
+ transform="matrix(0.26458333,0,0,0.26458333,42.705476,115.26531)">
+ <desc
+ id="desc890">Pump</desc>
+ <title
+ id="title892">Pump</title>
+ <g
+ id="g900">
+ <path
+ inkscape:connector-curvature="0"
+ id="path894"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.66862381"
+ d="m 18.500164,1.1580787 c 0,-4.7846574 3.878698,-8.6660282 8.666047,-8.6660282 4.784657,0 8.663356,3.8813708 8.663356,8.6660282 0,4.7853397 -3.878699,8.6633558 -8.663356,8.6633558 -4.787349,0 -8.666047,-3.8780161 -8.666047,-8.6633558 z" />
+ <g
+ transform="matrix(0.66862381,0,0,0.66862381,-389.41514,-1116.0024)"
+ id="g898">
+ <path
+ inkscape:connector-curvature="0"
+ id="path896"
+ style="fill:none;stroke:#000000;stroke-width:0.70875001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+ d="m 610.082,1670.836 c 0,-7.156 5.801,-12.961 12.961,-12.961 7.156,0 12.957,5.805 12.957,12.961 0,7.156 -5.801,12.957 -12.957,12.957 -7.16,0 -12.961,-5.801 -12.961,-12.957 z m 5.184,10.367 20.734,-10.367 -20.734,-10.367 m -5.184,10.367 h -6.48 m 32.398,0 h 6.48" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/umlet.uxf b/umlet.uxf
new file mode 100644
index 0000000..89f794e
--- /dev/null
+++ b/umlet.uxf
@@ -0,0 +1,1497 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<diagram program="umlet" version="14.3.0">
+ <help_text>// Uncomment the following line to change the fontsize and font:
+fontsize=10
+// fontfamily=SansSerif //possible: SansSerif,Serif,Monospaced
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// Welcome to UMLet!
+//
+// Double-click on elements to add them to the diagram, or to copy them
+// Edit elements by modifying the text in this panel
+// Hold Ctrl to select multiple elements
+// Use Ctrl+mouse to select via lasso
+//
+// Use +/- or Ctrl+mouse wheel to zoom
+// Drag a whole relation at its central square icon
+//
+// Press Ctrl+C to copy the whole diagram to the system clipboard (then just paste it to, eg, Word)
+// Edit the files in the "palettes" directory to create your own element palettes
+//
+// Select "Custom Elements &gt; New..." to create new element types
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+
+// This text will be stored with each diagram; use it for notes.</help_text>
+ <zoom_level>7</zoom_level>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>217</x>
+ <y>385</y>
+ <w>182</w>
+ <h>245</h>
+ </coordinates>
+ <panel_attributes>MainApp
+--
++ zoomcount: int = 0
++ thrd: Thread = None
++ container: Container()
++ comp: ComponentSelector()
++ scene: Graphics.QGraphicsScene()
+--
++ menuBar()
++ buttonHandler()
++ help()
++ BinPhaseEnv()
++ selectCompounds()
++ currentTime()
++ simulate(mode)
++ terminate()
++ zoomReset()
++ zoomOut()
++ zoomIn()
++ component()
++ new()
++ deleteCall()
++ undo_redo_helper()
++ undo()
++ redo()
++ save()
++ open()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>231</x>
+ <y>210</y>
+ <w>154</w>
+ <h>119</h>
+ </coordinates>
+ <panel_attributes>QMainWindow
+--
+graphicsView.keyPressEvent
+textBrowser: UC1
+--
+setUpUi()
+graphicsView.setScene()
+graphicsView.setMouseTracking()
+setDockNestingEnabled()
+setCorner()
+addDockWidget()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>301</x>
+ <y>322</y>
+ <w>21</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>245</x>
+ <y>112</y>
+ <w>119</w>
+ <h>42</h>
+ </coordinates>
+ <panel_attributes>UC1 (textBrowserClass)
+--
+setText()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>294</x>
+ <y>147</y>
+ <w>21</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>455</x>
+ <y>126</y>
+ <w>224</w>
+ <h>189</h>
+ </coordinates>
+ <panel_attributes>ComponentSelector
+--
++ Dict1: dictionary = dict()
++ instance: list = [ChemsepDatabase()]
++ lines: list = []
++ model: QStringListModel()
++ completer: QCompleter()
+--
++ final_list(*list_name)
++ isCompSelected()
++ get_object(component)
++ get_original_name(component, removing_attrib)
++ compoundSelection()
+_+ setCompounds(compounds)_
++ addToTable(a)
++ addCompToList(comp)
++ removeItems()
++ Show_Error()
++ cancel()
++ getComp()
++ final_mo()
+
+
+
+
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>469</x>
+ <y>378</y>
+ <w>161</w>
+ <h>252</h>
+ </coordinates>
+ <panel_attributes>Container
+--
++ unitOp: list = []
++ termoPackage = None
++ compounds = None
++ conn: dictionary = defaultdict(list)
++ op: dictionary = defaultdict(list)
++ ip: dictionary = defaultdict(list)
++ msg
++ opl: list = []
++ result: list = []
++ graphics: Graphics(unitOp)
++ scene : graphics.getScene()
+--
++ currentTime()
++ addUnitOp(obj, graphicsView)
++ delete(l)
++ fetchObject(name)
++ addCompounds(comp)
++ add_thermoPackage(thermo)
++ msgBrowser()
++ simulate(mode)
++ flatlist(lst)
++ PUSH(fileName, data)
++ CLEAN_FILE(fileName)
++ POP(fileName)
++ get_last_list(fileName)
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>686</x>
+ <y>434</y>
+ <w>238</w>
+ <h>119</h>
+ </coordinates>
+ <panel_attributes>Graphics
+--
++ scene: QGraphicsScene()
++ pos: QPointF = None
++ unitOp: list = unitOp
+--
++ getScene()
++ getComponentSelector()
++ createNodeItem(unitOpr, container, graphicsView)
++ boundingRect()
++ loadCanvas(obj)
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>728</x>
+ <y>238</y>
+ <w>147</w>
+ <h>105</h>
+ </coordinates>
+ <panel_attributes>QDialog
+--
+lineEdit: UC2
+compoundSelectButton: UC3
+pushButton: UC4
+pushButton_2: UC4
+pshButton_3: UC4
+--
+setupUi()
+show()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>728</x>
+ <y>42</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>QStringListModel
+--
+setStringList()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>910</x>
+ <y>231</y>
+ <w>147</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>UC3 (selectButtonClass)
+--
+clicked.connect()
+setAutoDefault()
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>728</x>
+ <y>98</y>
+ <w>147</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>QCompleter
+--
+setCaseSensitivity()
+setModel()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>728</x>
+ <y>175</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>UC2 (lineEditClass)
+--
+setCompleter()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>910</x>
+ <y>294</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>UC4 (pushButtonClass)
+--
+clicked.connect()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>665</x>
+ <y>595</y>
+ <w>259</w>
+ <h>315</h>
+ </coordinates>
+ <panel_attributes>NodeItem
+--
++ obj: UnitOperation = unitOpr
++ container: Container = container
++ graphicsView: QGraphicsView = graphicsView
++ name: string = obj.name
++ type: string = obj.type
++ default_tooltip: string
++ default_tooltip_dict: dictionary
++ nin: int = obj.no_of_inputs
++ nop: int = obj.no_of_outputs
++ text: string = user_input
++ ok: boolean = user_input
++ dockWidget: DockWidget() or DockWidgetMaterialStream()
+ or DockWidgetMixer() or DockWidgetSplitter()
+ or DockWidgetFlash() or DockWidgetCompoundSeparator()
+ or DockWidgetDistillationColumn()
+ or DockWidgetShortcutColumn()
++ mainwindow = findMainWindow()
++ pic: QPixmap()
++ rect: QRect()
++ text: QGraphicsTextItem()
++ f: QFont()
++ brush: QBrush()
++ pen: QPen()
++ selPen: QPen()
++ Input:list = [NodeSocket(type)]
++ Output:list = [NodeSocket(type)]
+--
+shape()
+boundingRect()
+paint()
+mouseMoveEvent(event)
+mouseDoubleClickEvent(event)
++ initializeSockets(type)
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>644</x>
+ <y>987</y>
+ <w>119</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>QtWidgets.QGraphicsItem
+--
+setTooltip(default_tooltip)
+setFlag
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>847</x>
+ <y>1036</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>QtWidgets.QInputDialog
+--
+getText()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>798</x>
+ <y>1092</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>QtGui.QFont
+--
+setPointSize()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>644</x>
+ <y>1064</y>
+ <w>147</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>QtWidgets.QGraphicTextItem
+--
+setFont()
+setDefaultTextColor()
+setParentItem()
+setPos()
+setPlainText()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>483</x>
+ <y>707</y>
+ <w>112</w>
+ <h>42</h>
+ </coordinates>
+ <panel_attributes>QtGui.QBrush
+--
+setStyle()
+setColor()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>294</x>
+ <y>707</y>
+ <w>147</w>
+ <h>56</h>
+ </coordinates>
+ <panel_attributes>QtGui.QPen
+--
+setStyle()
+setColor()
+setWidth()
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>469</x>
+ <y>805</y>
+ <w>147</w>
+ <h>189</h>
+ </coordinates>
+ <panel_attributes>NodeSocket
+--
++ rect: QRect = rect
++ type: string = socketType
++ parent: NodeItem = parent
++ newLine: NodeLine = None
++ otherLine: NodeLine = None
++ brush: QBrush()
++ pen: QPen()
++ outLines: list = []
++ inLines: list = []
+--
+shape()
+boundingRect()
+paint()
+mousePressEvent(event)
+mouseMoveEvent(event)
+mouseReleaseEvent(event)
+hoverEnterEvent(event)
+hoverLeaveEvent(event)
++ getCenter()
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>245</x>
+ <y>805</y>
+ <w>147</w>
+ <h>161</h>
+ </coordinates>
+ <panel_attributes>NodeLine
+--
++ _pointA: QPointF = pointA
++ _pointB: QPointF = pointB
++ _source: QPointF = None
++ _targer: QPointF = None
++ socket: string = socket
++ pen: QPen()
+--
+updatePath()
+paint()
+__delete__(instance)
++ pointA()
++ pointA(point)
++ pointB()
++ pointB(poing)
++ source()
++ target()
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>140</x>
+ <y>707</y>
+ <w>147</w>
+ <h>56</h>
+ </coordinates>
+ <panel_attributes>QtWigets.QGraphicsPathItem
+--
+setZValue()
+setBrush()
+setPen()
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1337</x>
+ <y>154</y>
+ <w>168</w>
+ <h>210</h>
+ </coordinates>
+ <panel_attributes>DockWidgetMaterialStream
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ input_dict: dictionary = {}
++ dict: dictionary = {}
++ x_pclist: list = []
++ name_type: string = None
++ container: Container = container
++ header: QTreeWidgetItem()
+--
++ modes()
++ mode_selection()
++ input_params_list()
++ param()
++ results_category(name)
++ _show_result(lst)_
++ show_error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>910</x>
+ <y>350</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>UC5 (comboBoxClass)
+--
+currentIndexChanged.connect()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1092</x>
+ <y>294</y>
+ <w>168</w>
+ <h>182</h>
+ </coordinates>
+ <panel_attributes>DockWidget
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ input_dict: dictionary = {}
++ dict: dictionary = {}
++ x_pclist: list = []
++ name_type: string = None
++ container: Container = container
+--
++ modes()
++ mode_selection()
++ input_params_list()
++ param()
++ show_error()
+_+ show_result(lst)_
++ result_category(name)</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1120</x>
+ <y>147</y>
+ <w>147</w>
+ <h>112</h>
+ </coordinates>
+ <panel_attributes>QDockWidget
+--
+pushButton_2: UC4
+comboBox: UC5
+
+btn:UC4
+--
+setupUi()
+setWindowTitle()
+hide()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1337</x>
+ <y>686</y>
+ <w>168</w>
+ <h>161</h>
+ </coordinates>
+ <panel_attributes>DockWidgetShortcutColumn
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ input_dict: list = []
++ dict: list = []
++ name_yype: string = None
++ container: Container = container
+--
++ input_params_list()
++ fun()
++ param()
++ show_error()
+_+ show_result(lst)_
++ result_category(name)</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1337</x>
+ <y>546</y>
+ <w>168</w>
+ <h>126</h>
+ </coordinates>
+ <panel_attributes>DockWidgetMixer
+DockWidgetCompoundSeparator
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ input_dict: list = []
++ dict: list = []
+--
++ input_params_list()
++ param()
++ show_error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1337</x>
+ <y>392</y>
+ <w>168</w>
+ <h>140</h>
+ </coordinates>
+ <panel_attributes>DockWidgetSplitter
+DockWidgetFlash
+--
++ name: string = name
++ obj: UnitOperations = obj
++ type: string = comptype
++ input_dict: list = []
++ dict: list = []
+--
++ input_params_list()
++ fun()
++ param()
++ show_error()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1022</x>
+ <y>511</y>
+ <w>231</w>
+ <h>231</h>
+ </coordinates>
+ <panel_attributes>Flowsheet
+--
++ sim_name: string = 'Simulator'
++ sim_method: string = ''
++ UnitOpn: list = []
++ data: list = []
++ compounds: list = []
++ interface: string = ''
++ omc_path: string = None
++ omc_path: string = cwd()
++ sim_dir_path: string = join(curr_path, sim_name)
++ Flomo_path: string = join(ssim_dir_path, 'Flowsheet.mo')
++ eqn_mos_path: string = join(sim_dir_path, 'simlateEQN.mos')
++ sm_mos_path: string = join(sim_dir_path, 'simulateSM.mos')
++ resdata: list = []
++ stdout = None
++ stderr = None
+--
++ get_omc_path()
++ add_UnitOpn()
++ remove_UnitOpn()
++ add_comp_list()
++ send_for_simulationEqn()
++ send_for_simulationSM()
++ ExtData()
++ simulateEQN()
++ simulateSM()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1050</x>
+ <y>980</y>
+ <w>189</w>
+ <h>280</h>
+ </coordinates>
+ <panel_attributes>MaterialStream
+--
+_+ counter: int = 1_
++ name: string = 'MaterialStream' + counter
++ type: string = 'MaterialStream'
++ CompNames: string = CompNames
++ count: int = counter
++ thermoPackage: string = 'RaoultsLaw'
++ mode1: string = 'P'
++ mode2: string = 'T'
++ mode1val: string = ''
++ mode2Val: string = ''
++ OM_data_init: string = ''
++ OM_data_eqn: string = ''
++ no_of_inputs: int = 1
++ no_of_outputs: int = 2
++ x: int = 2500-30
++ y: int = 2500-30
++ startDict: dictionary = {}
++ eqnDict: dictionary = {}
++ modesList: list = ['PT',...]
++ variables: dictionary = {'P':{..},...}
+--
++ paramgetter(mode)
++ paramsetter(params)
++ setPos(pos)
++ GetMinEqnValues()
++ GetStartValues()
++ OM_Flowsheet_Initialize()
++ OM_Flowsheet_Equation()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1316</x>
+ <y>980</y>
+ <w>189</w>
+ <h>350</h>
+ </coordinates>
+ <panel_attributes>UnitOperations
+--
+_+ counter: int = 1_
++ OM_data_eqn: string = ''
++ OM_data_init: string = ''
++ InputStms: list = []
++ OutputStms: list = []
++ compounds: list = compound_selected
++ name: string = ''
++ mode: string = None
++ modeVal: string = None
++ type: string = None
++ no_of_inputs: int = 1
++ no_of_outputs: int = 1
++ x: int = 2500-30
++ y: int = 2500-30
++ pos: QPointF(x, y)
++ count: int = counter
++ variables: dictionary = {}
++ modesList: list = []
++ parameters: list = []
++ extra: list = []
++ ForNaming: list = []
++ multidict: list = []
++ ThermoPackReq: boolean = False
++ thermoPackage: list = None
+--
++ paramgetter(mode)
++ paramsetter(params)
++ setPos(pos)
++ add_connection(flag, UnitOpr)
++ OM_Flowsheet_Initialize()
++ OM_Flowsheet_Equation()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>0</x>
+ <y>497</y>
+ <w>175</w>
+ <h>168</h>
+ </coordinates>
+ <panel_attributes>Bin_Phase_env
+--
++ comp: CompoundSelector = comp
++ compounds: list = comp.getComp()
++ lines: list = [line.rstrip('\n')...]
++ counter: int = 1
+--
+setupUi()
++ button_handler()
++ T_xy()
++ P_xy()
++ get_omc_path()
++ plot()
++ pressEvent(evt)
++ entered(items)</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>490</x>
+ <y>0</y>
+ <w>147</w>
+ <h>98</h>
+ </coordinates>
+ <panel_attributes>ChemsepDatabase
+--
++ comp_name_list: list = list()
++ name: string = 'chemsep'
++ comp_prop_list: list = list()
+--
++ get_comp_name_list()
++ get_value(comps, attrib)
++ get_comp_prop(comps)</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>392</x>
+ <y>308</y>
+ <w>84</w>
+ <h>126</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>100.0;10.0;100.0;160.0;10.0;160.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>392</x>
+ <y>476</y>
+ <w>91</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>110.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>553</x>
+ <y>91</y>
+ <w>21</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>672</x>
+ <y>280</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>80.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>791</x>
+ <y>203</y>
+ <w>21</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>791</x>
+ <y>140</y>
+ <w>21</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;50.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>791</x>
+ <y>70</y>
+ <w>21</w>
+ <h>42</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;40.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>868</x>
+ <y>252</y>
+ <w>56</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>868</x>
+ <y>301</y>
+ <w>56</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>623</x>
+ <y>497</y>
+ <w>77</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>90.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>791</x>
+ <y>546</y>
+ <w>21</w>
+ <h>63</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;70.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>609</x>
+ <y>875</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>385</x>
+ <y>875</y>
+ <w>98</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;120.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>217</x>
+ <y>756</y>
+ <w>105</w>
+ <h>63</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;130.0;70.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>315</x>
+ <y>756</y>
+ <w>63</w>
+ <h>63</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>70.0;10.0;10.0;70.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>539</x>
+ <y>742</y>
+ <w>21</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>588</x>
+ <y>728</y>
+ <w>91</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>700</x>
+ <y>903</y>
+ <w>21</w>
+ <h>98</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;120.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>917</x>
+ <y>903</y>
+ <w>21</w>
+ <h>147</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;190.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>819</x>
+ <y>903</y>
+ <w>21</w>
+ <h>203</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;270.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>770</x>
+ <y>903</y>
+ <w>21</w>
+ <h>175</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;230.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>623</x>
+ <y>560</y>
+ <w>413</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>570.0;10.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>973</x>
+ <y>560</y>
+ <w>448</w>
+ <h>434</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>620.0;600.0;620.0;520.0;10.0;520.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1134</x>
+ <y>917</y>
+ <w>21</w>
+ <h>77</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;90.0;10.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>917</x>
+ <y>245</y>
+ <w>672</w>
+ <h>651</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>840.0;10.0;940.0;10.0;940.0;910.0;10.0;910.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>448</y>
+ <w>91</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>602</y>
+ <w>91</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>763</y>
+ <w>91</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1253</x>
+ <y>371</y>
+ <w>336</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;460.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1162</x>
+ <y>252</y>
+ <w>21</w>
+ <h>56</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;10.0;60.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1260</x>
+ <y>175</y>
+ <w>91</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1260</x>
+ <y>196</y>
+ <w>98</w>
+ <h>210</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;120.0;280.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1260</x>
+ <y>224</y>
+ <w>91</w>
+ <h>336</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;460.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1260</x>
+ <y>252</y>
+ <w>91</w>
+ <h>455</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;110.0;630.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>168</x>
+ <y>546</y>
+ <w>63</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;70.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1050</x>
+ <y>308</y>
+ <w>56</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;60.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1050</x>
+ <y>364</y>
+ <w>56</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.</panel_attributes>
+ <additional_attributes>10.0;10.0;60.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>UMLNote</id>
+ <coordinates>
+ <x>14</x>
+ <y>1008</y>
+ <w>112</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>UC is the abbreviation
+for unknown class.
+bg=white
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1141</x>
+ <y>56</y>
+ <w>147</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>Graphics.py
+--
+findMainWindow()</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1554</x>
+ <y>1267</y>
+ <w>147</w>
+ <h>119</h>
+ </coordinates>
+ <panel_attributes>Heater
+Cooler
+AdiabaticCompressor
+AdiabaticExpander
+Valve
+Pump
+Flash
+--
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1554</x>
+ <y>1127</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>Mixer
+--
++ Pout_modes: list = [...]
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1554</x>
+ <y>1169</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>Splitter
+--
++ CalcType_modes: list = [...]
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1554</x>
+ <y>1218</y>
+ <w>147</w>
+ <h>35</h>
+ </coordinates>
+ <panel_attributes>CompoundSeparator
+--
++ SepFact_modes: list = [...]
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1554</x>
+ <y>994</y>
+ <w>175</w>
+ <h>70</h>
+ </coordinates>
+ <panel_attributes>DistillationColumn
+--
++ EngStm1:string = 'EngStm1'+name
++ EngStm2: string = 'EngStm2'+name
++ Cspec_list: list = [...]
++ Rsepc_list: list = [...]
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>UMLClass</id>
+ <coordinates>
+ <x>1554</x>
+ <y>1071</y>
+ <w>175</w>
+ <h>49</h>
+ </coordinates>
+ <panel_attributes>ShortcutColumn
+--
++ EngStm1:string = 'EngStm1'+name
++ EngStm2: string = 'EngStm2'+name
+
+</panel_attributes>
+ <additional_attributes/>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>1022</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>1085</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>1141</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>1190</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>1232</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>1498</x>
+ <y>1309</y>
+ <w>70</w>
+ <h>21</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-</panel_attributes>
+ <additional_attributes>10.0;10.0;80.0;10.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>7</x>
+ <y>1064</y>
+ <w>133</w>
+ <h>28</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;-
+Association</panel_attributes>
+ <additional_attributes>10.0;20.0;170.0;20.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>7</x>
+ <y>1106</y>
+ <w>133</w>
+ <h>28</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;.
+Implements</panel_attributes>
+ <additional_attributes>10.0;20.0;170.0;20.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>7</x>
+ <y>1141</y>
+ <w>133</w>
+ <h>28</h>
+ </coordinates>
+ <panel_attributes>lt=&lt;&lt;-
+Inherits</panel_attributes>
+ <additional_attributes>10.0;20.0;170.0;20.0</additional_attributes>
+ </element>
+ <element>
+ <id>Relation</id>
+ <coordinates>
+ <x>7</x>
+ <y>1169</y>
+ <w>147</w>
+ <h>28</h>
+ </coordinates>
+ <panel_attributes>+'s are user-defined variables and methods
+Qt's methods does not have any symbols</panel_attributes>
+ <additional_attributes>80.0;20.0;120.0;20.0</additional_attributes>
+ </element>
+</diagram>