Refactoring layout things

This commit is contained in:
Jamie Hardt
2021-05-20 15:34:00 -07:00
parent b1722966c6
commit f8cadcb9dc
6 changed files with 117 additions and 78 deletions

View File

@@ -144,12 +144,12 @@ def convert(input_file, output_format='fmpxml', start=None, end=None, select_ree
output_line_count(parsed) output_line_count(parsed)
output_summary(parsed) output_summary(parsed)
os.mkdir("Supervisor Logs") os.makedirs("Supervisor Logs", exist_ok=True)
os.chdir("Supervisor Logs") os.chdir("Supervisor Logs")
output_supervisor_1pg(parsed) output_supervisor_1pg(parsed)
os.chdir("..") os.chdir("..")
os.mkdir("Talent Scripts") os.makedirs("Talent Scripts", exist_ok=True)
os.chdir("Talent Scripts") os.chdir("Talent Scripts")
output_talent_sides(parsed) output_talent_sides(parsed)

View File

@@ -2,7 +2,7 @@ from reportlab.pdfbase.pdfmetrics import (getAscent, getDescent)
from reportlab.lib.units import inch from reportlab.lib.units import inch
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
import datetime import datetime
from reportlab.platypus.doctemplate import BaseDocTemplate, Frame, PageTemplate
# This is from https://code.activestate.com/recipes/576832/ for # This is from https://code.activestate.com/recipes/576832/ for
# generating page count messages # generating page count messages
@@ -30,7 +30,8 @@ class ReportCanvas(canvas.Canvas):
self.setFont("Futura", 10) self.setFont("Futura", 10)
self.drawString(0.5 * inch, 0.5 * inch, "Page %d of %d" % (self._pageNumber, page_count)) self.drawString(0.5 * inch, 0.5 * inch, "Page %d of %d" % (self._pageNumber, page_count))
right_edge = self._pagesize[0] - 0.5 * inch right_edge = self._pagesize[0] - 0.5 * inch
self.drawRightString(right_edge, 0.5 * inch, self._report_date.strftime("%c")) self.drawRightString(right_edge, 0.5 * inch, self._report_date.strftime("%m/%d/%Y %H:%M"))
top_line = self.beginPath() top_line = self.beginPath()
top_line.moveTo(0.5 * inch, 0.75 * inch) top_line.moveTo(0.5 * inch, 0.75 * inch)
top_line.lineTo(right_edge, 0.75 * inch) top_line.lineTo(right_edge, 0.75 * inch)
@@ -39,6 +40,41 @@ class ReportCanvas(canvas.Canvas):
self.restoreState() self.restoreState()
class ADRDocTemplate(BaseDocTemplate):
def build(self, flowables, filename=None, canvasmaker=ReportCanvas):
BaseDocTemplate.build(self, flowables, filename, canvasmaker)
def make_doc_template(page_size, filename, document_title, record, document_header = ""):
left_margin = right_margin = top_margin = bottom_margin = 0.5 * inch
page_box = GRect(0., 0., page_size[0], page_size[1])
_, page_box = page_box.split_x(left_margin, direction='r')
_, page_box = page_box.split_x(right_margin, direction='l')
_, page_box = page_box.split_y(bottom_margin, direction='u')
_, page_box = page_box.split_y(top_margin, direction='d')
footer_box, page_box = page_box.split_y(0.25 * inch, direction='u')
header_box, page_box = page_box.split_y(0.75 * inch, direction='d')
title_box, report_box = header_box.split_x(4. * inch, direction='r')
page_template = PageTemplate(id="Main",
frames=[Frame(page_box.min_x, page_box.min_y, page_box.width, page_box.height)],
onPage=lambda c, _: draw_header_footer(c, title_box, report_box, footer_box, record,
doc_title=document_header))
doc = ADRDocTemplate(filename,
title=document_title,
author=record.get('Supervisor', ""),
pagesize=page_size,
leftMargin=left_margin, rightMargin=right_margin,
topMargin=top_margin, bottomMargin=bottom_margin)
doc.addPageTemplates([page_template])
return doc
def time_format(mins): def time_format(mins):
if mins < 60.: if mins < 60.:
return "%im" % round(mins) return "%im" % round(mins)
@@ -48,12 +84,21 @@ def time_format(mins):
return "%ih%im" % (hh, mm) return "%ih%im" % (hh, mm)
# draws the title block inside the given rect def draw_header_footer(a_canvas, title_box, doc_title_box, footer_box, record, doc_title=""):
def draw_title_block(a_canvas, rect, record):
(supervisor, client,), title = rect.divide_y([16., 16., ]) (supervisor, client,), title = title_box.divide_y([16., 16., ])
title.draw_text_cell(a_canvas, record['Title'], "Futura", 18, inset_y=2.) title.draw_text_cell(a_canvas, record['Title'], "Futura", 18, inset_y=2.)
client.draw_text_cell(a_canvas, record.get('Client', ''), "Futura", 11, inset_y=2.) client.draw_text_cell(a_canvas, record.get('Client', ''), "Futura", 11, inset_y=2.)
supervisor.draw_text_cell(a_canvas, record.get('Supervisor', ''), "Futura", 11, inset_y=2.)
(doc_title_cell, spotting_version_cell,), _ = doc_title_box.divide_y([18., 14], direction='d')
doc_title_cell.draw_text_cell(a_canvas, doc_title, 'Futura', 14., inset_y=2.)
if 'Spot' in record.keys():
spotting_version_cell.draw_text_cell(a_canvas, record['Spot'], 'Futura', 12., inset_y=2.)
a_canvas.setFont('Futura', 11.)
a_canvas.drawCentredString(footer_box.min_x + footer_box.width / 2., footer_box.min_y,
record.get('Supervisor', 'Supervisor: ________________'))
class GRect: class GRect:

View File

@@ -4,13 +4,13 @@ from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.units import inch from reportlab.lib.units import inch
from reportlab.lib.pagesizes import letter from reportlab.lib.pagesizes import letter, landscape, portrait
from reportlab.lib import colors from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle from reportlab.platypus import Paragraph, Table, TableStyle
from .common import GRect, time_format, NumberedCanvas from .common import GRect, time_format, ReportCanvas, make_doc_template
import datetime import datetime
@@ -76,36 +76,36 @@ def build_columns(records, show_priorities = False):
'heading': '>P5', 'heading': '>P5',
'value_getter': lambda recs: blank_len([r for r in recs if r.get('Priority', 5) > 5]), 'value_getter': lambda recs: blank_len([r for r in recs if r.get('Priority', 5) > 5]),
'style_getter': lambda col_index: [], 'style_getter': lambda col_index: [],
'width': 0.5 * inch 'width': 0.375 * inch
}) })
columns.append({ columns.append({
'heading': 'TV', 'heading': 'TV',
'value_getter': lambda recs: blank_len([r for r in recs if 'TV' in r.keys()]), 'value_getter': lambda recs: blank_len([r for r in recs if 'TV' in r.keys()]),
'style_getter': lambda col_index: [], 'style_getter': lambda col_index: [],
'width': 0.5 * inch 'width': 0.375 * inch
}) })
columns.append({ columns.append({
'heading': 'OPT', 'heading': 'Opt',
'value_getter': lambda recs: blank_len([r for r in recs if 'Optional' in r.keys()]), 'value_getter': lambda recs: blank_len([r for r in recs if 'Optional' in r.keys()]),
'style_getter': lambda col_index: [], 'style_getter': lambda col_index: [],
'width': 0.5 * inch 'width': 0.375 * inch
}) })
columns.append({ columns.append({
'heading': 'EFF', 'heading': 'Eff',
'value_getter': lambda recs: blank_len([r for r in recs if 'Effort' in r.keys()]), 'value_getter': lambda recs: blank_len([r for r in recs if 'Effort' in r.keys()]),
'style_getter': lambda col_index: [], 'style_getter': lambda col_index: [],
'width': 0.5 * inch 'width': 0.375 * inch
}) })
columns.append({ columns.append({
'heading': 'Total', 'heading': 'Total',
'value_getter': lambda recs: len([r for r in recs]), 'value_getter': lambda recs: len([r for r in recs if 'Omitted' not in r.keys()]),
'style_getter': lambda col_index: [(('LINEBEFORE'), (col_index, 0), (col_index, -1), 1.0, colors.black), 'style_getter': lambda col_index: [(('LINEBEFORE'), (col_index, 0), (col_index, -1), 1.0, colors.black),
('ALIGN', (col_index, 0), (col_index, -1), 'RIGHT')], ('ALIGN', (col_index, 0), (col_index, -1), 'RIGHT')],
'width': inch 'width': 0.5 * inch
}) })
columns.append({ columns.append({
@@ -115,6 +115,13 @@ def build_columns(records, show_priorities = False):
'width': inch 'width': inch
}) })
# columns.append({
# 'heading': 'Omit',
# 'value_getter': lambda recs: blank_len([r for r in recs if 'Omitted' in r.keys()]),
# 'style_getter': lambda col_index: [('LINEBEFORE', (col_index, 0), (col_index, -1), 1.0, colors.black)],
# 'width': 0.5 * inch
# })
return columns return columns
@@ -150,15 +157,6 @@ def populate_columns(records, columns):
def output_report(records): def output_report(records):
# CN
# Role
# Actor
# R1, R2, R3, R4, R5, R6
# Opt
# TV
# EFF
# Total
columns = build_columns(records) columns = build_columns(records)
data, style, columns_widths = populate_columns(records, columns) data, style, columns_widths = populate_columns(records, columns)
style.append(('FONTNAME', [0, 0], (-1, -1), "Futura")) style.append(('FONTNAME', [0, 0], (-1, -1), "Futura"))
@@ -168,20 +166,28 @@ def output_report(records):
pdfmetrics.registerFont(TTFont('Futura', 'Futura.ttc')) pdfmetrics.registerFont(TTFont('Futura', 'Futura.ttc'))
page: GRect = GRect(0, 0, letter[1], letter[0]) title = "%s Line Count" % (records['events'][0]['Title'])
page = page.inset(inch * 0.5) filename = title + '.pdf'
title_box, table_box = page.split_y(inch, 'd') doc = make_doc_template(portrait(letter), filename=filename,
document_title=title,
c = NumberedCanvas('%s Line Count.pdf' % records['events'][0]['Title'], pagesize=(letter[1], letter[0])) record=records['events'][0], document_header='Line Count')
c.setFont('Futura', 18.)
c.drawCentredString(title_box.center_x, title_box.center_y, "Line Count")
# page: GRect = GRect(0, 0, letter[1], letter[0])
# page = page.inset(inch * 0.5)
# title_box, table_box = page.split_y(inch, 'd')
#
# c = ReportCanvas('%s Line Count.pdf' % records['events'][0]['Title'], pagesize=(letter[1], letter[0]))
# c.setFont('Futura', 18.)
# c.drawCentredString(title_box.center_x, title_box.center_y, "Line Count")
#
table = Table(data=data, style=style, colWidths=columns_widths) table = Table(data=data, style=style, colWidths=columns_widths)
#
# w, h = table.wrap(table_box.width, table_box.height)
# table.drawOn(canvas=c,
# x=table_box.min_x + table_box.width / 2. - w / 2.,
# y=table_box.max_y - h)
w, h = table.wrap(table_box.width, table_box.height) doc.build([table])
table.drawOn(canvas=c,
x=table_box.min_x + table_box.width / 2. - w / 2.,
y=table_box.max_y - h)
c.showPage() # c.showPage()
c.save() # c.save()

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from .common import GRect, draw_title_block, time_format, NumberedCanvas from .common import GRect, draw_header_footer, time_format, make_doc_template
from reportlab.lib.units import inch from reportlab.lib.units import inch
from reportlab.lib.pagesizes import letter, landscape, portrait from reportlab.lib.pagesizes import letter, landscape, portrait
@@ -86,28 +86,14 @@ def build_story(lines):
def output_report(records): def output_report(records):
page_size = portrait(letter)
page_box = GRect(inch * 0.5, inch * 0.5, page_size[0] - inch, page_size[1] - inch)
title_box, page_box = page_box.split_y(0.875 * inch, 'd')
footer_box, page_box = page_box.split_y(0.25 * inch, 'u')
title_block, header_block = title_box.split_x(inch * 4., direction='r')
pdfmetrics.registerFont(TTFont('Futura', 'Futura.ttc'))
page_template = PageTemplate(id="Main",
frames=[Frame(page_box.min_x, page_box.min_y, page_box.width, page_box.height)],
onPage=lambda canvas, _: draw_title_block(canvas, title_block, lines[0]))
lines = sorted(records['events'], key=lambda line: line['PT.Clip.Start_Seconds']) lines = sorted(records['events'], key=lambda line: line['PT.Clip.Start_Seconds'])
doc = BaseDocTemplate("%s Summary.pdf" % records['events'][0]['Title'], title = "%s ADR Report" % (lines[0]['Title'])
pagesize=page_size, leftMargin=0.5 * inch, filename = title + ".pdf"
rightMargin=0.5 * inch, topMargin=0.5 * inch,
bottomMargin=0.5 * inch)
doc.addPageTemplates([page_template]) doc = make_doc_template(portrait(letter), filename=filename, document_title=title,
record=lines[0], document_header='ADR Report')
story = build_story(lines) story = build_story(lines)
doc.build(story, canvasmaker=NumberedCanvas) doc.build(story)

