Files
moulder/moulder.py

200 lines
8.6 KiB
Python
Raw Normal View History

2018-02-01 16:20:03 -03:00
from __future__ import print_function, division
2018-01-31 12:35:47 -03:00
from future.builtins import super
import os
import sys
2018-02-01 12:39:59 -03:00
import numpy
2018-01-31 12:35:47 -03:00
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QSizePolicy, QMainWindow, QApplication, QAction
from PyQt5.QtWidgets import QMenu, QWidget, QVBoxLayout, QMessageBox
from PyQt5.QtWidgets import QSlider, QHBoxLayout, QLabel, QDialog
2018-02-01 16:20:03 -03:00
from PyQt5.QtWidgets import QDialogButtonBox, QDoubleSpinBox
2018-01-31 12:35:47 -03:00
from figure_canvas import GravityModelCanvas
2018-02-02 11:13:51 -03:00
from double_slider import QDoubleSlider
2018-01-31 13:51:07 -03:00
from interactive import Moulder
2018-02-01 14:44:20 -03:00
from configure_dialog import ConfigureMeassurementDialog
2018-01-31 12:35:47 -03:00
2018-02-01 16:20:03 -03:00
DENSITY_RANGE = [-2000, 2000]
2018-01-31 12:35:47 -03:00
2018-01-31 13:51:07 -03:00
class MoulderApp(QMainWindow):
2018-01-31 12:35:47 -03:00
def __init__(self):
super().__init__()
self.setWindowTitle("Moulder")
self.setWindowIcon(QIcon.fromTheme('python-logo'))
self.setGeometry(200, 200, 1024, 800)
self.init_ui()
2018-02-01 14:53:21 -03:00
self.moulder = Moulder(self, numpy.linspace(0, 100e3, 101),
numpy.zeros(101), 0, 10000,
2018-02-01 16:20:03 -03:00
density_range=DENSITY_RANGE,
2018-02-01 14:44:20 -03:00
width=5, height=4, dpi=100)
self.setCentralWidget(self.moulder)
self.moulder.setFocusPolicy(Qt.StrongFocus)
self.set_callbacks()
2018-02-01 11:18:39 -03:00
2018-01-31 12:35:47 -03:00
def closeEvent(self, event):
event.ignore()
self._quit_callback()
def init_ui(self):
self._define_actions()
self._configure_menubar()
2018-02-01 16:20:03 -03:00
self._configure_main_toolbar()
self._configure_secondary_toolbar()
2018-01-31 12:35:47 -03:00
def set_callbacks(self):
2018-02-01 14:44:20 -03:00
self.configure_action.triggered.connect(
self._configure_meassurement_callback)
2018-01-31 12:35:47 -03:00
self.about_action.triggered.connect(self._about_callback)
self.quit_action.triggered.connect(self._quit_callback)
self.moulder.polygon_selected.connect(self._change_density_callback)
self.new_polygon_action.triggered.connect(self.moulder.new_polygon)
self.add_vertex_action.triggered.connect(self.moulder.add_vertex)
self.delete_polygon_action.triggered.connect(
self.moulder.delete_polygon)
2018-02-01 16:20:03 -03:00
self.density_slider.valueChanged.connect(
self._spin_slider_changed_callback)
self.density_spinbox.valueChanged.connect(
self._spin_slider_changed_callback)
self.error_slider.valueChanged.connect(
self._spin_slider_changed_callback)
self.error_spinbox.valueChanged.connect(
self._spin_slider_changed_callback)
2018-01-31 12:35:47 -03:00
def _define_actions(self):
2018-02-01 14:44:20 -03:00
self.configure_action = QAction(QIcon.fromTheme('preferences-system'),
'&Configure...', self)
2018-01-31 12:35:47 -03:00
self.open_action = QAction(QIcon.fromTheme('document-open'),
'&Open model', self)
self.open_action.setShortcut('Ctrl+O')
self.save_action = QAction(QIcon.fromTheme('document-save'),
'&Save model', self)
self.save_action.setShortcut('Ctrl+S')
self.save_as_action = QAction(QIcon.fromTheme('document-save-as'),
'&Save model as...', self)
self.save_as_action.setShortcut('Ctrl+Shift+S')
self.quit_action = QAction(QIcon.fromTheme('application-exit'),
'&Quit', self)
self.quit_action.setShortcut('Ctrl+Q')
self.about_action = QAction("&About", self)
self.new_polygon_action = QAction(QIcon.fromTheme("window-new"),
"&New Polygon", self)
self.delete_polygon_action = QAction(QIcon.fromTheme("window-close"),
"&Delete Polygon", self)
self.add_vertex_action = QAction(QIcon.fromTheme("document-new"),
"&Add Vertex", self)
2018-01-31 12:35:47 -03:00
def _configure_menubar(self):
self.menubar = self.menuBar()
self.file_menu = self.menubar.addMenu('File')
self.file_menu.addAction(self.open_action)
self.file_menu.addAction(self.save_action)
2018-02-01 14:49:03 -03:00
self.file_menu.addAction(self.save_as_action)
2018-01-31 12:35:47 -03:00
self.file_menu.addAction(self.quit_action)
2018-02-01 14:49:03 -03:00
self.edit_menu = self.menubar.addMenu('Edit')
self.edit_menu.addAction(self.new_polygon_action)
self.edit_menu.addAction(self.add_vertex_action)
self.edit_menu.addAction(self.delete_polygon_action)
self.edit_menu.addSeparator()
2018-02-01 14:49:03 -03:00
self.edit_menu.addAction(self.configure_action)
2018-01-31 12:35:47 -03:00
self.about_menu = self.menubar.addMenu('About')
self.about_menu.addAction(self.about_action)
2018-02-01 16:20:03 -03:00
def _configure_main_toolbar(self):
self.main_toolbar = self.addToolBar("Main Toolbar")
self.main_toolbar.addAction(self.open_action)
self.main_toolbar.addAction(self.save_action)
self.main_toolbar.addAction(self.save_as_action)
self.main_toolbar.addAction(self.configure_action)
self.main_toolbar.addSeparator()
self.main_toolbar.addAction(self.new_polygon_action)
self.main_toolbar.addAction(self.add_vertex_action)
self.main_toolbar.addAction(self.delete_polygon_action)
2018-02-01 16:20:03 -03:00
def _configure_secondary_toolbar(self):
self.density_slider = QSlider(Qt.Horizontal)
self.density_slider.setMinimum(DENSITY_RANGE[0])
self.density_slider.setMaximum(DENSITY_RANGE[1])
self.density_slider.setValue(0)
self.density_slider.setTickInterval(
2018-02-02 12:09:10 -03:00
(DENSITY_RANGE[1] - DENSITY_RANGE[0])/10)
2018-02-01 16:20:03 -03:00
self.density_slider.setTickPosition(QSlider.TicksBelow)
self.density_spinbox = QDoubleSpinBox()
self.density_spinbox.setMinimum(DENSITY_RANGE[0])
self.density_spinbox.setMaximum(DENSITY_RANGE[1])
self.density_spinbox.setValue(0)
self.density_spinbox.setSingleStep(1)
2018-02-02 11:13:51 -03:00
self.error_slider = QDoubleSlider(Qt.Horizontal, 0, 5, 0.5,
init_value=0)
self.error_slider.setTickInterval(self.error_slider.float_2_int(0.5))
2018-02-01 16:20:03 -03:00
self.error_slider.setTickPosition(QSlider.TicksBelow)
self.error_spinbox = QDoubleSpinBox()
self.error_spinbox.setMinimum(0)
2018-02-02 10:14:04 -03:00
self.error_spinbox.setMaximum(5)
2018-02-01 16:20:03 -03:00
self.error_spinbox.setValue(0)
self.error_spinbox.setSingleStep(0.1)
self.secondary_toolbar = self.addToolBar("Secondary Toolbar")
self.secondary_toolbar.setStyleSheet('QToolBar{spacing:10px;}')
self.secondary_toolbar.addWidget(QLabel("Density [kg/m^3]:"))
self.secondary_toolbar.addWidget(self.density_slider)
self.secondary_toolbar.addWidget(self.density_spinbox)
self.secondary_toolbar.addSeparator()
self.secondary_toolbar.addWidget(QLabel("Error:"))
self.secondary_toolbar.addWidget(self.error_slider)
self.secondary_toolbar.addWidget(self.error_spinbox)
2018-01-31 12:35:47 -03:00
def _about_callback(self):
QMessageBox.about(self, "About Moulder",
"About Moulder\nVersion 0.1")
2018-02-01 14:44:20 -03:00
def _configure_meassurement_callback(self):
configure_dialog = ConfigureMeassurementDialog(self)
configure_dialog.exec_()
if configure_dialog.is_completed():
self.moulder.set_meassurement_points(configure_dialog.x,
configure_dialog.z)
2018-01-31 12:35:47 -03:00
2018-02-01 16:20:03 -03:00
def _spin_slider_changed_callback(self, value):
sender = self.sender()
if sender == self.density_slider:
self.density_spinbox.setValue(value)
self.moulder.density = value
2018-02-01 16:20:03 -03:00
elif sender == self.density_spinbox:
self.density_slider.setValue(value)
self.moulder.density = value
2018-02-01 16:20:03 -03:00
elif sender == self.error_slider:
2018-02-02 11:13:51 -03:00
value = self.error_slider.int_2_float(value)
2018-02-01 16:20:03 -03:00
self.error_spinbox.setValue(value)
self.moulder.error = value
2018-02-01 16:20:03 -03:00
elif sender == self.error_spinbox:
2018-02-02 11:13:51 -03:00
self.error_slider.setValue(self.error_slider.float_2_int(value))
self.moulder.error = value
2018-02-01 16:20:03 -03:00
def _change_density_callback(self, value):
self.density_spinbox.setValue(value)
self.density_slider.setValue(value)
2018-01-31 12:35:47 -03:00
def _quit_callback(self):
answer = QMessageBox.question(self, "Quit",
"Are you sure you want to quit?",
QMessageBox.Yes, QMessageBox.No)
if answer == QMessageBox.Yes:
sys.exit()
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setApplicationName("Moulder")
2018-02-01 14:44:20 -03:00
moulder_app = MoulderApp()
moulder_app.show()
2018-01-31 12:35:47 -03:00
sys.exit(app.exec_())