Spaces:
Runtime error
Runtime error
#!/usr/bin/env python3 | |
""" | |
Copyright (c) 2020, Carleton University Biomedical Informatics Collaboratory | |
This source code is licensed under the MIT license found in the | |
LICENSE file in the root directory of this source tree. | |
""" | |
from typing import List, Optional, Type | |
import PIL.ImageDraw | |
from interfaces import SymbolDict | |
from .line import Line | |
from .label import Label | |
import utils.audiology as Audiology | |
from utils.geometry import get_bounding_box_relative_to_original_report | |
class Symbol(object): | |
def __init__(self, symbol_dict: dict, audiogram_coordinates: dict, correction_angle: float): | |
bbox = symbol_dict["boundingBox"] | |
self.p1 = { | |
"x": bbox["x"], | |
"y": bbox["y"] | |
} | |
self.p2 = { | |
"x": bbox["x"] + bbox["width"], | |
"y": bbox["y"] + bbox["height"] | |
} | |
self.dimensions = { | |
"width": bbox["width"], | |
"height": bbox["height"] | |
} | |
self.absolute_bounding_box = get_bounding_box_relative_to_original_report(bbox, audiogram_coordinates, correction_angle) | |
self.ear = "left" if "left" in symbol_dict["measurementType"].lower() else "right" | |
self.masking = False if "unmasked" in symbol_dict["measurementType"].lower() else True | |
self.conduction = "air" if "air" in symbol_dict["measurementType"].lower() else "bone" | |
self.measurement_type = symbol_dict["measurementType"] | |
self.confidence = symbol_dict["confidence"] | |
def draw(self, canvas: PIL.ImageDraw): | |
"""Draws the symbol's bounding box on the canvas (image) passed. | |
Parameters | |
---------- | |
canvas : PIL.ImageDraw | |
The PIL.ImageDraw on which the symbol is to be displayed. | |
""" | |
color = "rgb(255,0,0)" if self.is_frequency() else "rgb(0,0,255)" | |
canvas.rectangle( | |
(self.p1["x"], self.p1["y"], self.p2["x"], self.p2["y"]), | |
outline=color, | |
width=3 | |
) | |
canvas.text((self.p1["x"], self.p1["y"] - 10), str(self.get_value()), fill=color) | |
def get_center(self): | |
"""Returns the center of the symbol's bounding box. | |
Returns | |
------- | |
dict | |
A dictionary describing the center of the symbol's bounding box | |
of the form { "x": int, "y": int }. | |
""" | |
center = { | |
"x": (self.p1["x"] + self.p2["x"]) / 2, | |
"y": (self.p1["y"] + self.p2["y"]) / 2 | |
} | |
return center | |
def to_dict(self) -> dict: | |
"""Serializes the symbol to a dictionary. | |
Returns | |
------- | |
dict | |
A dictionary representing the symbol. | |
""" | |
return { | |
"boundingBox": self.absolute_bounding_box, | |
"ear": self.ear, | |
"conduction": self.conduction, | |
"masking": self.masking, | |
"confidence": self.confidence, | |
"response": True, | |
"measurementType": self.measurement_type | |
} | |
def __str__(self): | |
return f"Threshold(ear={self.ear}, conduction={self.conduction})" | |
def __repr__(self): | |
return self.__str__() | |