Spaces:
Running
Running
from fpdf import FPDF | |
import tempfile | |
import os | |
import bridgebots | |
from pbn_util import merge_pbn, parse_pbn | |
DEALER_LIST = ['N', 'E', 'S', 'W'] | |
VULNERABILITY_LIST = ["None","NS","EW","All","NS","EW","All","None","EW","All","None","NS","All","None","NS","EW"] | |
SUITS = [bridgebots.Suit.SPADES, bridgebots.Suit.HEARTS, bridgebots.Suit.DIAMONDS, bridgebots.Suit.CLUBS] | |
SUIT_SYMBOLS = ['♠','♥','♦','♣'] | |
def create_hand_record_pdf(pbn_paths): | |
filepath_merged_pbn = merge_pbn(pbn_paths) | |
results = parse_pbn(filepath_merged_pbn) | |
fd,fn = tempfile.mkstemp(".pdf") | |
pdf = FPDF() | |
pdf.add_page() | |
pdf.add_font('times2', style='', fname='times.ttf') | |
pdf.set_font("times2", "", 8) | |
pdf.c_margin = 0.1 | |
table_config = { | |
'borders_layout':'NONE', | |
'col_widths':3, | |
'line_height':pdf.font_size + 0.5, | |
'align': 'L', | |
'text_align': 'L', | |
'first_row_as_headings': False, | |
} | |
start_x,start_y = 10,10 | |
table_size = 45, 48 | |
table_margin = 2 | |
for i, result in enumerate(results): | |
deal = result[0] | |
board_no = int(result[1][0]['Board']) | |
page_i = i % 20 | |
if (i % 20 == 0) and (i != 0): | |
pdf.add_page() | |
row_idx = page_i // 4 | |
col_idx = page_i % 4 | |
x = start_x + (table_size[0] + 2 * table_margin + 1) * col_idx | |
y = start_y + (table_size[1] + 2 * table_margin + 1) * row_idx | |
top_left = x - table_margin, y - table_margin | |
top_right = x + table_size[0] + table_margin, y - table_margin | |
bottom_left = x - table_margin, y + table_size[1] + table_margin | |
bottom_right = x + table_size[0] + table_margin, y + table_size[1] + table_margin | |
pdf.set_xy(x,y) | |
pdf.line(*top_left, *bottom_left) | |
pdf.line(*top_left, * top_right) | |
pdf.line(*top_right, *bottom_right) | |
pdf.line(*bottom_left, *bottom_right) | |
dealer = DEALER_LIST[(board_no-1) % 4] | |
vul = VULNERABILITY_LIST[(board_no-1) % 16] | |
with pdf.table(**table_config) as table: | |
row = table.row() | |
row.cell(f'{board_no}\n{dealer}/{vul}', colspan=6, rowspan=4, align='C', v_align='C') | |
for i, (suit, values) in enumerate(zip(SUIT_SYMBOLS, get_values(deal, 'N'))): | |
if i!=0: | |
row = table.row() | |
print_suit_values(pdf,row,suit,values) | |
row = table.row() | |
# row = table.row() | |
for i, (suit, values1, values2) in enumerate(zip(SUIT_SYMBOLS, get_values(deal, 'W'), get_values(deal, 'E'))): | |
row = table.row() | |
print_suit_values(pdf, row, suit, values1) | |
row.cell('',colspan=5) | |
print_suit_values(pdf, row, suit, values2) | |
row = table.row() | |
row = table.row() | |
row.cell('', colspan=6, rowspan=4) | |
for i, (suit, values) in enumerate(zip(SUIT_SYMBOLS, get_values(deal, 'S'))): | |
if i!=0: | |
row = table.row() | |
print_suit_values(pdf, row, suit, values) | |
pdf.output(fn) | |
return fn | |
def get_values(result, direction): | |
d = bridgebots.Direction.from_str(direction) | |
hand = result.hands[d] | |
return [''.join([value.abbreviation() | |
for value in hand.suits[suit]]) | |
for suit in SUITS] | |
def print_suit_values(pdf, row, suit, values): | |
if (suit=='♥') or (suit=='♦'): # Hearts or Diamonds | |
pdf.set_text_color(255,0,0) | |
row.cell(suit, colspan=1) | |
pdf.set_text_color(0,0,0) | |
row.cell(values, colspan=4) | |