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