def __init__(self): # constructor of the base class QtGui.QMainWindow.__init__(self) self._logger = logging.getLogger(self.__class__.__name__) # Create Simulation Backend self.guiProgress = None self.cmdProgress = None self.sim = SimulatorInteractor(self) self.runSimulation.connect(self.sim.run_simulation) self.sim.simulation_finished.connect(self.simulation_finished) self.sim.simulation_failed.connect(self.simulation_failed) self.currentDataset = None # sim setup viewer self.targetView = SimulatorView(self) self.targetView.setModel(self.sim.target_model) self.targetView.expanded.connect(self.target_view_changed) self.targetView.collapsed.connect(self.target_view_changed) # sim results viewer self.result_view = QtGui.QTreeView() # the docking area allows to rearrange the user interface at runtime self.area = pg.dockarea.DockArea() # Window properties self.setCentralWidget(self.area) self.resize(1000, 700) self.setWindowTitle("PyMoskito") res_path = get_resource("mosquito.png") icon = QtGui.QIcon(res_path) self.setWindowIcon(icon) # create docks self.propertyDock = pg.dockarea.Dock("Properties") self.vtkDock = pg.dockarea.Dock("Simulation") self.regimeDock = pg.dockarea.Dock("Regimes") self.dataDock = pg.dockarea.Dock("Data") self.logDock = pg.dockarea.Dock("Log") self.plotDocks = [] self.plotDocks.append(pg.dockarea.Dock("Placeholder")) self.plotWidgets = [] self.timeLines = [] # arrange docks self.area.addDock(self.vtkDock, "right") self.area.addDock(self.regimeDock, "left", self.vtkDock) self.area.addDock(self.propertyDock, "bottom", self.regimeDock) self.area.addDock(self.dataDock, "bottom", self.propertyDock) self.area.addDock(self.plotDocks[-1], "bottom", self.vtkDock) self.area.addDock(self.logDock, "bottom", self.dataDock) # add widgets to the docks self.propertyDock.addWidget(self.targetView) # vtk window self.vtkLayout = QtGui.QVBoxLayout() self.frame = QtGui.QFrame() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) self.vtkLayout.addWidget(self.vtkWidget) self.frame.setLayout(self.vtkLayout) self.vtkDock.addWidget(self.frame) self.vtk_renderer = vtk.vtkRenderer() self.vtkWidget.GetRenderWindow().AddRenderer(self.vtk_renderer) # check if there is a registered visualizer available_vis = get_registered_visualizers() self._logger.info("found visualizers: {}".format( [name for cls, name in available_vis])) if available_vis: # instantiate the first one self._logger.info("loading visualizer '{}'".format( available_vis[0][1])) self.visualizer = available_vis[0][0](self.vtk_renderer) self.vtkWidget.Initialize() else: self.visualizer = None # regime window self.regime_list = QtGui.QListWidget(self) self.regime_list.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) self.regimeDock.addWidget(self.regime_list) self.regime_list.itemDoubleClicked.connect(self.regime_dclicked) self._regimes = [] self.regime_file_name = "" # data window self.dataList = QtGui.QListWidget(self) self.dataDock.addWidget(self.dataList) self.dataList.itemDoubleClicked.connect(self.create_plot) # actions for simulation control self.actSimulate = QtGui.QAction(self) self.actSimulate.setText("Simulate") self.actSimulate.setIcon(QtGui.QIcon(get_resource("simulate.png"))) self.actSimulate.triggered.connect(self.start_simulation) # actions for animation control self.actPlayPause = QtGui.QAction(self) self.actPlayPause.setText("Play") self.actPlayPause.setIcon(QtGui.QIcon(get_resource("play.png"))) self.actPlayPause.setDisabled(True) self.actPlayPause.triggered.connect(self.play_animation) self.actStop = QtGui.QAction(self) self.actStop.setText("Stop") self.actStop.setIcon(QtGui.QIcon(get_resource("stop.png"))) self.actStop.setDisabled(True) self.actStop.triggered.connect(self.stop_animation) self.speedDial = QtGui.QDial() self.speedDial.setDisabled(True) self.speedDial.setMinimum(0) self.speedDial.setMaximum(100) self.speedDial.setValue(50) self.speedDial.setSingleStep(1) self.speedDial.resize(24, 24) self.speedDial.valueChanged.connect(self.update_playback_gain) self.timeSlider = QtGui.QSlider(QtCore.Qt.Horizontal, self) self.timeSlider.setMinimum(0) self.timeSliderRange = 1000 self.timeSlider.setMaximum(self.timeSliderRange) self.timeSlider.setTickInterval(1) self.timeSlider.setTracking(True) self.timeSlider.setDisabled(True) self.timeSlider.valueChanged.connect(self.update_playback_time) self.playbackTime = 0 self.playbackGain = 1 self.currentStepSize = 0 self.currentEndTime = 0 self.playbackTimer = QTimer() self.playbackTimer.timeout.connect(self.increment_playback_time) self.playbackTimeChanged.connect(self.update_gui) self.playbackTimeout = 33 # in [ms] -> 30 fps self.actSave = QtGui.QAction(self) self.actSave.setText('Save') self.actSave.setIcon(QtGui.QIcon(get_resource("save.png"))) self.actSave.setDisabled(True) self.actSave.triggered.connect(self.export_simulation_data) self.actLoadRegimes = QtGui.QAction(self) self.actLoadRegimes.setText("load regimes") self.actLoadRegimes.setIcon(QtGui.QIcon(get_resource("load.png"))) self.actLoadRegimes.setDisabled(False) self.actLoadRegimes.triggered.connect(self.load_regime_dialog) self.actExecuteRegimes = QtGui.QAction(self) self.actExecuteRegimes.setText("execute all regimes") self.actExecuteRegimes.setIcon( QtGui.QIcon(get_resource("execute_regimes.png"))) self.actExecuteRegimes.setDisabled(True) self.actExecuteRegimes.triggered.connect(self.execute_regimes_clicked) self.actPostprocessing = QtGui.QAction(self) self.actPostprocessing.setText("launch postprocessor") self.actPostprocessing.setIcon( QtGui.QIcon(get_resource("processing.png"))) self.actPostprocessing.setDisabled(False) self.actPostprocessing.triggered.connect(self.postprocessing_clicked) self.act_reset_camera = QtGui.QAction(self) self.act_reset_camera.setText("reset camera") self.act_reset_camera.setIcon( QtGui.QIcon(get_resource("reset_camera.png"))) self.act_reset_camera.setDisabled(not self.visualizer.can_reset_view) self.act_reset_camera.triggered.connect(self.reset_camera_clicked) # toolbar for control self.toolbarSim = QtGui.QToolBar("Simulation") self.toolbarSim.setIconSize(QtCore.QSize(32, 32)) self.addToolBar(self.toolbarSim) self.toolbarSim.addAction(self.actLoadRegimes) self.toolbarSim.addAction(self.actSave) self.toolbarSim.addSeparator() self.toolbarSim.addAction(self.actSimulate) self.toolbarSim.addAction(self.actExecuteRegimes) self.toolbarSim.addSeparator() self.toolbarSim.addAction(self.actPlayPause) self.toolbarSim.addAction(self.actStop) self.toolbarSim.addWidget(self.speedDial) self.toolbarSim.addWidget(self.timeSlider) self.toolbarSim.addAction(self.actPostprocessing) self.toolbarSim.addAction(self.act_reset_camera) self.postprocessor = None # regime management self.runningBatch = False self._current_regime_index = 0 self._regimes = [] self.regimeFinished.connect(self.run_next_regime) self.finishedRegimeBatch.connect(self.regime_batch_finished) # log dock self.logBox = QPlainTextEditLogger(self) self.logBox.setLevel(logging.INFO) formatter = logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%H:%M:%S") self.logBox.setFormatter(formatter) self.log_filter = PostFilter(invert=True) self.logBox.addFilter(self.log_filter) logging.getLogger().addHandler(self.logBox) self.logDock.addWidget(self.logBox.widget) # status bar self.status = QtGui.QStatusBar(self) self.setStatusBar(self.status) self.statusLabel = QtGui.QLabel("Ready.") self.statusBar().addPermanentWidget(self.statusLabel) self.timeLabel = QtGui.QLabel("current time: 0.0") self.statusBar().addPermanentWidget(self.timeLabel) # shortcuts self.delShort = QtGui.QShortcut( QtGui.QKeySequence(QtCore.Qt.Key_Delete), self.regime_list) self.delShort.activated.connect(self.remove_regime_items) self.shortOpenRegime = QtGui.QShortcut(QtGui.QKeySequence.Open, self) self.shortOpenRegime.activated.connect(self.load_regime_dialog) self.shortSaveResult = QtGui.QShortcut(QtGui.QKeySequence.Save, self) self.shortSaveResult.activated.connect(self.export_simulation_data) self.shortSaveResult.setEnabled(False) self.shortSpeedUp = QtGui.QShortcut(QtGui.QKeySequence.ZoomIn, self) self.shortSpeedUp.activated.connect(self.increment_playback_speed) self.shortSpeedDown = QtGui.QShortcut(QtGui.QKeySequence.ZoomOut, self) self.shortSpeedDown.activated.connect(self.decrement_playback_speed) self.shortSpeedReset = QtGui.QShortcut( QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_0), self) self.shortSpeedReset.activated.connect(self.reset_playback_speed) self.shortRunSimulation = QtGui.QShortcut(QtGui.QKeySequence('F5'), self) self.shortRunSimulation.activated.connect(self.start_simulation) self.shortRunRegimeBatch = QtGui.QShortcut(QtGui.QKeySequence('F6'), self) self.shortRunRegimeBatch.activated.connect( self.execute_regimes_clicked) self.shortRunPostprocessing = QtGui.QShortcut(QtGui.QKeySequence('F7'), self) self.shortRunPostprocessing.activated.connect( self.postprocessing_clicked) self.shortPlayPause = QtGui.QShortcut( QtGui.QKeySequence(QtCore.Qt.Key_Space), self) self.shortPlayPause.activated.connect(self.play_animation) self.shortPlayPause.setEnabled(False) self.postprocessor = None self._logger.info("Simulation GUI is up and running.")