From bef7a56fd2e4fa36e6239f4e796bcc642094e855 Mon Sep 17 00:00:00 2001 From: Paulo Artur Date: Mon, 8 Apr 2024 11:24:03 -0300 Subject: [PATCH] first commit --- .gitignore | 2 + assets/CURSIV.TTF | Bin 0 -> 43900 bytes assets/svt2.png | Bin 0 -> 13832 bytes colorParser.py | 6 + colors.json | 31 ++++ readme.md | 10 ++ src/__pycache__/configDialog.cpython-312.pyc | Bin 0 -> 7230 bytes src/__pycache__/data.cpython-312.pyc | Bin 0 -> 525 bytes src/__pycache__/graph.cpython-312.pyc | Bin 0 -> 8782 bytes src/__pycache__/renderer.cpython-312.pyc | Bin 0 -> 5012 bytes src/__pycache__/runner.cpython-312.pyc | Bin 0 -> 969 bytes src/__pycache__/sim.cpython-312.pyc | Bin 0 -> 2701 bytes src/__pycache__/window.cpython-312.pyc | Bin 0 -> 9661 bytes src/configDialog.py | 106 ++++++++++++ src/data.py | 6 + src/entry,py | 10 ++ src/graph.py | 103 ++++++++++++ src/renderer.py | 49 ++++++ src/sim.py | 57 +++++++ src/style.py | 0 src/window.py | 160 +++++++++++++++++++ 21 files changed, 540 insertions(+) create mode 100644 .gitignore create mode 100644 assets/CURSIV.TTF create mode 100644 assets/svt2.png create mode 100644 colorParser.py create mode 100644 colors.json create mode 100644 readme.md create mode 100644 src/__pycache__/configDialog.cpython-312.pyc create mode 100644 src/__pycache__/data.cpython-312.pyc create mode 100644 src/__pycache__/graph.cpython-312.pyc create mode 100644 src/__pycache__/renderer.cpython-312.pyc create mode 100644 src/__pycache__/runner.cpython-312.pyc create mode 100644 src/__pycache__/sim.cpython-312.pyc create mode 100644 src/__pycache__/window.cpython-312.pyc create mode 100644 src/configDialog.py create mode 100644 src/data.py create mode 100644 src/entry,py create mode 100644 src/graph.py create mode 100644 src/renderer.py create mode 100644 src/sim.py create mode 100644 src/style.py create mode 100644 src/window.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7e8e21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +dist \ No newline at end of file diff --git a/assets/CURSIV.TTF b/assets/CURSIV.TTF new file mode 100644 index 0000000000000000000000000000000000000000..350cf435aefab89ad035f643d2e7346f113b0952 GIT binary patch literal 43900 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 NOP9%g(d$VV{})4vJS6}C literal 0 HcmV?d00001 diff --git a/assets/svt2.png b/assets/svt2.png new file mode 100644 index 0000000000000000000000000000000000000000..012592919dbfbbf6db9d7a1e79afc4e9cf4c8b3b GIT binary patch literal 13832 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 literal 0 HcmV?d00001 diff --git a/colorParser.py b/colorParser.py new file mode 100644 index 0000000..82e1e30 --- /dev/null +++ b/colorParser.py @@ -0,0 +1,6 @@ +import PyQt6.QtGui as gui + +def parseQt(colVal: str, alpha): + colVal = colVal[1:len(colVal - 1)] + colVal = int(colVal, 16) + return gui.QColor(colVal) \ No newline at end of file diff --git a/colors.json b/colors.json new file mode 100644 index 0000000..a966658 --- /dev/null +++ b/colors.json @@ -0,0 +1,31 @@ +{ + "normal": { + "black": "#1C1E1F", + "red": "#F76C7C", + "orange": "#F3A96A", + "yellow": "#E3D367", + "green": "#9CD57B", + "blue": "#78CEE9", + "purple": "#BAAOF8", + "gray": "#82878B" + }, + "bg": { + "bg_dim": "#21282C", + "bg0": "#273136", + "bg1": "#313B42", + "bg2": "#352F46", + "bg3": "#3A444B", + "bg4": "#414B53", + "bg_red": "#FF6D7E", + "bg_green": "#A2E57B", + "bg_blue": "#7CD5F1" + }, + "gray_dim": "#55626D", + "fg": "#E1E2E3", + "diff": { + "diff_red": "#55593D", + "diff_green": "#394634", + "diff_blue": "#354157", + "diff_yellow": "#4E432F" + } +} \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..c50e18b --- /dev/null +++ b/readme.md @@ -0,0 +1,10 @@ +visualização de gráficos + +posição x tempo +S x T + +velocidade x tempo +V x T + +área x tempo +A x T \ No newline at end of file diff --git a/src/__pycache__/configDialog.cpython-312.pyc b/src/__pycache__/configDialog.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5b0cc63fe6e4e0d245d2e06b90b4375ca813eeb GIT binary patch literal 7230 zcmcIpU2GHC6~5!&u|19~l8q}5AmwlyIe*fhBa>vU?#>2s!DLY93nfD?bP=(hyNLC2u1tfWz$%}(H98r-O~id) zz&lR(b%nSKAp?U@xnMqqC5pwC3^==@30furYNw6sCnnB|POWY-s zZq{`dB|WSg{=GA3ib(oKP~4+Z=Y{+@KQYKNSz#h=$id>UIrz8!FZlZvF^^;@wP)5< zLcavpJkjd}k_|_pjL+b*$`X1)Xtfebd5m`3nA!pu?FMIt+}MI^HaVuA5&=^E25$*v z_8PQRvV<{`K)|uj>MP_VsKCgy`hXgTqg}E&hWi^PKblO*7L@qC@brL6E=ku&^Ym}F> zoEpFq@fa!YRy`7z9T)e2ZE7HuN@p2KN~I*c8Z`aIYkKepV-vhQmJ^G8lVg&Y9!uL6 zF;TcJVt-EWw=ZqNFc~{l8il`CU!YYoJnL7;h6)*7-5;Az&7~Gc%lo@$JYNP^qixk_ zpAzl+E&Kb-a;6+T1+9_i2Vzi!o|9CSY*NUkr?LJDIRMprb+dKP$cA;0i_-d9V;bSr zuI-}106svn*_W~JwHm9npI|-BURW)2$LMTOWX$!p+U#p=)8n*@^g*D<+_#{|VHY~- zktsuG2ExVW$7%N&d&}B`Hv7z(T9OQYun)YZJz!tGL0hGheXPq-&-Q*W=MH+_v*a6; zlOCHN4j6n^`HuZy`W)z)9;B<(?yOd-`8%xhF zC7Ju+J4GV^_lHYhkj#|_#lH%LEawHp-cXUQizMj#Mi)4)|V_%W9i(mczsToJz*&!)L7 zCo(IKSAH!_hex?wL7*?^`80s~>5x_(;`2wi28$XvD;Jq8Kh20={{|TN zUI1zFW-$b`>Kneo+~l$Icj!i-3{?OghbJqkWjXoL4=#RD&{~;|6rOH5$6SqqtG)8?yBc8GS=)pdd*4FdrtN zM^g)v1L%FND1CaaD9b`#4M@eCIbJ>|=SBSL1XEa6N9z7`mQR1iv8o^7bDm4fYN%LX z8JQcAi{s-e1@j!@r#NM9 z>krRAy0mbq8tYYJz2#VAs)AYJ6pQpiLp$7CRpIE%oUMPR%cRYxh!jh3wnRn^*#m9x;8W^Y$$Dz{EH6 z_Af!=baXRs?@}+U$#>!1i47Vr)&|L&wuP$XA%#4&C|3`kP!6A{kSC$HN;WEF8YJ<5pKNg&Ex;)r!#Ak!nm4J9rHj^c%RL;!?`yQcWIsB!~rnsVPjw}`msYOxtiz95PM%?NZs6w;g|F(N$8{>*B6t;>x3Wyb9V=iqo)uuM$fQ9tC(%rHoVmHOEc0nWG7OYf{$Ndqn<@aG#K15v z2UGoHjuQn5l*t?qL_DUtffn&0Qav&tSTPQy26IEhKf*&NxO2jkhy%NbovV7dDK0H~ zFzFr73XCk`&>`X^Ks<V>Ira-6KePSu^0CNy+S$SNVJ1fvp@svDF` z_*#$F9}SougO=%r4ZzffYtKQiv<~qXplPUXM!r{?Emb455~0hH_Qlc1V@qSz&f`kw z@p9)$C33P7I<;EgSgr3=>O0HzhiA?|ry^CVMWI@rwti5d&Or6vN3$P2Z75c#NnE)! zd+Ey$pHuZ~u5e)A>b~YxYVZAy`R=*y`Tn{7a{a+F)uA=@%=J|3+m-tEa(zdc>fE9+ za^Evg%~91oZOWdu@*ZutL*shL_g>x1`L!4dM`noURGt0rt9=LN-=BN`8{`SJ;2DIm zmG?*HKbiZaLbX`+>vPvDRI^og=zm5vuLVHN8ifL34QpbcUM1TVvVHN$B2yu|Occ74 zp0B|kjsj{EV~j69R$AWsXXQaOPwW-(2rQlCRssP)u7DAY0@5$`TFtbde%yfd3h zL2`sIPio2054Amruir%chkp{rL9gzjmoA^T@tZvZ-j4sUM5i}a1Cuqbc%2%#c6(Sp zo*0IYBH9;~fJy2{)L^(+YdO|+_3g}tEOrh zX=*Vddrh9!=KFz&BP9kU5)Kb*Zh|0QptcvN@$abh1={~NM7{L6)DX0X1gM3;+NC literal 0 HcmV?d00001 diff --git a/src/__pycache__/data.cpython-312.pyc b/src/__pycache__/data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8f9e7061b2572d914b5a88cc3c3fa8d3f77a360 GIT binary patch literal 525 zcmYjO%}T>S5S~pon${Mphf*zw*BtBvNbywg)&~fIB_yc?lD2NrLL~!T)0$CNAhN_tg znU1PH9U$YVsI!a>SZr!>r7stW;%OKMN?!+&;;!cfmZ5kOL^DYT%L9T#0uv#jcb63V z!Q|Sx3sWbStE;t>NYC+c+tG5POd-N~mJqpFQzsbJst|)cUVp zS_L|Qw!=AdHx7hQZ6V@?zlw-=gt%Y1QB{#g=zRm(!6fPTNV;PQ^dS;jd<%ufjbY`X m^3-CLtw-L!*1b8d4!MyhSSb6Ck$mZlu^-J~!*4(+8-4*sY-Uyf literal 0 HcmV?d00001 diff --git a/src/__pycache__/graph.cpython-312.pyc b/src/__pycache__/graph.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddc6cb925b1e2585962c9ff97e22ce7d9a1891ca GIT binary patch literal 8782 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 Q!oEw`Iob6cfsP6J54OgNhyVZp literal 0 HcmV?d00001 diff --git a/src/__pycache__/runner.cpython-312.pyc b/src/__pycache__/runner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8bf1d4d3f2b0bb0df049d65b98f31557ca75a5d GIT binary patch literal 969 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 self.timeFIn.text()): + msg = widgets.QMessageBox() + msg.setWindowTitle("Erro ao processar formulário") + msg.setText("Tempo final não pode ser menor que o tempo inicial.\nTempo não pode conter casas decimais") + msg.exec() + return + try: + obj = Simulation( + float(self.velIn.text()), + float(self.pos0In.text()), + float(self.acceIn.text()), + int(self.time0In.text()), + int(self.timeFIn.text()) + ) + except: + msg = widgets.QMessageBox() + msg.setWindowTitle("Erro ao processar formulário") + msg.setText("Use ponto final (.) para informar casas decimais ao invés da vírgula (,).\nNão é permitido caracteres alfabéticos.\nTempo só pode ser expressado em números inteiros") + msg.exec() + return + + t = [] + s = [] + a = [] + v = [] + + for dat in obj.dataArr: + t.append(dat.time) + s.append(dat.pos) + a.append(dat.acce) + v.append(dat.vel) + + self.parent.SGraph.setPlot(t, s) + self.parent.AGraph.setPlot(t, a) + self.parent.VGraph.setPlot(t, v) + self.parent.gScene.sim = obj + self.parent.reset() + + + \ No newline at end of file diff --git a/src/data.py b/src/data.py new file mode 100644 index 0000000..7179d10 --- /dev/null +++ b/src/data.py @@ -0,0 +1,6 @@ +class Data: + def __init__(self, pos, time, vel, acce): + self.pos = pos + self.time = time + self.vel = vel + self.acce = acce \ No newline at end of file diff --git a/src/entry,py b/src/entry,py new file mode 100644 index 0000000..5a65136 --- /dev/null +++ b/src/entry,py @@ -0,0 +1,10 @@ +import sim +import window +import sys + +import numpy as np + +window.app.show() +window.app.activateWindow() +window.app.raise_() +window.qapp.exec() \ No newline at end of file diff --git a/src/graph.py b/src/graph.py new file mode 100644 index 0000000..8b542ab --- /dev/null +++ b/src/graph.py @@ -0,0 +1,103 @@ +import matplotlib.pyplot as plt +import matplotlib.patches as pt +import matplotlib.animation as anm +import numpy as np +from matplotlib.backends.backend_qtagg import FigureCanvas +from sim import obj, Simulation +import gc + +class g(): + def __init__(self, title, x, labelX, y, labelY, par): + self.x = x + self.y = y + self.labelX = labelX + self.labelY = labelY + self.title = title + self.parent = par + + # overriding abstract method + def setPlot(self, x, y): + self.x = x + self.y = y + self.ani.__del__() + self.ani.pause() + self.circle.remove() + del self.ani + gc.collect() + + if len(self.ax.lines) > 0: + for line in list(self.ax.lines): + line.remove() + if len(self.ax.patches) > 0: + for patch in list(self.ax.patches): + patch.remove() + self.ax.plot(self.x, self.y, linewidth=2.0) + yl = max(self.y) + if self.y[0] == self.y[len(self.y)-1]: + yl *= 1.5 + #self.ax.relim() + self.ax.set(xlim=(0, max(self.x)), + ylim=(0, yl)) + self.circleW = max(self.x)*0.1 if max(self.x) >= 1 else 0.015 + self.circleH = yl*0.1333 if yl >= 1 else 0.015 + self.circle = pt.Ellipse((self.x[0],self.y[0]),self.circleW, self.circleH, fc='yellow',ec='black') + self.ax.add_patch(self.circle) + self.ani = anm.FuncAnimation(self.fig, self.update, frames=len(self.x), blit=True, interval=100) + plt.subplots_adjust(top=0.85, bottom=0.18, left=0.20, right=0.80, hspace=0.25, + wspace=0.35) + + def plot(self): + plt.style.use('_mpl-gallery') + self.fig, self.ax = plt.subplots() + self.canvas = FigureCanvas(self.fig) + self.canvas.setMinimumSize(364, 224) + self.parent.graphLayout.addWidget(self.canvas) + + self.ax.plot(self.x, self.y, linewidth=2.0) + yl = max(self.y) + if self.y[0] == self.y[len(self.y)-1]: + yl *= 1.5 + self.ax.set(xlim=(0, max(self.x)), xticks=np.arange(0, 0), + ylim=(0, yl), yticks=np.arange(0, 0)) + #self.circleW = max(self.x)*0.1 if max(self.x) >= 1 else 1.0 + self.circleW = max(self.x)*(self.canvas.height()/ self.canvas.width())*0.1 if max(self.x) >= 1 else 1.0 + #self.circleH = yl*0.13333 if yl >= 1 else 1.0 + self.circleH = yl*(self.canvas.height()/ self.canvas.width())*0.1 if yl >= 1 else 1.0 + self.circle = pt.Ellipse((self.x[0],self.y[0]),self.circleW, self.circleH, fc='yellow',ec='black') + self.ax.add_patch(self.circle) + self.i = 0 + self.isRunning = False + self.ani = anm.FuncAnimation(self.fig, self.update, frames=len(self.x), blit=True, interval=100) + + plt.ylabel(self.labelY) + plt.xlabel(self.labelX) + plt.title(self.title) + plt.yscale('linear') + plt.xscale('linear') + plt.subplots_adjust(top=0.85, bottom=0.11, left=0.20, right=0.80, hspace=0.25, + wspace=0.5) + #amém + #plt.show() + + def update(self, frame): + hMod = 0.175 if max(self.y) == min(self.y) else 0.070 + self.circleW = max(self.x)*(0.1+(self.canvas.height()/self.canvas.width()*0.1)) if max(self.x) >= 1 else 0.018 + self.circleH = max(self.y)*(hMod+(self.canvas.width()/self.canvas.height()*0.1)) if max(self.y) >= 1 else 0.018 + self.circle.remove() + #isso é do SATANÁS, AMIGO!!!!1! + #ainda bem que não precisei usar + #reze por mim, quem estiver vendo esse código + #gc.collect() + if self.i < len(self.x) - 1 and self.isRunning == True: + self.i+= 1 + self.circle = pt.Ellipse((self.x[self.i],self.y[self.i]),self.circleW, self.circleH, fc='yellow',ec='black') + else: + self.circle = pt.Ellipse((self.x[self.i],self.y[self.i]),self.circleW, self.circleH, fc='yellow',ec='black') + self.ax.add_patch(self.circle) + + return [self.circle] + + def play(self): + self.isRunning = True if not self.isRunning else False + def reset(self): + self.i = 0 \ No newline at end of file diff --git a/src/renderer.py b/src/renderer.py new file mode 100644 index 0000000..b2baf8f --- /dev/null +++ b/src/renderer.py @@ -0,0 +1,49 @@ +import sys +from PyQt6.QtWidgets import QGraphicsScene, QGraphicsRectItem, QGraphicsEllipseItem +from PyQt6.QtCore import QTimer +from PyQt6.QtGui import QBrush, QColor, QFont + +class scene(QGraphicsScene): + def __init__(self, parent, view, sim): + super().__init__(parent) + self.setSceneRect(0, 0, 400, 175) + self.sim = sim + self.view = view + self.view.setScene(self) + self.text = self.addText("Representação") + self.text.setScale(5) + self.runner = QGraphicsEllipseItem(0, 0, 100, 100) + brush = QBrush(QColor(255, 255, 0, 255)) + self.runner.setBrush(brush) + self.vel = self.sim.startVel + self.addItem(self.runner) + self.elapsedTime = self.sim.Time0 + self.timer = QTimer() + self.timer.setInterval(100) + self.timer.timeout.connect(self.run) + self.isRunning = False + self.timer.start() + + def run(self): + self.text.setPos((self.view.width()/2) - ((self.text.boundingRect().width()*5)/2), ((self.height()/2)) - ((self.text.boundingRect().height()) * 5)/2) + self.runner.setPos(self.runner.x(), (self.height()/2) - 100/2) + if self.isRunning and self.elapsedTime < self.sim.TimeF: + self.elapsedTime+=1 + pos = self.runner.x() + (self.vel) + self.runner.setPos(pos, (self.height()/2) - 100/2) + self.vel += self.sim.acce + self.text.setPlainText("T={}, A={}, S={}, V={}".format(self.elapsedTime, + self.sim.acce, + self.sim.dataArr[int(self.elapsedTime - self.sim.Time0) - 1].pos, + self.sim.dataArr[int(self.elapsedTime - self.sim.Time0) - 1].vel)) + + def pauseSim(self): + self.isRunning = False + + def playSim(self): + self.isRunning = True if not self.isRunning else False + + def resetSim(self): + self.runner.setPos(0, self.runner.y()) + self.vel = self.sim.startVel + self.elapsedTime = self.sim.Time0 \ No newline at end of file diff --git a/src/sim.py b/src/sim.py new file mode 100644 index 0000000..8baeda3 --- /dev/null +++ b/src/sim.py @@ -0,0 +1,57 @@ +import data + +class Simulation(): + #variable declaration + currTime = 0 + Time0 = 0 + TimeF = 0 + + startVel = 0 + currVel = 0 + acce = 0 + + startPos = 0 + pos = 0 + + dataArr = [] + + #constructor + def __init__(self, vel, pos, acce, time0, timeF): + self.startVel = vel + self.startPos = pos + self.acce = acce + self.Time0 = time0 + self.TimeF = timeF + self.dataArr = [] + self.reset() + self.run() + + # devo criar uma única função?? nahhhhh + def setVel(self, vel): + self.startVel = vel + def setAcce(self, acce): + self.acce = acce + def setTime(self, time0, timeF): + self.Time0 = time0 + self.TimeF = timeF + def setPos(self, pos): + self.startPos = pos + + #run simulation + def run(self): + while self.currTime < self.TimeF: + self.currTime+=1 + vel = self.startVel + self.acce*self.currTime + pos = self.startPos + self.startVel * self.currTime + (self.acce*pow(self.currTime, 2)) * 0.5 + #Amém + self.dataArr.append(data.Data(pos, self.currTime, vel, self.acce)) + + #reset the simulation + def reset(self): + self.currVel = self.startVel + self.pos = self.startPos + self.currTime = self.Time0 + + + +obj = Simulation(0, 0, 1, 0, 50) \ No newline at end of file diff --git a/src/style.py b/src/style.py new file mode 100644 index 0000000..e69de29 diff --git a/src/window.py b/src/window.py new file mode 100644 index 0000000..0e9fbdc --- /dev/null +++ b/src/window.py @@ -0,0 +1,160 @@ +import sys +from PyQt6.QtCore import Qt, QSize +from PyQt6.QtGui import QIcon +from PyQt6.QtWidgets import QWidget, QMainWindow, QVBoxLayout, QGraphicsView, QMenu, QLabel, QPushButton, QGroupBox +import PyQt6.QtWidgets as widgets +from graph import g +import sim +from configDialog import ConfigDialog + +import numpy as np + +#muito import ayy cabron +from matplotlib.backends.backend_qtagg import FigureCanvas +from matplotlib.backends.backend_qtagg import \ + NavigationToolbar2QT as NavigationToolbar +from matplotlib.backends.qt_compat import QtWidgets +from matplotlib.figure import Figure +import renderer + +class ApplicationWindow(QMainWindow): + # devo modularizar esse construtor + # feito :thumbs_up: + def __init__(self): + super().__init__() + #self.setBaseSize(500, 1500) + self._setupWindow() + self._setupQGraphics() + self._setupMenuBar() + self._setupUtils() + self._setupGraphs() + self._setupConfigWidget() + + + def contextMenuEvent(self, event): + # Show the context menu + self.context_menu.exec(event.globalPos()) + + #setup window + def _setupWindow(self): + app_icon = QIcon() + app_icon.addFile('assets/svt2.png', QSize(512, 512)) + self.setWindowIcon(app_icon) + #self.setFixedHeight(500) + self.setWindowTitle("Visualizador MRU") + + self._main = QtWidgets.QWidget() + + self.mainLayout = QtWidgets.QHBoxLayout(self._main) + self.setCentralWidget(self._main) + + self.viewWidget = QtWidgets.QWidget() + self.viewLayout = QtWidgets.QVBoxLayout(self.viewWidget) + self.mainLayout.addWidget(self.viewWidget) + + self.rightWidget = QtWidgets.QWidget() + self.rightLayout = QtWidgets.QVBoxLayout(self.rightWidget) + self.mainLayout.addWidget(self.rightWidget) + + self.graph = QtWidgets.QWidget() + self.graphLayout = QtWidgets.QHBoxLayout(self.graph) + + self.bottomWidget = QtWidgets.QWidget() + self.bottomLayout = QtWidgets.QHBoxLayout(self.bottomWidget) + + self.viewLayout.addWidget(self.graph) + + self.viewLayout.addWidget(self.bottomWidget) + self.viewLayout.setStretch(0, 6) + self.viewLayout.setStretch(1, 4) + + + self.viewLayout.setContentsMargins(0,0,0,0) + + + def _setupUtils(self): + self.utils = QWidget(self) + utilsLayout = QVBoxLayout() + self.utils.setLayout(utilsLayout) + self.rightLayout.addWidget(self.utils) + playBtn = QPushButton(self.bottomWidget) + playBtn.setText("Pausar/Continuar") + playBtn.clicked.connect(self.start) + resetBtn = QPushButton(self.bottomWidget) + resetBtn.setText("Resetar") + resetBtn.clicked.connect(self.reset) + + utilsLayout.addWidget(playBtn) + utilsLayout.addWidget(resetBtn) + + def _setupConfigWidget(self): + self.ConfigWidget = QWidget(self) + configLayout = widgets.QVBoxLayout(self.ConfigWidget) + self.rightLayout.addWidget(self.ConfigWidget) + + alterarBtn = QPushButton(self.ConfigWidget) + alterarBtn.setText("Alterar Params") + self.configDialog = ConfigDialog(self) + configLayout.addWidget(alterarBtn) + + alterarBtn.clicked.connect(self.invokeCfgDialog) + + #setup QGraphics + def _setupQGraphics(self): + gView = QGraphicsView() + gView.setAlignment(Qt.AlignmentFlag(1)) + gView.setMinimumWidth(1000) + gView.setFixedHeight(176) + self.gScene = renderer.scene(parent=self, view=gView, sim=sim.obj) + self.bottomLayout.addWidget(self.gScene.view) + self.gScene.view.show() + + def _setupGraphs(self): + t = [] + s = [] + a = [] + v = [] + + for dat in sim.obj.dataArr: + t.append(dat.time) + s.append(dat.pos) + a.append(dat.acce) + v.append(dat.vel) + #gráfico S x T + self.SGraph = g("S x T", t, "Tempo", s, "Distância", self) + self.SGraph.plot() + #gráfico A x T + self.AGraph = g("A x T", t, "Tempo", a, "Aceleração", self) + self.AGraph.plot() + #gráfico V x T + self.VGraph = g("V x T", t, "Tempo", v, "Velocidade", self) + self.VGraph.plot() + + def _setupMenuBar(self): + menuBar = self.menuBar() + actionsMenu = QMenu("&Ações", self) + menuBar.addMenu(actionsMenu) + resetAct = actionsMenu.addAction("Resetar") + playAct = actionsMenu.addAction("Pausar/Tocar") + + resetAct.triggered.connect(self.reset) + playAct.triggered.connect(self.start) + + def start(self): + self.gScene.playSim() + self.SGraph.play() + self.AGraph.play() + self.VGraph.play() + + def reset(self): + self.gScene.resetSim() + self.SGraph.reset() + self.AGraph.reset() + self.VGraph.reset() + + def invokeCfgDialog(self): + self.configDialog.show() + + +qapp = QtWidgets.QApplication(sys.argv) +app = ApplicationWindow() \ No newline at end of file