class Test(unittest.TestCase): def setUp(self): self.world = World(None) self.world.start() def testWorld(self): self.world.loader.filename = 'ballformation.sim' self.world.loadSimulation(True) amount = len(self.world.objects) first_item = self.world.objects.keys()[0] self.world.deleteObject(first_item) amount2 = len(self.world.objects) self.assertEqual(amount-1, amount2) self.world.addObject(AstronomicalObject(vector(0,0,0), vector(0,0,0),0,sphere(position=(0,0,0), make_trail=False),0), 'newObject') self.assertEqual(len(self.world.objects), amount) self.world.close() scene.visible = 0 def testSimulation(self): self.world.loader.filename = 'ballformation.sim' self.world.loadSimulation(True) self.world.startSimulation() sleep(3) self.world.stopSimulation()
class MainWindow(QWidget): group = None labels = [] def __init__(self,parent=None): super().__init__(parent) self.parent = parent self.width = parent.width self.height = parent.height self.clicked = False self.world = World(self) self.Pi = Vector(0,0) self.x = 0 self.y = 0 self.initUI() self.timer = QTimer() self.timer.timeout.connect(self.update) self.timer.start(20) # self.timer2 = QTimer() # self.timer2.timeout.connect(self.updateInfo) # self.timer2.start(100) def initUI(self): # self.group = QGroupBox(self) # vbox = QVBoxLayout() # for k,v in self.world.info: # hbox = QHBoxLayout() # self.labels.append([self.getTextLabel(k,10),self.getTextLabel(v,10)]) # hbox.addWidget(self.labels[-1][0]) # hbox.addStretch(1) # hbox.addWidget(self.labels[-1][1]) # vbox.addLayout(hbox) # self.group.setLayout(vbox) # self.group.resize(self.width/7,self.height/2) self.setMouseTracking(True) self.setGeometry(300,300,1280,720) self.setWindowTitle("test") self.setStyleSheet("background : black") self.showMaximized() def paintEvent(self,event): self.drawBorder() self.world.run() if self.clicked: self.drawArrow(self.Pi,Vector(self.x,self.y)) self.drawMouse() self.drawStatus() def drawBorder(self): qp = QPainter() qp.begin(self) pen = QPen(QColor(150,150,0)) pen.setWidth(10) pen.setStyle(Qt.DashDotLine) pen.setCapStyle(Qt.RoundCap) pen.setJoinStyle(Qt.RoundJoin) qp.setPen(pen) pos = self.world.planet.location rad = self.world.planet.radius*2 qp.drawEllipse(pos[0]-rad,pos[1]-rad,rad*2,rad*2) qp.end() def drawStatus(self): qp = QPainter() qp.begin(self) qp.setFont(QFont('Consolas',15)) for i in range(0,len(self.world.info)): pen = QPen(QColor('white')) qp.setPen(pen) qp.drawText(20,100+i*(self.height/20),self.world.info[i][0]) pen = QPen(self.getColor(i)) qp.setPen(pen) qp.drawText(self.width/8,100+i*(self.height/20),self.world.getInfo(i)) qp.end() def drawText(self,x,y,text): qp = QPainter() pen = QPen(QColor(255,255,255)) qp.begin(self) qp.setPen(pen) qp.drawText(x,y,text) qp.end() def drawArrow(self,fr,to): delta = (to-fr) if delta.norm() > self.height/3: delta = delta.normalize()*self.height*(1/3) to = fr+delta t = fr-to t = t.normalize()*50 l = t.rotate2D(45) r = t.rotate2D(-45) qp = QPainter() pen = QPen(QColor(0,150,150)) pen.setStyle(Qt.DashLine) pen.setCapStyle(Qt.RoundCap) pen.setJoinStyle(Qt.RoundJoin) pen.setWidth(10) qp.begin(self) qp.setPen(pen) qp.drawLine(fr[0],fr[1],to[0],to[1]) qp.drawLine(to[0],to[1],to[0]+l[0],to[1]+l[1]) qp.drawLine(to[0],to[1],to[0]+r[0],to[1]+r[1]) qp.end() def drawMouse(self): if self.clicked == True: return if self.parent.moverName == 'Satellite': if (Vector(self.x,self.y)-self.world.planet.location).norm()<self.world.planet.radius: return else: if (Vector(self.x,self.y)-self.world.planet.location).norm()<self.world.planet.radius*2: return qp = QPainter() qp.begin(self) icon = self.parent.icon if icon != None: img = icon.pixmap(50,50) qp.drawPixmap(self.x-25,self.y-25,img) qp.end() def mouseReleaseEvent(self,event): if not self.clicked: return to = Vector(self.x,self.y) delta = (to-self.Pi) if delta.norm() > self.height/3: delta = delta.normalize()*self.height*(1/3) to = self.Pi+delta self.clicked = False self.world.addObject(self.parent.moverName,self.Pi,(to-self.Pi)*0.01) def mouseMoveEvent(self,event): self.x = event.pos().x() self.y = event.pos().y() def mousePressEvent(self,event): if self.parent.moverName == 'Satellite': if (Vector(self.x,self.y)-self.world.planet.location).norm() < self.world.planet.radius: return else: if (Vector(self.x,self.y)-self.world.planet.location).norm() < self.world.planet.radius*2: return self.clicked = True self.Pi = Vector(event.pos().x(),event.pos().y()) def getTextLabel(self,text,size): ret = QLabel(str(text),self) font = QFont('Consolas',size) font.setBold(True) ret.setFont(font) ret.setStyleSheet('color : white') ret.setFrameStyle(QFrame.Panel | QFrame.Sunken) return ret def getPixmap(self,img_name,ratio): file = os.path.join('data',img_name) return QPixmap(file).scaledToWidth(self.width/ratio,mode=Qt.SmoothTransformation) def getColor(self,id): value = self.world.info[id][1] if 5 <= id and id < 8: return QColor('white') if id < 2 and value >= 1280: value = 1279 if ((id >=2 and id < 5) or id >=8) and value >= 768: value = 767 value = 1279-value r = 0 g = 0 b = 0 if value >= 0 and value < 256 : r = 255 g = value b = 0 elif value >= 256 and value < 512: r = 511-value g = 255 b = 0 elif value >= 512 and value < 768: r = 0 g = 255 b = value-512 elif value >= 768 and value < 1024: r = 0 g = 1023-value b = 255 elif value >= 1024 and value < 1280: r = value-1024 g = 0 b = 255 return QColor(r,g,b)