import sys
sys.path.append("../src")
import gzip
import json
from typing import MutableMapping
from analyzer.epoint import EPoint
from analyzer.corners import Corners
class Board:
def __init__(self,**kwargs):
self.board=Corners(kwargs.get("board") or [])
self.grid=Corners(kwargs.get("grid") or [])
def isEmpty(self):
return len(self.board)==0 and len(self.grid)==0
class DataFile(MutableMapping):
"""self.data: {filename: [Board, ...}"""
def __init__(self,filename):
self.filename=filename
try:
with gzip.open(filename,mode="rt",encoding="utf8") as f:
self._data=json.load(f,object_hook=self.deserialize)
except OSError:
self._data=dict()
def save(self):
with gzip.open(self.filename,mode="wt",encoding="utf8") as f:
json.dump(self._data,f,default=self.serialize,indent="\t")
def serialize(self,obj):
if isinstance(obj,EPoint):
return {"type": "EPoint", "val": [obj.x,obj.y]}
elif isinstance(obj,Board):
return {"type": "Board", "val": {"board": list(obj.board), "grid": list(obj.grid)}}
raise TypeError(obj)
def deserialize(self,obj):
type=obj.get("type")
if type=="EPoint": return EPoint(*obj["val"])
elif type=="Board": return Board(**obj["val"])
return obj
def __getitem__(self, key): return self._data[key]
def __setitem__(self, key, val): self._data[key]=val
def __delitem__(self, key): del self._data[key]
def __iter__(self): return iter(self._data)
def __len__(self): return len(self._data)
def computeBoundingBox(corners):
x1=min(p.x for p in corners)
x2=max(p.x for p in corners)
y1=min(p.y for p in corners)
y2=max(p.y for p in corners)
return (x1,y1,x2,y2)