hexMapLine.py (2910B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\hexagonal\hexMapLine.py 2 from eve.client.script.ui.shared.mapView.hexagonal import hexUtil 3 import geo2 4 __author__ = 'fridrik' 5 from carbonui.primitives.vectorlinetrace import VectorLineTrace 6 7 class HexMapLine(VectorLineTrace): 8 positionsUnscaled = None 9 margin = 6 10 lineColor = (1, 1, 1, 0) 11 12 def ApplyAttributes(self, attributes): 13 VectorLineTrace.ApplyAttributes(self, attributes) 14 15 def AddPoints(self, posList, color = None, scaling = 1.0): 16 posList = list(posList) 17 totalPoints = len(posList) 18 if totalPoints > 2: 19 p1, p2 = self.ApplyLineMargin(posList[0], posList[1], self.margin, 0) 20 posList[0] = p1 21 p1, p2 = self.ApplyLineMargin(posList[-2], posList[-1], 0, self.margin) 22 posList[-1] = p2 23 elif totalPoints == 2: 24 p1, p2 = self.ApplyLineMargin(posList[0], posList[1], self.margin, self.margin) 25 posList[0] = p1 26 posList[1] = p2 27 for pos in posList: 28 x, y = pos 29 self.AddPoint((x * scaling, y * scaling), color or self.lineColor) 30 31 def ApplyLineMargin(self, p1, p2, radius1, radius2): 32 v = geo2.Vec2Subtract(p1, p2) 33 vn = geo2.Vec2Normalize(v) 34 l = geo2.Vec2Length(v) 35 if not l: 36 return (None, None) 37 s = (radius1 + radius2) / l 38 mp1 = geo2.Vec2Subtract(p1, geo2.Vec2Scale(vn, radius1)) 39 mp2 = geo2.Vec2Add(p2, geo2.Vec2Scale(vn, radius2)) 40 return (mp1, mp2) 41 42 def GetCrossPointsWithLine(self, hexLine, stopOnFirstCross = True): 43 crossPoints = [] 44 myVertexCount = len(self.renderObject.vertices) 45 otherVertexCount = len(hexLine.renderObject.vertices) 46 if myVertexCount < 2 or otherVertexCount < 2: 47 return crossPoints 48 for m_i in xrange(myVertexCount - 1): 49 m_p1 = self.renderObject.vertices[m_i].position 50 m_p2 = self.renderObject.vertices[m_i + 1].position 51 for o_i in xrange(otherVertexCount - 1): 52 o_p1 = hexLine.renderObject.vertices[o_i].position 53 o_p2 = hexLine.renderObject.vertices[o_i + 1].position 54 if m_p1 == o_p1 or m_p1 == o_p2: 55 crossPoint = m_p1 56 elif m_p2 == o_p1 or m_p2 == o_p2: 57 crossPoint = m_p2 58 else: 59 try: 60 crossPoint = hexUtil.intersect_line_segments((m_p1, m_p2), (o_p1, o_p2)) 61 except ValueError: 62 continue 63 64 if crossPoint: 65 crossPoints.append(crossPoint) 66 if stopOnFirstCross: 67 break 68 69 if crossPoints and stopOnFirstCross: 70 break 71 72 return crossPoints