""" Generator PSD - Zaproszenie akrylowe na chrzest (Galazki UV). Makieta A3 ma 4 identyczne scianki (DP, DL, GP, GL) — po 4 zaproszenia na arkusz. Wszystkie zaproszenia wspoldziela dane (imie dziecka, miejsce_data, poczestunek), a roznia sie tylko "od_kogo" (osoba zapraszana) — kazda scianka moze miec inna. Kolejnosc wypelniania: DP -> DL -> GP -> GL. Niewykorzystane scianki zostaja ukryte (visible=False). Jesli --poczestunek nie jest podany, warstwa "poczestunek" jest ukrywana w wykorzystanych sciankach. Dla zamowien z wieksza liczba osob zapraszanych niz 4 — silnik /wygeneruj-projekty wywoluje skrypt N razy (partie po 4) z roznymi nazwami plikow. Wymaga: uruchomiony Adobe Photoshop, photoshop-python-api. """ import argparse import os import sys import photoshop.api as ps PROJEKT_DIR = os.path.join( r"d:\pomysloweprezenty.pl\projekty\chrzest - zaproszenia", "Zaproszenie akrylowe na chrzest z nadrukiem UV - Gałązki", ) SZABLON_PATH = os.path.join(PROJEKT_DIR, "prośba UV - makieta A3.psd") GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe") # Kolejnosc wypelniania zaproszen na A3 SCIANKI = ["DP", "DL", "GP", "GL"] def set_text(layer, new_text): """Zmienia tekst warstwy zachowujac srodek bounding boxa (centrowane warstwy).""" b = [float(x) for x in layer.bounds] cx, cy = (b[0] + b[2]) / 2, (b[1] + b[3]) / 2 layer.textItem.contents = new_text b2 = [float(x) for x in layer.bounds] cx2, cy2 = (b2[0] + b2[2]) / 2, (b2[1] + b2[3]) / 2 dx, dy = cx - cx2, cy - cy2 if dx or dy: layer.translate(dx, dy) def set_layer_text(container, layer_name, new_text): if new_text is None: return layer = container.artLayers[layer_name] old = layer.textItem.contents set_text(layer, new_text) print(f' {layer_name}: "{old[:30]}..." -> "{new_text[:40]}..."') def fill_sciana(sciana_container, imie_dziecka, miejsce_data, poczestunek, od_kogo): tekst = sciana_container.layerSets["Tekst"] set_layer_text(tekst, "imie_dziecka", imie_dziecka) set_layer_text(tekst, "miejsce_data", miejsce_data) set_layer_text(tekst, "od_kogo", od_kogo) if poczestunek: set_layer_text(tekst, "poczestunek", poczestunek) else: tekst.artLayers["poczestunek"].visible = False print(f" poczestunek: ukryte (brak --poczestunek)") def generate(klient, imie_dziecka, miejsce_data, od_kogo_list, poczestunek=None): if not od_kogo_list: print("BLAD: podaj co najmniej jedno --od-kogo") sys.exit(1) if len(od_kogo_list) > 4: print(f"BLAD: max 4 --od-kogo (podano {len(od_kogo_list)})") sys.exit(1) os.makedirs(GOTOWE_DIR, exist_ok=True) output_path = os.path.join(GOTOWE_DIR, f"{klient}.psd") app = ps.Application() doc = app.open(SZABLON_PATH) print(f"Otwarto szablon: {doc.name}") try: for idx, sciana_name in enumerate(SCIANKI): sciana = doc.layerSets[sciana_name] if idx < len(od_kogo_list): print(f" [{sciana_name}] zaproszenie {idx+1}:") sciana.visible = True fill_sciana(sciana, imie_dziecka, miejsce_data, poczestunek, od_kogo_list[idx]) else: print(f" [{sciana_name}] ukryte (brak zaproszenia {idx+1})") sciana.visible = False psd_opts = ps.PhotoshopSaveOptions() doc.saveAs(output_path, psd_opts, True) print(f"Zapisano: {output_path}") finally: app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges) print("Gotowe!") return output_path def main(): parser = argparse.ArgumentParser( description="Generator PSD - Zaproszenie akrylowe na chrzest (Galazki UV)" ) parser.add_argument("--klient", required=True, help="Nazwa pliku wyjsciowego") parser.add_argument("--imie-dziecka", dest="imie_dziecka", required=True, help="Imie dziecka w dopelniaczu (np. 'Teodora')") parser.add_argument("--miejsce-data", dest="miejsce_data", required=True, help='Miejsce i data uroczystosci, wieloliniowe (zwykle: "W dniu DD.MM.RRRR\\ro godzinie HH:MM\\rParafia...")') parser.add_argument("--poczestunek", default=None, help='Info o poczestunku (opcjonalne). Jesli brak - warstwa jest ukrywana.') parser.add_argument("--od-kogo-1", dest="od_kogo_1", required=True, help="1. osoba zapraszana (scianka DP)") parser.add_argument("--od-kogo-2", dest="od_kogo_2", default=None, help="2. osoba zapraszana (scianka DL, opcjonalnie)") parser.add_argument("--od-kogo-3", dest="od_kogo_3", default=None, help="3. osoba zapraszana (scianka GP, opcjonalnie)") parser.add_argument("--od-kogo-4", dest="od_kogo_4", default=None, help="4. osoba zapraszana (scianka GL, opcjonalnie)") args = parser.parse_args() od_kogo_list = [x for x in [args.od_kogo_1, args.od_kogo_2, args.od_kogo_3, args.od_kogo_4] if x] generate( klient=args.klient, imie_dziecka=args.imie_dziecka, miejsce_data=args.miejsce_data, od_kogo_list=od_kogo_list, poczestunek=args.poczestunek, ) if __name__ == "__main__": main()