From d72d720f2295c764d0b304ef49489423cc8b7bf9 Mon Sep 17 00:00:00 2001 From: leo Date: Mon, 14 Feb 2022 15:53:18 +0100 Subject: [PATCH] import --- CarController.py | 11 ++++++++++- Map.py | 23 ++++++++++++++++++++--- main.py | 25 ++++++++++++++++++++----- mainLoop.py | 27 +++++++++++++++++++++++---- mainPainter.py | 6 +++++- 5 files changed, 78 insertions(+), 14 deletions(-) diff --git a/CarController.py b/CarController.py index cf7d86e..91b633d 100644 --- a/CarController.py +++ b/CarController.py @@ -5,8 +5,17 @@ class CarController: def __init__(self,parentMap): self.map=parentMap self.cars=[] + self.path = None + + def setPath(self,path): + self.path = path - def fromPath(self,path): + def fromPath(self,path=None): + if(path == None): + if(self.path == None): + return + else: + path = self.path for vehicle in sumolib.xml.parse(path,"vehicle"): route=vehicle.route[0].edges.split() self.cars.append(Car(vehicle.id,route,self.map,self)) diff --git a/Map.py b/Map.py index f16c4d0..dac02da 100644 --- a/Map.py +++ b/Map.py @@ -10,10 +10,22 @@ class Map: def __init__(self,path=None): if path!=None: self.fromPath(path) + self.net = None def fromPath(self,path): self.net = sumolib.net.readNet(path,withInternal=True,withConnections=True) + + def isLoaded(self): + return not (self.net == None) + def safeCall(func): + def inner(*args, **kwargs): + if not args[0].isLoaded(): + return + return func(*args, **kwargs) + return inner + + @safeCall def draw(self, painter): for edge in self.net.getEdges(): color=Qt.white @@ -24,19 +36,24 @@ class Map: pts=[QPointF(*p) for p in lane.getShape()] poly = QPolygonF.fromList(pts) painter.drawPolyline(poly) - + + @safeCall def getEdge(self,edgeID): return self.net.getEdge(edgeID) + @safeCall def getNode(self,nodeID): return self.net.getNode(nodeID) + @safeCall def getLane(self,laneID): return self.net.getLane(laneID) - + + @safeCall def getBounds(self): return self.net.getBBoxXY() - + + @safeCall def convertPos(self,pos): bounds=self.net.getBoundary() bounds[0]-=200 diff --git a/main.py b/main.py index bd36055..d693cae 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,7 @@ else: from PySide6.QtCore import Qt, QTimer from PySide6.QtWidgets import QApplication, QMainWindow -from PySide6.QtGui import QSurfaceFormat +from PySide6.QtGui import QSurfaceFormat, QAction from window import Ui_MainWindow from mainLoop import mainLoop @@ -18,9 +18,25 @@ class MainWindow(QMainWindow): super(MainWindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) - - self.mainLoop = mainLoop(self.ui.mainSurf) + + self.setAttribute(Qt.WA_TranslucentBackground) + self.setAttribute(Qt.WA_NoSystemBackground, False) + + self.mainLoop = mainLoop(self) + + fileMenu = self.menuBar().addMenu("&File") + openMenu = fileMenu.addMenu("&Open") + + openNet = QAction("&Open Network",self) + openNet.setStatusTip("Open Network file (.net.xml)") + openNet.triggered.connect(self.mainLoop.openNetwork) + openMenu.addAction(openNet) + openVeh = QAction("&Open Vehicles",self) + openVeh.setStatusTip("Open Vehicle description (.rou.xml)") + openVeh.triggered.connect(self.mainLoop.openVehicles) + openMenu.addAction(openVeh) + timer = QTimer(self) timer.timeout.connect(self.mainLoop.update) timer.start(1.0/60) @@ -34,9 +50,8 @@ if __name__ == "__main__": format = QSurfaceFormat() format.setDepthBufferSize(24) - format.setStencilBufferSize(8) format.setVersion(3, 2) - format.setSamples(16) + format.setSamples(4) format.setProfile(QSurfaceFormat.CoreProfile) QSurfaceFormat.setDefaultFormat(format) diff --git a/mainLoop.py b/mainLoop.py index c4c4a8f..24c6d45 100644 --- a/mainLoop.py +++ b/mainLoop.py @@ -1,15 +1,16 @@ from Map import Map from CarController import CarController +from PySide6.QtWidgets import QFileDialog + class mainLoop(): - def __init__(self, painter): - self.painter = painter + def __init__(self, parent): + self.parent = parent + self.painter = parent.ui.mainSurf self.map = Map() - self.map.fromPath("test2.net.xml") self.controller = CarController(self.map) - self.controller.fromPath("test5.rou.xml") self.painter.addMap(self.map) self.painter.addCarController(self.controller) @@ -17,3 +18,21 @@ class mainLoop(): def update(self): self.controller.update() self.painter.update() + + def openNetwork(self): + fileName = QFileDialog.getOpenFileName(self.parent,"Open Network", "./", "Network File (*.net.xml)") + if(fileName[0] == ''): + return + self.map.fromPath(fileName[0]) + self.painter.generateTransform() + + self.controller.fromPath() + + def openVehicles(self): + fileName = QFileDialog.getOpenFileName(self.parent,"Open Vehicle trip description", "./", "Route File (*.rou.xml)") + if(fileName[0] == ''): + return + self.controller.setPath(fileName[0]) + if(self.map.isLoaded()): + self.controller.fromPath() + diff --git a/mainPainter.py b/mainPainter.py index 791c3ce..1690918 100644 --- a/mainPainter.py +++ b/mainPainter.py @@ -1,10 +1,12 @@ from PySide6.QtOpenGLWidgets import QOpenGLWidget from PySide6.QtCore import Qt -from PySide6.QtGui import QPainter, QFont, QColor, QTransform +from PySide6.QtGui import QPainter, QFont, QColor, QTransform, QOpenGLContext, QOpenGLFunctions +from PySide6 import QtOpenGL class mainPainter(QOpenGLWidget): def __init__(self, parent=None): super(mainPainter, self).__init__(parent) + self.map = None self.carController = None self.transform = QTransform() @@ -17,6 +19,8 @@ class mainPainter(QOpenGLWidget): def generateTransform(self): bounds = self.map.getBounds() + if(bounds == None): + return bounds[0] = list(map(lambda b: b-10,bounds[0])) bounds[1] = list(map(lambda b: b+10, bounds[1])) self.transform.reset()