1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
import sys
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
from PyQt6.QtWidgets import QApplication, QMessageBox
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import Qt
import motorlib
from motorlib import simResult
from uilib import preferencesManager, propellantManager, simulationManager, fileManager, toolManager
from uilib import importExportManager
import uilib.widgets.mainWindow
from uilib.logger import logger
from uilib.fileIO import appVersionStr
class App(QApplication):
def __init__(self, args):
super().__init__(args)
self.icon = QIcon(os.path.join(os.path.dirname(sys.argv[0]), 'resources/oMIconCyclesSmall.png'))
self.headless = '-h' in args
if not self.headless and self.isDarkMode():
# Change these settings before any graph widgets are built, so they apply everywhere
plt.style.use('dark_background')
mpl.rcParams['axes.facecolor'] = '1e1e1e'
mpl.rcParams['figure.facecolor'] = '1e1e1e'
self.preferencesManager = uilib.preferencesManager.PreferencesManager()
self.propellantManager = uilib.propellantManager.PropellantManager()
self.preferencesManager.preferencesChanged.connect(self.propellantManager.setPreferences)
self.simulationManager = uilib.simulationManager.SimulationManager()
self.preferencesManager.preferencesChanged.connect(self.simulationManager.setPreferences)
self.fileManager = uilib.fileManager.FileManager(self)
startupFileLoaded = False
if len(args) > 1 and args[-1][0] != '-':
startupFileLoaded = self.fileManager.load(args[-1])
self.propellantManager.updated.connect(self.fileManager.updatePropellant)
self.toolManager = uilib.toolManager.ToolManager(self)
self.preferencesManager.preferencesChanged.connect(self.toolManager.setPreferences)
self.importExportManager = uilib.importExportManager.ImportExportManager(self)
self.preferencesManager.preferencesChanged.connect(self.importExportManager.setPreferences)
self.simulationManager.newSimulationResult.connect(self.importExportManager.acceptSimRes)
self.fileManager.newMotor.connect(self.importExportManager.acceptNewMotor)
if self.headless:
if len(args) < 3:
print('Not enough arguments. Headless mode requires an input file.')
elif not startupFileLoaded:
print('Could not load motor file')
sys.exit(1)
else:
motor = self.fileManager.getCurrentMotor()
simulationResult = motor.runSimulation()
for alert in simulationResult.alerts:
print('{} ({}, {}): {}'.format(motorlib.simResult.alertLevelNames[alert.level],
motorlib.simResult.alertTypeNames[alert.type],
alert.location,
alert.description))
print()
if '-o' in args:
with open(args[args.index('-o') + 1], 'w') as outputFile:
outputFile.write(simulationResult.getCSV(self.preferencesManager.preferences))
else:
print(simulationResult.getCSV(self.preferencesManager.preferences))
sys.exit(0)
else:
usingDarkMode = self.isDarkMode()
currentTheme = self.style().objectName()
logger.log('openMotor version "{}"'.format(appVersionStr))
logger.log('Opening window (dark mode: {}, default theme: "{}")'.format(usingDarkMode, currentTheme))
if startupFileLoaded:
logger.log('Loaded startup file from "{}"'.format(args[-1]))
# Windows 10 and before don't have dark mode versions of their themes, so if the user wants dark mode, we have to switch to fusion
if usingDarkMode and currentTheme in ['windows', 'windowsvista']:
logger.log('Overriding theme to fusion to get dark mode')
self.setStyle('fusion')
self.window = uilib.widgets.mainWindow.Window(self)
self.preferencesManager.publishPreferences()
if startupFileLoaded:
self.fileManager.sendTitleUpdate()
self.window.getQuickResults(self.fileManager.getCurrentMotor())
self.window.ui.resultsWidget.setupGrainChecks(len(self.fileManager.getCurrentMotor().grains), False)
self.window.show()
logger.log('Window opened')
def isDarkMode(self):
if self.headless:
return False
return self.styleHints().colorScheme() == Qt.ColorScheme.Dark
def outputMessage(self, content, title='openMotor'):
if self.headless:
print(content)
else:
logger.log(content)
msg = QMessageBox()
msg.setWindowIcon(self.icon)
msg.setText(content)
msg.setWindowTitle(title)
msg.exec()
def promptYesNo(self, content, title='openMotor'):
if self.headless:
return input('{} (y/n): '.format(content)) == 'y'
else:
logger.log(content)
msg = QMessageBox()
msg.setWindowIcon(self.icon)
msg.setText(content)
msg.setWindowTitle(title)
msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
return msg.exec() == QMessageBox.StandardButton.Yes
def outputException(self, exception, text, title='openMotor - Error'):
if self.headless:
print(text + " " + str(exception))
else:
logger.error(text)
logger.error(exception)
msg = QMessageBox()
msg.setWindowIcon(self.icon)
msg.setText(text)
msg.setInformativeText(str(exception))
msg.setWindowTitle(title)
msg.exec()
|