From f5268d1d1020aa74cc61daf9b4e57196de59a8b0 Mon Sep 17 00:00:00 2001 From: James Kerns Date: Wed, 27 Mar 2019 22:57:32 -0500 Subject: [PATCH] Closes #181. Touches #175. Changed PDF tag to add analysis date. --- pylinac/core/pdf.py | 26 +++++++++++++------------- pylinac/flatsym.py | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/pylinac/core/pdf.py b/pylinac/core/pdf.py index 65f943a37..6ae8651de 100644 --- a/pylinac/core/pdf.py +++ b/pylinac/core/pdf.py @@ -11,33 +11,32 @@ from reportlab.lib.utils import ImageReader from .. import __version__ -from .io import retrieve_demo_file class PylinacCanvas: - def __init__(self, filename: str, page_title: str, font: str="Helvetica", metadata: dict=None): + def __init__(self, filename: str, page_title: str, font: str="Helvetica", metadata: dict=None, metadata_location: tuple=(2, 25.5)): self.canvas = Canvas(filename, pagesize=A4) self._font = font self._title = page_title + self._metadata = metadata + self._metadata_location = metadata_location self._generate_pylinac_template_theme() - self._add_metadata(metadata) + self._add_metadata() - def add_new_page(self, metadata: dict=None): + def add_new_page(self): self.canvas.showPage() self._generate_pylinac_template_theme() - self._add_metadata(metadata) + self._add_metadata() - def _add_metadata(self, metadata: dict=None): - if metadata is None: + def _add_metadata(self): + if self._metadata is None: return else: text = ['Metadata:'] - for key, value in metadata.items(): + for key, value in self._metadata.items(): text.append(f"{key}: {value}") - date = datetime.now().strftime("%A, %B %d, %Y") - text.append(f'Analyzed on: {date}') - self.add_text(text=text, location=(2, 25.5)) + self.add_text(text=text, location=self._metadata_location) def _generate_pylinac_template_theme(self): # draw logo and header separation line @@ -46,8 +45,9 @@ def _generate_pylinac_template_theme(self): self.canvas.line(1 * cm, 26.5 * cm, 20 * cm, 26.5 * cm) # draw title self.add_text(text=self._title, location=(7, 28.5), font_size=24) - # draw "generated by" tag - self.add_text(f"Generated with Pylinac version {__version__}", location=(0.5, 0.5), font_size=8) + # draw "generated by pylinac" tag + date = datetime.now().strftime("%B %d, %Y at %H:%M") + self.add_text(f"Generated with Pylinac v{__version__} on {date}", location=(0.5, 0.5), font_size=8) def add_text(self, text: Union[str, List[str]], location: Sequence, font_size: int=10): """Generic text drawing function. diff --git a/pylinac/flatsym.py b/pylinac/flatsym.py index 2f534f901..7e3f81707 100644 --- a/pylinac/flatsym.py +++ b/pylinac/flatsym.py @@ -155,14 +155,38 @@ def results(self, as_str=True) -> Union[str, list]: """ if not self._is_analyzed: raise NotAnalyzed("Image is not analyzed yet. Use analyze() first.") + # do some calculations + horiz_penum = self.symmetry['horizontal']['profile'].penumbra_width() / self.dpmm + vert_penum = self.symmetry['vertical']['profile'].penumbra_width() / self.dpmm + horiz_width = self.symmetry['horizontal']['profile'].fwxm() / self.dpmm + vert_width = self.symmetry['vertical']['profile'].fwxm() / self.dpmm + upper_dist = abs(self.symmetry['vertical']['profile']._penumbra_point('left') - self.center.y) / self.dpmm + lower_dist = abs(self.symmetry['vertical']['profile']._penumbra_point('right') - self.center.y) / self.dpmm + left_dist = abs(self.symmetry['horizontal']['profile']._penumbra_point('left') - self.center.x) / self.dpmm + right_dist = abs(self.symmetry['horizontal']['profile']._penumbra_point('right') - self.center.x) / self.dpmm results = [f'Flatness & Symmetry', f'File: {self.truncated_path}', + "", f'Flatness method: {self.flatness["method"].capitalize()}', f"Vertical flatness: {self.flatness['vertical']['value']:3.3}%", f"Horizontal flatness: {self.flatness['horizontal']['value']:3.3}%", f'Symmetry method: {self.symmetry["method"].capitalize()}', f"Vertical symmetry: {self.symmetry['vertical']['value']:3.3}%", - f"Horizontal symmetry: {self.symmetry['horizontal']['value']:3.3}%" + f"Horizontal symmetry: {self.symmetry['horizontal']['value']:3.3}%", + "", + "Penumbra (80/20):", + f"Horizontal: {horiz_penum:3.1f}mm", + f"Vertical: {vert_penum:3.1f}mm", + "", + "Field Size:", + f'Horizontal: {horiz_width:3.1f}mm', + f"Vertical: {vert_width:3.1f}mm", + "", + "CAX to edge distances:", + f"CAX -> Upper edge: {upper_dist:3.1f}mm", + f"CAX -> Lower edge: {lower_dist:3.1f}mm", + f"CAX -> Left edge: {left_dist:3.1f}mm", + f"CAX -> Right edge: {right_dist:3.1f}mm", ] if as_str: results = '\n'.join(result for result in results) @@ -224,16 +248,18 @@ def publish_pdf(self, filename: str, notes: Union[str, list]=None, open_file: bo """ if not self._is_analyzed: raise NotAnalyzed("Image is not analyzed yet. Use analyze() first.") - canvas = pdf.PylinacCanvas(filename, page_title="Flatness & Symmetry Analysis", metadata=metadata) + canvas = pdf.PylinacCanvas(filename, page_title="Flatness & Symmetry Analysis", + metadata=metadata, metadata_location=(2, 5)) # draw result text text = self.results(as_str=False) - canvas.add_text(text=text, location=(3, 25.5), font_size=12) + canvas.add_text(text=text, location=(2, 25.5), font_size=14) + canvas.add_new_page() # draw flatness & symmetry on two pages for method in (self._plot_symmetry, self._plot_flatness): - for height, direction in zip((1, 11.5), ('vertical', 'horizontal')): + for height, direction in zip((1, 12.5), ('vertical', 'horizontal')): data = io.BytesIO() self._save_plot(method, data, direction=direction) - canvas.add_image(data, location=(1, height), dimensions=(19, 10)) + canvas.add_image(data, location=(-4, height), dimensions=(28, 12)) canvas.add_new_page() # draw image on last page data = io.BytesIO()