генерация иконки и сплэша

By Пользователь Google · Published July 23, 2026

Генерирует PNG-ассеты (иконка и логотип сплэша) с золотой короной на тёмном фоне для приложения Царь-Путь.

  • image-generation
  • pillow
  • ui-assets
  • flutter
7 cells1 experiment1 views0 forks

Inside this notebook

# Генерация царских ассетов: золотая корона на тёмном фоне.
# Создаёт 3 PNG в /home/user/assets/... (авто-сохранятся в outputs):
#   icon/crown_icon.png        — иконка (корона на #0D0D0D)
#   icon/crown_foreground.png  — адаптивный передний план (корона на прозрачном)
#   splash/crown_logo.png      — логотип сплэш-экрана (корона на прозрачном)
%pip install -q Pillow
import os
from PIL import Image, ImageDraw

# фирменные цвета «Царский софт»
BG      = (13, 13, 13, 255)      # #0D0D0D
GOLD    = (212, 175, 55, 255)    # #D4AF37
GOLD_DK = (150, 118, 38, 255)    # тёмное золото (контур)
GOLD_LT = (241, 220, 133, 255)   # светлое золото (блики/камни)
RED     = (139, 0, 0, 255)       # #8B0000 (царский бархат)
RING    = (107, 86, 24, 255)     # приглушённое золото для медальона

# локальные координаты короны (центр ~ (0,0)); y вниз
…
# Точный анализатор Dart: считает скобки ТОЛЬКО в коде (строки/комментарии вырезаются).
# Это отвечает на вопрос, скомпилируется ли файл (а не на «сколько скобок в тексте отзывов»).
src = open('main.dart', encoding='utf-8').read()

i, n = 0, len(src)
code = []
while i < n:
    c = src[i]
    nxt = src[i + 1] if i + 1 < n else ''
    if c == '/' and nxt == '/':                 # line comment
        while i < n and src[i] != '\n':
            i += 1
        continue
    if c == '/' and nxt == '*':                 # block comment
        i += 2
        while i < n - 1 and not (src[i] == '*' and src[i + 1] == '/'):
            i += 1
        i += 2
…
=== БАЛАНС СКОБОК В КОДЕ (строки/комментарии исключены) ===
  {}: open= 449  close= 449  OK
  (): open=3250  close=3250  OK
  []: open= 305  close= 305  OK
  depth {}: итог=0, мин. глубина=0 (должна быть >=0)
  depth (): итог=0, мин. глубина=0 (должна быть >=0)
  depth []: итог=0, мин. глубина=0 (должна быть >=0)

ВЕРДИКТ: ✅ код структурно корректен
# Служебная ячейка: здесь агент собирает итоговый main.dart v1.2 (конструктор мультимодальных маршрутов).
# Сам файл отдаётся через write_file в outputs; эта ячейка — рабочий блокнот-контекст проекта.
print("Царь-Путь v1.2 — сборка интерактивного конструктора карты…")
# Проверка эмодзи транспорта и семантических мелочей v1.2 (обход shell-кодировки).
src = open('main.dart', encoding='utf-8').read()

print("=== ЭМОДЗИ ТРАНСПОРТА В ФАЙЛЕ ===")
for name, e in [("Самолёт","✈️"),("Паром","⛴️"),("Авто","🚗"),("Поезд","🚆"),("Пешком","🥾")]:
    print(f"  {name:9s} {e} : {src.count(e)}")

