| 11 | |
| 12 | |
| 13 | class CalcAddProjectedModuleCommand(wx.Command): |
| 14 | |
| 15 | def __init__(self, fitID, modInfo, position=None, ignoreRestrictions=False, recalc=True): |
| 16 | wx.Command.__init__(self, True) |
| 17 | self.fitID = fitID |
| 18 | self.newModInfo = modInfo |
| 19 | self.newPosition = position |
| 20 | self.ignoreRestrictions = ignoreRestrictions |
| 21 | self.recalc = recalc |
| 22 | self.oldModInfo = None |
| 23 | self.oldPosition = None |
| 24 | self.savedStateCheckChanges = None |
| 25 | |
| 26 | def Do(self): |
| 27 | pyfalog.debug('Doing addition of projected module {} onto: {}'.format(self.newModInfo, self.fitID)) |
| 28 | newMod = self.newModInfo.toModule(fallbackState=FittingModuleState.ACTIVE) |
| 29 | if newMod is None: |
| 30 | return False |
| 31 | |
| 32 | sFit = Fit.getInstance() |
| 33 | fit = sFit.getFit(self.fitID) |
| 34 | canHaveState = newMod.canHaveState(newMod.state, projectedOnto=fit) |
| 35 | if canHaveState is not True: |
| 36 | newMod.state = canHaveState |
| 37 | if not self.ignoreRestrictions and not newMod.isValidCharge(newMod.charge): |
| 38 | newMod.charge = None |
| 39 | self.oldPosition, self.oldModInfo = fit.projectedModules.makeRoom(newMod) |
| 40 | |
| 41 | if self.newPosition is not None: |
| 42 | fit.projectedModules.insert(self.newPosition, newMod) |
| 43 | if newMod not in fit.projectedModules: |
| 44 | return False |
| 45 | else: |
| 46 | fit.projectedModules.append(newMod) |
| 47 | if newMod not in fit.projectedModules: |
| 48 | return False |
| 49 | self.newPosition = fit.projectedModules.index(newMod) |
| 50 | |
| 51 | if self.recalc: |
| 52 | # Need to flush because checkStates sometimes relies on module->fit |
| 53 | # relationship via .owner attribute, which is handled by SQLAlchemy |
| 54 | eos.db.flush() |
| 55 | sFit.recalc(fit) |
| 56 | self.savedStateCheckChanges = sFit.checkStates(fit, newMod) |
| 57 | return True |
| 58 | |
| 59 | def Undo(self): |
| 60 | pyfalog.debug('Undoing addition of projected module {} onto: {}'.format(self.newModInfo, self.fitID)) |
| 61 | if self.oldPosition is not None and self.oldModInfo is not None: |
| 62 | cmd = CalcAddProjectedModuleCommand( |
| 63 | fitID=self.fitID, |
| 64 | modInfo=self.oldModInfo, |
| 65 | position=self.oldPosition, |
| 66 | ignoreRestrictions=True, |
| 67 | recalc=False) |
| 68 | if not cmd.Do(): |
| 69 | return False |
| 70 | restoreCheckedStates(Fit.getInstance().getFit(self.fitID), self.savedStateCheckChanges) |