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)