print("\n=== СЕМАНТИЧЕСКИЕ ПРОВЕРКИ ===")
checks = {
  "enum DashStyle (5 стилей)": all(s in src for s in ["solid","dashed","dotted","dashDot","rail"]),
  "enum PointKind (warning есть)": "enum PointKind { hotel, food, sight, warning }" in src,
  "enum Transport (5 типов)": "enum Transport { plane, ferry, car, train, walk }" in src,
  "RoutePoint.copyWith": "RoutePoint copyWith(" in src,
  "painter shouldRepaint": "bool shouldRepaint(covariant RouteMapPainter old)" in src,
  "RoutePoint в TravelRoute.toJson": "'routePoints': routePoints.map((e) => e.toJson()).toList()" in src,
  "TravelRoute.fromJson парсит routePoints": "RoutePoint.fromJson(e as Map<String, dynamic>)" in src,
  "демо r6 мультимодальный": "legFromPrev: Transport.plane" in src and "legFromPrev: Transport.train" in src,
  "демо r6 предупреждение": "kind: PointKind.warning" in src,
…
=== ЭМОДЗИ ТРАНСПОРТА В ФАЙЛЕ ===
  Самолёт   ✈️ : 4
  Паром     ⛴️ : 1
  Авто      🚗 : 4
  Поезд     🚆 : 4
  Пешком    🥾 : 4

=== СЕМАНТИЧЕСКИЕ ПРОВЕРКИ ===
  [OK] enum DashStyle (5 стилей)
  [OK] enum PointKind (warning есть)
  [OK] enum Transport (5 типов)
  [OK] RoutePoint.copyWith
  [OK] painter shouldRepaint
  [OK] RoutePoint в TravelRoute.toJson
  [OK] TravelRoute.fromJson парсит routePoints
  [OK] демо r6 мультимодальный
  [OK] демо r6 предупреждение
  [OK] конструктор возвращает List…
# Семантическая проверка Царь-Путь v2.0 (i18n, paywall, мат.движок, облако).
src = open('main.dart', encoding='utf-8').read()

checks = {
  # i18n
  "enum AppLang {ru,en}": "enum AppLang { ru, en }" in src,
  "langNotifier (ValueNotifier)": "final langNotifier = ValueNotifier<AppLang>(AppLang.ru)" in src,
  "t(ru,en) функция": "String t(String ru, String en)" in src,
  "LangToggle виджет": "class LangToggle extends StatelessWidget" in src,
  "ValueListenableBuilder в TsarPutApp": "valueListenable: langNotifier" in src,
  # paywall
  "premiumNotifier": "final premiumNotifier = ValueNotifier<bool>(false)" in src,
  "freePointLimit = 3": "const int freePointLimit = 3" in src,
  "PaywallSheet": "class PaywallSheet extends StatefulWidget" in src,
  "ensurePremium()": "Future<bool> ensurePremium(BuildContext context)" in src,
  "Т-Банк / ЮКасса": "Т-Банк / ЮКасса" in src,
  "setPremium persist": "Future<void> setPremium(bool v)" in src,
  # math engine
…
[OK] enum AppLang {ru,en}
  [OK] langNotifier (ValueNotifier)
  [OK] t(ru,en) функция
  [OK] LangToggle виджет
  [OK] ValueListenableBuilder в TsarPutApp
  [OK] premiumNotifier
  [OK] freePointLimit = 3
  [OK] PaywallSheet
  [OK] ensurePremium()
  [OK] Т-Банк / ЮКасса
  [OK] setPremium persist
  [OK] RouteMath класс
  [OK] speedKmh (5 транспортов)
  [OK] legKm/legHours
  [OK] totalKm/totalHours
  [OK] fmtDuration
  [OK] tsarIdNotifier
  [OK] TsarIdSheet
  [OK] openTsarId()
  [OK] Царь-Казна эксп…
# Семантическая проверка интеграции flutter_map (REAL MAP) в Царь-Путь v2.0.
import re
src = open('main.dart', encoding='utf-8').read()

checks = {
  # импорты
  "import flutter_map": "import 'package:flutter_map/flutter_map.dart';" in src,
  "import latlong2": "import 'package:latlong2/latlong.dart';" in src,
  # модель: реальные координаты
  "RoutePoint.lat": "final double? lat;" in src,
  "RoutePoint.lon": "final double? lon;" in src,
  "RoutePoint.hasGeo": "bool get hasGeo => lat != null && lon != null;" in src,
  "lat/lon в toJson": "'lat': lat" in src and "'lon': lon" in src,
  # гео-хелперы
  "checkMapOnline()": "Future<bool> checkMapOnline()" in src,
  "пинг тайла OSM": "https://tile.openstreetmap.org/0/0/0.png" in src,
  "withSchematic()": "List<RoutePoint> withSchematic(" in src,
  "_fitZoom()": "double _fitZoom(" in src,
…
[OK] import flutter_map
  [OK] import latlong2
  [OK] RoutePoint.lat
  [OK] RoutePoint.lon
  [OK] RoutePoint.hasGeo
  [OK] lat/lon в toJson
  [OK] checkMapOnline()
  [OK] пинг тайла OSM
  [OK] withSchematic()
  [OK] _fitZoom()
  [OK] _centerOf()
  [OK] haversine (_haversineKm)
  [OK] OsmMapLayer
  [OK] GeoRouteMap
  [OK] PointInfoCard
  [OK] FlutterMap(
  [OK] MapOptions(initialCenter
  [OK] TileLayer urlTemplate OSM
  [OK] userAgentPackageName
  [OK] errorTileCallback
  [OK] ErrorTileCallBack с…
# Семантическая проверка v3.0 (QR/PDF, голос, погода, гео-фото) в Царь-Путь.
import re
src = open('main.dart', encoding='utf-8').read()

checks = {
  # импорты новых пакетов
  "import exif": "import 'package:exif/exif.dart';" in src,
  "import image_picker": "import 'package:image_picker/image_picker.dart';" in src,
  "import pdf": "import 'package:pdf/pdf.dart';" in src,
  "import pdf/widgets as pw": "import 'package:pdf/widgets.dart' as pw;" in src,
  "import printing": "import 'package:printing/printing.dart';" in src,
  "import qr_flutter": "import 'package:qr_flutter/qr_flutter.dart';" in src,
  "import speech_to_text": "import 'package:speech_to_text/speech_to_text.dart';" in src,
  "import dart:typed_data": "import 'dart:typed_data';" in src,
  "НЕТ dart:io (Web-safe)": "import 'dart:io'" not in src,
  # модель фото
  "PhotoRecord класс": "class PhotoRecord {" in src,
  "RoutePoint.photos": "final List<PhotoRecord> photos;" in src,
…
[OK] import exif
  [OK] import image_picker
  [OK] import pdf
  [OK] import pdf/widgets as pw
  [OK] import printing
  [OK] import qr_flutter
  [OK] import speech_to_text
  [OK] import dart:typed_data
  [OK] НЕТ dart:io (Web-safe)
  [OK] PhotoRecord класс
  [OK] RoutePoint.photos
  [OK] freePhotoLimit = 2
  [OK] totalPhotosIn()
  [OK] WeatherService
  [OK] WeatherBlock
  [OK] Open-Meteo API
  [OK] WMA иконка (wb_sunny)
  [OK] RouteCodec
  [OK] RouteCodec.encode
  [OK] RouteCodec.decode
  [OK] Qr…