summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlucaszhao192019-12-23 13:25:49 +0530
committerlucaszhao192019-12-23 13:25:49 +0530
commit9f86138b86efebb816a2289bf84b96d688615f41 (patch)
treec3213fb23a240130186adab4f1c523443d83c319
parente2113828e404349f15b98d6c29e119a11abdab01 (diff)
downloadChemical-Simulator-GUI-9f86138b86efebb816a2289bf84b96d688615f41.tar.gz
Chemical-Simulator-GUI-9f86138b86efebb816a2289bf84b96d688615f41.tar.bz2
Chemical-Simulator-GUI-9f86138b86efebb816a2289bf84b96d688615f41.zip
Feature implementation - saving and partial loading
-rw-r--r--Graphics.py374
-rw-r--r--OMChem/CompSep.py19
-rw-r--r--OMChem/ConvReactor.py37
-rw-r--r--OMChem/Cooler.py14
-rw-r--r--OMChem/DistCol.py17
-rw-r--r--OMChem/Flash.py18
-rw-r--r--OMChem/Heater.py12
-rw-r--r--OMChem/MatStm.py25
-rw-r--r--OMChem/Mixer.py17
-rw-r--r--OMChem/Pump.py12
-rw-r--r--OMChem/ShortcutColumn.py18
-rw-r--r--OMChem/Splitter.py13
-rw-r--r--OMChem/Valve.py13
-rw-r--r--OMChem/adiabatic_comp.py17
-rw-r--r--OMChem/adiabatic_exp.py17
-rw-r--r--component_selector.py3
-rw-r--r--main.ui23
-rw-r--r--mainApp.py391
18 files changed, 609 insertions, 431 deletions
diff --git a/Graphics.py b/Graphics.py
new file mode 100644
index 0000000..4d0a5ea
--- /dev/null
+++ b/Graphics.py
@@ -0,0 +1,374 @@
+from functools import partial
+from collections import defaultdict
+import sys
+import numpy as np
+from OMChem.Flowsheet import Flowsheet
+from OMChem.MatStm import MatStm
+from OMChem.Mixer import Mixer
+from OMChem.Heater import Heater
+from OMChem.Splitter import Splitter
+from OMChem.ShortcutColumn import ShortcutColumn
+
+import pandas as pd
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import QTextDocument ,QTextCursor ,QTextCharFormat ,QFont ,QPixmap
+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
+import PyQt5.QtGui as QtGui
+import PyQt5.QtCore as QtCore
+import PyQt5.QtWidgets as QtWidgets
+from component_selector import *
+from dockWidget import dockWidget
+from resDockWidget import resdockWidget
+from helper import helperFunc
+import datetime
+from container import Container
+
+class Graphics(QDialog):
+
+ def __init__(self):
+ QDialog.__init__(self)
+ self.scene = QGraphicsScene()
+ self.scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex)
+
+ def getScene(self):
+ return self.scene
+
+ '''def getContainer(self, textBrowser):
+ return Container(textBrowser)
+
+ def getComponentSelector(self):
+ return componentSelector(self)'''
+
+ def createNodeItem(self, conntype, container):
+ return NodeItem(conntype, container)
+
+class NodeLine(QtWidgets.QGraphicsPathItem):
+ def __init__(self, pointA, pointB , socket):
+ super(NodeLine, self).__init__()
+ self._pointA = pointA
+ self._pointB = pointB
+ self.socket = socket
+ self._source = None
+ self._target = None
+ self.setZValue(-1)
+ self.setBrush(QtGui.QColor(0,0,255,255))
+ self.pen = QtGui.QPen()
+
+ self.pen.setStyle(QtCore.Qt.SolidLine)
+ self.pen.setWidth(1)
+ self.pen.setColor(QtGui.QColor(0,0,255,255))
+ self.setPen(self.pen)
+
+ def updatePath(self):
+ path = QtGui.QPainterPath()
+ path.moveTo(self.pointA)
+ midptx = 0.5*(self.pointA.x() + self.pointB.x())
+
+
+ ctrl1_1 = QtCore.QPointF(self.pointA.x(), self.pointA.y())
+ ctrl2_1 = QtCore.QPointF(self.pointA.x(), self.pointA.y())
+ pt1 = QtCore.QPointF(midptx , self.pointA.y())
+ 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())
+ pt2 = QtCore.QPointF(midptx , self.pointB.y())
+ path.cubicTo(ctrl1_2, ctrl2_2, pt2)
+ path.moveTo(pt2)
+
+ ctrl1_3 = QtCore.QPointF(midptx, self.pointB.y())
+ ctrl2_3 = QtCore.QPointF(midptx, self.pointB.y())
+ path.cubicTo(ctrl1_3, ctrl2_3, self.pointB)
+ self.setPath(path)
+
+ def paint(self, painter, option, widget):
+ painter.setPen(self.pen)
+ painter.drawPath(self.path())
+
+ @property
+ def pointA(self):
+ #print('a')
+ return self._pointA
+
+ @pointA.setter
+ def pointA(self, point):
+ #print('seta')
+ self._pointA = point
+ self.updatePath()
+
+ @property
+ def pointB(self):
+ #print('b')
+ return self._pointB
+
+ @pointB.setter
+ def pointB(self, point):
+ #print('set b')
+ self._pointB = point
+ self.updatePath()
+
+ @property
+ def source(self):
+ #print('source')
+ return self._source
+
+ @source.setter
+ def source(self, widget):
+ #print('set source')
+ self._source = widget
+
+ @property
+ def target(self):
+ #print('target')
+ return self._target
+
+ @target.setter
+ def target(self, widget):
+ #print('set target')
+ self._target = widget
+
+ def __delete__(self,instance):
+ del self._source
+ del self._target
+ del self._pointA
+ del self._pointB
+
+class NodeSocket(QtWidgets.QGraphicsItem):
+ def __init__(self, rect, parent, socketType,container):
+ super(NodeSocket, self).__init__(parent)
+ self.rect = rect
+ self.type = socketType
+ self.parent=parent
+ self.container=container
+ self.newLine=None
+ self.otherLine=None
+
+ # Brush.
+ self.brush = QtGui.QBrush()
+ self.brush.setStyle(QtCore.Qt.SolidPattern)
+ self.brush.setColor(QtGui.QColor(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))
+
+ # Lines.
+ self.outLines = []
+ self.inLines = []
+
+ def shape(self):
+ path = QtGui.QPainterPath()
+ path.addEllipse(self.boundingRect())
+ return path
+
+ def boundingRect(self):
+ return QtCore.QRectF(self.rect)
+
+ def paint(self, painter, option, widget):
+ painter.setBrush(self.brush)
+ painter.setPen(self.pen)
+ painter.drawEllipse(self.rect)
+
+ def mousePressEvent(self, event):
+ 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)
+ 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)
+ 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
+
+ elif self.type == 'in':
+ pointA = self.mapToScene(event.pos())
+ self.newLine.pointA = pointA
+ if self.otherLine:
+ self.otherLine.pointA=pointA
+ else:
+ super(NodeSocket, self).mouseMoveEvent(event)
+
+ def mouseReleaseEvent(self, event):
+ item = self.scene().itemAt(event.scenePos().toPoint(),QtGui.QTransform())
+ item.otherLine=self.newLine
+ 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()
+ self.container.updateConn(self.newLine.source.parent.obj,self.newLine.target.parent.obj)
+ 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()
+ self.container.updateConn(self.newLine.source.parent.obj,self.newLine.target.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
+ super(NodeSocket, self).mouseReleaseEvent(event)
+
+ def getCenter(self):
+ rect = self.boundingRect()
+ center = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
+ center = self.mapToScene(center)
+ return center
+
+class NodeItem(QtWidgets.QGraphicsItem):
+ def __init__(self,comptype,container):
+ l = ['Mixer','Splitter']
+ super(NodeItem, self).__init__()
+ self.type = comptype
+
+ # for creating unit operation objects without helper function
+ if (self.type == 'MatStm'):
+ self.obj = MatStm(CompNames=compound_selected)
+ elif (self.type == 'ShortCol'): # the only class that class name and type does not match
+ self.obj = ShortcutColumn()
+ else:
+ self.obj = eval(self.type)()
+
+
+ #self.obj = myhelperFunc(self.type)
+ self.name = self.obj.getname()
+ self.pos = None
+ self.setToolTip(self.name)
+ self.nin = self.obj.no_of_input
+ self.nop = self.obj.no_of_output
+
+ self.container=container
+ self.container.addUnitOp(self.obj)
+ if(self.type not in l):
+ self.mainwindow= findMainWindow(self)
+ self.dockWidget=dockWidget(self.name,self.type,self.obj)
+ self.mainwindow.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)
+ self.dockWidget.hide()
+
+ self.pic=QtGui.QPixmap("icons/"+self.type+".png")
+ self.rect = QtCore.QRect(0,0,self.pic.width(),self.pic.height())
+ self.text = QGraphicsTextItem(self)
+ f = QFont()
+ f.setPointSize(8)
+ self.text.setFont(f)
+ self.text.setDefaultTextColor(QtGui.QColor(73,36,73,255))
+ self.text.setParentItem(self)
+ self.text.setPos(-2.5, self.rect.height()-15)
+ self.text.setPlainText(self.name)
+
+ self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsMovable)
+ self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsSelectable)
+ self.initUi()
+
+ # Brush
+ self.brush = QtGui.QBrush()
+ self.brush.setStyle(QtCore.Qt.SolidPattern)
+ self.brush.setColor(QtGui.QColor(80,0,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.selPen = QtGui.QPen()
+ self.selPen.setStyle(QtCore.Qt.SolidLine)
+ self.selPen.setWidth(2)
+ self.selPen.setColor(QtGui.QColor(222,192,222))
+
+ def initUi(self):
+ self.Input , self.Output = self.initializeSockets(self.type)
+
+ def shape(self):
+ path = QtGui.QPainterPath()
+ path.addRect(self.boundingRect())
+ return path
+
+ def boundingRect(self):
+ return QtCore.QRectF(self.rect)
+
+ def paint(self, painter, option, widget):
+ if self.isSelected():
+ painter.setPen(self.selPen)
+ 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',self.container) 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',self.container) for x in range(1,self.nop+1)]
+ return Input,Output
+ elif(self.type=="AdiaComp" or self.type=="AdiaExp" 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',self.container) 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',self.container) 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',self.container) 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',self.container) 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',self.container) for x in range(1,self.nin+1) ]
+ Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,-2.5,4,4), self, 'op',self.container) 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',self.container) 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',self.container) for x in range(1,self.nop+1)]
+ return Input,Output
+ elif(self.type=="MatStm"):
+ Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-1,4,4), self, 'in',self.container) 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',self.container) for x in range(1,self.nop+1)]
+ return Input,Output
+
+ def mouseMoveEvent(self, event):
+ #print(event.scenePos())
+ 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()
+ self.pos = event.scenePos()
+
+ def mouseDoubleClickEvent(self, event):
+ self.setPos(event.scenePos().x()-250,event.scenePos().y())
+ self.dockWidget.show()
+
+def findMainWindow(self):
+ '''
+ Global function to find the (open) QMainWindow in application
+ '''
+ app = QApplication.instance()
+ for widget in app.topLevelWidgets():
+ if isinstance(widget, QMainWindow):
+ return widget
+ return None
diff --git a/OMChem/CompSep.py b/OMChem/CompSep.py
index 54b6415..5bdfd51 100644
--- a/OMChem/CompSep.py
+++ b/OMChem/CompSep.py
@@ -1,11 +1,12 @@
from OMChem.EngStm import EngStm
import json
class CompSep():
- def __init__(self,CompNames = [],name='compoundseparator',SepFact=['Molar_Flow','Mass_Flow'],SepStrm=1,SepFactValue=[]):
+ counter = 1
+ def __init__(self,CompNames = [],name='CompSep',SepFact=['Molar_Flow','Mass_Flow'],SepStrm=1,SepFactValue=[]):
self.SepFact = json.dumps(SepFact).replace('[','{').replace(']','}')
self.SepStrm = str(SepStrm)
self.SepFactValue = json.dumps(SepFactValue).replace('[','{').replace(']','}')
- self.name = name
+ #self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = []
@@ -13,8 +14,18 @@ class CompSep():
self.type = 'CompSep'
self.EngStms = EngStm(name='EngStm')
+ # new
+ self.name = name + str(CompSep.counter)
+ self.no_of_input = 1
+ self.no_of_output = 2
+ CompSep.counter += 1
+
+ def getname(self):
+ return self.name
+
def modesList(self):
- return []
+ return []
+
def paramgetter(self,mode=None):
dict = {"SepStrm":None,"SepFactValue":None,"SepFact":None}
return dict
@@ -42,7 +53,6 @@ class CompSep():
self.InputStms = InputStms
self.OutputStms = OutputStms
-
def OM_Flowsheet_Eqn(self, addedcomp):
self.OM_data_eqn = ''
comp_count = len(addedcomp)
@@ -57,7 +67,6 @@ class CompSep():
sepFac = str(self.SepFactValue).strip('[').strip(']')
self.OM_data_eqn = self.OM_data_eqn + (self.name+'.sepFactVal= {'+ sepFac + '};\n')
-
return self.OM_data_eqn
diff --git a/OMChem/ConvReactor.py b/OMChem/ConvReactor.py
index b9958a9..9ad35da 100644
--- a/OMChem/ConvReactor.py
+++ b/OMChem/ConvReactor.py
@@ -41,40 +41,3 @@ class ConvReactor():
self.OM_data_eqn = self.OM_data_eqn + ('connect(' + self.EngStms.name + '.inlet,' + self.name + '.EnergyStream);\n')
return self.OM_data_eqn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/OMChem/Cooler.py b/OMChem/Cooler.py
index 577b181..32fe594 100644
--- a/OMChem/Cooler.py
+++ b/OMChem/Cooler.py
@@ -1,9 +1,10 @@
from OMChem.EngStm import EngStm
class Cooler():
- def __init__(self,name='cooler',PressureDrop = None, eff = None):
+ counter = 1
+ def __init__(self,name='Cooler',PressureDrop = None, eff = None):
self.PressureDrop = PressureDrop
self.eff = eff
- self.name = name
+ # self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
@@ -21,6 +22,15 @@ class Cooler():
'tempDrop':None,
'heatRem':None,
}
+ # new
+ self.name = name + str(Cooler.counter)
+ self.no_of_input = 1
+ self.no_of_output = 1
+ Cooler.counter += 1
+
+ def getname(self):
+ return self.name
+
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
self.OutputStms = OutputStms
diff --git a/OMChem/DistCol.py b/OMChem/DistCol.py
index 35054da..4f9f2fb 100644
--- a/OMChem/DistCol.py
+++ b/OMChem/DistCol.py
@@ -1,17 +1,20 @@
from OMChem.EngStm import EngStm
class DistCol():
- def __init__(self,name=('DistCol',1), numStage = None,numFeeds = None,feedStages = None):
+ counter = 1
+ def __init__(self,name='DistCol', numStage = None,numFeeds = None,feedStages = None):
self.numStage = numStage
self.numFeeds=numFeeds
self.feedStages=feedStages
- self.name = name[0]
+ #self.name = name[0]
+ self.name = name + str(DistCol.counter)
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
self.OutputStms = None
self.EngStm1 = EngStm(name='EngStm1'+self.name)
self.EngStm2 = EngStm(name='EngStm2'+self.name)
- self.count = name[1]
+ #self.count = name[1]
+ self.count = DistCol.counter
self.thermoPackage='Raoults_Law'
self.type = 'DistCol'
self.mode = None
@@ -20,6 +23,14 @@ class DistCol():
self.condP=None
self.rebP=None
+ # new
+ self.no_of_input = 2
+ self.no_of_output = 2
+ DistCol.counter += 1
+
+ def getname(self):
+ return self.name
+
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
self.OutputStms = OutputStms
diff --git a/OMChem/Flash.py b/OMChem/Flash.py
index 22335a5..68294ea 100644
--- a/OMChem/Flash.py
+++ b/OMChem/Flash.py
@@ -1,13 +1,25 @@
class Flash():
- def __init__(self,name=("flash",1)):
- self.name = name[0]
+ counter = 1
+ def __init__(self,name='Flash'):
+ #self.name = name[0]
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
self.OutputStms = None
self.type = 'flash'
- self.count = name[1]
+ #self.count = name[1]
+ self.count = Flash.counter
self.thermoPackage =None
+
+ # new
+ self.name = name + str(Flash.counter)
+ self.no_of_input = 1
+ self.no_of_output = 2
+ Flash.counter += 1
+
+ def getname(self):
+ return self.name
+
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
self.OutputStms = OutputStms
diff --git a/OMChem/Heater.py b/OMChem/Heater.py
index c0d8d95..ebdae9e 100644
--- a/OMChem/Heater.py
+++ b/OMChem/Heater.py
@@ -1,9 +1,10 @@
from OMChem.EngStm import EngStm
class Heater():
+ counter = 1
def __init__(self,name='Heater',PressureDrop = None, eff = None):
self.PressureDrop = PressureDrop
self.eff = eff
- self.name = name
+ #self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
@@ -23,6 +24,15 @@ class Heater():
'heatAdd':None,
}
+ # new
+ self.name = name + str(Heater.counter)
+ self.no_of_input = 1
+ self.no_of_output = 1
+ Heater.counter += 1
+
+ def getname(self):
+ return self.name
+
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
self.OutputStms = OutputStms
diff --git a/OMChem/MatStm.py b/OMChem/MatStm.py
index f27b3da..7635fbe 100644
--- a/OMChem/MatStm.py
+++ b/OMChem/MatStm.py
@@ -4,8 +4,10 @@ import sys
from collections import defaultdict
class MatStm():
- def __init__(self,name =None,CompNames = [],Temperature=300,Pressure=101325,VapPhasMolFrac=None,VapPhasMasFrac=None,LiqPhasMolFrac=None,LiqPhasMasFrac=None,CompMolFrac = [1.0], CompMasFrac = [], MolFlow=100, MasFlow=None,**kwargs):
- self.name = name[0]
+ counter = 1
+ def __init__(self,name ='MatStm',CompNames = [],Temperature=300,Pressure=101325,VapPhasMolFrac=None,VapPhasMasFrac=None,LiqPhasMolFrac=None,LiqPhasMasFrac=None,CompMolFrac = [1.0], CompMasFrac = [], MolFlow=100, MasFlow=None,**kwargs):
+ # self.name = name[0]
+ self.name = name + str(MatStm.counter)
self.type = 'MatStm'
self.T = Temperature
self.P = Pressure
@@ -20,7 +22,8 @@ class MatStm():
self.MasFlow = MasFlow
self.OM_data_init = ''
self.OM_data_eqn = ''
- self.count = name[1]
+ # self.count = name[1]
+ self.count = MatStm.counter
self.thermoPackage ="Raoults_Law"
self.mode1 = "P"
self.mode1val = ""
@@ -28,8 +31,6 @@ class MatStm():
self.mode2val = ""
# self.ValEntList = {"T":T," P":P," VapPhasMolFrac":vapPhasMolFrac," CompNames":CompNames," CompMolFrac[1]":CompMolFrac," CompMasFrac":CompMasFrac," MolFlow[1]":MolFlow," MasFlow[1]":MasFlow}
-
-
# self.OMProp = {
# 'Pressure': self.mode1,
# 'Temperature': self.mode2,
@@ -50,7 +51,6 @@ class MatStm():
# }
self.startDict = {}
self.eqnDict = {}
-
self.Prop = {
@@ -106,12 +106,20 @@ class MatStm():
'totMasFlo[2]':None,
'totMolFlo[3]':None,
'totMasFlo[3]':None
-
}
+
+ # new
+ self.no_of_input = 1
+ self.no_of_output = 1
+ MatStm.counter += 1
+
+ def getname(self):
+ return self.name
+
def modesList(self):
return ["PT","PH","PVF","TVF","PS"]
-
+
def paramgetter(self,mode):
dict = {}
if(mode=="PT"):
@@ -136,6 +144,7 @@ class MatStm():
dict = {self.mode1:None,self.mode2:None,"CompMolFrac":None,"MolFlow":None,"thermoPackage":None}
return dict
+
def paramsetter(self,dict):
self.mode1val = dict[self.mode1]
self.mode2val = dict[self.mode2]
diff --git a/OMChem/Mixer.py b/OMChem/Mixer.py
index 9419de1..b0e0a66 100644
--- a/OMChem/Mixer.py
+++ b/OMChem/Mixer.py
@@ -1,22 +1,33 @@
class Mixer():
- def __init__(self,name='mixer',NOI=5,Pcal = 'Inlet_Average'):
+ counter = 1 #
+ def __init__(self,name='Mixer',NOI=5,Pcal = 'Inlet_Average'):
self.NOI = NOI
self.Pcal = Pcal
- self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = []
self.OutputStms = None
self.type = 'Mixer'
+ # new
+ self.name = name + str(Mixer.counter)
+ self.no_of_input = 4
+ self.no_of_output = 1
+ Mixer.counter += 1
+
+ def getname(self):
+ return self.name
+
def modesList(self):
return []
def paramgetter(self,mode=None):
dict = {}
return dict
+
def paramsetter(self,dict):
self.NOI = dict["NOI"]
+
def OM_Flowsheet_Init(self, addedcomp):
self.OM_data_init = ''
comp_count = len(addedcomp)
@@ -35,7 +46,6 @@ class Mixer():
self.InputStms = InputStms
self.OutputStms = OutputStms
-
def OM_Flowsheet_Eqn(self, addedcomp):
self.OM_data_eqn = ''
comp_count = len(addedcomp)
@@ -46,4 +56,3 @@ class Mixer():
strcount += 1
self.OM_data_eqn = self.OM_data_eqn + ('connect(' + self.name + '.outlet,' + self.OutputStms[0].name + '.inlet);\n')
return self.OM_data_eqn
-
diff --git a/OMChem/Pump.py b/OMChem/Pump.py
index 04c8425..a63c9f0 100644
--- a/OMChem/Pump.py
+++ b/OMChem/Pump.py
@@ -1,8 +1,9 @@
from OMChem.EngStm import EngStm
class Pump():
+ counter = 1
def __init__(self,name='Pump',eff = None):
self.eff = eff
- self.name = name
+ #self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
@@ -13,6 +14,14 @@ class Pump():
self.type = 'Pump'
self.mode = None
self.modeVal = None
+ # new
+ self.name = name + str(Pump.counter)
+ self.no_of_input = 1
+ self.no_of_output = 1
+ Pump.counter += 1
+
+ def getname(self):
+ return self.name
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
@@ -27,7 +36,6 @@ class Pump():
return dict
def paramsetter(self,dict):
-
self.eff = dict['eff']
self.modeVal = dict[self.mode]
diff --git a/OMChem/ShortcutColumn.py b/OMChem/ShortcutColumn.py
index 13cffea..5c42545 100644
--- a/OMChem/ShortcutColumn.py
+++ b/OMChem/ShortcutColumn.py
@@ -1,25 +1,37 @@
from OMChem.EngStm import EngStm
class ShortcutColumn():
- def __init__(self,name=("ShortcutCol",1),condP = None, rebP = None, LKey = None, HKey = None):
+ counter = 1
+ def __init__(self,name='ShortCol',condP = None, rebP = None, LKey = None, HKey = None):
self.condP = condP
self.rebP = rebP
self.LKey = LKey
self.HKey = HKey
self.LKeyMolFrac = None
self.HKeyMolFrac = None
- self.name = name[0]
+ #self.name = name[0]
+ self.name = name + str(ShortcutColumn.counter)
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
self.OutputStms = None
+
self.EngStm1 = EngStm(name='EngStm1'+self.name)
self.EngStm2 = EngStm(name='EngStm2'+self.name)
- self.count = name[1]
+ #self.count = name[1]
+ self.count = ShortcutColumn.counter
self.condType=''
self.actR = None
self.thermoPackage='Raoults_Law'
self.type = 'ShortCol'
+ # new
+ self.no_of_input = 1
+ self.no_of_output = 2
+ ShortcutColumn.counter += 1
+
+ def getname(self):
+ return self.name
+
def modesList(self):
return []
diff --git a/OMChem/Splitter.py b/OMChem/Splitter.py
index a055851..ed79c9d 100644
--- a/OMChem/Splitter.py
+++ b/OMChem/Splitter.py
@@ -1,7 +1,8 @@
import json
class Splitter():
- def __init__(self,name='splitter',NOO=5,calcType = 'Molar_Flow',specval = [50,50]):
+ counter = 1
+ def __init__(self,name='Splitter',NOO=5,calcType = 'Molar_Flow',specval = [50,50]):
self.NOO = NOO
self.calcType = calcType
self.name = name
@@ -11,7 +12,15 @@ class Splitter():
self.OutputStms = []
self.type = 'Splitter'
self.specval = json.dumps(specval).replace('[','{').replace(']','}')
-
+ # new
+ self.name = name + str(Splitter.counter)
+ self.no_of_input = 1
+ self.no_of_output = 4
+ Splitter.counter += 1
+
+ def getname(self):
+ return self.name
+
def modesList(self):
return []
def paramgetter(self,mode=None):
diff --git a/OMChem/Valve.py b/OMChem/Valve.py
index f8f61b6..f1f8ac3 100644
--- a/OMChem/Valve.py
+++ b/OMChem/Valve.py
@@ -1,9 +1,10 @@
class Valve():
- def __init__(self,name='valve'):
+ counter = 1
+ def __init__(self,name='Valve'):
#self.PressDrop = PressureDrop
self.mode = None
self.modeVal = None
- self.name = name
+ #self.name = name
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
@@ -14,6 +15,14 @@ class Valve():
'pressDrop':None,
'outP':None
}
+ # new
+ self.name = name + str(Valve.counter)
+ self.no_of_input = 1
+ self.no_of_output = 1
+ Valve.counter += 1
+
+ def getname(self):
+ return self.name
def modesList(self):
return ["pressDrop","outP"]
diff --git a/OMChem/adiabatic_comp.py b/OMChem/adiabatic_comp.py
index b8849fd..5399ed0 100644
--- a/OMChem/adiabatic_comp.py
+++ b/OMChem/adiabatic_comp.py
@@ -1,18 +1,29 @@
from OMChem.EngStm import EngStm
class AdiaComp():
- def __init__(self,name=('AdiaComp',1), eff = None):
+ counter = 1
+ def __init__(self,name='AdiaComp', eff = None):
self.eff = eff
- self.name = name[0]
+ #self.name = name[0]
+ self.name = name + str(AdiaComp.counter)
+
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
self.OutputStms = None
self.EngStms = EngStm(name='EngStm'+self.name)
- self.count = name[1]
+ #self.count = name[1]
+ self.count = AdiaComp.counter
self.type = 'AdiaComp'
self.thermoPackage ="Raoults_Law"
self.mode = None
self.modeVal = None
+ # new
+ self.no_of_input = 1
+ self.no_of_output = 1
+ AdiaComp.counter += 1
+
+ def getname(self):
+ return self.name
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
diff --git a/OMChem/adiabatic_exp.py b/OMChem/adiabatic_exp.py
index 102596d..0dfb541 100644
--- a/OMChem/adiabatic_exp.py
+++ b/OMChem/adiabatic_exp.py
@@ -1,19 +1,30 @@
from OMChem.EngStm import EngStm
class AdiaExp():
- def __init__(self,name=('AdiaExp',1), eff = None):
+ counter = 1
+ def __init__(self,name='AdiaExp', eff = None):
self.eff = eff
- self.name = name[0]
+ #self.name = name[0]
+ self.name = name + str(AdiaExp.counter)
self.OM_data_eqn = ''
self.OM_data_init = ''
self.InputStms = None
self.OutputStms = None
self.EngStms = EngStm(name='EngStm'+self.name)
- self.count = name[1]
+ #self.count = name[1]
+ self.count = AdiaExp.counter
self.type = 'AdiaExp'
self.thermoPackage ="Raoults_Law"
self.mode = None
self.modeVal = None
+ # new
+ self.no_of_input = 1
+ self.no_of_output = 1
+ AdiaExp.counter += 1
+
+ def getname(self):
+ return self.name
+
def connect(self,InputStms = None,OutputStms = None):
self.InputStms = InputStms
self.OutputStms = OutputStms
diff --git a/component_selector.py b/component_selector.py
index 03c0863..5d11087 100644
--- a/component_selector.py
+++ b/component_selector.py
@@ -88,6 +88,9 @@ class componentSelector(QDialog,ui_dialog):
compound_selected.clear()
self.tableWidget.setRowCount(0)
self.reject()
+
+ def getComp(self):
+ return compound_selected
diff --git a/main.ui b/main.ui
index 378d376..3f17384 100644
--- a/main.ui
+++ b/main.ui
@@ -148,7 +148,7 @@
<x>0</x>
<y>0</y>
<width>1068</width>
- <height>26</height>
+ <height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -156,13 +156,13 @@
<string>File</string>
</property>
<addaction name="actionNew_Flowsheet"/>
+ <addaction name="actionSave_2"/>
+ <addaction name="actionOpen"/>
</widget>
<widget class="QMenu" name="menuEdit">
<property name="title">
<string>Edit</string>
</property>
- <addaction name="actionUndo_2"/>
- <addaction name="actionRedo"/>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
@@ -256,8 +256,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>222</width>
- <height>978</height>
+ <width>221</width>
+ <height>956</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
@@ -1184,19 +1184,14 @@
<string>save</string>
</property>
</action>
- <action name="actionUndo">
+ <action name="actionSave_2">
<property name="text">
- <string>Undo</string>
+ <string>Save</string>
</property>
</action>
- <action name="actionUndo_2">
+ <action name="actionOpen">
<property name="text">
- <string>Undo</string>
- </property>
- </action>
- <action name="actionRedo">
- <property name="text">
- <string>Redo</string>
+ <string>Open</string>
</property>
</action>
</widget>
diff --git a/mainApp.py b/mainApp.py
index 97578c8..3be6c08 100644
--- a/mainApp.py
+++ b/mainApp.py
@@ -25,11 +25,13 @@ from resDockWidget import resdockWidget
from helper import helperFunc
import datetime
from container import Container
+from Graphics import Graphics
+import pickle
ui,_ = loadUiType('main.ui')
# comp_dict is a dictionary in which keys are the type of component and value is a list [counter_of_that_particular_type ,Number of ip,Number of op]
-comp_dict ={'MatStm':[1,1,1],'EngStm':[1,1,1],'Mixer':[1,4,1],'Splitter':[1,1,4],'Flash':[1,1,2],'Heater':[1,1,1],'Valve':[1,1,1],'Cooler':[1,1,1],'CompSep':[1,1,2],'Pump':[1,1,1],'AdiaComp':[1,1,1],'AdiaExp':[1,1,1],'DistCol':[1,2,2],'ShortCol':[1,1,2]}
+#comp_dict ={'MatStm':[1,1,1],'EngStm':[1,1,1],'Mixer':[1,4,1],'Splitter':[1,1,4],'Flash':[1,1,2],'Heater':[1,1,1],'Valve':[1,1,1],'Cooler':[1,1,1],'CompSep':[1,1,2],'Pump':[1,1,1],'AdiaComp':[1,1,1],'AdiaExp':[1,1,1],'DistCol':[1,2,2],'ShortCol':[1,1,2]}
'''
MainApp class is responsible for all the main App Ui operations
@@ -53,13 +55,22 @@ class MainApp(QMainWindow,ui):
# Creating instances of classes for the main app
self.Container = Container(self.textBrowser)
self.comp = componentSelector(self)
+ '''self.Container = self.graphics.getContainer(self.textBrowser)
+ self.comp = self.graphics.getComponentSelector()'''
+
# Setting up interactive canvas
- self.scene = QGraphicsScene()
+ '''self.scene = QGraphicsScene()
self.scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex)
self.graphicsView.setScene(self.scene)
self.graphicsView.setMouseTracking(True)
+ self.graphicsView.keyPressEvent=self.deleteCall'''
+ self.graphics = Graphics()
+ self.scene = self.graphics.getScene()
+ self.graphicsView.setScene(self.scene)
+ self.graphicsView.setMouseTracking(True)
self.graphicsView.keyPressEvent=self.deleteCall
+
self.setDockNestingEnabled(True)
self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea)
self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea)
@@ -89,6 +100,8 @@ class MainApp(QMainWindow,ui):
self.actionEquation_oriented.triggered.connect(partial(self.simulate,'EQN'))
# self.actionUndo_2.triggered.connect(self.undoStack.undo)
# self.actionRedo.triggered.connect(self.undoStack.redo)
+ self.actionSave_2.triggered.connect(self.save)
+ self.actionOpen.triggered.connect(self.open)
'''
Handles all the buttons of different components.
@@ -107,7 +120,7 @@ class MainApp(QMainWindow,ui):
self.pushButton_13.clicked.connect(partial(self.component,'CompSep'))
self.pushButton_15.clicked.connect(partial(self.component,'AdiaComp'))
self.pushButton_16.clicked.connect(partial(self.component,'AdiaExp'))
-
+
'''
Displays help box
'''
@@ -177,7 +190,9 @@ class MainApp(QMainWindow,ui):
def component(self,conntype):
if(self.comp.isCompSelected()):
# box=None
- box = NodeItem(conntype,self.Container) # Returns the unit operation with NodeItem, NodeSocket initialized
+ #box = NodeItem(conntype,self.Container) # Returns the unit operation with NodeItem, NodeSocket initialized
+ box = self.graphics.createNodeItem(conntype, self.Container)
+
# print(box)
# addNodeItem = AddNodeItemCommand(self,box)
# self.undoStack.push(addNodeItem)
@@ -185,6 +200,8 @@ class MainApp(QMainWindow,ui):
box.setPos(2500-30, 2500-30)
else:
QMessageBox.about(self, 'Important', "Please Select Compounds first")
+ self.comp.show()
+
'''
New is used to delete all the existing work.
@@ -251,347 +268,43 @@ class MainApp(QMainWindow,ui):
self.textBrowser.append("<span style=\"color:blue\">["+str(self.currentTime())+"]<b> "+item.obj.name+" </b>is deleted .""</span>")
del item.obj
del item
-
-# class AddNodeItemCommand(QUndoCommand):
-
-# def __init__(self,mainApp,box):
-# super(AddNodeItemCommand, self).__init__()
-# self.mainApp = mainApp
-# self.box = box
-
-# def redo(self):
-# self.mainApp.scene.addItem(self.box)
-# self.box.setPos(2500-30, 2500-30)
-
-# def undo(self):
-# self.mainApp.delete(self.box)
-
-
-'''
-============================================================
---- GRAPHICS CLASSES
-============================================================
-'''
-class NodeLine(QtWidgets.QGraphicsPathItem):
- def __init__(self, pointA, pointB , socket):
- super(NodeLine, self).__init__()
- self._pointA = pointA
- self._pointB = pointB
- self.socket = socket
- self._source = None
- self._target = None
- self.setZValue(-1)
- self.setBrush(QtGui.QColor(0,0,255,255))
- self.pen = QtGui.QPen()
-
- self.pen.setStyle(QtCore.Qt.SolidLine)
- self.pen.setWidth(1)
- self.pen.setColor(QtGui.QColor(0,0,255,255))
- self.setPen(self.pen)
-
- def updatePath(self):
- path = QtGui.QPainterPath()
- path.moveTo(self.pointA)
- midptx = 0.5*(self.pointA.x() + self.pointB.x())
-
-
- ctrl1_1 = QtCore.QPointF(self.pointA.x(), self.pointA.y())
- ctrl2_1 = QtCore.QPointF(self.pointA.x(), self.pointA.y())
- pt1 = QtCore.QPointF(midptx , self.pointA.y())
- 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())
- pt2 = QtCore.QPointF(midptx , self.pointB.y())
- path.cubicTo(ctrl1_2, ctrl2_2, pt2)
- path.moveTo(pt2)
-
- ctrl1_3 = QtCore.QPointF(midptx, self.pointB.y())
- ctrl2_3 = QtCore.QPointF(midptx, self.pointB.y())
- path.cubicTo(ctrl1_3, ctrl2_3, self.pointB)
- self.setPath(path)
-
- def paint(self, painter, option, widget):
- painter.setPen(self.pen)
- painter.drawPath(self.path())
-
- @property
- def pointA(self):
- #print('a')
- return self._pointA
-
- @pointA.setter
- def pointA(self, point):
- #print('seta')
- self._pointA = point
- self.updatePath()
-
- @property
- def pointB(self):
- #print('b')
- return self._pointB
-
- @pointB.setter
- def pointB(self, point):
- #print('set b')
- self._pointB = point
- self.updatePath()
-
- @property
- def source(self):
- #print('source')
- return self._source
-
- @source.setter
- def source(self, widget):
- #print('set source')
- self._source = widget
-
- @property
- def target(self):
- #print('target')
- return self._target
-
- @target.setter
- def target(self, widget):
- #print('set target')
- self._target = widget
-
- def __delete__(self,instance):
- del self._source
- del self._target
- del self._pointA
- del self._pointB
-
-class NodeSocket(QtWidgets.QGraphicsItem):
- def __init__(self, rect, parent, socketType,container):
- super(NodeSocket, self).__init__(parent)
- self.rect = rect
- self.type = socketType
- self.parent=parent
- self.container=container
- self.newLine=None
- self.otherLine=None
- # Brush.
- self.brush = QtGui.QBrush()
- self.brush.setStyle(QtCore.Qt.SolidPattern)
- self.brush.setColor(QtGui.QColor(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))
-
- # Lines.
- self.outLines = []
- self.inLines = []
-
- def shape(self):
- path = QtGui.QPainterPath()
- path.addEllipse(self.boundingRect())
- return path
-
- def boundingRect(self):
- return QtCore.QRectF(self.rect)
-
- def paint(self, painter, option, widget):
- painter.setBrush(self.brush)
- painter.setPen(self.pen)
- painter.drawEllipse(self.rect)
+ '''
+ Function for saving the current canvas items and compound_selected
+ '''
+ def save(self):
+ def jdefault(o):
+ return o.__dict__
- def mousePressEvent(self, event):
- 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)
- 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)
- else:
- super(NodeSocket, self).mousePressEvent(event)
+ data = []
+ for i in self.Container.unitOp:
+ data.append(i)
- def mouseMoveEvent(self, event):
- if self.type == 'op':
- pointB = self.mapToScene(event.pos())
- self.newLine.pointB = pointB
- if self.otherLine:
- self.otherLine.pointB=pointB
-
- elif self.type == 'in':
- pointA = self.mapToScene(event.pos())
- self.newLine.pointA = pointA
- if self.otherLine:
- self.otherLine.pointA=pointA
- else:
- super(NodeSocket, self).mouseMoveEvent(event)
+ data.append(self.comp.getComp())
- def mouseReleaseEvent(self, event):
- item = self.scene().itemAt(event.scenePos().toPoint(),QtGui.QTransform())
- item.otherLine=self.newLine
- 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()
- self.container.updateConn(self.newLine.source.parent.obj,self.newLine.target.parent.obj)
- 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()
- self.container.updateConn(self.newLine.source.parent.obj,self.newLine.target.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
- super(NodeSocket, self).mouseReleaseEvent(event)
-
- def getCenter(self):
- rect = self.boundingRect()
- center = QtCore.QPointF(rect.x() + rect.width()/2, rect.y() + rect.height()/2)
- center = self.mapToScene(center)
- return center
-
-
-class NodeItem(QtWidgets.QGraphicsItem):
- def __init__(self,comptype,container):
- l = ['Mixer','Splitter']
- super(NodeItem, self).__init__()
- self.name = comptype + str(comp_dict[comptype][0])
- self.type = comptype
+ fileFormat = 'sim'
+ initialPath = QDir.currentPath() + 'untitled.' + fileFormat
+ fileName, _ = QFileDialog.getSaveFileName(self, "Save As",
+ initialPath, "%s Files (*.%s);; All Files (*)" %
+ (fileFormat.upper(), fileFormat))
+ with open(fileName, 'wb') as f: #'saved_file.sim'
+ pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
- self.setToolTip(self.name)
- self.nin = comp_dict[comptype][1]
- self.nop = comp_dict[comptype][2]
- self.obj = helperFunc(self.type,self.name,comp_dict[comptype][0])
- self.container=container
- self.container.addUnitOp(self.obj)
- if(self.type not in l):
- self.mainwindow=findMainWindow()
- self.dockWidget=dockWidget(self.name,self.type,self.obj)
- self.mainwindow.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)
- self.dockWidget.hide()
-
- comp_dict[comptype][0]+=1
- self.pic=QtGui.QPixmap("icons/"+self.type+".png")
- self.rect = QtCore.QRect(0,0,self.pic.width(),self.pic.height())
- self.text = QGraphicsTextItem(self)
- f = QFont()
- f.setPointSize(8)
- self.text.setFont(f)
- self.text.setDefaultTextColor(QtGui.QColor(73,36,73,255))
- self.text.setParentItem(self)
- self.text.setPos(-2.5, self.rect.height()-15)
- self.text.setPlainText(self.name)
-
- #self.text.setPlainText(self.name)
- self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsMovable)
- self.setFlag(QtWidgets.QGraphicsPixmapItem.ItemIsSelectable)
- self.initUi()
-
- # Brush
- self.brush = QtGui.QBrush()
- self.brush.setStyle(QtCore.Qt.SolidPattern)
- self.brush.setColor(QtGui.QColor(80,0,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.selPen = QtGui.QPen()
- self.selPen.setStyle(QtCore.Qt.SolidLine)
- self.selPen.setWidth(2)
- self.selPen.setColor(QtGui.QColor(222,192,222))
-
- def initUi(self): # Should be rather named as initialize sockets
- self.Input , self.Output = self.initializeSockets(self.type)
-
- def shape(self):
- path = QtGui.QPainterPath()
- path.addRect(self.boundingRect())
- return path
-
- def boundingRect(self):
- return QtCore.QRectF(self.rect)
-
- def paint(self, painter, option, widget):
- if self.isSelected():
- painter.setPen(self.selPen)
- 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',self.container) 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',self.container) for x in range(1,self.nop+1)]
- return Input,Output
- elif(self.type=="AdiaComp" or self.type=="AdiaExp" 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',self.container) 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',self.container) 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',self.container) 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',self.container) 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',self.container) for x in range(1,self.nin+1) ]
- Output = [NodeSocket(QtCore.QRect(self.rect.width()-2.5,-2.5,4,4), self, 'op',self.container) 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',self.container) 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',self.container) for x in range(1,self.nop+1)]
- return Input,Output
- elif(self.type=="MatStm"):
- Input = [NodeSocket(QtCore.QRect(-2.5,(self.rect.height()*x/(self.nin+1))-1,4,4), self, 'in',self.container) 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',self.container) 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()
-
- def mouseDoubleClickEvent(self, event):
- self.setPos(event.scenePos().x()-250,event.scenePos().y())
- self.dockWidget.show()
+ '''
+ Function for loading previous saved canvas and simulation
+ ***Not finished yet***
+ '''
+ def open(self):
+ fileFormat = 'sim'
+ initialPath = QDir.currentPath() + 'untitled.' + fileFormat
+ fileName, _ = QFileDialog.getOpenFileName(self, "Open As",
+ initialPath, "%s Files (*.%s);; All Files (*)" %
+ (fileFormat.upper(), fileFormat))
+ with open(fileName, 'rb') as f:
+ obj = pickle.load(f)
-'''
- Global function to find the (open) QMainWindow in application
-'''
-def findMainWindow():
- app = QApplication.instance()
- for widget in app.topLevelWidgets():
- if isinstance(widget, QMainWindow):
- return widget
- return None
-
+ for i in obj:
+ print(i)
def main():
app = QApplication(sys.argv)