diff options
author | lucaszhao19 | 2019-12-23 13:25:49 +0530 |
---|---|---|
committer | lucaszhao19 | 2019-12-23 13:25:49 +0530 |
commit | 9f86138b86efebb816a2289bf84b96d688615f41 (patch) | |
tree | c3213fb23a240130186adab4f1c523443d83c319 | |
parent | e2113828e404349f15b98d6c29e119a11abdab01 (diff) | |
download | Chemical-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.py | 374 | ||||
-rw-r--r-- | OMChem/CompSep.py | 19 | ||||
-rw-r--r-- | OMChem/ConvReactor.py | 37 | ||||
-rw-r--r-- | OMChem/Cooler.py | 14 | ||||
-rw-r--r-- | OMChem/DistCol.py | 17 | ||||
-rw-r--r-- | OMChem/Flash.py | 18 | ||||
-rw-r--r-- | OMChem/Heater.py | 12 | ||||
-rw-r--r-- | OMChem/MatStm.py | 25 | ||||
-rw-r--r-- | OMChem/Mixer.py | 17 | ||||
-rw-r--r-- | OMChem/Pump.py | 12 | ||||
-rw-r--r-- | OMChem/ShortcutColumn.py | 18 | ||||
-rw-r--r-- | OMChem/Splitter.py | 13 | ||||
-rw-r--r-- | OMChem/Valve.py | 13 | ||||
-rw-r--r-- | OMChem/adiabatic_comp.py | 17 | ||||
-rw-r--r-- | OMChem/adiabatic_exp.py | 17 | ||||
-rw-r--r-- | component_selector.py | 3 | ||||
-rw-r--r-- | main.ui | 23 | ||||
-rw-r--r-- | mainApp.py | 391 |
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 @@ -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> @@ -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) |