NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

systemMapHandler.py (27372B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\systemMapHandler.py
      2 import eveui
      3 from carbon.common.script.util.format import FmtDist, FmtAmt
      4 from carbonui.primitives.layoutGrid import LayoutGrid
      5 from eve.client.script.environment.spaceObject.planet import Planet
      6 from eve.client.script.ui.control.eveLabel import EveLabelLarge, EveLabelMedium
      7 from eve.client.script.ui.inflight.scannerFiles.directionalScanHandler import MapViewDirectionalScanHandler
      8 from eve.client.script.ui.inflight.scannerFiles.directionalScanUtil import IsDscanConeShown
      9 from eve.client.script.ui.shared.mapView import mapViewUtil
     10 import eve.client.script.ui.shared.mapView.mapViewConst as mapViewConst
     11 from eve.client.script.ui.shared.mapView.mapViewConst import MARKERID_SOLARSYSTEM_CELESTIAL, VIEWMODE_MARKERS_SETTINGS, MARKERID_PROBE
     12 from eve.client.script.ui.shared.mapView.markers.mapMarkerCelestial import MarkerSpaceObject
     13 from eve.client.script.ui.shared.mapView.markers.mapMarkerProbe import MarkerProbe
     14 from eve.client.script.ui.shared.mapView.mapViewSettings import GetMapViewSetting
     15 from eve.client.script.ui.shared.mapView.mapViewUtil import SolarSystemPosToMapPos, ScaleSolarSystemValue
     16 from eve.client.script.ui.shared.maps.label import TransformableLabel
     17 from eve.common.lib import appConst as const
     18 from eve.common.script.sys.idCheckers import IsTriglavianSystem
     19 from eve.common.script.util.eveFormat import FmtSystemSecStatus
     20 from fsdBuiltData.common.graphicIDs import GetGraphicFile
     21 from localization import GetByLabel
     22 import trinity
     23 import uthread
     24 import evegraphics.settings as gfxsettings
     25 import geo2
     26 import math
     27 import weakref
     28 import inventorycommon.typeHelpers
     29 from carbonui.uicore import uicore
     30 PLANET_TEXTURE_SIZE = 512
     31 
     32 class SystemMapHandler(object):
     33     scene = None
     34     probeHandler = None
     35     directionalScanHandler = None
     36     localMarkerIDs = None
     37     cameraTranslationFromParent = None
     38     solarSystemRadius = None
     39     sunID = None
     40     rangeIndicator = None
     41     _mapView = None
     42 
     43     def __init__(self, mapView, solarsystemID, scaling = 1.0, position = None, loadBookmarks = True):
     44         if mapView:
     45             self.mapView = mapView
     46             self.scene = mapView.scene
     47         self.solarsystemID = solarsystemID
     48         self.scaling = scaling
     49         self.systemMapSvc = sm.GetService('systemmap')
     50         self.loadBookmarks = loadBookmarks
     51         self.localMarkerIDs = set()
     52         self._closed = False
     53         parent = trinity.EveTransform()
     54         parent.name = 'solarsystem_%s' % solarsystemID
     55         self.systemMapTransform = parent
     56         if mapView:
     57             mapView.mapRoot.children.append(self.systemMapTransform)
     58         if position:
     59             self.SetPosition(position)
     60 
     61     def Close(self):
     62         self._closed = True
     63         if self.scene:
     64             self._RemoveAllMarkers()
     65             uthread.new(self._AnimClose)
     66         else:
     67             self.RemoveFromScene()
     68 
     69     def _AnimClose(self):
     70         uicore.animations.MorphVector3(self.systemMapTransform, 'scaling', self.systemMapTransform.scaling, (0.0, 0.0, 0.0), duration=0.5, sleep=True)
     71         self.RemoveFromScene()
     72 
     73     def RemoveFromScene(self):
     74         mapView = self.mapView
     75         self._RemoveAllMarkers()
     76         self.StopProbeHandler()
     77         self.StopDirectionalScanHandler()
     78         if mapView and mapView.mapRoot and self.systemMapTransform in mapView.mapRoot.children:
     79             mapView.mapRoot.children.remove(self.systemMapTransform)
     80         self.systemMapTransform = None
     81         self.scene = None
     82         self.localMarkerIDs = None
     83 
     84     def _RemoveAllMarkers(self):
     85         if self.mapView and self.mapView.markersHandler and self.localMarkerIDs:
     86             for markerID in self.localMarkerIDs:
     87                 self.mapView.markersHandler.RemoveMarker(markerID)
     88 
     89         self.localMarkerIDs = set()
     90 
     91     def OnCameraUpdate(self):
     92         if self.directionalScanHandler:
     93             self.directionalScanHandler.OnCameraUpdate()
     94         if self.directionalScanHandler and IsDscanConeShown():
     95             direction = self.directionalScanHandler.GetConeDirection()
     96             egoPos = self.mapView.GetEgoPosition()
     97             self.markersHandler.UpdateDscanHilite(direction, egoPos)
     98 
     99     def EnableProbeHandlerStandalone(self):
    100         if self.probeHandler:
    101             return
    102         self.StopProbeHandler()
    103         from eve.client.script.ui.shared.mapView.mapViewProbeHandlerStandalone import MapViewProbeHandlerStandalone
    104         self.probeHandler = MapViewProbeHandlerStandalone(self)
    105         self.LoadProbeMarkers()
    106 
    107     def StopProbeHandler(self):
    108         if self.probeHandler:
    109             self.probeHandler.StopHandler()
    110         self.probeHandler = None
    111 
    112     def EnableDirectionalScanHandler(self):
    113         if self.directionalScanHandler:
    114             return
    115         self.StopDirectionalScanHandler()
    116         self.directionalScanHandler = MapViewDirectionalScanHandler(self)
    117 
    118     def StopDirectionalScanHandler(self):
    119         if self.directionalScanHandler:
    120             self.directionalScanHandler.StopHandler()
    121         if self.markersHandler:
    122             self.markersHandler.HideAllDscanHilite()
    123         self.directionalScanHandler = None
    124 
    125     @apply
    126     def mapView():
    127 
    128         def fget(self):
    129             if self._mapView:
    130                 return self._mapView()
    131 
    132         def fset(self, value):
    133             if value:
    134                 self._mapView = weakref.ref(value)
    135             else:
    136                 self._mapView = None
    137 
    138         return property(**locals())
    139 
    140     @apply
    141     def markersHandler():
    142 
    143         def fget(self):
    144             mapView = self.mapView
    145             if mapView:
    146                 return mapView.markersHandler
    147 
    148         def fset(self, value):
    149             pass
    150 
    151         return property(**locals())
    152 
    153     @apply
    154     def bookmarkHandler():
    155 
    156         def fget(self):
    157             mapView = self.mapView
    158             if mapView:
    159                 return mapView.bookmarkHandler
    160 
    161         def fset(self, value):
    162             pass
    163 
    164         return property(**locals())
    165 
    166     def RegisterCameraTranslationFromParent(self, cameraTranslationFromParent):
    167         self.cameraTranslationFromParent = cameraTranslationFromParent
    168         if self.probeHandler and self.solarSystemRadius:
    169             radius = ScaleSolarSystemValue(self.solarSystemRadius)
    170             camangle = 0.5
    171             translationFromParent = radius / math.sin(camangle) * math.cos(camangle) * 16
    172             if cameraTranslationFromParent > translationFromParent:
    173                 self.probeHandler.Hide()
    174             else:
    175                 self.probeHandler.Show()
    176 
    177     def SetPosition(self, position):
    178         self.position = position
    179         if self.systemMapTransform:
    180             self.systemMapTransform.translation = self.position
    181 
    182     def LoadCelestials(self):
    183         uthread.new(self._LoadCelestials)
    184         groups, solarsystemData = self.systemMapSvc.GetSolarsystemHierarchy(self.solarsystemID)
    185         for transform in self.systemMapTransform.children:
    186             try:
    187                 itemID = int(transform.name)
    188                 itemData = solarsystemData[itemID]
    189             except:
    190                 continue
    191 
    192             if itemData.groupID == const.groupPlanet:
    193                 planetTransform = self.LoadPlanet(itemData.typeID, itemID)
    194                 scaling = self.scaling * 1.0 / mapViewConst.SOLARSYSTEM_SCALE
    195                 planetTransform.scaling = (scaling, scaling, scaling)
    196                 planetTransform.translation = transform.translation
    197 
    198     def ShowRangeIndicator(self):
    199         self.LoadRangeIndicator()
    200 
    201     def HideRangeIndicator(self):
    202         if self.rangeIndicator:
    203             uicore.animations.MorphVector3(self.rangeIndicator.rootTransform, 'scaling', startVal=self.rangeIndicator.rootTransform.scaling, endVal=(0, 0, 0), duration=0.2, callback=self._RemoveRangeIndicator)
    204 
    205     def _RemoveRangeIndicator(self):
    206         if self.rangeIndicator and self.rangeIndicator.rootTransform in self.systemMapTransform.children:
    207             self.rangeIndicator.systemMapTransform.children.remove(self.rangeIndicator.rootTransform)
    208         self.rangeIndicator = None
    209 
    210     def LoadRangeIndicator(self):
    211         self.HideRangeIndicator()
    212         rangeIndicator = RangeIndicator(self.systemMapTransform, contextScaling=1.0 / const.AU)
    213         uicore.animations.MorphVector3(rangeIndicator.rootTransform, 'scaling', startVal=(0, 0, 0), endVal=(const.AU, const.AU, const.AU), duration=0.4)
    214         self.rangeIndicator = rangeIndicator
    215         self.SetupMyPositionTracker(rangeIndicator.rootTransform)
    216 
    217     def LoadPlanet(self, planetTypeID, planetID):
    218         planet = Planet()
    219         graphicFile = inventorycommon.typeHelpers.GetGraphicFile(planetTypeID)
    220         planet.typeData['graphicFile'] = graphicFile
    221         planet.typeID = planetTypeID
    222         planet.LoadPlanet(planetID, forPhotoService=True, rotate=False, hiTextures=True)
    223         if planet.model is None or planet.model.highDetail is None:
    224             return
    225         planetTransform = trinity.EveTransform()
    226         planetTransform.name = 'planet'
    227         planetTransform.children.append(planet.model.highDetail)
    228         planet.SetEffectParameters()
    229         trinity.WaitForResourceLoads()
    230         for t in planet.model.highDetail.children:
    231             if t.mesh is not None:
    232                 if len(t.mesh.transparentAreas) > 0:
    233                     t.sortValueMultiplier = 2.0
    234 
    235         self.systemMapTransform.children.append(planetTransform)
    236         return planetTransform
    237 
    238     def LoadSolarSystemMap(self):
    239         self.maxRadius = 0.0
    240         solarsystemID = self.solarsystemID
    241         solarSystemData = self.systemMapSvc.GetSolarsystemData(solarsystemID)
    242         planets = []
    243         childrenToParentByID = {}
    244         sunID = None
    245         maxRadius = 0.0
    246         for celestialObject in solarSystemData:
    247             if celestialObject.groupID == const.groupPlanet:
    248                 planets.append((celestialObject.itemID, geo2.Vector(celestialObject.x, celestialObject.y, celestialObject.z)))
    249                 maxRadius = max(maxRadius, geo2.Vec3Length((celestialObject.x, celestialObject.y, celestialObject.z)))
    250             elif celestialObject.groupID == const.groupSun:
    251                 sunID = celestialObject.itemID
    252                 sunGraphicFilePath = GetGraphicFile(cfg.mapSystemCache[solarsystemID].sunFlareGraphicID)
    253                 sunGraphicFile = trinity.Load(sunGraphicFilePath)
    254                 self.CreateSun(sunGraphicFile)
    255 
    256         self.sunID = sunID
    257         objectPositions = {}
    258         for each in solarSystemData:
    259             objectPositions[each.itemID] = (each.x, each.y, each.z)
    260             if each.groupID in (const.groupPlanet, const.groupStargate):
    261                 childrenToParentByID[each.itemID] = sunID
    262                 continue
    263             closest = []
    264             eachPosition = geo2.Vector(each.x, each.y, each.z)
    265             maxRadius = max(maxRadius, geo2.Vec3Length(eachPosition))
    266             for planetID, planetPos in planets:
    267                 diffPos = planetPos - eachPosition
    268                 diffVector = geo2.Vec3Length(diffPos)
    269                 closest.append((diffVector, planetID))
    270 
    271             if closest:
    272                 closest.sort()
    273                 childrenToParentByID[each.itemID] = closest[0][1]
    274 
    275         self.maxRadius = maxRadius
    276         for each in solarSystemData:
    277             if each.itemID == each.locationID:
    278                 continue
    279             if each.groupID == const.groupSecondarySun:
    280                 continue
    281             if each.groupID == const.groupPlanet:
    282                 self.CreatePlanet((each.x, each.y, each.z), each.itemID)
    283                 OrbitCircle(each.itemID, (each.x, each.y, each.z), objectPositions[sunID], self.systemMapTransform)
    284             elif each.groupID == const.groupMoon:
    285                 parentID = childrenToParentByID.get(each.itemID, None)
    286                 if parentID:
    287                     self.CreatePlanet((each.x, each.y, each.z), each.itemID)
    288                     OrbitCircle(each.itemID, (each.x, each.y, each.z), objectPositions[parentID], self.systemMapTransform)
    289 
    290         self.solarSystemRadius = maxRadius
    291         cfg.evelocations.Prime(objectPositions.keys(), 0)
    292 
    293     def CreatePlanet(self, planetPosition, itemID = None):
    294         scaling = 0.01 / mapViewConst.SOLARSYSTEM_SCALE
    295         planetTransform = trinity.EveTransform()
    296         planetTransform.name = str(itemID) or 'planetTransform'
    297         planetTransform.scaling = (scaling, scaling, scaling)
    298         planetTransform.translation = planetPosition
    299         self.systemMapTransform.children.append(planetTransform)
    300         planetTransform.useDistanceBasedScale = True
    301         planetTransform.distanceBasedScaleArg1 = 1.0
    302         planetTransform.distanceBasedScaleArg2 = 0.0
    303         planetTransform.mesh = trinity.Tr2Mesh()
    304         planetTransform.mesh.geometryResPath = 'res:/Model/Global/zsprite.gr2'
    305         planetTransform.modifier = 1
    306         area = trinity.Tr2MeshArea()
    307         planetTransform.mesh.additiveAreas.append(area)
    308         effect = trinity.Tr2Effect()
    309         effect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
    310         area.effect = effect
    311         diffuseColor = trinity.Tr2Vector4Parameter()
    312         diffuseColor.name = 'DiffuseColor'
    313         effect.parameters.append(diffuseColor)
    314         diffuseMap = trinity.TriTextureParameter()
    315         diffuseMap.name = 'DiffuseMap'
    316         diffuseMap.resourcePath = 'res:/UI/Texture/Classes/MapView/spotSprite.dds'
    317         effect.resources.append(diffuseMap)
    318 
    319     def CreateSun(self, sunGraphic):
    320 
    321         def GetEffectParameter(effect, parameterName):
    322             for paramName, value in effect.constParameters:
    323                 if paramName == parameterName:
    324                     return value
    325 
    326             for parameter in effect.parameters:
    327                 if parameter.name == parameterName:
    328                     return parameter.value
    329 
    330         if not self.systemMapTransform:
    331             return
    332         scaling = 1.0 / mapViewConst.SOLARSYSTEM_SCALE * 5
    333         sunTransform = trinity.EveTransform()
    334         sunTransform.name = 'Sun'
    335         sunTransform.scaling = (scaling, scaling, scaling)
    336         self.systemMapTransform.children.append(sunTransform)
    337         ignoredSunMeshAreas = ['flare', 'rainbow', 'tg_added']
    338         triglavianSystem = IsTriglavianSystem(self.solarsystemID)
    339         for each in sunGraphic.mesh.additiveAreas:
    340             onIgnoreList = any([ areaName in each.name.lower() for areaName in ignoredSunMeshAreas ])
    341             if not each.display or onIgnoreList:
    342                 continue
    343             scale = GetEffectParameter(each.effect, 'Size')
    344             if scale is None:
    345                 continue
    346             if triglavianSystem:
    347                 color = mapViewConst.TRIGLAVIAN_SUN_FLARE_COLOR
    348             else:
    349                 color = GetEffectParameter(each.effect, 'Color')
    350             if color is None:
    351                 continue
    352             textureParameter = each.effect.resources.FindByName('TexMap')
    353             if textureParameter is None:
    354                 continue
    355             transform = trinity.EveTransform()
    356             transform.scaling = (scale[0], scale[1], scale[2])
    357             transform.mesh = trinity.Tr2Mesh()
    358             transform.mesh.geometryResPath = 'res:/Model/Global/zsprite.gr2'
    359             transform.modifier = 1
    360             transform.name = each.name
    361             area = trinity.Tr2MeshArea()
    362             transform.mesh.additiveAreas.append(area)
    363             effect = trinity.Tr2Effect()
    364             effect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
    365             area.effect = effect
    366             diffuseColor = trinity.Tr2Vector4Parameter()
    367             diffuseColor.name = 'DiffuseColor'
    368             diffuseColor.value = color
    369             effect.parameters.append(diffuseColor)
    370             diffuseMap = trinity.TriTextureParameter()
    371             diffuseMap.name = 'DiffuseMap'
    372             diffuseMap.resourcePath = textureParameter.resourcePath
    373             effect.resources.append(diffuseMap)
    374             sunTransform.children.append(transform)
    375 
    376     def LoadMarkers(self, showChanges = False):
    377         mapView = self.mapView
    378         if not mapView or not mapView.markersHandler:
    379             return
    380         loadedCelestialMarkers = set()
    381         loadMarkerGroups = GetMapViewSetting(VIEWMODE_MARKERS_SETTINGS, mapView.mapViewID)
    382         if self.solarsystemID == session.solarsystemid:
    383             ballpark = sm.GetService('michelle').GetBallpark()
    384             if ballpark:
    385                 for itemID, ball in ballpark.balls.iteritems():
    386                     if ballpark is None:
    387                         break
    388                     slimItem = ballpark.GetInvItem(itemID)
    389                     if not slimItem:
    390                         continue
    391                     markerID = (MARKERID_SOLARSYSTEM_CELESTIAL, slimItem.itemID)
    392                     if slimItem.groupID in loadMarkerGroups:
    393                         pos = SolarSystemPosToMapPos((ball.x, ball.y, ball.z))
    394                         pos = geo2.Vec3ScaleD(pos, self.scaling)
    395                         mapView.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerSpaceObject, celestialData=slimItem, solarSystemID=self.solarsystemID, highlightOnLoad=showChanges, mapPositionLocal=pos, mapPositionSolarSystem=self.position, distanceFadeAlphaNearFar=None)
    396                         loadedCelestialMarkers.add(markerID)
    397 
    398         solarSystemData = self.systemMapSvc.GetSolarsystemData(self.solarsystemID)
    399         for each in solarSystemData:
    400             markerID = (MARKERID_SOLARSYSTEM_CELESTIAL, each.itemID)
    401             if markerID in loadedCelestialMarkers:
    402                 continue
    403             if each.groupID in loadMarkerGroups:
    404                 pos = SolarSystemPosToMapPos((each.x, each.y, each.z))
    405                 pos = geo2.Vec3ScaleD(pos, self.scaling)
    406                 mapView.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerSpaceObject, celestialData=each, solarSystemID=self.solarsystemID, highlightOnLoad=showChanges, mapPositionLocal=pos, mapPositionSolarSystem=self.position, distanceFadeAlphaNearFar=None)
    407                 loadedCelestialMarkers.add(markerID)
    408 
    409         for markerID in self.localMarkerIDs.copy():
    410             if markerID[0] != MARKERID_SOLARSYSTEM_CELESTIAL:
    411                 continue
    412             if markerID not in loadedCelestialMarkers:
    413                 mapView.markersHandler.RemoveMarker(markerID, fadeOut=showChanges)
    414                 self.localMarkerIDs.remove(markerID)
    415 
    416         self.localMarkerIDs.update(loadedCelestialMarkers)
    417         mapView.markersHandler.UpdateGateMarkerYellowIfNextJump()
    418         self.LoadProbeMarkers()
    419         if self.loadBookmarks:
    420             uthread.new(self.LoadBookmarkMarkers, showChanges)
    421 
    422     def GetMarkerIDs(self):
    423         return self.localMarkerIDs or set()
    424 
    425     def GetProbeMarkerIDs(self):
    426         return [ markerID for markerID in self.localMarkerIDs if markerID[0] == MARKERID_PROBE ]
    427 
    428     def LoadBookmarkMarkers(self, showChanges = False):
    429         if self.bookmarkHandler:
    430             loadedMarkerIDs = self.bookmarkHandler.LoadBookmarkMarkers(loadSolarSystemID=self.solarsystemID, showChanges=showChanges)
    431             self.localMarkerIDs = self.localMarkerIDs.union(loadedMarkerIDs)
    432 
    433     def LoadProbeMarkers(self, *args):
    434         if not self.probeHandler or self.mapView:
    435             return
    436         currentProbeMarkers = self.GetProbeMarkerIDs()
    437         scanSvc = sm.GetService('scanSvc')
    438         probes = scanSvc.GetProbeData()
    439         loadMarkerGroups = GetMapViewSetting(VIEWMODE_MARKERS_SETTINGS, self.mapView.mapViewID)
    440         showProbes = const.groupScannerProbe in loadMarkerGroups
    441         if showProbes and probes is not None and len(probes) > 0:
    442             for probe in probes.itervalues():
    443                 markerID = (MARKERID_PROBE, probe.probeID)
    444                 markerObject = self.mapView.markersHandler.GetMarkerByID(markerID)
    445                 if markerObject:
    446                     markerObject.UpdateMapPositionLocal(SolarSystemPosToMapPos(probe.pos), animate=True)
    447                 else:
    448                     self.mapView.markersHandler.AddSolarSystemBasedMarker(markerID, MarkerProbe, probeData=probe, solarSystemID=self.solarsystemID, mapPositionLocal=SolarSystemPosToMapPos(probe.pos), mapPositionSolarSystem=self.position, trackObjectID=probe.probeID, distanceFadeAlphaNearFar=None)
    449                 self.localMarkerIDs.add(markerID)
    450                 if markerID in currentProbeMarkers:
    451                     currentProbeMarkers.remove(markerID)
    452 
    453         for markerID in currentProbeMarkers:
    454             self.mapView.markersHandler.RemoveMarker(markerID)
    455             self.localMarkerIDs.remove(markerID)
    456 
    457     def CreateRenderTarget(self):
    458         textureQuality = gfxsettings.Get(gfxsettings.GFX_TEXTURE_QUALITY)
    459         size = PLANET_TEXTURE_SIZE >> textureQuality
    460         rt = None
    461         while rt is None or not rt.isValid:
    462             rt = trinity.Tr2RenderTarget(2 * size, size, 0, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
    463             if not rt.isValid:
    464                 if size < 2:
    465                     return
    466                 size = size / 2
    467                 rt = None
    468 
    469         return (rt, size)
    470 
    471     def SetupMyPositionTracker(self, transform):
    472         done = False
    473         while not done and not self._closed:
    474             ballpark = sm.GetService('michelle').GetBallpark(doWait=True)
    475             if ballpark is None:
    476                 eveui.wait_for_next_frame()
    477                 continue
    478             ball = ballpark.GetBall(self.sunID)
    479             if ball is None:
    480                 eveui.wait_for_next_frame()
    481                 continue
    482             vectorCurve = trinity.Tr2CurveVector3()
    483             vectorCurve.AddKey(0, (-1.0, -1.0, -1.0))
    484             vectorSequencer = trinity.TriVectorSequencer()
    485             vectorSequencer.operator = trinity.TRIOP_MULTIPLY
    486             vectorSequencer.functions.append(ball)
    487             vectorSequencer.functions.append(vectorCurve)
    488             binding = trinity.TriValueBinding()
    489             binding.sourceAttribute = 'value'
    490             binding.destinationAttribute = 'translation'
    491             binding.scale = 1.0
    492             binding.sourceObject = vectorSequencer
    493             binding.destinationObject = transform
    494             curveSet = trinity.TriCurveSet()
    495             curveSet.name = 'translationCurveSet'
    496             curveSet.playOnLoad = True
    497             curveSet.curves.append(vectorSequencer)
    498             curveSet.bindings.append(binding)
    499             transform.curveSets.append(curveSet)
    500             curveSet.Play()
    501             done = True
    502 
    503 
    504 class OrbitCircle(object):
    505     lineSetScaling = 1000000.0
    506 
    507     def __init__(self, orbitID, position, parentPosition, parentTransform):
    508         self.orbitID = orbitID
    509         dirVec = geo2.Vec3Subtract(position, parentPosition)
    510         radius = geo2.Vec3Length(dirVec)
    511         dirVec = geo2.Vec3Normalize(dirVec)
    512         fwdVec = (-1.0, 0.0, 0.0)
    513         rotation = geo2.QuaternionRotationArc(fwdVec, dirVec)
    514         radius = radius / self.lineSetScaling
    515         lineSet = mapViewUtil.CreateLineSet()
    516         lineSet.scaling = (self.lineSetScaling, self.lineSetScaling, self.lineSetScaling)
    517         lineSet.translation = parentPosition
    518         lineSet.rotation = rotation
    519         parentTransform.children.append(lineSet)
    520         self.pixelLineSet = lineSet
    521         orbitLineColor = (1, 1, 1, 0.1)
    522         mapViewUtil.DrawCircle(lineSet, (0, 0, 0), radius, startColor=orbitLineColor, endColor=orbitLineColor, lineWidth=2.5)
    523         lineSet.SubmitChanges()
    524         lineSet = mapViewUtil.CreatePlanarLineSet()
    525         lineSet.scaling = (self.lineSetScaling, self.lineSetScaling, self.lineSetScaling)
    526         lineSet.translation = parentPosition
    527         lineSet.rotation = rotation
    528         parentTransform.children.append(lineSet)
    529         self.planarLineSet = lineSet
    530         orbitLineColor = orbitLineColor
    531         self.planarLineIDs = mapViewUtil.DrawCircle(lineSet, (0, 0, 0), radius, startColor=orbitLineColor, endColor=orbitLineColor, lineWidth=radius / 150.0)
    532         lineSet.SubmitChanges()
    533 
    534 
    535 class RangeIndicator(object):
    536     circleColor = (0.065, 0.065, 0.065, 0.7)
    537     labelColor = (0.5, 0.5, 0.5, 0.7)
    538     defaultRangeSteps = [ each * const.AU for each in (30, 25, 20, 15, 10, 5) ]
    539 
    540     def __init__(self, parentTransform = None, rangeSteps = None, contextScaling = 1.0):
    541         rangeCircles = trinity.EveTransform()
    542         rangeCircles.name = 'RangeIndicator'
    543         if parentTransform:
    544             parentTransform.children.append(rangeCircles)
    545         self.rootTransform = rangeCircles
    546         self.contextScaling = contextScaling
    547         rangeSteps = rangeSteps or self.defaultRangeSteps
    548         color = self.circleColor
    549         for i, radius in enumerate(rangeSteps):
    550             drawRadius = radius * self.contextScaling
    551             if i == 0:
    552                 label = GetByLabel('UI/Inflight/Scanner/UnitAU')
    553             else:
    554                 if radius >= const.AU:
    555                     label = FmtAmt(radius / const.AU)
    556                 else:
    557                     label = FmtDist(radius, maxdemicals=0)
    558                 baseAngle = math.pi / 2
    559                 circum = drawRadius * baseAngle
    560                 gapSize = 0.8 / circum
    561                 gapAngle = gapSize * baseAngle
    562                 for startAngle in (0.0,
    563                  math.pi * 0.5,
    564                  math.pi,
    565                  math.pi * 1.5):
    566                     lineSet = mapViewUtil.CreatePlanarLineSet()
    567                     rangeCircles.children.append(lineSet)
    568                     mapViewUtil.DrawCircularArc(lineSet, (0.0, 0.0, 0.0), drawRadius, startAngle=startAngle + gapAngle, angle=baseAngle - gapAngle * 2, lineWidth=0.1, startColor=color, endColor=color)
    569                     lineSet.SubmitChanges()
    570 
    571             self.AddRangeLabel(label, drawRadius)
    572 
    573         lineSet.SubmitChanges()
    574 
    575     def AddRangeLabel(self, text, radius):
    576         for x, z in [(0.0, radius),
    577          (radius, 0.0),
    578          (0.0, -radius),
    579          (-radius, 0.0)]:
    580             label = TransformableLabel(text, self.rootTransform, size=64, shadow=0, hspace=0)
    581             label.transform.translation = (x, 0.0, z)
    582             sx, sy, sz = label.transform.scaling
    583             label.transform.scaling = (sx / sy, 1.0, 0.0)
    584             label.SetDiffuseColor(self.labelColor)
    585             label.transform.useDistanceBasedScale = False
    586             label.transform.modifier = 0
    587             label.transform.rotation = geo2.QuaternionRotationSetYawPitchRoll(math.pi, -math.pi / 2, 0)
    588 
    589 
    590 class SolarSystemInfoBox(LayoutGrid):
    591     default_columns = 2
    592     default_cellPadding = (0, 1, 6, 1)
    593 
    594     def ApplyAttributes(self, attributes):
    595         LayoutGrid.ApplyAttributes(self, attributes)
    596         self.nameLabel = EveLabelLarge(bold=True)
    597         self.AddCell(cellObject=self.nameLabel, colSpan=self.columns)
    598         EveLabelMedium(parent=self, text=GetByLabel('UI/Map/StarMap/SecurityStatus'))
    599         self.securityValue = EveLabelMedium(parent=self, bold=True, color=(1, 0, 0, 1))
    600 
    601     def LoadSolarSystemID(self, solarSystemID):
    602         self.nameLabel.text = cfg.evelocations.Get(solarSystemID).name
    603         securityStatus, color = FmtSystemSecStatus(sm.GetService('map').GetSecurityStatus(solarSystemID), True)
    604         self.securityValue.color = color
    605         self.securityValue.text = securityStatus