This commit is contained in:
2026-05-05 12:59:44 +02:00
parent 3aab40a35e
commit 0da0241ebf
5 changed files with 496 additions and 0 deletions

View File

@@ -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Å<49>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"}

View File

@@ -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()

View File

@@ -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()