
import os
import argparse

import numpy as np

"""
Dota数据集标注
每条标注数据应包含：
+前 8 个数值，表示目标的四个角点的坐标（x1, y1, x2, y2, x3, y3, x4, y4），按顺时针或逆时针顺序排列，无需进行归一化处理；
+倒数第二列为标注的目标类别名称，如：jun_ship等；
+最后一列为识别目标的难易程度（difficulty）

提供数据集标注

"""
class DotaObj(object):
    def __init__(self, x1, y1, x2, y2, x3, y3, x4, y4,clsname,difficulty):
        self.x1=x1
        self.y1=y1
        self.x2=x2
        self.y2=y2
        self.x3=x3
        self.y3=y3
        self.x4=x4
        self.y4=y4
        self.clsname=clsname
        self.difficulty=difficulty
    def __str__(self):
        return "{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}".format(
            self.x1,self.y1,
            self.x2,self.y2,
            self.x3,self.y3,
            self.x4,self.y4,
            self.clsname,self.difficulty
        )
    def getCenter(self):
        CenterX=np.mean([self.x1,self.x2,self.x3,self.x4])
        CenterY=np.mean([self.y1,self.y2,self.y3,self.y4])
        return [CenterX,CenterY]


def createDota(x1, y1, x2, y2, x3, y3, x4, y4,clsname,difficulty):
    return DotaObj(x1, y1, x2, y2, x3, y3, x4, y4,clsname,difficulty) # 8+2


def readDotaFile(dotafilepath,filterlabels=None):
    content=None
    with open(dotafilepath,'r',encoding="utf-8") as fp:
        content=fp.read()
    contentlines=content.split("\n")
    # 逐行分解
    result=[]
    for linestr in contentlines:
        if linestr=="":
            continue
        linestr=linestr.replace("\t"," ")
        linestr=linestr.replace("  "," ")
        linemetas=linestr.split(" ")
        if(len(linemetas)>=10):
            x1=float(linemetas[0])
            y1=float(linemetas[1])
            x2=float(linemetas[2])
            y2=float(linemetas[3])
            x3=float(linemetas[4])
            y3=float(linemetas[5])
            x4=float(linemetas[6])
            y4=float(linemetas[7])
            clsname=linemetas[8]
            difficulty=linemetas[9]
            if filterlabels is None or clsname.strip() in filterlabels:
                result.append(createDota(x1, y1, x2, y2, x3, y3, x4, y4, clsname,difficulty))
        elif (len(linemetas)>=8):
            x1=float(linemetas[0])
            y1=float(linemetas[1])
            x2=float(linemetas[2])
            y2=float(linemetas[3])
            x3=float(linemetas[4])
            y3=float(linemetas[5])
            x4=float(linemetas[6])
            y4=float(linemetas[7])
            clsname="MLC"
            difficulty="0"
            if filterlabels is None or clsname.strip() in filterlabels:
                result.append(createDota(x1, y1, x2, y2, x3, y3, x4, y4, clsname,difficulty))
        else:
            print("parse result: ", linestr)
    return result


def writerDotaFile(dotalist,filepath):
    with open(filepath,'a',encoding="utf-8") as fp:
        for dota in dotalist:
            if isinstance(dota,DotaObj):
                fp.write("{}\n".format(str(dota)))
            else:
                fp.write("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}\n".format(
                    dota[0],dota[1],dota[2],dota[3],dota[4],dota[5],dota[6],dota[7],dota[8],dota[9]
                ))
        print("write label result: ", filepath)


