class IceStorageTwoHx(BlockItemFourPorts): def __init__(self, trnsysType, parent, **kwargs): super(IceStorageTwoHx, self).__init__(trnsysType, parent, **kwargs) self.loadedFiles = [] self.addTree() self.changeSize() def _getImageAccessor(self) -> _tp.Optional[_img.ImageAccessor]: return _img.ICE_STORAGE_TWO_HX_SVG def changeSize(self): w = self.w h = self.h """ Resize block function """ delta = 20 # center label: rect = self.label.boundingRect() lw, lh = rect.width(), rect.height() lx = (w - lw) / 2 self.label.setPos(lx, h) self.origInputsPos = [[0, delta], [w, delta]] self.origOutputsPos = [[0, h - delta], [w, h - delta]] self.inputs[0].setPos(self.origInputsPos[0][0], self.origInputsPos[0][1]) self.inputs[1].setPos(self.origInputsPos[1][0], self.origInputsPos[1][1]) self.outputs[0].setPos(self.origOutputsPos[0][0], self.origOutputsPos[0][1]) self.outputs[1].setPos(self.origOutputsPos[1][0], self.origOutputsPos[1][1]) self.updateFlipStateH(self.flippedH) self.updateFlipStateV(self.flippedV) self.inputs[0].side = (self.rotationN + 2 * self.flippedH) % 4 self.inputs[1].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 self.outputs[0].side = (self.rotationN + 2 * self.flippedH) % 4 self.outputs[1].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 return w, h def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ self.logger.debug(self.parent.parent()) pathName = self.displayName if self.parent.parent().projectPath == "": # self.path = os.path.dirname(__file__) # self.path = os.path.join(self.path, 'default') self.path = self.parent.parent().projectFolder # now = datetime.now() # self.fileName = now.strftime("%Y%m%d%H%M%S") # self.path = os.path.join(self.path, self.fileName) else: self.path = self.parent.parent().projectPath self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ self.logger.debug("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() # self.logger.debug("self.parent.parent" + str(self.parent.parent())) self.parent.parent().trnsysObj.remove(self) self.logger.debug("deleting block " + str(self) + self.displayName) # self.logger.debug("self.scene is" + str(self.parent.scene())) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild(QTreeView, self.displayName + "Tree") shutil.rmtree(self.path) self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: self.logger.debug("Widget doesnt exist!") else: self.logger.debug("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) self.logger.debug(os.path.dirname(self.path)) # destPath = str(os.path.dirname(self.path))+'\\IceStorage_'+self.displayName destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath self.logger.debug(self.path)
class HPDoubleDual(BlockItem, MassFlowNetworkContributorMixin): def __init__(self, trnsysType, parent, **kwargs): super(HPDoubleDual, self).__init__(trnsysType, parent, **kwargs) self.inputs.append(_cspi.createSinglePipePortItem("i", 0, self)) self.inputs.append(_cspi.createSinglePipePortItem("i", 2, self)) self.inputs.append(_cspi.createSinglePipePortItem("i", 2, self)) self.outputs.append(_cspi.createSinglePipePortItem("o", 0, self)) self.outputs.append(_cspi.createSinglePipePortItem("o", 2, self)) self.outputs.append(_cspi.createSinglePipePortItem("o", 2, self)) self.loadedFiles = [] # For restoring correct order of trnsysObj list self.childIds = [] self.childIds.append(self.trnsysId) self.childIds.append(self.parent.parent().idGen.getTrnsysID()) self.childIds.append(self.parent.parent().idGen.getTrnsysID()) self.changeSize() self.addTree() def _getImageAccessor(self) -> _tp.Optional[_img.ImageAccessor]: return _img.HP_DOUBLE_DUAL_SVG def changeSize(self): w = self.w h = self.h """ Resize block function """ delta = 20 # Limit the block size: if h < 20: h = 20 if w < 40: w = 40 # center label: rect = self.label.boundingRect() lw, lh = rect.width(), rect.height() lx = (w - lw) / 2 self.label.setPos(lx, h) self.origInputsPos = [[0, h - 2 * delta], [w, 2 * delta], [w, h - delta]] # inlet of [evap, cond, cond] self.origOutputsPos = [[0, h - delta], [w, delta], [w, h - 2 * delta]] # outlet of [evap, cond, cond] self.inputs[0].setPos(self.origInputsPos[0][0], self.origInputsPos[0][1]) #evaporator self.inputs[1].setPos(self.origInputsPos[1][0], self.origInputsPos[1][1]) # top condenser self.inputs[2].setPos(self.origInputsPos[2][0], self.origInputsPos[2][1]) # bottom condenser self.outputs[0].setPos(self.origOutputsPos[0][0], self.origOutputsPos[0][1]) #evaporator self.outputs[1].setPos(self.origOutputsPos[1][0], self.origOutputsPos[1][1]) # top condenser self.outputs[2].setPos(self.origOutputsPos[2][0], self.origOutputsPos[2][1]) # bottom condenser self.updateFlipStateH(self.flippedH) self.updateFlipStateV(self.flippedV) self.inputs[0].side = (self.rotationN + 2 * self.flippedH) % 4 self.inputs[1].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 self.inputs[2].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 self.outputs[0].side = (self.rotationN + 2 * self.flippedH) % 4 self.outputs[1].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 self.outputs[2].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 return w, h def encode(self): if self.isVisible(): self.logger.debug("Encoding a HeatPump") portListInputs = [] portListOutputs = [] for p in self.inputs: portListInputs.append(p.id) for p in self.outputs: portListOutputs.append(p.id) dct = {} dct[".__BlockDict__"] = True dct["BlockName"] = self.name dct["BlockDisplayName"] = self.displayName dct["PortsIDIn"] = portListInputs dct["PortsIDOut"] = portListOutputs dct["HeatPumpPosition"] = (float(self.pos().x()), float(self.pos().y())) dct["ID"] = self.id dct["trnsysID"] = self.trnsysId dct["childIds"] = self.childIds dct["FlippedH"] = self.flippedH dct["FlippedV"] = self.flippedH dct["RotationN"] = self.rotationN dictName = "Block-" return dictName, dct def decode(self, i, resBlockList): self.flippedH = i["FlippedH"] self.flippedV = i["FlippedV"] self.childIds = i["childIds"] self.displayName = i["BlockDisplayName"] self.changeSize() for x in range(len(self.inputs)): self.inputs[x].id = i["PortsIDIn"][x] self.logger.debug("Input at heatExchanger") for x in range(len(self.outputs)): self.outputs[x].id = i["PortsIDOut"][x] self.logger.debug("Output at heatExchanger") self.setPos(float(i["HeatPumpPosition"][0]), float(i["HeatPumpPosition"][1])) self.trnsysId = i["trnsysID"] self.id = i["ID"] resBlockList.append(self) def decodePaste(self, i, offset_x, offset_y, resConnList, resBlockList, **kwargs): self.flippedH = i["FlippedH"] self.flippedV = i["FlippedV"] self.changeSize() for x in range(len(self.inputs)): self.inputs[x].id = i["PortsIDIn"][x] self.logger.debug("Input at heatExchanger") for x in range(len(self.outputs)): self.outputs[x].id = i["PortsIDOut"][x] self.logger.debug("Output at heatExchanger") self.setPos(float(i["HeatPumpPosition"][0] + offset_x), float(i["HeatPumpPosition"][1] + offset_y)) # self.trnsysId = i["trnsysID"] # self.id = i["ID"] resBlockList.append(self) def exportBlackBox(self): equation = [] files = glob.glob(os.path.join(self.path, "**/*.ddck"), recursive=True) if not (files): status = "noDdckFile" for i in range(1, 3): equation.append("T" + self.displayName + "X" + str(i) + "=1") else: status = "noDdckEntry" lines = [] for file in files: infile = open(file, "r") lines += infile.readlines() for i in range(len(lines)): if "output" in lines[i].lower() and "to" in lines[i].lower() and "hydraulic" in lines[i].lower(): counter = 1 for j in range(i, len(lines) - i): if lines[j][0] == "T": outputT = lines[j].split("=")[0].replace(" ", "") equation.append("T" + self.displayName + "X" + str(counter) + "=1 ! suggestion: " + outputT) counter += 1 if counter == 4: status = "success" break break return status, equation def getInternalPiping(self) -> InternalPiping: pipes = [] portItems = {} for i in range(3): inputPort = _mfn.PortItem(f"Input {i+1}", _mfn.PortItemType.INPUT) outputPort = _mfn.PortItem(f"Output {i+1}", _mfn.PortItemType.OUTPUT) pipe = _mfn.Pipe(f"{self.displayName}Side{i+1}", self.childIds[i], inputPort, outputPort) pipes.append(pipe) portItems[inputPort] = self.inputs[i] portItems[outputPort] = self.outputs[i] return InternalPiping(pipes, portItems) def getSubBlockOffset(self, c): for i in range(3): if ( self.inputs[i] == c.toPort or self.inputs[i] == c.fromPort or self.outputs[i] == c.toPort or self.outputs[i] == c.fromPort ): return i def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ self.logger.debug(self.parent.parent()) pathName = self.displayName if self.parent.parent().projectPath == "": # self.path = os.path.dirname(__file__) # self.path = os.path.join(self.path, 'default') self.path = self.parent.parent().projectFolder # now = datetime.now() # self.fileName = now.strftime("%Y%m%d%H%M%S") # self.path = os.path.join(self.path, self.fileName) else: self.path = self.parent.parent().projectPath self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ self.logger.debug("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() # self.logger.debug("self.parent.parent" + str(self.parent.parent())) self.parent.parent().trnsysObj.remove(self) self.logger.debug("deleting block " + str(self) + self.displayName) # self.logger.debug("self.scene is" + str(self.parent.scene())) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild(QTreeView, self.displayName + "Tree") shutil.rmtree(self.path) self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: self.logger.debug("Widget doesnt exist!") else: self.logger.debug("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) self.logger.debug(os.path.dirname(self.path)) # destPath = str(os.path.dirname(self.path))+'\\HPTwoHx_'+self.displayName destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath self.logger.debug(self.path)
class Collector(BlockItem, MassFlowNetworkContributorMixin): def __init__(self, trnsysType, parent, **kwargs): super().__init__(trnsysType, parent, **kwargs) self.inputs.append(_cspi.createSinglePipePortItem("i", 2, self)) self.outputs.append(_cspi.createSinglePipePortItem("o", 2, self)) self.loadedFiles = [] self.changeSize() self.addTree() def getInternalPiping(self) -> InternalPiping: inputPort = _mfn.PortItem("Collector Input", _mfn.PortItemType.INPUT) outputPort = _mfn.PortItem("Collector Output", _mfn.PortItemType.OUTPUT) pipe = _mfn.Pipe(self.displayName, self.trnsysId, inputPort, outputPort) return InternalPiping([pipe], { inputPort: self.inputs[0], outputPort: self.outputs[0] }) def _getImageAccessor(self) -> _tp.Optional[_img.ImageAccessor]: return _img.COLLECTOR_SVG def changeSize(self): w = self.w h = self.h delta = 20 if h < 20: h = 20 if w < 40: w = 40 rect = self.label.boundingRect() lw, lh = rect.width(), rect.height() lx = (w - lw) / 2 self.label.setPos(lx, h) self.origInputsPos = [[w, h - delta]] self.origOutputsPos = [[w, delta]] self.outputs[0].setPos(self.origOutputsPos[0][0], self.origOutputsPos[0][1]) self.inputs[0].setPos(self.origInputsPos[0][0], self.origInputsPos[0][1]) self.updateFlipStateH(self.flippedH) self.updateFlipStateV(self.flippedV) self.inputs[0].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 self.outputs[0].side = (self.rotationN + 2 - 2 * self.flippedH) % 4 return w, h def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ if self.parent.parent().projectPath == "": self.path = self.parent.parent().projectFolder else: self.path = self.parent.parent().projectPath pathName = self.displayName self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ self.logger.debug("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() # self.logger.debug("self.parent.parent" + str(self.parent.parent())) self.parent.parent().trnsysObj.remove(self) self.logger.debug("deleting block " + str(self) + self.displayName) # self.logger.debug("self.scene is" + str(self.parent.scene())) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild( QTreeView, self.displayName + "Tree") try: shutil.rmtree(self.path) except: pass self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: self.logger.debug("Widget doesnt exist!") else: self.logger.debug("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) self.logger.debug(os.path.dirname(self.path)) # destPath = str(os.path.dirname(self.path))+'\\Collector_'+self.displayName destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath self.logger.debug(self.path)
class PV(BlockItem): def __init__(self, trnsysType, parent, **kwargs): super(PV, self).__init__(trnsysType, parent, **kwargs) factor = 0.97 self.w = 100 self.h = 100 self.loadedFiles = [] self.changeSize() self.addTree() def _getImageAccessor(self) -> _tp.Optional[_img.ImageAccessor]: return _img.PV_SVG def changeSize(self): w = self.w h = self.h # Limit the block size: if h < 20: h = 20 if w < 40: w = 40 # center label: rect = self.label.boundingRect() lw, lh = rect.width(), rect.height() lx = (w - lw) / 2 self.label.setPos(lx, h) return w, h def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ self.logger.debug(self.parent.parent()) pathName = self.displayName if self.parent.parent().projectPath == "": self.path = self.parent.parent().projectFolder else: self.path = self.parent.parent().projectPath self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ self.logger.debug("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() # self.logger.debug("self.parent.parent" + str(self.parent.parent())) self.parent.parent().trnsysObj.remove(self) self.logger.debug("deleting block " + str(self) + self.displayName) # self.logger.debug("self.scene is" + str(self.parent.scene())) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild(QTreeView, self.displayName + "Tree") shutil.rmtree(self.path) self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: self.logger.debug("Widget doesnt exist!") else: self.logger.debug("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) self.logger.debug(os.path.dirname(self.path)) destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath self.logger.debug(self.path)
class WTap(BlockItem, MassFlowNetworkContributorMixin): def __init__(self, trnsysType, parent, **kwargs): super(WTap, self).__init__(trnsysType, parent, **kwargs) self.w = 40 self.h = 40 self.inputs.append(_cspi.createSinglePipePortItem("i", 0, self)) self.loadedFiles = [] self.changeSize() self.addTree() def _getImageAccessor(self) -> _tp.Optional[_img.ImageAccessor]: return _img.W_TAP_SVG def changeSize(self): w = self.w h = self.h """ Resize block function """ delta = 20 deltaHF = 0.45 # Limit the block size: if h < 20: h = 20 if w < 40: w = 40 # center label: rect = self.label.boundingRect() lw, lh = rect.width(), rect.height() lx = (w - lw) / 2 self.label.setPos(lx, h) self.origInputsPos = [[0, delta]] self.inputs[0].setPos(self.origInputsPos[0][0], self.origInputsPos[0][1]) self.updateFlipStateH(self.flippedH) self.updateFlipStateV(self.flippedV) self.inputs[0].side = (self.rotationN + 2 * self.flippedH) % 4 return w, h def exportPumpOutlets(self): resStr = "T" + self.displayName + " = " + "T" + self.inputs[ 0].connectionList[0].displayName + "\n" equationNr = 1 return resStr, equationNr def getInternalPiping(self) -> InternalPiping: portItem = _mfn.PortItem("WTap Input", _mfn.PortItemType.INPUT) sink = _mfn.Sink(self.displayName, self.trnsysId, portItem) return InternalPiping([sink], {portItem: self.inputs[0]}) def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ self.logger.debug(self.parent.parent()) pathName = self.displayName if self.parent.parent().projectPath == "": # self.path = os.path.dirname(__file__) # self.path = os.path.join(self.path, 'default') self.path = self.parent.parent().projectFolder # now = datetime.now() # self.fileName = now.strftime("%Y%m%d%H%M%S") # self.path = os.path.join(self.path, self.fileName) else: self.path = self.parent.parent().projectPath self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ self.logger.debug("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() # self.logger.debug("self.parent.parent" + str(self.parent.parent())) self.parent.parent().trnsysObj.remove(self) self.logger.debug("deleting block " + str(self) + self.displayName) # self.logger.debug("self.scene is" + str(self.parent.scene())) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild( QTreeView, self.displayName + "Tree") shutil.rmtree(self.path) self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: self.logger.debug("Widget doesnt exist!") else: self.logger.debug("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) self.logger.debug(os.path.dirname(self.path)) # destPath = str(os.path.dirname(self.path))+'\\WTap_'+self.displayName destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath self.logger.debug(self.path)
class Control(BlockItem): def __init__(self, trnsysType, parent, **kwargs): super(Control, self).__init__(trnsysType, parent, **kwargs) factor = 0.667 # 0.63 for png self.w = 100 self.h = 100 self.loadedFiles = [] self.addTree() def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ print(self.parent.parent()) pathName = self.displayName if self.parent.parent().projectPath == "": # self.path = os.path.dirname(__file__) # self.path = os.path.join(self.path, 'default') self.path = self.parent.parent().projectFolder # now = datetime.now() # self.fileName = now.strftime("%Y%m%d%H%M%S") # self.path = os.path.join(self.path, self.fileName) else: self.path = self.parent.parent().projectPath self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ print("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() # print("self.parent.parent" + str(self.parent.parent())) self.parent.parent().trnsysObj.remove(self) print("deleting block " + str(self) + self.displayName) # print("self.scene is" + str(self.parent.scene())) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild( QTreeView, self.displayName + "Tree") shutil.rmtree(self.path) self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: print("Widget doesnt exist!") else: print("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) print(os.path.dirname(self.path)) destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath print(self.path)
class GenericBlock(BlockItem, MassFlowNetworkContributorMixin): def __init__(self, trnsysType, parent, **kwargs): super(GenericBlock, self).__init__(trnsysType, parent, **kwargs) self.inputs.append(_cspi.createSinglePipePortItem("i", 2, self)) self.outputs.append(_cspi.createSinglePipePortItem("o", 2, self)) self.loadedFiles = [] self.childIds = [] self.childIds.append(self.trnsysId) self._imageAccessor = _img.GENERIC_BLOCK_PNG # Disallow adding port pairs later, because the trnsysIDs of the generated port pairs have to be # consecutive to be correctly printed out in the export self.isSet = True self.changeSize() self.addTree() def _getImageAccessor(self) -> _tp.Optional[_img.ImageAccessor]: return _img.GENERIC_BLOCK_PNG def changeSize(self): w = self.w h = self.h delta = 4 """ Resize block function """ # Limit the block size: if h < 20: h = 20 if w < 40: w = 40 # center label: rect = self.label.boundingRect() lw, lh = rect.width(), rect.height() lx = (w - lw) / 2 self.label.setPos(lx, h) self.outputs[0].setPos(2 * delta + w, h - 2 * delta) self.inputs[0].setPos(2 * delta + w, 2 * delta) return w, h def getPairNb(self, side): res = 0 for i in self.inputs: if i.side == side: res += 1 self.logger.debug("there are " + str(res) + " pairs on the side " + str(side)) return res def addPortDlg(self): self.parent.parent().showGenericPortPairDlg(self) def addPort(self, io, relH): self.logger.debug(io) self.logger.debug(relH) def setImage(self): pixmap = self._getPixmap() self.setPixmap(pixmap) def changeImage(self): name = str(self.pickImage().resolve()) if name[-3:] == "png" or name[-3:] == "svg": self.setImageSource(name) self.setImage() else: self.logger.debug("No image picked, name is " + name) def setImageSource(self, name): self._imageAccessor = _img.ImageAccessor.createForFile(_pl.Path(name)) def pickImage(self): return _pl.Path( QFileDialog.getOpenFileName(self.parent.parent(), filter="*.png *.svg")[0]) def contextMenuEvent(self, event): menu = QMenu() a1 = menu.addAction("Launch NotePad++") a1.triggered.connect(self.launchNotepadFile) rr = _img.ROTATE_TO_RIGHT_PNG.icon() a2 = menu.addAction(rr, "Rotate Block clockwise") a2.triggered.connect(self.rotateBlockCW) ll = _img.ROTATE_LEFT_PNG.icon() a3 = menu.addAction(ll, "Rotate Block counter-clockwise") a3.triggered.connect(self.rotateBlockCCW) a4 = menu.addAction("Reset Rotation") a4.triggered.connect(self.resetRotation) b1 = menu.addAction("Print Rotation") b1.triggered.connect(self.printRotation) c1 = menu.addAction("Delete this Block") c1.triggered.connect(self.deleteBlock) c3 = menu.addAction("Set image") c3.triggered.connect(self.changeImage) if not self.isSet: c4 = menu.addAction("Add port") c4.triggered.connect(self.addPortDlg) menu.exec_(event.screenPos()) def encode(self): if self.isVisible(): self.logger.debug("Encoding a Generic Block") portListInputs = [] portListOutputs = [] for p in self.inputs: portListInputs.append(p.id) for p in self.outputs: portListOutputs.append(p.id) dct = {} dct[".__BlockDict__"] = True dct["BlockName"] = self.name dct["BlockDisplayName"] = self.displayName dct["BlockPosition"] = (float(self.pos().x()), float(self.pos().y())) dct["ID"] = self.id dct["trnsysID"] = self.trnsysId dct["PortsIDIn"] = portListInputs dct["PortsIDOut"] = portListOutputs dct["FlippedH"] = self.flippedH dct["FlippedV"] = self.flippedV dct["RotationN"] = self.rotationN dct["Imagesource"] = self._imageAccessor.getResourcePath() dct["PortPairsNb"] = [self.getPairNb(i) for i in range(4)] dictName = "Block-" return dictName, dct def decode(self, i, resBlockList): assert len(self.inputs) == len(self.outputs) numberOfPortPairs = len(self.inputs) for portPairIndex in range(numberOfPortPairs): self.removePortPair(portPairIndex) numberOfPortPairsBySide = i["PortPairsNb"] for side in range(3): numberOfPortPairsToAdd = numberOfPortPairsBySide[side] for _ in range(numberOfPortPairsToAdd): self.addPortPair(side) super(GenericBlock, self).decode(i, resBlockList) self._imageAccessor = _img.ImageAccessor.createFromResourcePath( i["Imagesource"]) self.setImage() def decodePaste(self, i, offset_x, offset_y, resConnList, resBlockList, **kwargs): correcter = 0 for j in range(4): if j == 2: correcter = -1 for k in range(i["PortPairsNb"][j] + correcter): self.addPortPair(j) super(GenericBlock, self).decodePaste(i, offset_x, offset_y, resConnList, resBlockList) self._imageAccessor = _img.ImageAccessor.createFromResourcePath( i["Imagesource"]) self.setImage() def addPortPair(self, side): h = self.h w = self.w delta = 4 self.logger.debug("side is " + str(side)) self.inputs.append(_cspi.createSinglePipePortItem("i", side, self)) self.outputs.append(_cspi.createSinglePipePortItem("o", side, self)) # Allocate id self.childIds.append(self.parent.parent().idGen.getTrnsysID()) portNb = [0, 0, 0, 0] for i in self.inputs: if i.side == 0: distBetweenPorts = (self.h - 4 * delta) / (2 * self.getPairNb(0) - 1) self.logger.debug("distance betw ports " + str(distBetweenPorts)) i.setPos(-2 * delta, 2 * delta + distBetweenPorts * portNb[0]) portNb[0] += 1 self.outputs[self.inputs.index(i)].setPos( -2 * delta, 2 * delta + distBetweenPorts * portNb[0]) portNb[0] += 1 elif i.side == 1: distBetweenPorts = (self.w - 4 * delta) / (2 * self.getPairNb(1) - 1) i.setPos(2 * delta + distBetweenPorts * portNb[1], -2 * delta) portNb[1] += 1 self.outputs[self.inputs.index(i)].setPos( 2 * delta + distBetweenPorts * portNb[1], -2 * delta) portNb[1] += 1 elif i.side == 2: self.logger.debug("side == 2") distBetweenPorts = (self.h - 4 * delta) / (2 * self.getPairNb(2) - 1) self.logger.debug("side 2 dist betw ports is " + str(distBetweenPorts)) i.setPos(2 * delta + w, 2 * delta + distBetweenPorts * portNb[2]) self.logger.debug(2 * delta + distBetweenPorts * portNb[2]) portNb[2] += 1 self.outputs[self.inputs.index(i)].setPos( 2 * delta + w, 2 * delta + distBetweenPorts * portNb[2]) self.logger.debug(2 * delta + distBetweenPorts * portNb[2]) portNb[2] += 1 else: distBetweenPorts = (self.w - 4 * delta) / (2 * self.getPairNb(3) - 1) self.logger.debug("distance betw ports " + str(distBetweenPorts)) i.setPos(2 * delta + distBetweenPorts * portNb[3], 2 * delta + h) portNb[3] += 1 self.outputs[self.inputs.index(i)].setPos( 2 * delta + distBetweenPorts * portNb[3], 2 * delta + h) portNb[3] += 1 def removePortPairOnSide(self, side): for i in self.inputs: if i.side == side: self.removePortPair(self.inputs.index(i)) return def removePortPair(self, n): self.inputs.remove(self.inputs[n]) self.outputs.remove(self.outputs[n]) def updateFlipStateH(self, state): self.flippedH = bool(state) pixmap = self._getPixmap() self.setPixmap(pixmap) def updateFlipStateV(self, state): self.flippedV = bool(state) pixmap = self._getPixmap() self.setPixmap(pixmap) def getInternalPiping(self) -> InternalPiping: assert len(self.inputs) == len(self.outputs) pipes = [] portItems = {} for i, (graphicalInputPort, graphicalOutputPort) in enumerate( zip(self.inputs, self.outputs)): inputPort = _mfn.PortItem(f"Input {i+1}", _mfn.PortItemType.INPUT) outputPort = _mfn.PortItem(f"Output {i+1}", _mfn.PortItemType.OUTPUT) pipe = _mfn.Pipe(f"{self.displayName}X{i}", self.childIds[0], inputPort, outputPort) pipes.append(pipe) portItems[inputPort] = graphicalInputPort portItems[outputPort] = graphicalOutputPort return InternalPiping(pipes, portItems) def getSubBlockOffset(self, c): for i in range(len(self.inputs)): if (self.inputs[i] == c.toPort or self.inputs[i] == c.fromPort or self.outputs[i] == c.toPort or self.outputs[i] == c.fromPort): return i def addTree(self): """ When a blockitem is added to the main window. A file explorer for that item is added to the right of the main window by calling this method """ self.logger.debug(self.parent.parent()) pathName = self.displayName if self.parent.parent().projectPath == "": self.path = self.parent.parent().projectFolder else: self.path = self.parent.parent().projectPath self.path = os.path.join(self.path, "ddck") self.path = os.path.join(self.path, pathName) if not os.path.exists(self.path): os.makedirs(self.path) self.model = MyQFileSystemModel() self.model.setRootPath(self.path) self.model.setName(self.displayName) self.tree = MyQTreeView(self.model, self) self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(self.path)) self.tree.setObjectName("%sTree" % self.displayName) for i in range(1, self.model.columnCount() - 1): self.tree.hideColumn(i) self.tree.setMinimumHeight(200) self.tree.setSortingEnabled(True) self.parent.parent().splitter.addWidget(self.tree) def deleteBlock(self): """ Overridden method to also delete folder """ self.logger.debug("Block " + str(self) + " is deleting itself (" + self.displayName + ")") self.deleteConns() self.parent.parent().trnsysObj.remove(self) self.logger.debug("deleting block " + str(self) + self.displayName) self.parent.scene().removeItem(self) widgetToRemove = self.parent.parent().findChild( QTreeView, self.displayName + "Tree") shutil.rmtree(self.path) self.deleteLoadedFile() try: widgetToRemove.hide() except AttributeError: self.logger.debug("Widget doesnt exist!") else: self.logger.debug("Deleted widget") del self def setName(self, newName): """ Overridden method to also change folder name """ self.displayName = newName self.label.setPlainText(newName) self.model.setName(self.displayName) self.tree.setObjectName("%sTree" % self.displayName) self.logger.debug(os.path.dirname(self.path)) destPath = os.path.join(os.path.split(self.path)[0], self.displayName) if os.path.exists(self.path): os.rename(self.path, destPath) self.path = destPath self.logger.debug(self.path)