View File

@@ -9,7 +9,7 @@ from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph from reportlab.platypus import Paragraph
from .common import GRect, draw_title_block from .common import GRect
import datetime import datetime
@@ -200,7 +200,11 @@ def create_report_for_character(records, report_date):
(cue_number_block, timecode_block), reason_block = data_row.divide_x([1.5 * inch, 1.5 * inch]) (cue_number_block, timecode_block), reason_block = data_row.divide_x([1.5 * inch, 1.5 * inch])
(take_grid_block), aux_block = takes_row.split_x(5.25 * inch) (take_grid_block), aux_block = takes_row.split_x(5.25 * inch)
c = Canvas(outfile, pagesize=letter) c = Canvas(outfile, pagesize=letter,)
c.setTitle("%s %s (%s) Supervisor's Log" % (records[0]['Title'], records[0]['Character Name'],
records[0]['Character Number']))
c.setAuthor(records[0]['Supervisor'])
recording_time_sec = 0.0 recording_time_sec = 0.0
total_lines = len(records) total_lines = len(records)
@@ -210,7 +214,8 @@ def create_report_for_character(records, report_date):
recording_time_sec = recording_time_sec + recording_time_sec_this_line recording_time_sec = recording_time_sec + recording_time_sec_this_line
draw_header_block(c, cue_header_block, record) draw_header_block(c, cue_header_block, record)
draw_title_block(c, title_header_block, record) # FIXME: Draw the title
#draw_title_box(c, title_header_block, record)
draw_character_row(c, char_row, record) draw_character_row(c, char_row, record)
draw_cue_number_block(c, cue_number_block, record) draw_cue_number_block(c, cue_number_block, record)
draw_timecode_block(c, timecode_block, record) draw_timecode_block(c, timecode_block, record)

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from .common import GRect, draw_title_block, NumberedCanvas from .common import GRect, draw_header_footer, ReportCanvas, make_doc_template
from reportlab.lib.units import inch from reportlab.lib.units import inch
from reportlab.lib.pagesizes import letter from reportlab.lib.pagesizes import letter
@@ -11,10 +11,10 @@ from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase.ttfonts import TTFont
#
page_box = GRect(inch * 0.5, inch * 0.5, letter[0] - inch, letter[1] - inch) # page_box = GRect(inch * 0.5, inch * 0.5, letter[0] - inch, letter[1] - inch)
title_box, page_box = page_box.split_y(0.875 * inch, 'd') # title_box, page_box = page_box.split_y(0.875 * inch, 'd')
header_block, title_block = title_box.split_x(inch * 4.) # header_block, title_block = title_box.split_x(inch * 4.)
def output_report(records): def output_report(records):
@@ -25,17 +25,14 @@ def output_report(records):
lines = [line for line in records['events'] lines = [line for line in records['events']
if 'Omit' not in line.keys() and line['Character Number'] == n] if 'Omit' not in line.keys() and line['Character Number'] == n]
page_template = PageTemplate(id="Main",
frames=[Frame(page_box.min_x, page_box.min_y, page_box.width, page_box.height)],
onPage=lambda canv, _: draw_title_block(canv, title_block, lines[0]))
sorted(lines, key=lambda line: line['PT.Clip.Start_Seconds']) sorted(lines, key=lambda line: line['PT.Clip.Start_Seconds'])
doc = BaseDocTemplate("%s_%s_%s_Script.pdf" % (lines[0]['Title'], n, lines[0]['Character Name']), title = "%s (%s) %s ADR Script" % (lines[0]['Title'], lines[0]['Character Name'], n)
pagesize=letter, leftMargin=0.5 * inch, filename = "%s_%s_%s_ADR Script.pdf" % (lines[0]['Title'], n, lines[0]['Character Name'])
rightMargin=0.5 * inch, topMargin=0.5 * inch, bottomMargin=0.5 * inch)
doc = make_doc_template(page_size=letter, filename=filename, document_title=title,
record=lines[0], document_header=lines[0]['Character Name'])
doc.addPageTemplates([page_template])
story = [] story = []
prompt_style = getSampleStyleSheet()['Normal'] prompt_style = getSampleStyleSheet()['Normal']
@@ -58,7 +55,7 @@ def output_report(records):
data_block = [[Paragraph(line['Cue Number'], number_style), data_block = [[Paragraph(line['Cue Number'], number_style),
Paragraph(line['PT.Clip.Start'] + " - " + line['PT.Clip.Finish'], number_style) Paragraph(line['PT.Clip.Start'] + " - " + line['PT.Clip.Finish'], number_style)
]] ]]
# RIGHTWARDS ARRO→W # RIGHTWARDS ARROW
# Unicode: U+2192, UTF-8: E2 86 92 # Unicode: U+2192, UTF-8: E2 86 92
story.append( story.append(
KeepTogether( KeepTogether(
@@ -69,4 +66,4 @@ def output_report(records):
) )
) )
doc.build(story, canvasmaker=NumberedCanvas) doc.build(story)