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

mapMarkerScanResult.py (9363B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\markers\mapMarkerScanResult.py
      2 import math
      3 import carbonui.const as uiconst
      4 import geo2
      5 from carbon.common.script.util.format import FmtDist
      6 from carbonui.primitives.container import Container
      7 from carbonui.primitives.transform import Transform
      8 from carbonui.primitives.vectorlinetrace import VectorLineTrace
      9 from carbonui.uianimations import animations
     10 from carbonui.util.color import Color
     11 from eve.client.script.ui.control.gaugeCircular import GaugeCircular
     12 from eve.client.script.ui.control.themeColored import SpriteThemeColored
     13 from eve.client.script.ui.inflight.scannerFiles.scannerUtil import GetScanDifficultyText
     14 from eve.client.script.ui.shared.mapView.markers.mapMarkerBase_Icon import MarkerIconBase
     15 from eve.client.script.ui.shared.mapView.markers.mapMarkerSpaceObjectRadialMenu import MapMarkerSpaceObjectRadialMenu
     16 from eve.client.script.ui.shared.mapView.markers.mapMarkerUtil import GetResultColor, GetResultTexturePath
     17 from eve.common.lib.appConst import minWarpDistance
     18 from eveservices.menu import GetMenuService
     19 from localization import GetByLabel
     20 from logmodule import LogException
     21 from sensorsuite.overlay.controllers.probescanner import SiteDataFromScanResult
     22 MIN_WARP_DISTANCE_SQUARED = minWarpDistance ** 2
     23 
     24 def IsResultWithinWarpDistance(result):
     25     ballpark = sm.GetService('michelle').GetBallpark()
     26     egoBall = ballpark.GetBall(ballpark.ego)
     27     egoPos = geo2.Vector(egoBall.x, egoBall.y, egoBall.z)
     28     resultPos = geo2.Vector(*result.data)
     29     distanceSquared = geo2.Vec3LengthSq(egoPos - resultPos)
     30     return distanceSquared > MIN_WARP_DISTANCE_SQUARED
     31 
     32 
     33 class MarkerScanResult(MarkerIconBase):
     34     __notifyevents__ = ['OnSiteSelectionChanged', 'OnClientEvent_PerfectScanResultReached']
     35     distanceFadeAlphaNearFar = None
     36     backgroundTexturePath = None
     37     graph = None
     38     highlightFrame = None
     39     label = None
     40 
     41     def __init__(self, *args, **kwds):
     42         MarkerIconBase.__init__(self, *args, **kwds)
     43         sm.RegisterNotify(self)
     44         self.resultData = resultData = kwds['resultData']
     45         self.gaugeCircular = None
     46         self.gaugeCont = None
     47         self.texturePath = GetResultTexturePath(self.resultData)
     48         self.projectBracket.offsetY = 0
     49         self.iconSprite = None
     50         self.CreateClientBall()
     51 
     52     def UpdateIcon(self):
     53         self.texturePath = GetResultTexturePath(self.resultData)
     54         if self.iconSprite:
     55             self.iconSprite.texturePath = self.texturePath
     56 
     57     def Close(self, *args):
     58         MarkerIconBase.Close(self, *args)
     59         sm.UnregisterNotify(self)
     60 
     61     def UpdateResultData(self, resultData):
     62         self.resultData = resultData
     63         if self.isLoaded:
     64             self.UpdateScanResult()
     65             self.CheckShowGauge()
     66         self.UpdateIcon()
     67 
     68     def SetOverlappedState(self, overlapState):
     69         self.overlapMarkers = None
     70         if self.overlapStackContainer:
     71             overlapStackContainer = self.overlapStackContainer
     72             self.overlapStackContainer = None
     73             overlapStackContainer.Close()
     74 
     75     def Load(self):
     76         if self.isLoaded:
     77             return
     78         MarkerIconBase.Load(self)
     79         self.UpdateScanResult()
     80         self.CheckShowGauge()
     81 
     82     def CheckShowGauge(self):
     83         if sm.GetService('scanSvc').IsSiteSelected(self.resultData.id):
     84             self.ConstructGauge()
     85             self.UpdateCircularGauge()
     86             self.gaugeCont.Show()
     87         elif self.gaugeCont:
     88             self.gaugeCont.Hide()
     89 
     90     def ConstructGauge(self):
     91         if not self.gaugeCircular or self.gaugeCircular.destroyed or not self.gaugeCircular.parent:
     92             self.gaugeCont = Container(parent=self.markerContainer, pos=(0, 0, 60, 60), align=uiconst.CENTER)
     93             self.gaugeCircular = GaugeCircular(parent=self.gaugeCont, radius=22, align=uiconst.CENTER, lineWidth=2, showMarker=False, state=uiconst.UI_DISABLED)
     94             SpriteThemeColored(parent=self.gaugeCont, align=uiconst.TOALL, state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/Shared/CircularGradient.png', colorType=uiconst.COLORTYPE_UIBASE, opacity=0.4)
     95 
     96     def GetResultColor(self):
     97         certainty = self.resultData.certainty
     98         return GetResultColor(certainty)
     99 
    100     def UpdateScanResult(self):
    101         color = self.GetResultColor()
    102         self.iconColor = color
    103         self.iconSprite.SetRGBA(*color)
    104         try:
    105             self.UpdateCircularGauge()
    106         except:
    107             LogException()
    108             raise
    109 
    110     def UpdateCircularGauge(self):
    111         if not self.gaugeCircular:
    112             return
    113         col = self.GetResultColor()
    114         colBg = Color(*col).SetBrightness(0.4).GetRGBA()
    115         colEnd = col
    116         brightness = Color(*col).GetBrightness()
    117         colStart = Color(*colEnd).SetBrightness(brightness * 0.8).GetRGBA()
    118         self.gaugeCircular.SetColor(colStart, colEnd)
    119         self.gaugeCircular.SetColorBg(colBg)
    120         certainty = self.resultData.certainty
    121         self.gaugeCircular.SetValue(certainty)
    122 
    123     def GetLabelText(self):
    124         scanSvc = sm.GetService('scanSvc')
    125         displayName = scanSvc.GetDisplayName(self.resultData)
    126         labelText = '%s %s' % (self.resultData.id, displayName)
    127         distance = self.GetDistance()
    128         if distance is not None:
    129             labelText += ' ' + FmtDist(distance)
    130         return labelText
    131 
    132     def GetBracketLabelText(self):
    133         labelText = MarkerIconBase.GetBracketLabelText(self)
    134         if self.resultData.certainty < 1.0:
    135             difficulty = GetScanDifficultyText(self.resultData.difficulty)
    136             labelText += '\n' + GetByLabel('UI/Inflight/Scanner/ScanningDifficulty', difficulty=difficulty)
    137         return labelText
    138 
    139     def _SetLabelOffset(self):
    140         MarkerIconBase._SetLabelOffset(self)
    141         if self.resultData.certainty < 1.0:
    142             y_offset = -8
    143         else:
    144             y_offset = 2
    145         self.label.x_offset = 32
    146         self.label.y_offset = y_offset
    147 
    148     def IsPartialResult(self):
    149         return self.resultData.certainty < 1.0
    150 
    151     def GetMenu(self):
    152         scanSvc = sm.GetService('scanSvc')
    153         scanResult = SiteDataFromScanResult(self.resultData)
    154         return scanSvc.GetScanResultMenuWithIgnore(scanResult, self.resultData.groupID)
    155 
    156     def GetDistance(self):
    157         bp = sm.GetService('michelle').GetBallpark()
    158         if bp is None:
    159             return
    160         if not bp.ego:
    161             return
    162         ego = bp.balls[bp.ego]
    163         myPos = (ego.x, ego.y, ego.z)
    164         return self.resultData.GetDistance(myPos)
    165 
    166     def OnMouseDown(self, *args):
    167         siteData = SiteDataFromScanResult(self.resultData)
    168         if self.clientBall:
    169             GetMenuService().TryExpandActionMenu(itemID=self.clientBall.id, clickedObject=self, siteData=siteData, radialMenuClass=MapMarkerSpaceObjectRadialMenu, markerObject=self)
    170 
    171     def OnSiteSelectionChanged(self):
    172         self.CheckShowGauge()
    173 
    174     def OnClick(self, *args, **kwds):
    175         MarkerIconBase.OnClick(self, *args, **kwds)
    176         doDScan = self.CheckDirectionalScanItem()
    177         if not doDScan:
    178             sm.GetService('scanSvc').SelectSite(self.resultData.id)
    179 
    180     def OnClientEvent_PerfectScanResultReached(self, results):
    181         for result in results:
    182             if result.id == self.resultData.id:
    183                 self.AnimPerfectResult()
    184 
    185     def AnimPerfectResult(self):
    186         if self.gaugeCircular:
    187             animations.BlinkIn(self.gaugeCircular, loops=4)
    188         self._AnimCircle(0.25)
    189         self._AnimCircle(0.65)
    190 
    191     def _AnimCircle(self, timeOffset):
    192         radius = 40
    193         transform = Transform(parent=self.markerContainer, align=uiconst.CENTER, width=radius * 2, height=radius * 2, state=uiconst.UI_DISABLED, scalingCenter=(0.5, 0.5))
    194         circle = Circle(parent=transform, radius=radius, color=(0.4, 1.0, 0.4, 1.0))
    195         duration = 0.8
    196         animations.FadeTo(circle, 0.3, 0.0, duration=duration, callback=circle.Close, timeOffset=timeOffset)
    197         animations.MorphVector2(transform, 'scale', (0.0, 0.0), (1.4, 1.4), duration=duration, curveType=uiconst.ANIM_LINEAR, timeOffset=timeOffset)
    198         animations.MorphScalar(circle, 'lineWidth', radius, 0.0, duration=duration, curveType=uiconst.ANIM_LINEAR, timeOffset=timeOffset, callback=transform.Close)
    199 
    200     def GetMarkerOpacity(self, bracketCameraDistance, cameraZoomDistance):
    201         if sm.GetService('scanSvc').IsSiteSelected(self.markerID[1][0]):
    202             return 1.0
    203         else:
    204             return 0.6
    205 
    206 
    207 class Circle(VectorLineTrace):
    208     default_color = Color.WHITE
    209     default_radius = 10
    210 
    211     def ApplyAttributes(self, attributes):
    212         VectorLineTrace.ApplyAttributes(self, attributes)
    213         color = attributes.get('color', self.default_color)
    214         self.radius = attributes.get('radius', self.default_radius)
    215         self.isLoop = True
    216         numPoints = max(20, self.radius)
    217         w = self.lineWidth / 2.0
    218         stepSize = 2 * math.pi / numPoints
    219         for i in xrange(numPoints):
    220             t = float(i) * stepSize
    221             point = self.GetLinePoint(t, w)
    222             self.AddPoint(point, color)
    223 
    224     def GetLinePoint(self, t, w):
    225         r = self.radius - w
    226         xPoint = w + r * (1.0 + math.cos(t))
    227         yPoint = w + r * (1.0 + math.sin(t))
    228         return (xPoint, yPoint)