#!/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  
 | 
      
 | 
     
 | 
      
 | 
      
 | 
      
 | 
     
 |