Apache update

-UI update with QTmodern library
-mist lua script updated and modified to deal with ED bug on Unit.getGroupsByName returning dead units
-pydcs updated with Apache
-pydcs update fixes 'transportable' mission editor bug
This commit is contained in:
spencer-ki
2022-03-19 16:46:35 -07:00
parent d70e0544f2
commit ad84f7beba
18 changed files with 11008 additions and 1109 deletions

View File

@@ -2,18 +2,26 @@ import math
import sys
import os
import dcs
from PyQt5.QtCore import QCoreApplication
from PyQt5.uic.properties import QtCore
import RotorOpsMission as ROps
import RotorOpsUtils
import RotorOpsUnits
import logging
import json
import yaml
import requests
from PyQt5.QtWidgets import (
QApplication, QDialog, QMainWindow, QMessageBox
)
from PyQt5 import QtGui
from PyQt5 import Qt, QtCore
from MissionGeneratorUI import Ui_MainWindow
import qtmodern.styles
import qtmodern.windows
#Setup logfile and exception handler
logger = logging.getLogger(__name__)
@@ -21,6 +29,30 @@ logging.basicConfig(filename='generator.log', encoding='utf-8', level=logging.DE
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
user_files_url = 'https://dcs-helicopters.com/user-files/'
class directories:
home_dir = scenarios = forces = scripts = sound = output = assets = imports = None
@classmethod
def find(cls):
current_dir = os.getcwd()
if os.path.basename(os.getcwd()) == "Generator":
os.chdir("..")
cls.home_dir = os.getcwd()
cls.scenarios = cls.home_dir + "\Generator\Scenarios"
cls.forces = cls.home_dir + "\Generator\Forces"
cls.scripts = cls.home_dir
cls.sound = cls.home_dir + "\sound\embedded"
cls.output = cls.home_dir + "\Generator\Output"
cls.assets = cls.home_dir + "\Generator/assets"
cls.imports = cls.home_dir + "\Generator\Imports"
os.chdir(current_dir)
directories.find()
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt): #example of handling error subclasses
sys.__excepthook__(exc_type, exc_value, exc_traceback)
@@ -36,8 +68,8 @@ def handle_exception(exc_type, exc_value, exc_traceback):
sys.excepthook = handle_exception
maj_version = 0
minor_version = 6
maj_version = 1
minor_version = 1
version_string = str(maj_version) + "." + str(minor_version)
scenarios = []
red_forces_files = []
@@ -55,8 +87,8 @@ class Window(QMainWindow, Ui_MainWindow):
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
logger.info('running in a PyInstaller bundle')
home_dir = os.getcwd()
os.chdir(home_dir + "/Generator")
qtmodern.styles._STYLESHEET = directories.assets + '/style.qss'
qtmodern.windows._FL_STYLESHEET = directories.assets + '/frameless.qss'
else:
logger.info('running in a normal Python process')
@@ -69,9 +101,9 @@ class Window(QMainWindow, Ui_MainWindow):
self.populateForces("blue", self.blueforces_comboBox, blue_forces_files)
self.populateSlotSelection()
self.blue_forces_label.setText(attackers_text)
self.red_forces_label.setText(defenders_text)
self.background_label.setPixmap(QtGui.QPixmap(self.m.assets_dir + "/background.PNG"))
# self.blue_forces_label.setText(attackers_text)
# self.red_forces_label.setText(defenders_text)
self.background_label.setPixmap(QtGui.QPixmap(directories.assets + "/rotorops-dkgray.png"))
self.statusbar.setStyleSheet(
"QStatusBar{padding-left:5px;color:black;font-weight:bold;}")
@@ -82,9 +114,11 @@ class Window(QMainWindow, Ui_MainWindow):
self.action_generateMission.triggered.connect(self.generateMissionAction)
self.action_scenarioSelected.triggered.connect(self.scenarioChanged)
self.action_defensiveModeChanged.triggered.connect(self.defensiveModeChanged)
self.action_nextScenario.triggered.connect(self.nextScenario)
self.action_prevScenario.triggered.connect(self.prevScenario)
def populateScenarios(self):
os.chdir(self.m.scenarios_dir)
os.chdir(directories.scenarios)
path = os.getcwd()
dir_list = os.listdir(path)
logger.info("Looking for mission files in " + path)
@@ -95,8 +129,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.scenario_comboBox.addItem(filename.removesuffix('.miz'))
def populateForces(self, side, combobox, files_list):
os.chdir(self.m.home_dir)
os.chdir(self.m.forces_dir + "/" + side)
os.chdir(directories.home_dir)
os.chdir(directories.forces + "/" + side)
path = os.getcwd()
dir_list = os.listdir(path)
logger.info("Looking for " + side + " Forces files in '" + path)
@@ -113,15 +147,16 @@ class Window(QMainWindow, Ui_MainWindow):
self.slot_template_comboBox.addItem("None")
def defensiveModeChanged(self):
if self.defense_checkBox.isChecked():
self.red_forces_label.setText(attackers_text)
self.blue_forces_label.setText(defenders_text)
else:
self.red_forces_label.setText(defenders_text)
self.blue_forces_label.setText(attackers_text)
# if self.defense_checkBox.isChecked():
# self.red_forces_label.setText(attackers_text)
# self.blue_forces_label.setText(defenders_text)
# else:
# self.red_forces_label.setText(defenders_text)
# self.blue_forces_label.setText(attackers_text)
self.applyScenarioConfig()
def loadScenarioConfig(self, filename):
try:
j = open(filename)
@@ -165,7 +200,7 @@ class Window(QMainWindow, Ui_MainWindow):
def scenarioChanged(self):
os.chdir(self.m.scenarios_dir)
os.chdir(directories.scenarios)
filename = scenarios[self.scenario_comboBox.currentIndex()]
source_mission = dcs.mission.Mission()
source_mission.load_file(filename)
@@ -228,12 +263,22 @@ class Window(QMainWindow, Ui_MainWindow):
+ source_mission.description_text()
)
path = directories.scenarios + "/" + filename.removesuffix(".miz") + ".jpg"
if os.path.isfile(path):
self.missionImage.setPixmap(QtGui.QPixmap(path))
else:
self.missionImage.setPixmap(QtGui.QPixmap(directories.assets + "/briefing1.png"))
def generateMissionAction(self):
red_forces_filename = red_forces_files[self.redforces_comboBox.currentIndex()]
blue_forces_filename = blue_forces_files[self.blueforces_comboBox.currentIndex()]
scenario_filename = scenarios[self.scenario_comboBox.currentIndex()]
source = "offline"
data = {
"source": source,
"scenario_filename": scenario_filename,
"red_forces_filename": red_forces_filename,
"blue_forces_filename": blue_forces_filename,
@@ -258,7 +303,7 @@ class Window(QMainWindow, Ui_MainWindow):
"transport_drop_qty": self.troop_drop_spinBox.value(),
"smoke_pickup_zones": self.smoke_pickup_zone_checkBox.isChecked(),
}
os.chdir(self.m.home_dir + '/Generator')
os.chdir(directories.home_dir + '/Generator')
n = ROps.RotorOpsMission()
result = n.generateMission(data)
logger.info("Generating mission with options:")
@@ -274,7 +319,7 @@ class Window(QMainWindow, Ui_MainWindow):
msg = QMessageBox()
msg.setWindowTitle("Mission Generated")
msg.setText("Awesome, your mission is ready! It's located in this directory: \n" +
self.m.output_dir + "\n" +
directories.output + "\n" +
"\n" +
"Next, you should use the DCS Mission Editor to fine tune unit placements. Don't be afraid to edit the missions that this generator produces. \n" +
"\n" +
@@ -294,13 +339,74 @@ class Window(QMainWindow, Ui_MainWindow):
msg.setText(result["failure_msg"])
x = msg.exec_()
def prevScenario(self):
self.scenario_comboBox.setCurrentIndex((self.scenario_comboBox.currentIndex() - 1))
def nextScenario(self):
self.scenario_comboBox.setCurrentIndex((self.scenario_comboBox.currentIndex() + 1))
def loadOnlineContent(self):
url = user_files_url + 'directory.yaml'
r = requests.get(url, allow_redirects=False)
user_files = yaml.safe_load(r.content)
count = 0
#todo: try/catch/fail here
# Download scenarios files
os.chdir(directories.scenarios)
if user_files["scenarios"]["files"]:
for filename in user_files["scenarios"]["files"]:
url = user_files_url + user_files["scenarios"]["dir"] + '/' + filename
r = requests.get(url, allow_redirects=False)
open(filename, 'wb').write(r.content)
count = count + 1
# Download blue forces files
os.chdir(directories.forces + '/blue')
if user_files["forces_blue"]["files"]:
for filename in user_files["forces_blue"]["files"]:
url = user_files_url + user_files["forces_blue"]["dir"] + '/' + filename
r = requests.get(url, allow_redirects=False)
open(filename, 'wb').write(r.content)
count = count + 1
# Download red forces files
os.chdir(directories.forces + '/red')
if user_files["forces_red"]["files"]:
for filename in user_files["forces_red"]["files"]:
url = user_files_url + user_files["forces_red"]["dir"] + '/' + filename
r = requests.get(url, allow_redirects=False)
open(filename, 'wb').write(r.content)
count = count + 1
# Download imports files
os.chdir(directories.imports)
if user_files["imports"]["files"]:
for filename in user_files["imports"]["files"]:
url = user_files_url + user_files["imports"]["dir"] + '/' + filename
r = requests.get(url, allow_redirects=False)
open(filename, 'wb').write(r.content)
count = count + 1
msg = QMessageBox()
msg.setWindowTitle("Downloaded Files")
msg.setText("We've downloaded " + str(count) + " new files!")
x = msg.exec_()
if __name__ == "__main__":
# os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
app = QApplication(sys.argv)
# QCoreApplication.setAttribute(QtCore.Qt.AA_DisableHighDpiScaling)
win = Window()
win.show()
# win.show()
# win.loadOnlineContent()
qtmodern.styles.dark(app)
mw = qtmodern.windows.ModernWindow(win)
mw.show()
sys.exit(app.exec())