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: labels=["UNSET","CLEAR","GOOD","POOR"] UNSET=0 CLEAR=1 GOOD=2 POOR=3 def __init__(self,**kwargs): self.board=Corners(kwargs.get("board") or []) self.grid=Corners(kwargs.get("grid") or []) self.grade=kwargs.get("grade") or Board.UNSET def isEmpty(self): return len(self.board)==0 and len(self.grid)==0 and self.grade==Board.UNSET def setGrade(self,g): self.grade=g 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), "grade": obj.grade}} 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)