diff --git a/.paul/governance/governance_2026-05-05.jsonl b/.paul/governance/governance_2026-05-05.jsonl new file mode 100644 index 0000000..70d04f9 --- /dev/null +++ b/.paul/governance/governance_2026-05-05.jsonl @@ -0,0 +1,119 @@ +{"ts":"2026-05-05T06:43:04Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop || echo \"NOT_RUNNING\"\",\"description\":\"Check if Photoshop is running\"},\"tool_response\":{\"stdout\":\"Binary file (s","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:43:22Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_explore_temp.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:43:32Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_explore_temp.py\",\"timeout\":120000,\"description\":\"Run PSD layer exploration\"},\"tool_response\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:43:38Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_explore_temp.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:43:59Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_explore_temp.py\",\"timeout\":180000,\"description\":\"Re-run exploration with kind=17 detection\"},\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:45:37Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_rename_temp.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:45:48Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_rename_temp.py\",\"timeout\":180000,\"description\":\"Rename layers in PSD template\"},\"tool_respons","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:46:20Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:46:34Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzor2.py --imie_pana \"Jan\" --imie_pani \"Maria\" --data \"15.06.2026\" --klient \"TE","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:46:47Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_explore_temp.py\" \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_rename_temp.py\" && ls \"d:/pomysloweprezenty.pl/projekty","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:48:37Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_check_just.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:48:48Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_check_just.py\",\"timeout\":180000,\"description\":\"Check text justification for all text layers\"},","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:49:22Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:49:29Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:49:45Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_check_just.py\" && cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzo","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:50:05Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:50:11Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:50:26Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzor2.py --imie_pana \"Jan\" --imie_pani \"Maria\" --data \"15.06.2026\" --klient \"TE","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:52:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:52:58Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_diag_inicjal.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:53:07Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_diag_inicjal.py\",\"timeout\":180000,\"description\":\"Diagnose inicjal_pani layer properties\"},\"to","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:53:47Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:53:52Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:54:04Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzor2.py --imie_pana \"Jan\" --imie_pani \"Maria\" --data \"15.06.2026\" --klient \"TE","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:54:15Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_diag_inicjal.py\"\",\"description\":\"Cleanup diag script\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:56:48Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_diag2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:56:57Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_diag2.py\",\"timeout\":180000,\"description\":\"Check current state of template PSB\"},\"tool_respons","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:57:36Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_diag3.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T06:58:08Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_diag3.py\",\"timeout\":300000,\"description\":\"Inspect generated PSD all SO copies\"},\"tool_respons","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:00:03Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_fix_inicjal.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:00:10Z","tool":"Bash","cmd":"cp \"d:/pomysloweprezenty.pl/projekty/ślub - buteleczki/Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - Wzór 2/szablon 370x300.psd\" \"d:/pomysloweprezenty.pl/projekty/ślub - butele","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:00:22Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_fix_inicjal.py\",\"timeout\":300000,\"description\":\"Fix template by rebuilding inicjal_pani layer\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:00:59Z","tool":"Bash","cmd":"cp \"d:/pomysloweprezenty.pl/projekty/ślub - buteleczki/Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - Wzór 2/szablon 370x300.BACKUP.psd\" \"d:/pomysloweprezenty.pl/projekty/ślub -","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:01:37Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:01:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:01:54Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_diag2.py\" \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_diag3.py\" \"C:/visual studio code/projekty/orderPRO/tools/gener","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:03:36Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzor2.py --imie_pana \"Jan\" --imie_pani \"Maria\" --data \"15.06.2026\" --klient \"TE","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:05:59Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_diag.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:06:10Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_diag.py\",\"timeout\":300000,\"description\":\"Compare template vs generated bounds\"},\"tool_respons","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:06:52Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:07:20Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_close_all.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:07:26Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_close_all.py\",\"timeout\":60000,\"description\":\"Close all PS docs\"},\"tool_response\":{\"stdout\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:07:38Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzor2.py --imie_pana \"Jan\" --imie_pani \"Maria\" --data \"15.06.2026\" --klient \"TE","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:08:40Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:08:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:09:00Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_diag.py\" \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_close_all.py\" 2>/dev/null; cd \"C:/visual studio code/projekty/o","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:10:48Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\.claude\\\\projects\\\\C--visual-studio-code-projekty-orderPRO\\\\memory\\\\feedback_psd_text_zero_bounds_fallback.md","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:10:57Z","tool":"Edit","file":"C:\\\\Users\\\\jacek\\\\.claude\\\\projects\\\\C--visual-studio-code-projekty-orderPRO\\\\memory\\\\MEMORY.md","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:11:53Z","tool":"Bash","cmd":"mysql -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' host700513_orderpro -e \"SELECT id, product_name_pattern, script_name, is_active FROM project_mappings WHERE script_n","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:12:01Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' host700513_orderpro -e \"SELECT id, product_name_pattern, script_name, is_active FROM proj","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:12:11Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_insert_mapping.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:12:17Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:12:25Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_insert_mapping.sql\"\",\"description\":\"Cleanup SQL file\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:15:00Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_query.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:15:08Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:15:18Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/email_message_fetcher.py --email \"d.kosinska.d@gmail.com\" --days 60 --json 2>&1 | head -50\",\"timeout\":120000,\"descripti","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:15:22Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop || echo \"NOT_RUNNING\"\",\"description\":\"Check Photoshop running\"},\"tool_response\":{\"stdout\":\"Binary file (standar","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:15:48Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/buteleczki_slub_wzor2.py --imie_pana \"Erdim\" --imie_pani \"Diana\" --data \"25.07.2026\" --klient \"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:16:01Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_update.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:16:10Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:18:22Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_reset.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:18:39Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:18:49Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_update.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:18:56Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:21:44Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_query.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:21:52Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:22:04Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/email_message_fetcher.py --email \"zosiajechna2@gmail.com\" --days 60 --json 2>&1 | head -20\",\"timeout\":120000,\"descripti","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:22:07Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop || echo \"NOT_RUNNING\"\",\"description\":\"Check Photoshop\"},\"tool_response\":{\"stdout\":\"Binary file (standard input)","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:22:51Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/prosba_chrzestny_zlota_plexi_uv.py --klient \"Zosia Jechna\" --imie-dziecka \"Lidia\" --ojciec-wolacz ","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:22:58Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_update.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:23:06Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:24:48Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\.claude\\\\projects\\\\C--visual-studio-code-projekty-orderPRO\\\\memory\\\\feedback_prosba_chrzestny_tresc_default.md","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:24:56Z","tool":"Edit","file":"C:\\\\Users\\\\jacek\\\\.claude\\\\projects\\\\C--visual-studio-code-projekty-orderPRO\\\\memory\\\\MEMORY.md","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:25:12Z","tool":"Bash","cmd":"rm \"d:/pomysloweprezenty.pl/projekty/chrzest - prośby o bycie chrzestnym/złota plexi z nadrukiem UV/_gotowe/Zosia Jechna.psd\" 2>/dev/null; cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONI","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:26:27Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_query.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:26:36Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:26:58Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/email_message_fetcher.py --email \"agaszymczak@interia.eu\" --days 60 --json 2>&1 | head -20\",\"timeout\":120000,\"descripti","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:28:13Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_close.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:28:27Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_explore_template.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:28:38Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/_close.py && PYTHONIOENCODING=utf-8 python tools/generowanie/_explore_template.py\",\"timeout\":300000","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:29:07Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_close.py\" \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_explore_template.py\" \"C:/visual studio code/projekty/orderPRO/","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:29:24Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_update.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:29:34Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:31:43Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_query.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:31:52Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:32:00Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/email_message_fetcher.py --email \"kamachi3005@wp.pl\" --days 60 --json 2>&1 | head -20\",\"timeout\":120000,\"description\":","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:32:42Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_query.sql\"; cd \"C:/visual studio code/projekty/orderPRO\" && PYTHONIOENCODING=utf-8 python tools/generowanie/pudelko_komunia_chlopiec.","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:32:47Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_update.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T07:32:58Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' --default-character-set=utf8mb4 host700513_orderpro < \"C:/visual studio code/projekty/ord","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:25:18Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>&1 | head -20\",\"description\":\"Check if Photoshop is running\"},\"tool_response\":{\"stdout\":\"INFO: No tasks are running which match the specified c","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:25:31Z","tool":"Bash","cmd":"\"/c/Program Files/Adobe/Adobe Photoshop 2026/Photoshop.exe\" &\",\"description\":\"Start Photoshop\",\"run_in_background\":true},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":fal","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:25:47Z","tool":"Bash","cmd":"until tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>&1 | grep -qi photoshop; do sleep 2; done; sleep 8; echo \"Photoshop ready\"\",\"timeout\":60000,\"description\":\"Wait for Photoshop to fully load","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:26:11Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\explore_psd.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:26:21Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/Users/jacek/AppData/Local/Temp/explore_psd.py\" 2>&1\",\"timeout\":120000,\"description\":\"Explore PSD layer structure\"},\"tool_response\":{\"stdout\":\"=== TOP LE","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:38:47Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\rename_layers.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:38:54Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/Users/jacek/AppData/Local/Temp/rename_layers.py\" 2>&1\",\"timeout\":120000,\"description\":\"Rename PSD layers\"},\"tool_response\":{\"stdout\":\"rename: \"MIŁOŚ","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:39:39Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\akrylowa_statuetka_podziekowanie_rodzice_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:39:55Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/visual studio code/projekty/orderPRO/tools/generowanie/akrylowa_statuetka_podziekowanie_rodzice_wzor2.py\" --klient \"TEST_Nowak\" --para \"Anna i Piotr\" --data \"1","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:41:54Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/visual studio code/projekty/orderPRO/tools/generowanie/akrylowa_statuetka_podziekowanie_rodzice_wzor2.py\" --klient \"TEST_Kowalski\" --para \"Magda i Tomek\" --data","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:43:01Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\explore_psd2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:43:08Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/Users/jacek/AppData/Local/Temp/explore_psd2.py\" 2>&1\",\"timeout\":120000,\"description\":\"Re-explore PSD with bounds and visibility\"},\"tool_response\":{\"stdout","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:45:12Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\convert_so.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:45:20Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/Users/jacek/AppData/Local/Temp/convert_so.py\" 2>&1\",\"timeout\":120000,\"description\":\"Convert pixel layer to Smart Object\"},\"tool_response\":{\"stdout\":\"Wyb","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:45:32Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/Users/jacek/AppData/Local/Temp/explore_psd2.py\" 2>&1\",\"timeout\":120000,\"description\":\"Re-verify structure after SO conversion\"},\"tool_response\":{\"stdout\"","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:46:17Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\akrylowa_statuetka_podziekowanie_rodzice_wzor2.py","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:46:30Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python \"C:/visual studio code/projekty/orderPRO/tools/generowanie/akrylowa_statuetka_podziekowanie_rodzice_wzor2.py\" --klient \"TEST_BezZdjecia\" --para \"Anna i Piotr\" --dat","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:51:58Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\add_mapping.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:52:05Z","tool":"Bash","cmd":"\"/c/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -phrDNtUBg9grwZ7syN77S host700513_orderpro --default-character-set=utf8mb4 < \"C:/Users/jacek/AppData/Local/Temp/ad","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:53:57Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\find_orders.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:54:11Z","tool":"Bash","cmd":"\"/c/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -phrDNtUBg9grwZ7syN77S host700513_orderpro --default-character-set=utf8mb4 < \"C:/Users/jacek/AppData/Local/Temp/fi","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:54:39Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>&1 | grep -i photoshop | head -1\",\"description\":\"Verify Photoshop running\"},\"tool_response\":{\"stdout\":\"Binary file (standard input) matches\",\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:54:45Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\fix_mapping.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:54:53Z","tool":"Bash","cmd":"\"/c/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -phrDNtUBg9grwZ7syN77S host700513_orderpro --default-character-set=utf8mb4 < \"C:/Users/jacek/AppData/Local/Temp/fi","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:55:00Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python tools/generowanie/email_message_fetcher.py --email \"gabitoja7@gmail.com\" --days 60 --json 2>&1\",\"timeout\":90000,\"description\":\"Check email messages from customer\","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:55:08Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python tools/generowanie/email_photo_fetcher.py --email \"gabitoja7@gmail.com\" --out \"C:/tmp/orderpro_photos\" --days 365 2>&1\",\"timeout\":120000,\"description\":\"Fetch pho","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:55:54Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python -c \"\\nimport subprocess\\nphoto = r'C:/tmp/orderpro_photos/gabitoja7@gmail.com_20260505105507_att.oLjoJ73dSdFX1oPNWDqwErwrQ1BED8mETGE-aer23Xg.jpeg'\\ntresc1 = 'Z całeg","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:56:17Z","tool":"Bash","cmd":"PYTHONIOENCODING=utf-8 python -c \"\\nimport subprocess\\nphoto = r'C:/tmp/orderpro_photos/gabitoja7@gmail.com_20260505105507_att.oLjoJ73dSdFX1oPNWDqwErwrQ1BED8mETGE-aer23Xg.jpeg'\\ntresc2 = 'Dziękuj","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:56:24Z","tool":"Write","file":"C:\\\\Users\\\\jacek\\\\AppData\\\\Local\\\\Temp\\\\mark_generated.sql","cwd":"/c/visual studio code/projekty/orderPRO"} +{"ts":"2026-05-05T08:56:33Z","tool":"Bash","cmd":"\"/c/xampp/mysql/bin/mysql.exe\" -h host700513.hostido.net.pl -u host700513_orderpro -phrDNtUBg9grwZ7syN77S host700513_orderpro --default-character-set=utf8mb4 < \"C:/Users/jacek/AppData/Local/Temp/ma","cwd":"/c/visual studio code/projekty/orderPRO"} diff --git a/tools/generowanie/__pycache__/_pudelko_komunia_core.cpython-312.pyc b/tools/generowanie/__pycache__/_pudelko_komunia_core.cpython-312.pyc index 8f19521..d96b322 100644 Binary files a/tools/generowanie/__pycache__/_pudelko_komunia_core.cpython-312.pyc and b/tools/generowanie/__pycache__/_pudelko_komunia_core.cpython-312.pyc differ diff --git a/tools/generowanie/__pycache__/email_photo_fetcher.cpython-312.pyc b/tools/generowanie/__pycache__/email_photo_fetcher.cpython-312.pyc index 13035b9..46af539 100644 Binary files a/tools/generowanie/__pycache__/email_photo_fetcher.cpython-312.pyc and b/tools/generowanie/__pycache__/email_photo_fetcher.cpython-312.pyc differ diff --git a/tools/generowanie/akrylowa_statuetka_podziekowanie_rodzice_wzor2.py b/tools/generowanie/akrylowa_statuetka_podziekowanie_rodzice_wzor2.py new file mode 100644 index 0000000..669abf2 --- /dev/null +++ b/tools/generowanie/akrylowa_statuetka_podziekowanie_rodzice_wzor2.py @@ -0,0 +1,173 @@ +""" +Generator PSD - Akrylowa statuetka podziekowanie dla Rodzicow ze zdjeciem (Wzor 2). + +Plaska struktura PSD: w grupie "Projekt" znajduja sie: +- warstwy tekstowe: naglowek, tresc, para, data, motto +- Smart Object zdjecia: zdjecie (clipping mask do warstwy ponizej) + +Podmiana zdjecia: +- jesli --zdjecie wskazuje na istniejacy plik graficzny -> zostaje wstawione, + przeskalowane "cover" do oryginalnych boundsow placeholdera i wycentrowane +- jesli zdjecie nie zostalo podane lub plik nie istnieje -> wstawiamy + zielony prostokat (#00FF00) jako sygnal, ze klient nie przeslal foto + +Wymaga: uruchomiony Adobe Photoshop, photoshop-python-api, Pillow. +""" + +import argparse +import os +import photoshop.api as ps + + +PROJEKT_DIR = os.path.join( + r"d:\pomysloweprezenty.pl\projekty\ślub - podziękowania", + "Akrylowa statuetka podziękowanie dla rodziców ze zdjęciem - Wzór 2", +) +SZABLON_PATH = os.path.join(PROJEKT_DIR, "Akrylowa statuetka podziękowanie dla rodziców ze zdjęciem - Wzór 2.psd") +GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe") + +ASSETS_DIR = os.path.join(os.path.dirname(__file__), "_assets") +GREEN_PLACEHOLDER_PATH = os.path.join(ASSETS_DIR, "green_placeholder.png") + +PHOTO_SLOT = "zdjecie" + + +def ensure_green_placeholder(): + """Tworzy raz zielony PNG (#00FF00) jako placeholder dla brakujacego zdjecia.""" + if os.path.exists(GREEN_PLACEHOLDER_PATH): + return GREEN_PLACEHOLDER_PATH + os.makedirs(ASSETS_DIR, exist_ok=True) + from PIL import Image + Image.new("RGB", (1000, 1000), (0, 255, 0)).save(GREEN_PLACEHOLDER_PATH) + return GREEN_PLACEHOLDER_PATH + + +def set_text(layer, new_text): + """Zmienia tekst 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}" -> "{new_text}"') + + +def replace_smart_object_contents(app, file_path): + """Wykonuje akcje placedLayerReplaceContents na aktywnej warstwie SO.""" + desc = ps.ActionDescriptor() + desc.putPath(app.charIDToTypeID("null"), file_path) + desc.putInteger(app.charIDToTypeID("PgNm"), 1) + app.executeAction(app.stringIDToTypeID("placedLayerReplaceContents"), desc) + + +def replace_photo_cover(app, so_layer, photo_path): + """Podmienia zawartosc Smart Object i skaluje 'cover' do oryginalnych boundsow.""" + target = [float(x) for x in so_layer.bounds] + target_w = target[2] - target[0] + target_h = target[3] - target[1] + target_cx = (target[0] + target[2]) / 2 + target_cy = (target[1] + target[3]) / 2 + + app.activeDocument.activeLayer = so_layer + replace_smart_object_contents(app, photo_path) + + new_b = [float(x) for x in so_layer.bounds] + new_w = new_b[2] - new_b[0] + new_h = new_b[3] - new_b[1] + if new_w <= 0 or new_h <= 0: + return + + scale = max(target_w / new_w, target_h / new_h) * 100.0 + so_layer.resize(scale, scale, ps.AnchorPosition.MiddleCenter) + + cur = [float(x) for x in so_layer.bounds] + cur_cx = (cur[0] + cur[2]) / 2 + cur_cy = (cur[1] + cur[3]) / 2 + so_layer.translate(target_cx - cur_cx, target_cy - cur_cy) + + +def swap_photo_slot(app, container, slot_name, photo_path): + """Podmienia zdjecie w slocie; brak/nieistnieje -> zielony placeholder.""" + so_layer = container.artLayers[slot_name] + if photo_path and os.path.isfile(photo_path): + print(f" {slot_name}: {photo_path}") + replace_photo_cover(app, so_layer, photo_path) + else: + if photo_path: + print(f" {slot_name}: UWAGA plik nie istnieje ({photo_path}) - zielony placeholder") + else: + print(f" {slot_name}: brak - zielony placeholder") + replace_photo_cover(app, so_layer, ensure_green_placeholder()) + + +def generate(klient, para, data, tresc=None, naglowek=None, motto=None, zdjecie=None): + 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: + projekt = doc.layerSets["Projekt"] + + print(" Podmiana tekstow:") + set_layer_text(projekt, "naglowek", naglowek) + set_layer_text(projekt, "tresc", tresc) + set_layer_text(projekt, "para", para) + set_layer_text(projekt, "data", data) + set_layer_text(projekt, "motto", motto) + + print(" Podmiana zdjecia:") + swap_photo_slot(app, projekt, PHOTO_SLOT, zdjecie) + + psd_opts = ps.PhotoshopSaveOptions() + doc.saveAs(output_path, psd_opts, True) + print(f"Zapisano: {output_path}") + finally: + try: + doc.close(ps.SaveOptions.DoNotSaveChanges) + except Exception: + pass + + print("Gotowe!") + return output_path + + +def main(): + parser = argparse.ArgumentParser( + description="Generator PSD - Akrylowa statuetka podziekowanie dla Rodzicow Wzor 2" + ) + parser.add_argument("--klient", required=True, help="Nazwa pliku wyjsciowego (bez rozszerzenia)") + parser.add_argument("--para", required=True, help="Imiona pary mlodej (np. 'Klaudia i Marcin')") + parser.add_argument("--data", required=True, help="Data uroczystosci (np. '04.10.2025')") + parser.add_argument("--tresc", default=None, help="Tresc podziekowania (opcjonalnie, domyslnie z szablonu)") + parser.add_argument("--naglowek", default=None, help="Naglowek (opcjonalnie, domyslnie 'Kochani Rodzice!')") + parser.add_argument("--motto", default=None, help="Motto (opcjonalnie)") + parser.add_argument("--zdjecie", default=None, help="Sciezka do zdjecia (opcjonalnie; brak = zielony placeholder)") + + args = parser.parse_args() + generate( + klient=args.klient, + para=args.para, + data=args.data, + tresc=args.tresc, + naglowek=args.naglowek, + motto=args.motto, + zdjecie=args.zdjecie, + ) + + +if __name__ == "__main__": + main() diff --git a/tools/generowanie/buteleczki_slub_wzor2.py b/tools/generowanie/buteleczki_slub_wzor2.py new file mode 100644 index 0000000..0bb69da --- /dev/null +++ b/tools/generowanie/buteleczki_slub_wzor2.py @@ -0,0 +1,204 @@ +""" +Generator PSD - Podziekowanie dla gosci weselnych (buteleczka, Wzor 2). + +Otwiera szablon PSD, podmienia teksty w Smart Object "Projekt" +z zachowaniem pozycji warstw, zapisuje jako nowy PSD w folderze _gotowe. + +Wszystkie 8 warstw w szablonie to linkowane kopie tego samego Smart Object, +wiec edycja w "Projekt" propaguje sie automatycznie na pozostale buteleczki. + +Wymaga: uruchomiony Adobe Photoshop, pakiet photoshop-python-api. + +Uzycie: + python buteleczki_slub_wzor2.py --imie_pana "Piotr" --imie_pani "Anna" \ + --data "12.12.2024" --klient "Anna Kowalska" + + python buteleczki_slub_wzor2.py --imie_pana "Piotr" --imie_pani "Anna" \ + --inicjal_pana "P" --inicjal_pani "A" --data "12.12.2024" \ + --tekst "Dziekujemy!" --klient "Anna Kowalska" +""" + +import argparse +import os +import photoshop.api as ps + + +# --- Sciezki --- +PROJEKT_DIR = os.path.join( + r"d:\pomysloweprezenty.pl\projekty\ślub - buteleczki", + "Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - Wzór 2", +) +SZABLON_PATH = os.path.join(PROJEKT_DIR, "szablon 370x300.psd") +GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe") + +# Nazwa warstwy Smart Object w glownym PSD (jeden z 8 - edycja propaguje na wszystkie) +SMART_OBJECT_LAYER = "Projekt" + + +def open_smart_object(app): + """Otwiera zawartosc aktywnej warstwy Smart Object do edycji.""" + desc = ps.ActionDescriptor() + ref = ps.ActionReference() + ref.putEnumerated( + app.stringIDToTypeID("layer"), + app.stringIDToTypeID("ordinal"), + app.stringIDToTypeID("targetEnum"), + ) + desc.putReference(app.stringIDToTypeID("null"), ref) + app.executeAction(app.stringIDToTypeID("placedLayerEditContents"), desc) + + +def change_text_preserve_position(layer, new_text): + """Zmienia tekst warstwy z zachowaniem oryginalnej pozycji. + + Zwraca (dx, dy, ok) gdzie ok=False oznacza ze bounds_after=(0,0,0,0) + (warstwa poza canvas SO po zmianie tekstu - delta nieuzyteczna). + """ + bounds_before = [float(b) for b in layer.bounds] + layer.textItem.contents = new_text + bounds_after = [float(b) for b in layer.bounds] + + if bounds_after == [0.0, 0.0, 0.0, 0.0]: + return (None, None, False) + + dx = bounds_before[0] - bounds_after[0] + dy = bounds_before[1] - bounds_after[1] + if dx != 0 or dy != 0: + layer.translate(dx, dy) + return (dx, dy, True) + + +def apply_replacements(group, replacements): + """Podmienia teksty w grupie warstw z fallbackiem dla warstw gubiacych bounds. + + Photoshop po zmianie textItem.contents potrafi przeniesc warstwe + poza canvas SO (bounds=0). Wykrywamy to i kompensujemy srednia delta + z poprawnie obsluzonych warstw - przesuniecie jest systematyczne. + """ + deltas = [] + pending = [] + + for layer_name, new_text in replacements.items(): + layer = group.artLayers[layer_name] + old_text = layer.textItem.contents + dx, dy, ok = change_text_preserve_position(layer, new_text) + if ok: + deltas.append((dx, dy)) + print(f' {layer_name}: "{old_text}" -> "{new_text}"') + else: + pending.append((layer_name, layer, old_text, new_text)) + print(f' {layer_name}: "{old_text}" -> "{new_text}" (poza canvas, fallback)') + + if pending: + if not deltas: + raise RuntimeError("Wszystkie warstwy poza canvas - brak referencji do fallbacku") + avg_dx = sum(d[0] for d in deltas) / len(deltas) + avg_dy = sum(d[1] for d in deltas) / len(deltas) + for layer_name, layer, _old, _new in pending: + layer.translate(avg_dx, avg_dy) + print(f' [{layer_name}] fallback translate ({avg_dx:.2f},{avg_dy:.2f})') + + +def generate( + imie_pana, + imie_pani, + data, + klient, + inicjal_pana=None, + inicjal_pani=None, + tekst=None, +): + """Generuje PSD z podmienionymi danymi.""" + os.makedirs(GOTOWE_DIR, exist_ok=True) + output_path = os.path.join(GOTOWE_DIR, f"{klient}.psd") + + # Auto-inicjaly z imion jesli nie podane + if inicjal_pana is None: + inicjal_pana = imie_pana[:1].upper() if imie_pana else "" + if inicjal_pani is None: + inicjal_pani = imie_pani[:1].upper() if imie_pani else "" + + app = ps.Application() + doc = app.open(SZABLON_PATH) + print(f"Otwarto szablon: {doc.name}") + + target = None + for layer in doc.layers: + if layer.name == SMART_OBJECT_LAYER: + target = layer + break + + if target is None: + doc.close(ps.SaveOptions.DoNotSaveChanges) + raise RuntimeError(f"Nie znaleziono warstwy '{SMART_OBJECT_LAYER}'") + + app.activeDocument.activeLayer = target + open_smart_object(app) + so_doc = app.activeDocument + + # Nawigacja do grupy z tekstami (po renamie: "Tekst") + tekst_group = so_doc.layerSets["Tekst"] + + replacements = { + "imie_pana": imie_pana, + "imie_pani": imie_pani, + "inicjal_pana": inicjal_pana, + "inicjal_pani": inicjal_pani, + "data": data, + } + if tekst is not None: + replacements["tekst"] = tekst + + apply_replacements(tekst_group, replacements) + + so_doc.save() + so_doc.close() + print("Smart Object zapisany") + + psd_opts = ps.PhotoshopSaveOptions() + app.activeDocument.saveAs(output_path, psd_opts, True) + print(f"Zapisano: {output_path}") + + app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges) + print("Gotowe!") + return output_path + + +def main(): + parser = argparse.ArgumentParser( + description="Generator PSD - buteleczki weselne Wzor 2" + ) + parser.add_argument("--imie_pana", required=True, help="Imie pana mlodego (np. Piotr)") + parser.add_argument("--imie_pani", required=True, help="Imie pani mlodej (np. Anna)") + parser.add_argument("--data", required=True, help="Data slubu (np. 12.12.2024)") + parser.add_argument("--klient", required=True, help="Nazwa pliku wyjsciowego (bez .psd)") + parser.add_argument( + "--inicjal_pana", + default=None, + help="Inicjal pana mlodego (domyslnie: pierwsza litera --imie_pana)", + ) + parser.add_argument( + "--inicjal_pani", + default=None, + help="Inicjal pani mlodej (domyslnie: pierwsza litera --imie_pani)", + ) + parser.add_argument( + "--tekst", + default=None, + help="Tekst podziekowania (domyslnie: oryginalny z szablonu)", + ) + + args = parser.parse_args() + generate( + imie_pana=args.imie_pana, + imie_pani=args.imie_pani, + data=args.data, + klient=args.klient, + inicjal_pana=args.inicjal_pana, + inicjal_pani=args.inicjal_pani, + tekst=args.tekst, + ) + + +if __name__ == "__main__": + main()