| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #×÷Õߣºifo  | 
| # Change Log: ÐÞ¸ÄÀà¼Ü¹¹        2011-9-9    Alee  | 
|   | 
| import string  | 
| import CommFunc  | 
| import Log4P  | 
| import binascii  | 
| import os  | 
| import logging  | 
| import IPY_AStar  | 
| from ConfigurationReader import ConfigIniReader  | 
|   | 
| DUMP_MAPDATA = False  | 
|   | 
|   | 
| class  tagFLCOMMONHEADERS:  | 
|       | 
|     Signature = 0       # (DWORD Signature )     // ±êÖ¾  | 
|     Numbering = 0       # (DWORD Numbering )     // ±àºÅ  | 
|     OSVersion = 0       # (DWORD OSVersion )     // °æ±¾  | 
|     Copyright = ""      # (char Copyright[64] )     // °æÈ¨ÉùÃ÷  | 
|     CreationTime = 0        # (double CreationTime )     // ´´½¨Ê±¼ä  | 
|     LastWriteTime = 0       # (double LastWriteTime )     // ×îºóÒ»´ÎÐÞ¸Äʱ¼ä  | 
|     BuildVersion = 0        # (DWORD BuildVersion )     // ¸Äд´ÎÊý  | 
|     Ressource = 0       # (DWORD Ressource )     // ×ÊÔ´ÀàÐÍ  | 
|     ResVersion = 0      # (DWORD ResVersion )     // ×ÊÔ´°æ±¾  | 
|     AddonsResCount = 0      # (DWORD AddonsResCount )     // ¸½¼Ó×ÊÔ´ÊýÁ¿  | 
|     Reserved = ""       # (char Reserved[20] )     // ¶ÔÆëÖÁ 128 byte(s)  | 
|       | 
|     def __init__(self):  | 
|         self.Clear()  | 
|   | 
|         return  | 
|     def ReadData(self, _lpData, _pos=0, _Len=0):  | 
|         self.Clear()  | 
|   | 
|         self.Signature, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.Numbering, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.OSVersion, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.Copyright, _pos = CommFunc.ReadString(_lpData, _pos, 64)  | 
|         self.CreationTime, _pos = CommFunc.ReadDouble(_lpData, _pos)  | 
|         self.LastWriteTime, _pos = CommFunc.ReadDouble(_lpData, _pos)  | 
|         self.BuildVersion, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.Ressource, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.ResVersion, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.AddonsResCount, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.Reserved, _pos = CommFunc.ReadString(_lpData, _pos, 20)  | 
|   | 
|         if _Len != 0 and _pos != _Len:  | 
|             Log4P.Warn("Error in tagFLCOMMONHEADERS : %s "% binascii.b2a_hex(_lpData))  | 
|             return 0  | 
|         return _pos  | 
|   | 
|     def Clear(self):  | 
|         self.Signature = 0  | 
|         self.Numbering = 0  | 
|         self.OSVersion = 0  | 
|         self.Copyright = ""  | 
|         self.CreationTime = 0  | 
|         self.LastWriteTime = 0  | 
|         self.BuildVersion = 0  | 
|         self.Ressource = 0  | 
|         self.ResVersion = 0  | 
|         self.AddonsResCount = 0  | 
|         self.Reserved = ""  | 
|         return  | 
|   | 
|     def GetLength(self):  | 
|         length = 0  | 
|         length += 4  | 
|         length += 4  | 
|         length += 4  | 
|         length += 64  | 
|         length += 8  | 
|         length += 8  | 
|         length += 4  | 
|         length += 4  | 
|         length += 4  | 
|         length += 4  | 
|         length += 20  | 
|         return  length;  | 
|   | 
|     def GetBuffer(self):  | 
|         data = ''  | 
|         data = CommFunc.WriteDWORD(data, self.Signature)  | 
|         data = CommFunc.WriteDWORD(data, self.Numbering)  | 
|         data = CommFunc.WriteDWORD(data, self.OSVersion)  | 
|         data = CommFunc.WriteString(data, 64, self.Copyright)  | 
|         data = CommFunc.WriteDouble(data, self.CreationTime)  | 
|         data = CommFunc.WriteDouble(data, self.LastWriteTime)  | 
|         data = CommFunc.WriteDWORD(data, self.BuildVersion)  | 
|         data = CommFunc.WriteDWORD(data, self.Ressource)  | 
|         data = CommFunc.WriteDWORD(data, self.ResVersion)  | 
|         data = CommFunc.WriteDWORD(data, self.AddonsResCount)  | 
|         data = CommFunc.WriteString(data, 20, self.Reserved)  | 
|         return data  | 
|   | 
|     def OutputString(self):  | 
|         DumpString = ''':  | 
|                             Signature:%d,  | 
|                             Numbering:%d,  | 
|                             OSVersion:%d,  | 
|                             Copyright:%s,  | 
|                             CreationTime:%d,  | 
|                             LastWriteTime:%d,  | 
|                             BuildVersion:%d,  | 
|                             Ressource:%d,  | 
|                             ResVersion:%d,  | 
|                             AddonsResCount:%d,  | 
|                             Reserved:%s  | 
|                             '''\  | 
|                             %(  | 
|                             self.Signature,  | 
|                             self.Numbering,  | 
|                             self.OSVersion,  | 
|                             self.Copyright,  | 
|                             self.CreationTime,  | 
|                             self.LastWriteTime,  | 
|                             self.BuildVersion,  | 
|                             self.Ressource,  | 
|                             self.ResVersion,  | 
|                             self.AddonsResCount,  | 
|                             self.Reserved  | 
|                             )  | 
|   | 
|         return  DumpString  | 
|   | 
|   | 
| #Õϰ±íÐÅÏ¢  | 
| class  tagMapObs:  | 
|     Width = 0       # (DWORD Width )  | 
|     Height = 0      # (DWORD Height )  | 
|     def __init__(self):  | 
|         self.Clear()  | 
|   | 
|         return  | 
|     def ReadData(self, _lpData, _pos=0, _Len=0):  | 
|         self.Clear()  | 
|   | 
|         self.Width, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|         self.Height, _pos = CommFunc.ReadDWORD(_lpData, _pos)  | 
|   | 
|         if _Len != 0 and _pos != _Len:  | 
|             Log4P.Warn("Error in tagMapObs : %s "% binascii.b2a_hex(_lpData))  | 
|             return 0  | 
|         return _pos  | 
|   | 
|     def Clear(self):  | 
|         self.Width = 0  | 
|         self.Height = 0  | 
|         return  | 
|   | 
|     def GetLength(self):  | 
|         length = 0  | 
|         length += 4  | 
|         length += 4  | 
|         return  length;  | 
|   | 
|     def GetBuffer(self):  | 
|         data = ''  | 
|         data = CommFunc.WriteDWORD(data, self.Width)  | 
|         data = CommFunc.WriteDWORD(data, self.Height)  | 
|         return data  | 
|   | 
|     def OutputString(self):  | 
|         DumpString = ''':  | 
|                             Width:%d,  | 
|                             Height:%d  | 
|                             '''\  | 
|                             %(  | 
|                             self.Width,  | 
|                             self.Height  | 
|                             )  | 
|   | 
|         return  DumpString  | 
|       | 
|       | 
| class   MapNameInfoType:  | 
|     def __init__(self):  | 
|         self.MapFileName = ''  | 
|         self.MapID = 0  | 
|         self.MapName = ''  | 
|       | 
|     def ReadFromList(self, curList):  | 
|         self.MapFileName = curList[0]  | 
|         self.MapID = CommFunc.ToIntDef(curList[1])  | 
|         self.MapName = curList[2]  | 
|         return  | 
|       | 
|     def __str__(self):  | 
|         DumpString = "MapFileName:%s," \  | 
|                             "MapID:%d," \  | 
|                             "MapName:%s" \  | 
|                             %( \  | 
|                             self.MapFileName, \  | 
|                             self.MapID, \  | 
|                             self.MapName \  | 
|                             )  | 
|   | 
|         return  DumpString  | 
|       | 
|       | 
| class MapData():  | 
|     def __init__(self, mapID):  | 
|         self.aStarPath = IPY_AStar.IPY_AStar()  | 
|         self.mapDataHead = tagFLCOMMONHEADERS()  | 
|         self.mapObs = tagMapObs()  | 
|         self.mapID = mapID  | 
|   | 
|     def GetAStarPath(self):  | 
|         return self.aStarPath  | 
|       | 
|     def ReadFromFile(self, filepath ):  | 
|         f = open(filepath,'rb')  | 
|         buf = f.read()  | 
|         pos = self.mapDataHead.ReadData(buf)  | 
|         pos = self.mapObs.ReadData(buf, pos)  | 
|           | 
|         obsPos = pos  | 
|         self.DataList=[]#mapdatalist  | 
|         for j in range(self.mapObs.Height):  | 
|             self.DataList.append([])  | 
|             for i in range(self.mapObs.Width):  | 
|                 curValue, pos = CommFunc.ReadBYTE(buf, pos)  | 
|                 self.DataList[j].append(curValue)  | 
|                   | 
|         mapObsData, pos = CommFunc.ReadString(buf, obsPos, len(buf) - obsPos)  | 
|       | 
|         #ÉèÖÃÕϰ±í  | 
|         self.aStarPath.SetMap(mapObsData, self.mapObs.Width, self.mapObs.Height)  | 
|           | 
|           | 
|       | 
|     #Check Is Block      | 
|     def IsBlockPoint( self,posX, posY ):    | 
|         data = self.GetMapFilePointValue( posX, posY )  | 
|         if not data:  | 
|             return True  | 
|           | 
|         return 0 != data  | 
|                | 
|     def __str__(self):  | 
|         data="MapDataDump:\n MapID:%d Width:%d Height:%d\n" \  | 
|             % ( self.mapID, self.mapObs.Width, self.mapObs.Height )  | 
|         for y in range(len(self.DataList)):  | 
|             for x in range(len(self.DataList[y])):  | 
|                 data += str(self.DataList[y][x])  | 
|             data+="\n"  | 
|   | 
|         return data  | 
|           | 
|     #return mapPointValue  | 
|     def GetMapFilePointValue(self, posX, posY):  | 
|         if posY >= self.mapObs.Height \  | 
|             or posX >= self.mapObs.Width:  | 
|             logging.warning( "Out of Range in map:%d pos:(%d,%d)" % ( self.mapID, posX, posY ))  | 
|             return None  | 
|           | 
|         return self.DataList[posY][posX]  | 
|       | 
|           | 
|       | 
| class MapDataReader:  | 
|     def __init__(self, PyBaseRoot, mapsPath, postFix ):  | 
|         self.mapNameInfo = {}  | 
|         self.mapDataDict = {}  | 
|         self.mapsPath = PyBaseRoot + mapsPath  | 
|         self.postFix = postFix  | 
|           | 
|         self.ReadMapIDTxt()  | 
|         self.ReadAllMapData()  | 
|                | 
|     def ReadMapIDTxt(self ):  | 
|         mapIdTxtPath = os.path.join(self.mapsPath, 'MapID.txt')  | 
|         logging.debug( "MapID.txt path:%s" % mapIdTxtPath )  | 
|         f = file(mapIdTxtPath)  | 
|         mapTxt = f.readlines()  | 
|         for line in mapTxt:  | 
|             curList = line.split('\t')  | 
|             infoType = MapNameInfoType()  | 
|             infoType.ReadFromList(curList)  | 
|             self.mapNameInfo[infoType.MapID] = infoType  | 
|             logging.debug( "Dump....%s" % str(infoType) )  | 
|               | 
|     def ReadAllMapData(self):  | 
|         for mapID in self.mapNameInfo.keys():  | 
|             self.mapDataDict[mapID] = self.__ReadMapData( mapID )  | 
|       | 
|     def __ReadMapData( self, mapID ):  | 
|         curMapPath = os.path.join(self.mapsPath, self.mapNameInfo[mapID].MapFileName + self.postFix)  | 
|         logging.debug( "MapFileReader: reading [%d]%s ..." % ( mapID, curMapPath ) )   | 
|         data = MapData( mapID )  | 
|         data.ReadFromFile( curMapPath )  | 
|         return data  | 
|       | 
|     def GetMapDataByID(self,mapID):  | 
|         return self.mapDataDict[mapID]  | 
|       | 
|     def GetAllMapData(self):  | 
|         return self.mapDataDict  | 
|       | 
|     #Check Is Block      | 
|     def IsBlockPoint(self,mapID,posX,posY):    | 
|         mapData = self.GetMapDataByID(mapID)  | 
|         if not mapList:  | 
|             logging.warning( "NO DATA for map %d" % mapID )  | 
|             return True  | 
|         return mapData.IsBlockPoint( posX, posY )  | 
|       | 
|   | 
|     def __str__(self):  | 
|         data = "MapPath:%s\n" % self.mapsPath  | 
|         data += "MapFilePostFix:%s\n" % self.postFix  | 
|         data += "MapNameInfo:\n"  | 
|         for mapID in self.mapNameInfo.keys():  | 
|             data += "%d:%s\n" %( mapID, str(self.mapNameInfo[mapID]) )  | 
|         for mapID in self.mapDataDict.keys():  | 
|             data += "%d:%s\n" % ( mapID, str(self.mapDataDict[mapID]) )  | 
|         return data  | 
|           | 
|       | 
|   | 
| __gRobotsMapData = None  | 
|   | 
| def ReadMapData( PyBaseRoot,):  | 
|     global __gRobotsMapData  | 
|     if not __gRobotsMapData:  | 
|         __gRobotsMapData =  MapDataReader( PyBaseRoot, ConfigIniReader.GetConfig().GetMapFilePath(),\  | 
|                                           ConfigIniReader.GetConfig().GetMapFilePostFix())  | 
|         if DUMP_MAPDATA:  | 
|             logging.debug( "%s", str(__gRobotsMapData) )  | 
|           | 
|           | 
| def GetMapData():  | 
|     global __gRobotsMapData  | 
|     return __gRobotsMapData  | 
|   | 
|   | 
|           | 
| if __name__ == "__main__":  | 
|     pass  | 
|       | 
|      | 
|       | 
|       | 
|       | 
|      |