From d4dc0d67cf338437df35bec34834526f909b1f4a Mon Sep 17 00:00:00 2001 From: Patrick Rooney Date: Tue, 21 Jul 2020 20:35:48 +0100 Subject: [PATCH 1/2] Implemented ability to split drone stacks by ship's available bandwidth --- gui/builtinContextMenus/droneSplitStack.py | 38 +++++++++++++++++++- gui/fitCommands/calc/drone/localRemove.py | 8 +++-- gui/fitCommands/gui/localDrone/stackSplit.py | 10 ++++-- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/gui/builtinContextMenus/droneSplitStack.py b/gui/builtinContextMenus/droneSplitStack.py index 1369d51cbe..69e8f3eb74 100644 --- a/gui/builtinContextMenus/droneSplitStack.py +++ b/gui/builtinContextMenus/droneSplitStack.py @@ -37,14 +37,50 @@ def activate(self, callingWindow, fullContext, mainItem, i): fitID = self.mainFrame.getActiveFit() fit = Fit.getInstance().getFit(fitID) cleanInput = re.sub(r'[^0-9.]', '', dlg.input.GetLineText(0).strip()) - if mainItem in fit.drones: position = fit.drones.index(mainItem) self.mainFrame.command.Submit(cmd.GuiSplitLocalDroneStackCommand( fitID=fitID, position=position, amount=int(cleanInput))) +class DroneSplitStackBandwidth(DroneSplitStack): + """ + Split drone stack to match ship's available bandwidth, ensuring that only + one of the stacks is active so as not to exceed the bandwidth limit. + """ + def getText(self, callingWindow, itmContext, mainItem): + return "Split {} Stack to Fit Max Bandwidth".format(itmContext) + + def activate(self, callingWindow, fullContext, mainItem, i): + fitID = self.mainFrame.getActiveFit() + fit = Fit.getInstance().getFit(fitID) + bandwidth_per_drone = fit.drones[0].item. \ + attributes['droneBandwidthUsed'].value + ship_bandwidth = fit.ship.item.attributes['droneBandwidth'].value + max_active_drones = int(ship_bandwidth/bandwidth_per_drone) + if max_active_drones == 0: + wx.MessageDialog( + None, "Cannot split drone stack to fit bandwidth. Each drone " + "uses {0} mbit/s and this ship only has {1} mbit/s." + .format(int(bandwidth_per_drone), int(ship_bandwidth)), + "Ship drone bandwidth exceeded", wx.OK | wx.ICON_ERROR + ).ShowModal() + else: + if max_active_drones > 5: + max_active_drones = 5 + + if mainItem in fit.drones: + position = fit.drones.index(mainItem) + self.mainFrame.command.Submit( + cmd.GuiSplitLocalDroneStackCommand(fitID=fitID, + position=position, + amount=max_active_drones, + deactivate=True) + ) + + DroneSplitStack.register() +DroneSplitStackBandwidth.register() class DroneStackSplit(wx.Dialog): diff --git a/gui/fitCommands/calc/drone/localRemove.py b/gui/fitCommands/calc/drone/localRemove.py index 1ff26f4a3f..f4fd9fa035 100644 --- a/gui/fitCommands/calc/drone/localRemove.py +++ b/gui/fitCommands/calc/drone/localRemove.py @@ -10,13 +10,14 @@ class CalcRemoveLocalDroneCommand(wx.Command): - def __init__(self, fitID, position, amount): + def __init__(self, fitID, position, amount, deactivate=False): wx.Command.__init__(self, True, 'Remove Local Drone') self.fitID = fitID self.position = position self.amountToRemove = amount self.savedDroneInfo = None self.removedStack = None + self.deactivate = deactivate def Do(self): pyfalog.debug('Doing removal of {} local drones at position {} from fit {}'.format(self.amountToRemove, self.position, self.fitID)) @@ -26,7 +27,10 @@ def Do(self): drone.amount = max(drone.amount - self.amountToRemove, 0) if drone.amountActive > 0: - drone.amountActive = min(drone.amountActive, drone.amount) + if self.deactivate: + drone.amountActive = 0 + else: + drone.amountActive = min(drone.amountActive, drone.amount) if drone.amount == 0: fit.drones.remove(drone) diff --git a/gui/fitCommands/gui/localDrone/stackSplit.py b/gui/fitCommands/gui/localDrone/stackSplit.py index 0f7009a366..73c9744242 100644 --- a/gui/fitCommands/gui/localDrone/stackSplit.py +++ b/gui/fitCommands/gui/localDrone/stackSplit.py @@ -11,12 +11,17 @@ class GuiSplitLocalDroneStackCommand(wx.Command): - def __init__(self, fitID, position, amount): + def __init__(self, fitID, position, amount, deactivate=False): + """ + Deactivate argument is only True when splitting drone stacks to match + ship's available bandwidth. + """ wx.Command.__init__(self, True, 'Split Local Drone Stack') self.internalHistory = InternalCommandHistory() self.fitID = fitID self.position = position self.amount = amount + self.deactivate = deactivate def Do(self): sFit = Fit.getInstance() @@ -31,7 +36,8 @@ def Do(self): commands.append(CalcRemoveLocalDroneCommand( fitID=self.fitID, position=self.position, - amount=self.amount)) + amount=self.amount, + deactivate=self.deactivate)) commands.append(CalcAddLocalDroneCommand( fitID=self.fitID, droneInfo=info, From 7026bb1ce73c9e31e8ad65bb00a6e447093c855c Mon Sep 17 00:00:00 2001 From: Patrick Rooney Date: Wed, 22 Jul 2020 12:16:10 +0100 Subject: [PATCH 2/2] Fixed bug where the bandwidth per drone was always taken from the first drone stack --- gui/builtinContextMenus/droneSplitStack.py | 31 +++++++++++----------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/gui/builtinContextMenus/droneSplitStack.py b/gui/builtinContextMenus/droneSplitStack.py index 69e8f3eb74..ba60ccb4d4 100644 --- a/gui/builtinContextMenus/droneSplitStack.py +++ b/gui/builtinContextMenus/droneSplitStack.py @@ -54,22 +54,23 @@ def getText(self, callingWindow, itmContext, mainItem): def activate(self, callingWindow, fullContext, mainItem, i): fitID = self.mainFrame.getActiveFit() fit = Fit.getInstance().getFit(fitID) - bandwidth_per_drone = fit.drones[0].item. \ - attributes['droneBandwidthUsed'].value - ship_bandwidth = fit.ship.item.attributes['droneBandwidth'].value - max_active_drones = int(ship_bandwidth/bandwidth_per_drone) - if max_active_drones == 0: - wx.MessageDialog( - None, "Cannot split drone stack to fit bandwidth. Each drone " - "uses {0} mbit/s and this ship only has {1} mbit/s." - .format(int(bandwidth_per_drone), int(ship_bandwidth)), - "Ship drone bandwidth exceeded", wx.OK | wx.ICON_ERROR - ).ShowModal() - else: - if max_active_drones > 5: - max_active_drones = 5 + if mainItem in fit.drones: + bandwidth_per_drone = mainItem.item.\ + attributes['droneBandwidthUsed'].value + ship_bandwidth = fit.ship.item.attributes['droneBandwidth'].value + max_active_drones = int(ship_bandwidth/bandwidth_per_drone) + if max_active_drones == 0: + wx.MessageDialog( + None, "Cannot split drone stack to fit bandwidth. This " + "drone type uses {0} mbit/s and this ship only has {1} " + "mbit/s.".format(int(bandwidth_per_drone), + int(ship_bandwidth)), + "Ship drone bandwidth exceeded", wx.OK | wx.ICON_ERROR + ).ShowModal() + else: + if max_active_drones > 5: + max_active_drones = 5 - if mainItem in fit.drones: position = fit.drones.index(mainItem) self.mainFrame.command.Submit( cmd.GuiSplitLocalDroneStackCommand(fitID=fitID,