mapMarkersHandler.py (25112B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\markers\mapMarkersHandler.py 2 import evetypes 3 from carbon.common.script.util.timerstuff import AutoTimer 4 from carbonui.util.color import Color 5 from eve.client.script.ui.inflight.scannerFiles.directionalScanIntersectUtil import IsWithinScanShape 6 from eve.client.script.ui.inflight.scannerFiles.directionalScanUtil import GetScanAngle, GetScanRangeInMeters 7 from eve.client.script.ui.shared.mapView import mapViewConst 8 from eve.client.script.ui.shared.mapView.markers.mapMarkerContellation import MarkerLabelConstellation 9 from eve.client.script.ui.shared.mapView.markers.mapMarkerGroup import MarkerGroup 10 from eve.client.script.ui.shared.mapView.markers.mapMarkerLandmark import MarkerLabelLandmark 11 from eve.client.script.ui.shared.mapView.markers.mapMarkerRegion import MarkerLabelRegion 12 from eve.client.script.ui.shared.mapView.markers.mapMarkerSolarSystem import MarkerLabelSolarSystem, FilterInfo 13 from eve.client.script.ui.shared.mapView.mapViewUtil import IsDynamicMarkerType, MapPosToSolarSystemPos 14 import geo2 15 import telemetry 16 from eve.client.script.ui.inflight.overview.overviewConst import OVERVIEW_AUTO_PILOT_DESTINATION_COLOR 17 from eve.client.script.ui.shared.mapView.markers.pendingAbstractMarkerUpdater import PendingAbstractMarkerUpdater 18 from eve.common.script.sys import idCheckers 19 20 @telemetry.ZONE_METHOD 21 def DoMarkersIntersect(marker1Bound, marker2Bound): 22 l1, t1, r1, b1 = marker1Bound 23 l2, t2, r2, b2 = marker2Bound 24 overlapX = not (r1 <= l2 or l1 >= r2) 25 if overlapX: 26 overlapY = not (b1 <= t2 or t1 >= b2) 27 if overlapY: 28 return True 29 return False 30 31 32 @telemetry.ZONE_METHOD 33 def FindOverlaps(markers): 34 isOverlapped = set() 35 isOverlapping = {} 36 for _sortVal, (bound1, marker1) in markers: 37 if marker1.markerID in isOverlapped: 38 continue 39 for _sortVal, (bound2, marker2) in markers: 40 if marker1 is marker2: 41 continue 42 if marker2.markerID in isOverlapped: 43 continue 44 intersect = DoMarkersIntersect(bound1, bound2) 45 if intersect: 46 isOverlapping.setdefault(marker1.markerID, []).append(marker2) 47 isOverlapped.add(marker2.markerID) 48 49 return (isOverlapping, isOverlapped) 50 51 52 def GetMarkerGroupsForZoomLevel(markersObjects, zoomLevel): 53 groups = {} 54 itemIDs = {} 55 for markerObject in markersObjects: 56 if markerObject.isGrouped: 57 groupID, itemID = markerObject.GetGroupingId(zoomLevel) 58 if itemID not in itemIDs: 59 itemIDs[groupID] = itemID 60 if groupID is not None: 61 if groupID not in groups: 62 groups[groupID] = [] 63 groups[groupID].append(markerObject) 64 65 groupedMarkers = {} 66 for groupID, groupMarkers in groups.items(): 67 if len(groupMarkers) <= 1: 68 continue 69 positions = [ marker.position for marker in groupMarkers ] 70 centroid = GetMeanPosition(positions) 71 groupedMarkers[groupID] = {'centroid': tuple(centroid), 72 'itemID': itemIDs[groupID], 73 'markers': groupMarkers} 74 75 return groupedMarkers 76 77 78 def GetMeanPosition(positions): 79 if not positions: 80 return (0, 0, 0) 81 x_sum = sum((pos[0] for pos in positions)) 82 y_sum = sum((pos[1] for pos in positions)) 83 z_sum = sum((pos[2] for pos in positions)) 84 count = len(positions) 85 return (x_sum / count, y_sum / count, z_sum / count) 86 87 88 class MapViewMarkersHandler(object): 89 __notifyevents__ = ['OnDirectionalScannerShowCone', 90 'OnDirectionalScanStarted', 91 'OnDestinationSet', 92 'OnNewState', 93 'OnSecurityModified'] 94 __metaclass__ = telemetry.ZONE_PER_METHOD 95 projectBrackets = None 96 markerCurveSet = None 97 markerLayer = None 98 mapView = None 99 disabledMarkers = None 100 eventHandler = None 101 clickTimer = None 102 cameraTranslationFromParent = 1.0 103 cameraZoomValue = 1.0 104 cameraProjectionFovConst = 1.0 105 106 def __init__(self, mapView, markerCurveSet, markerLayer, eventHandler = None, stackMarkers = True, updateInterval = 500, isAbstractMode = False): 107 sm.RegisterNotify(self) 108 self.mapView = mapView 109 self.projectBrackets = {} 110 self.hilightMarkers = set() 111 self.activeMarkers = set() 112 self.groupedMarkers = set() 113 self.previewBubbleMarkerIDs = set() 114 self.selectedMarkerIDs = set() 115 self.overlapMarkers = set() 116 self.distanceSortedMarkers = set() 117 self.activeGroups = set() 118 self.removedGroups = set() 119 self.markerCurveSet = markerCurveSet 120 self.markerLayer = markerLayer 121 self.eventHandler = eventHandler 122 self.stackMarkers = stackMarkers 123 self.updateTimer = AutoTimer(updateInterval, self.UpdateMarkers) 124 self.isRegionSelected = False 125 self.isUpdating = False 126 self.pendingAbstractUpdater = PendingAbstractMarkerUpdater(self) 127 self.isAbstractMode = isAbstractMode 128 129 def __del__(self): 130 sm.UnregisterNotify(self) 131 self.StopHandler() 132 133 def IsMarkerPickOverridden(self): 134 if self.eventHandler: 135 return self.eventHandler.MapMarkerPickingOverride() 136 return False 137 138 def GetIntersectingMarkersForMarker(self, checkMarkerObject): 139 intersectingMarkers = [] 140 for markerID, markerObject in self.projectBrackets.iteritems(): 141 if markerObject and markerObject.markerContainer and not markerObject.markerContainer.destroyed: 142 intersect = DoMarkersIntersect(checkMarkerObject.GetBoundaries(), markerObject.GetBoundaries()) 143 if intersect: 144 intersectingMarkers.append(markerObject) 145 146 return intersectingMarkers 147 148 def UpdateMarkers(self, forceUpdateGroupings = False): 149 if self.isUpdating: 150 return 151 self.isUpdating = True 152 distance_markers = [] 153 stack_markers = [] 154 activeAndHighlighted = self.hilightMarkers.union(self.activeMarkers) 155 for markerID in activeAndHighlighted.union(self.distanceSortedMarkers): 156 markerObject = self.projectBrackets.get(markerID, None) 157 if markerObject and markerObject.ignoreOverlaps: 158 continue 159 if markerObject and markerObject.markerContainer and not markerObject.markerContainer.destroyed: 160 markerDistance = markerObject.GetMarkerDistance() 161 distance_markers.append((markerDistance, markerObject)) 162 if hasattr(markerObject, 'GetOverlapSortValue'): 163 markerBoundaries = markerObject.GetBoundaries() 164 stack_markers.append(((markerObject.GetOverlapSortValue(), markerDistance), (markerBoundaries, markerObject))) 165 166 distanceSortedMarkers = sorted(distance_markers, reverse=True) 167 for markerDistance, markerObject in distanceSortedMarkers: 168 markerObject.MoveToFront() 169 170 if self.stackMarkers: 171 markersSorted = sorted(stack_markers) 172 isOverlapping, isOverlapped = FindOverlaps(markersSorted) 173 for sortOrderValue, (bound, markerObject) in reversed(markersSorted): 174 markerID = markerObject.markerID 175 if markerID in isOverlapping: 176 markerObject.RegisterOverlapMarkers(isOverlapping[markerID]) 177 elif markerID in isOverlapped: 178 markerObject.SetOverlappedState(True) 179 else: 180 markerObject.SetOverlappedState(False) 181 182 if len(self.groupedMarkers) > 0: 183 zoomLevel = self.cameraZoomValue 184 groupedMarkers = GetMarkerGroupsForZoomLevel(self.groupedMarkers, zoomLevel) 185 needsUpdates = len(groupedMarkers) != len(self.activeGroups) 186 if not needsUpdates: 187 for group in self.activeGroups: 188 groupID = group.GetGroupID() 189 if groupID not in groupedMarkers: 190 needsUpdates = True 191 break 192 193 if needsUpdates or forceUpdateGroupings: 194 for oldGroupMarker in self.activeGroups: 195 for marker in oldGroupMarker.members: 196 marker.SetGroupingID(None) 197 198 oldGroupMarker.Close() 199 self.RemoveMarker(oldGroupMarker.markerID) 200 201 self.activeGroups.clear() 202 for groupID, groupInfo in groupedMarkers.items(): 203 centroid = groupInfo['centroid'] 204 markers = groupInfo['markers'] 205 itemID = groupInfo['itemID'] 206 for marker in markers: 207 marker.SetGroupingID(groupID) 208 209 if len(markers) <= 1: 210 continue 211 markerID = (mapViewConst.MARKERID_GROUP, itemID) 212 groupMarker = self._AddPositionMarker(markerID=markerID, groupID=groupID, position=centroid, members=markers, markerClass=MarkerGroup, hintFormat=markers[0].GetGroupingHintFormat(), isAbstractMode=self.isAbstractMode) 213 self.activeGroups.add(groupMarker) 214 215 if len(self.removedGroups): 216 for removedGroup in self.removedGroups: 217 if removedGroup in self.activeGroups: 218 self.activeGroups.remove(removedGroup) 219 220 self.removedGroups.clear() 221 self.isUpdating = False 222 223 def OnNewState(self, state): 224 self.UpdateGateMarkerYellowIfNextJump() 225 226 def OnDestinationSet(self, *args): 227 self.UpdateGateMarkerYellowIfNextJump() 228 229 def UpdateGateMarkerYellowIfNextJump(self): 230 bp = sm.GetService('michelle').GetBallpark() 231 if not bp or not self.projectBrackets: 232 return 233 for marker in self.projectBrackets.values(): 234 if not marker.typeID: 235 continue 236 if self.IsStargate(marker.typeID): 237 destinationPath = sm.GetService('starmap').GetDestinationPath() 238 slimItem = bp.slimItems.get(marker.itemID, None) 239 if slimItem: 240 jumpToLocationID = slimItem.jumps[0].locationID 241 if destinationPath and jumpToLocationID == destinationPath[0]: 242 iconColor = OVERVIEW_AUTO_PILOT_DESTINATION_COLOR 243 else: 244 iconColor = Color.WHITE 245 marker.SetIconColor(iconColor) 246 247 def OnSecurityModified(self, solar_system_id, modifier_amount, new_security): 248 marker = self.GetMarkerByID(solar_system_id) 249 if marker is not None: 250 marker.UpdateLabelText() 251 252 def IsStargate(self, typeID): 253 return evetypes.GetGroupID(typeID) == const.groupStargate 254 255 def UpdateDscanHilite(self, direction, egoPos): 256 egoPos = MapPosToSolarSystemPos(egoPos) 257 range = GetScanRangeInMeters() 258 angle = GetScanAngle() 259 for marker in self.projectBrackets.values(): 260 pos = marker.GetDisplayPosition() 261 if pos == egoPos: 262 continue 263 pos = MapPosToSolarSystemPos(pos) 264 if not marker.IsPartialResult() and IsWithinScanShape(pos, egoPos, angle, range, direction): 265 marker.ShowDscanHilite() 266 else: 267 marker.HideDscanHilite() 268 269 def HideAllDscanHilite(self): 270 for marker in self.projectBrackets.values(): 271 marker.HideDscanHilite() 272 273 def OnDirectionalScanStarted(self): 274 if not self.projectBrackets: 275 return 276 for marker in self.projectBrackets.values(): 277 if marker.IsDscanHiliteShown(): 278 marker.AnimBlinkDscanHilite() 279 280 def OnDirectionalScannerShowCone(self, isShown): 281 if not isShown: 282 self.HideAllDscanHilite() 283 284 def GetExtraMouseOverInfoForMarker(self, markerID): 285 if self.mapView: 286 return self.mapView.GetExtraMouseOverInfoForItemID(markerID) 287 288 def ReloadAll(self): 289 for markerID, markerObject in self.projectBrackets.iteritems(): 290 if markerObject: 291 markerObject.Reload() 292 293 def ReloadAllAbstractBrackets(self, isAbstractMode = False): 294 self.isAbstractMode = isAbstractMode 295 for markerID, markerObject in self.projectBrackets.iteritems(): 296 if hasattr(markerObject, 'ResetAbstractMode'): 297 markerObject.ResetAbstractMode(isAbstractMode) 298 299 def _IsSolarSystemMarker(self, markerObject): 300 return markerObject and isinstance(markerObject, MarkerLabelSolarSystem) 301 302 def _IsGroupMaker(self, markerObject): 303 return markerObject and isinstance(markerObject, MarkerGroup) 304 305 def SetDisplayStateOverrideFilter(self, markersToShow): 306 filtering = bool(markersToShow) 307 for markerID, markerObject in self.projectBrackets.iteritems(): 308 if IsDynamicMarkerType(markerObject.markerID): 309 continue 310 if not filtering or markerID in markersToShow: 311 markerObject.displayStateOverride = None 312 else: 313 markerObject.displayStateOverride = False 314 315 def SetDisplayStateOverrideFilterFalseForSystems(self): 316 for markerID, markerObject in self.projectBrackets.iteritems(): 317 if self._IsSolarSystemMarker(markerObject): 318 markerObject.displayStateOverride = False 319 320 def UpdateMarkerPositions(self, changedSolarSystemPositions): 321 for markerID, markerObject in self.projectBrackets.iteritems(): 322 if hasattr(markerObject, 'UpdateSolarSystemPosition') and markerObject.solarSystemID in changedSolarSystemPositions: 323 mapNode = changedSolarSystemPositions[markerObject.solarSystemID] 324 markerObject.UpdateSolarSystemPosition(mapNode.position) 325 326 def UpdateRegionMarkerPositions(self, newPosByRegionID): 327 for regionID, coordinates in newPosByRegionID.iteritems(): 328 markerObject = self.projectBrackets.get(regionID, None) 329 if not markerObject: 330 continue 331 if hasattr(markerObject, 'UpdateRegionPosition'): 332 markerObject.UpdateRegionPosition(coordinates) 333 334 def UpdateConstellationMarkerPositions(self, newPosByConstellationID): 335 for constellationID, coordinates in newPosByConstellationID.iteritems(): 336 markerObject = self.projectBrackets.get(constellationID, None) 337 if not markerObject: 338 continue 339 if hasattr(markerObject, 'UpdateConstellationPosition'): 340 markerObject.UpdateConstellationPosition(coordinates) 341 342 def UpdateMarkerTransitionState(self, markerIDs, isTransitioning): 343 for markerID in markerIDs: 344 markerObject = self.projectBrackets.get(markerID, None) 345 if not markerObject: 346 continue 347 if getattr(markerObject, 'SetMapTransitioning', None): 348 markerObject.SetMapTransitioning(isTransitioning) 349 350 def UpdateLandmarkMarkerPositions(self, newPosByLandmarkID): 351 for landmarkID, coordinates in newPosByLandmarkID.iteritems(): 352 markerObject = self.projectBrackets.get(landmarkID, None) 353 if not markerObject: 354 continue 355 if hasattr(markerObject, 'UpdateLandmarkPosition'): 356 markerObject.UpdateLandmarkPosition(coordinates) 357 358 def StopHandler(self): 359 self.updateTimer = None 360 if self.projectBrackets: 361 for markerID, markerObject in self.projectBrackets.iteritems(): 362 markerObject.Close() 363 364 self.projectBrackets = None 365 self.mapView = None 366 self.markerLayer = None 367 self.markerCurveSet = None 368 self.eventHandler = None 369 if self.pendingAbstractUpdater: 370 self.pendingAbstractUpdater.Kill() 371 self.pendingAbstractUpdater = None 372 373 def OnMarkerMouseEnter(self, marker): 374 self.mapView.OnMarkerHovered(marker.markerID) 375 376 def OnMarkerMouseExit(self, marker): 377 self.mapView.OnMarkerHovered(None) 378 379 def OnMarkerSelected(self, marker): 380 self.isRegionSelected = marker and idCheckers.IsRegion(marker.markerID) 381 self.mapView.SetSelectedMarker(marker) 382 383 def HilightMarkers(self, markerIDs, add = False): 384 hilightMarkers = markerIDs 385 if not add: 386 for oldMarkerID in self.hilightMarkers: 387 if oldMarkerID not in hilightMarkers: 388 oldMarker = self.GetMarkerByID(oldMarkerID) 389 if oldMarker: 390 oldMarker.SetHilightState(False) 391 392 for newMarkerID in hilightMarkers: 393 newMarker = self.GetMarkerByID(newMarkerID) 394 if newMarker: 395 newMarker.SetHilightState(True) 396 397 if add: 398 self.hilightMarkers = self.hilightMarkers.union(set(hilightMarkers)) 399 else: 400 self.hilightMarkers = set(hilightMarkers) 401 402 def SetPreviewBubbleMarkers(self, markerIDsSet): 403 if markerIDsSet: 404 noLongerVisible = self.previewBubbleMarkerIDs.difference(markerIDsSet) 405 newTubeBubbles = markerIDsSet.difference(self.previewBubbleMarkerIDs) 406 else: 407 noLongerVisible = self.previewBubbleMarkerIDs 408 newTubeBubbles = set() 409 self.previewBubbleMarkerIDs = set(markerIDsSet) if markerIDsSet else set() 410 for oldMarkerID in noLongerVisible: 411 oldMarker = self.GetMarkerByID(oldMarkerID) 412 if oldMarker: 413 oldMarker.SetPreviewState(False) 414 415 for newMarkerID in newTubeBubbles: 416 newMarker = self.GetMarkerByID(newMarkerID) 417 if newMarker: 418 newMarker.SetPreviewState(True) 419 420 def UpdateMarkerState(self, markerIDs, selectedMarkerIDs = None): 421 for oldMarkerID in self.activeMarkers: 422 if oldMarkerID not in markerIDs: 423 oldMarker = self.GetMarkerByID(oldMarkerID) 424 if oldMarker: 425 oldMarker.SetActiveState(mapViewConst.MARKER_INACTIVE) 426 427 for newMarkerID in markerIDs: 428 newMarker = self.GetMarkerByID(newMarkerID) 429 if newMarker: 430 if newMarkerID in selectedMarkerIDs: 431 newMarker.SetActiveState(mapViewConst.MARKER_SELECTED) 432 else: 433 newMarker.SetActiveState(mapViewConst.MARKER_ACTIVE) 434 435 self.selectedMarkerIDs = set(selectedMarkerIDs) 436 self.activeMarkers = set(markerIDs) 437 438 def RefreshActiveAndHilightedMarkers(self): 439 for marker in self.GetActiveAndHilightedMarkers(): 440 marker.UpdateActiveAndHilightState() 441 442 def GetActiveAndHilightedMarkers(self): 443 ret = set() 444 for markerID in self.hilightMarkers.union(self.activeMarkers): 445 marker = self.GetMarkerByID(markerID) 446 if marker: 447 ret.add(marker) 448 449 return ret 450 451 def GetMarkerState(self, markerID): 452 if markerID in self.selectedMarkerIDs: 453 return mapViewConst.MARKER_SELECTED 454 elif markerID in self.activeMarkers: 455 return mapViewConst.MARKER_ACTIVE 456 else: 457 return mapViewConst.MARKER_INACTIVE 458 459 def IsActiveOrHilighted(self, markerID): 460 return markerID in self.activeMarkers or markerID in self.hilightMarkers 461 462 def IsHilighted(self, markerID): 463 return markerID in self.hilightMarkers 464 465 def IsSelected(self, markerID): 466 return markerID in self.selectedMarkerIDs 467 468 def IsRegionSelected(self): 469 return self.isRegionSelected 470 471 def RemoveMarker(self, markerID, fadeOut = False): 472 try: 473 self.overlapMarkers.remove(markerID) 474 except: 475 pass 476 477 try: 478 self.distanceSortedMarkers.remove(markerID) 479 except: 480 pass 481 482 markerObject = self.projectBrackets.pop(markerID, None) 483 if markerObject: 484 if markerObject.isGrouped: 485 currentGroupID = markerObject.GetCurrentGroupID() 486 if currentGroupID: 487 emptyGroups = [] 488 for groupMarker in self.activeGroups: 489 if groupMarker.GetGroupID() == currentGroupID: 490 groupMarker.RemoveMember(markerObject) 491 if len(groupMarker.members) == 1: 492 lastMember = groupMarker.members[0] 493 lastMember.SetGroupingID(None) 494 emptyGroups.append(groupMarker) 495 496 for emptyGroup in emptyGroups: 497 emptyGroup.Close() 498 self.RemoveMarker(emptyGroup.markerID) 499 self.removedGroups.add(emptyGroup) 500 501 try: 502 self.groupedMarkers.remove(markerObject) 503 except: 504 pass 505 506 if fadeOut: 507 markerObject.FadeOutAndClose() 508 else: 509 markerObject.Close() 510 511 def RemoveMarkersByType(self, markerType): 512 markers = self.GetMarkersByType(markerType) 513 markerIDs = set([ markerObject.markerID for markerObject in markers ]) 514 for markerID in markerIDs: 515 self.RemoveMarker(markerID) 516 517 def GetMarkerByID(self, markerID): 518 return self.projectBrackets.get(markerID, None) 519 520 def GetMarkersByType(self, markerType): 521 return [ markerObject for markerID, markerObject in self.projectBrackets.iteritems() if isinstance(markerID, tuple) and markerID[0] == markerType ] 522 523 def _AddPositionMarker(self, **kwds): 524 markerID = kwds.get('markerID', None) 525 if self.projectBrackets is not None and markerID in self.projectBrackets: 526 return self.projectBrackets[markerID] 527 if 'parentContainer' not in kwds: 528 kwds['parentContainer'] = self.markerLayer 529 kwds['curveSet'] = self.markerCurveSet 530 kwds['markerHandler'] = self 531 kwds['eventHandler'] = self.eventHandler 532 markerClass = kwds.get('markerClass', None) 533 markerObject = markerClass(**kwds) 534 if self.projectBrackets is not None: 535 self.projectBrackets[markerID] = markerObject 536 markerObject.SetActiveState(self.GetMarkerState(markerID)) 537 if markerObject.isGrouped: 538 self.groupedMarkers.add(markerObject) 539 return markerObject 540 541 def RegisterMarker(self, markerObject): 542 self.projectBrackets[markerObject.markerID] = markerObject 543 544 def AddSolarSystemMarker(self, markerID, position, **kwds): 545 return self.AddSolarSystemBasedMarker(markerID=markerID, solarSystemID=markerID, mapPositionSolarSystem=position, mapPositionLocal=(0, 0, 0), markerClass=MarkerLabelSolarSystem, **kwds) 546 547 def AddConstellationMarker(self, markerID, position, **kwds): 548 return self._AddPositionMarker(markerID=markerID, position=position, markerClass=MarkerLabelConstellation, **kwds) 549 550 def AddRegionMarker(self, markerID, position, **kwds): 551 return self._AddPositionMarker(markerID=markerID, position=position, markerClass=MarkerLabelRegion, **kwds) 552 553 def AddLandmarkMarker(self, markerID, position, **kwds): 554 return self._AddPositionMarker(markerID=markerID, position=position, markerClass=MarkerLabelLandmark, **kwds) 555 556 def AddSolarSystemBasedMarker(self, markerID, markerClass, **kwds): 557 if getattr(markerClass, 'distanceSortEnabled', False): 558 self.distanceSortedMarkers.add(markerID) 559 if getattr(markerClass, 'overlapEnabled', False): 560 self.overlapMarkers.add(markerID) 561 position = geo2.Vec3Add(kwds['mapPositionSolarSystem'], kwds['mapPositionLocal']) 562 return self._AddPositionMarker(markerID=markerID, position=position, markerClass=markerClass, **kwds) 563 564 def RegisterCameraTranslationFromParent(self, cameraTranslationFromParent): 565 self.cameraTranslationFromParent = cameraTranslationFromParent 566 567 def RegisterCameraZoomValue(self, cameraZoomValue): 568 self.cameraZoomValue = cameraZoomValue 569 570 def RegisterCameraProjectionFov(self, value): 571 self.cameraProjectionFovConst = value 572 573 def GetViewportValues(self): 574 return (self.cameraZoomValue, 575 self.cameraProjectionFovConst, 576 self.mapView.camera.viewport.width, 577 self.mapView.camera.viewport.height) 578 579 def UpdateMarkersWithFilters(self, activeFilter): 580 if activeFilter is None: 581 return 582 amountFmtFunc = activeFilter.GetAmountFmtFunc() 583 for markerID, markerObject in self.projectBrackets.iteritems(): 584 if self._IsSolarSystemMarker(markerObject): 585 filterInfo = FilterInfo(activeFilter.GetStarColor(markerID), activeFilter.GetAmountForSolarSystem(markerID), activeFilter.GetTexturePathForSolarSystem(markerID), activeFilter.GetTextureColorForSolarSystem(markerID), amountFmtFunc) 586 markerObject.UpdateFilterInfo(filterInfo)