From 7a5efc540ff8f8fee710e8ef0b283de71c4bb5c0 Mon Sep 17 00:00:00 2001 From: OpenClaw Coder Date: Wed, 4 Nov 2026 01:02:18 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82:=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B0=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8=D0=B9=20(Python=20CLI=20+?= =?UTF-8?q?=20.NET=20WPF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 31 ++ README.md | 101 ++++++ docs/prompt-bolt-7805.md | 172 ++++++++++ docs/schema.md | 47 +++ dotnet/Directory.Build.props | 8 + dotnet/README.md | 66 ++++ dotnet/StandardProducts.sln | 43 +++ dotnet/global.json | 6 + dotnet/src/StandardProducts.App/App.xaml | 6 + dotnet/src/StandardProducts.App/App.xaml.cs | 7 + .../src/StandardProducts.App/MainWindow.xaml | 77 +++++ .../StandardProducts.App/MainWindow.xaml.cs | 167 +++++++++ .../StandardProducts.App.csproj | 17 + .../Data/CatalogDatabase.cs | 72 ++++ .../Data/ProductRepository.cs | 246 +++++++++++++ .../StandardProducts.Core/Gost/Gost7805.cs | 126 +++++++ .../StandardProducts.Core/IO/JsonCatalog.cs | 159 +++++++++ .../StandardProducts.Core/Models/Product.cs | 28 ++ .../Models/ProductValidator.cs | 24 ++ .../StandardProducts.Core.csproj | 13 + .../Gost7805Tests.cs | 103 ++++++ .../ProductRepositoryTests.cs | 179 ++++++++++ .../StandardProducts.Core.Tests.csproj | 22 ++ .../TestDatabase.cs | 12 + .../StandardProducts.Core.Tests/Usings.cs | 1 + examples/sample_products.json | 57 ++++ pyproject.toml | 42 +++ src/standard_products/__init__.py | 37 ++ src/standard_products/__main__.py | 4 + src/standard_products/cli.py | 196 +++++++++++ src/standard_products/db.py | 322 ++++++++++++++++++ tests/test_cli.py | 70 ++++ tests/test_db.py | 169 +++++++++ 33 files changed, 2630 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docs/prompt-bolt-7805.md create mode 100644 docs/schema.md create mode 100644 dotnet/Directory.Build.props create mode 100644 dotnet/README.md create mode 100644 dotnet/StandardProducts.sln create mode 100644 dotnet/global.json create mode 100644 dotnet/src/StandardProducts.App/App.xaml create mode 100644 dotnet/src/StandardProducts.App/App.xaml.cs create mode 100644 dotnet/src/StandardProducts.App/MainWindow.xaml create mode 100644 dotnet/src/StandardProducts.App/MainWindow.xaml.cs create mode 100644 dotnet/src/StandardProducts.App/StandardProducts.App.csproj create mode 100644 dotnet/src/StandardProducts.Core/Data/CatalogDatabase.cs create mode 100644 dotnet/src/StandardProducts.Core/Data/ProductRepository.cs create mode 100644 dotnet/src/StandardProducts.Core/Gost/Gost7805.cs create mode 100644 dotnet/src/StandardProducts.Core/IO/JsonCatalog.cs create mode 100644 dotnet/src/StandardProducts.Core/Models/Product.cs create mode 100644 dotnet/src/StandardProducts.Core/Models/ProductValidator.cs create mode 100644 dotnet/src/StandardProducts.Core/StandardProducts.Core.csproj create mode 100644 dotnet/tests/StandardProducts.Core.Tests/Gost7805Tests.cs create mode 100644 dotnet/tests/StandardProducts.Core.Tests/ProductRepositoryTests.cs create mode 100644 dotnet/tests/StandardProducts.Core.Tests/StandardProducts.Core.Tests.csproj create mode 100644 dotnet/tests/StandardProducts.Core.Tests/TestDatabase.cs create mode 100644 dotnet/tests/StandardProducts.Core.Tests/Usings.cs create mode 100644 examples/sample_products.json create mode 100644 pyproject.toml create mode 100644 src/standard_products/__init__.py create mode 100644 src/standard_products/__main__.py create mode 100644 src/standard_products/cli.py create mode 100644 src/standard_products/db.py create mode 100644 tests/test_cli.py create mode 100644 tests/test_db.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3865f80 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +__pycache__/ +*.py[cod] +*.egg-info/ +.eggs/ +build/ +dist/ +.venv/ +venv/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.coverage +htmlcov/ + +*.db +*.db-journal +*.db-wal +*.db-shm +!examples/*.db + +.env +.idea/ +.vscode/ + +bin/ +obj/ +publish/ +*.user +*.suo +bin/ +publish/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..7ffb8c4 --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# Библиотека стандартных изделий + +Каталог стандартных изделий (крепёж, подшипники и т. п.) с хранением в SQLite. +Две реализации с общей схемой БД и совместимым JSON: + +- `dotnet/` — desktop-приложение для Windows 11 на C# / .NET 8 / WPF (основное); +- `src/standard_products/` — Python-пакет и CLI `stdparts` (генератор и эталон данных). + +## Desktop-приложение (Windows 11) + +```bash +cd dotnet +dotnet build +dotnet run --project src/StandardProducts.App +``` + +Публикация одним self-contained exe (не требует .NET у пользователя): + +```bash +dotnet publish src/StandardProducts.App -c Release -r win-x64 \ + --self-contained true -p:PublishSingleFile=true -o publish +``` + +Подробнее — [dotnet/README.md](dotnet/README.md). + +## Python CLI + +```bash +python3 -m venv .venv +source .venv/bin/activate +pip install -e ".[dev]" + +stdparts init +stdparts import examples/sample_products.json +stdparts list +stdparts search болт +``` + +Без установки пакета: + +```bash +PYTHONPATH=src python3 -m standard_products init +PYTHONPATH=src python3 -m standard_products import examples/sample_products.json +``` + +## Команды + +| Команда | Назначение | +| --- | --- | +| `stdparts init` | создать базу и схему | +| `stdparts add <обозначение> --name ...` | добавить изделие | +| `stdparts show <обозначение>` | показать изделие в JSON | +| `stdparts list [--limit N]` | список изделий | +| `stdparts search [запрос] [--standard ...] [--category ...] [--material ...]` | поиск | +| `stdparts import ` | импорт (upsert по обозначению) | +| `stdparts export ` | экспорт всего каталога | +| `stdparts delete <обозначение>` | удалить изделие | +| `stdparts stats` | количество записей | + +Путь к базе задаётся глобальным флагом `--db` (по умолчанию `standard_products.db`): + +```bash +stdparts --db data/catalog.db list +``` + +### Добавление с атрибутами + +```bash +stdparts add "Болт M10x50 ГОСТ 7798-70" \ + --name "Болт с шестигранной головкой" \ + --standard "ГОСТ 7798-70" \ + --category "Крепёж" \ + --material "Сталь 20" \ + --mass 0.045 \ + --attr "резьба=M10" \ + --attr "покрытие=цинк" +``` + +## Модель данных + +Поля изделия описаны в [docs/schema.md](docs/schema.md). +Свободные характеристики хранятся в JSON-поле `attributes`. + +## Разработка + +```bash +pip install -e ".[dev]" +pytest +ruff check . +mypy src +``` + +## Структура + +``` +dotnet/ # C# / WPF приложение (Core + App + xunit) +src/standard_products/ # Python-пакет: db.py, cli.py +tests/ # pytest +examples/ # пример JSON для импорта +docs/ # документация, схема, промты +``` diff --git a/docs/prompt-bolt-7805.md b/docs/prompt-bolt-7805.md new file mode 100644 index 0000000..4913fe5 --- /dev/null +++ b/docs/prompt-bolt-7805.md @@ -0,0 +1,172 @@ +# Промт: болт ГОСТ 7805-70 в каталоге standard_products + +> Адаптация исходного промта «C++/Qt/OCCT desktop-приложение» под текущий +> проект: Python 3.10+, SQLite, пакет `standard_products`, CLI `stdparts`. +> 3D/STEP вынесены в опциональную фазу (см. приложение). + +## РОЛЬ И КОНТЕКСТ + +Ты — senior Python-разработчик. Работаешь в репозитории +`библиотека-стандартных-изделий`: каталог стандартных изделий на SQLite. +Уже есть пакет `src/standard_products/` (`db.py`, `cli.py`), тесты +`tests/`, примеры `examples/`, документация `docs/`. Зависимостей в +рантайме нет — только стандартная библиотека. + +Задача — добавить в каталог болты с шестигранной головкой по +ГОСТ 7805-70 (класс точности А) как параметрическое семейство: +таблица размеров, валидация, генерация изделий и загрузка в базу. + +## ЗАДАЧА (MVP) + +1. Новый модуль `src/standard_products/gost_7805.py`: + - `BoltSize` (frozen dataclass), таблица размеров, допустимые длины; + - функции получения размера, проверки длины, формирования `Product`; + - идемпотентная загрузка всего семейства в БД. +2. Команды CLI в `src/standard_products/cli.py`: + - `stdparts bolts` — таблица размеров; + - `stdparts bolts --size M10 --length 40` — параметры одного болта в JSON; + - `stdparts seed-bolts` — загрузить все комбинации M×L в каталог. +3. Тесты `tests/test_gost_7805.py`. +4. Документация `docs/gost-7805.md`. +5. Экспорт `examples/gost_7805.json` (сгенерировать из таблицы, не руками). + +## СТЕК (строго соблюдать) + +- Python 3.10+, только стандартная библиотека в рантайме. +- SQLite через существующий `db.py` (`Product`, `upsert_product`, `connect`). +- pytest / ruff / mypy — dev-зависимости, уже настроены в `pyproject.toml`. +- Никаких новых обязательных зависимостей. + +## ТАБЛИЦА ПАРАМЕТРОВ (ГОСТ 7805-70, класс точности А) + +Захардкодь в `gost_7805.py`: + +```python +@dataclass(frozen=True, slots=True) +class BoltSize: + d: float # номинальный диаметр резьбы, мм + P: float # шаг резьбы, мм + S: float # размер под ключ (между гранями), мм + k: float # высота головки, мм + e: float # размер по углам (справочно), мм + b: float | None = None # длина резьбы, мм (в источнике не задана) +``` + +Данные (только эти строки, не выдумывай свои): + +| Размер | d | P | S | k | e | +| --- | --- | --- | --- | --- | --- | +| M6 | 6 | 1.0 | 10 | 4.0 | 11.05 | +| M8 | 8 | 1.25 | 13 | 5.3 | 14.38 | +| M10 | 10 | 1.5 | 16 | 6.4 | 17.77 | +| M12 | 12 | 1.75 | 18 | 7.5 | 19.85 | +| M16 | 16 | 2.0 | 24 | 10.0 | 26.75 | + +Доступные длины стержня L (мм): `20, 25, 30, 35, 40, 50, 60, 70, 80`. + +Значение `b` в источнике не приведено — оставь `None`, не подставляй +расчётные или справочные значения из головы. + +## ТРЕБОВАНИЯ К МОДУЛЮ + +Публичный API (имена можно уточнить, но смысл сохранить): + +```python +BOLT_SIZES: dict[str, BoltSize] # ключи: "M6", "M8", "M10", "M12", "M16" +ALLOWED_LENGTHS_MM: tuple[int, ...] # (20, 25, ..., 80) + +def get_size(label: str) -> BoltSize: ... +def validate_length(length: int) -> None: ... +def bolt_designation(size: BoltSize, length: int) -> str: ... +def build_product(size: BoltSize, length: int) -> Product: ... +def iter_products() -> Iterator[Product]: ... +def seed_bolts(connection: sqlite3.Connection) -> int: ... +``` + +Правила: + +- `designation`: `"Болт M10x40 ГОСТ 7805-70"` (диаметр — целое без `.0`). +- `name`: `"Болт с шестигранной головкой"`. +- `standard`: `"ГОСТ 7805-70"`, `category`: `"Крепёж"`, `unit`: `"шт"`. +- `material` и `mass_kg` не заданы в источнике — `None`. +- Параметры ГОСТ кладутся в `attributes` (ключи на русском, как в проекте): + `диаметр`, `шаг_резьбы`, `размер_под_ключ`, `высота_головки`, + `размер_по_углам`, `длина`, `длина_резьбы` (если `b is None` — не добавлять). +- `seed_bolts` использует `upsert_product`, поэтому повторный запуск не + создаёт дубликатов и возвращает число обработанных записей (5 × 9 = 45). +- Ошибки — `ValueError` с перечислением допустимых значений: + `get_size("M7")`, `validate_length(45)`. +- Никаких изменений схемы БД и сигнатур существующих функций `db.py`. + +## ТРЕБОВАНИЯ К CLI + +Добавить подкоманды, не ломая существующие: + +```bash +stdparts bolts # таблица размеров +stdparts bolts --size M10 --length 40 # JSON одного изделия +stdparts seed-bolts # загрузить 45 изделий (идемпотентно) +``` + +- `--size` и `--length` валидируются теми же функциями; при ошибке — + сообщение в `stderr` и код возврата 1. +- `seed-bolts` печатает число загруженных записей. +- Работает с глобальным `--db`, как остальные команды. + +## ТЕСТЫ (обязательно) + +`tests/test_gost_7805.py`: + +1. Таблица содержит ровно 5 размеров, значения совпадают с промтом. +2. `bolt_designation` даёт `"Болт M10x40 ГОСТ 7805-70"` и не даёт `M10.0`. +3. `build_product` заполняет `standard/category/unit/attributes`. +4. `get_size` и `validate_length` кидают `ValueError` на недопустимых входах. +5. `seed_bolts` в temp-БД создаёт 45 записей; повторный вызов — всё ещё 45. +6. Несколько записей находятся через `search_products(conn, "ГОСТ 7805-70")`. +7. CLI: `bolts --size M10 --length 40` возвращает 0 и валидный JSON. + +## ДОКУМЕНТАЦИЯ + +`docs/gost-7805.md`: таблица размеров, допустимые длины, формат +`designation`, соответствие полей `Product` ↔ `attributes`, примеры команд. +Ссылка из `README.md` в разделе про данные. + +## ОГРАНИЧЕНИЯ (ЧТО НЕ ДЕЛАТЬ — строго) + +- ❌ Не добавлять C++, Qt, OpenCASCADE, CMake — это другой стек и его нет в проекте. +- ❌ Не делать 3D-геометрию, резьбу, спирали, вырезы и экспорт STEP в MVP. +- ❌ Не менять схему SQLite и не добавлять миграции. +- ❌ Не добавлять другие типы изделий (гайки, шайбы) — только болт 7805-70. +- ❌ Не добавлять обязательные зависимости, логирование, настройки, темы. +- ❌ Не выдумывать размеры, длины, массу и `b`, которых нет в источнике. +- ❌ Не дублировать логику `db.py` — использовать `Product` и `upsert_product`. + +## ФОРМАТ ОТВЕТА + +Код каждого файла — отдельным блоком с полным путём: + +```python +# File: src/standard_products/gost_7805.py +... +``` + +Затем — короткая инструкция (3–5 команд): установка, тесты, линтеры, +пример запуска. В конце — отчёт: какие файлы изменены и почему. + +## КРИТЕРИИ ПРИЁМКИ + +1. `pytest` — зелёный, включая новые тесты. +2. `ruff check .` и `mypy src` — без ошибок. +3. `stdparts seed-bolts` создаёт 45 изделий; повторный запуск — те же 45. +4. `stdparts search "ГОСТ 7805-70"` находит загруженные болты. +5. `stdparts bolts --size M16 --length 80` печатает корректный JSON. +6. Существующие команды и тесты не сломаны. +7. Новых обязательных зависимостей нет. + +## ПРИЛОЖЕНИЕ (вне MVP): STEP-экспорт + +Если позже понадобится STEP, это отдельная задача и отдельный модуль +`step_export.py` с опциональной зависимостью (`cadquery`/`OCP`), не +входящей в базовую установку. Геометрия строится из тех же `BoltSize`: +шестигранная призма `S × k`, цилиндр `d/2 × L`, фаска 0.3×45° на торце. +Резьба не моделируется. До появления зависимости модуль не добавлять. diff --git a/docs/schema.md b/docs/schema.md new file mode 100644 index 0000000..6d53b86 --- /dev/null +++ b/docs/schema.md @@ -0,0 +1,47 @@ +# Схема данных + +## Таблица `products` + +| Поле | Тип | Ограничения | Описание | +| --- | --- | --- | --- | +| `id` | INTEGER | PK, AUTOINCREMENT | внутренний идентификатор | +| `designation` | TEXT | NOT NULL, UNIQUE | обозначение по стандарту, например `Болт M10x50 ГОСТ 7798-70` | +| `name` | TEXT | NOT NULL | наименование изделия | +| `standard` | TEXT | | стандарт: ГОСТ, ISO, DIN и т. п. | +| `category` | TEXT | | категория: крепёж, подшипники, ... | +| `material` | TEXT | | материал | +| `unit` | TEXT | NOT NULL, DEFAULT `шт` | единица измерения | +| `mass_kg` | REAL | >= 0 | масса в килограммах | +| `attributes` | TEXT (JSON) | NOT NULL, DEFAULT `{}` | произвольные характеристики | +| `created_at` | TEXT | NOT NULL | дата создания (UTC) | +| `updated_at` | TEXT | NOT NULL | дата обновления (UTC) | + +Индексы: `standard`, `category`, `material`. + +## Идентификация + +Ключ записи — `designation`. Поэтому импорт работает как upsert: +повторный импорт записи с тем же обозначением обновляет её, +а не создаёт дубликат. + +## JSON-формат импорта/экспорта + +```json +{ + "products": [ + { + "designation": "Болт M10x50 ГОСТ 7798-70", + "name": "Болт с шестигранной головкой", + "standard": "ГОСТ 7798-70", + "category": "Крепёж", + "material": "Сталь 20", + "unit": "шт", + "mass_kg": 0.045, + "attributes": {"резьба": "M10"} + } + ] +} +``` + +Допустим и просто список объектов без обёртки `products`. +Поле `id` при импорте игнорируется. diff --git a/dotnet/Directory.Build.props b/dotnet/Directory.Build.props new file mode 100644 index 0000000..ff4c9e2 --- /dev/null +++ b/dotnet/Directory.Build.props @@ -0,0 +1,8 @@ + + + latest + enable + enable + true + + diff --git a/dotnet/README.md b/dotnet/README.md new file mode 100644 index 0000000..46ade1f --- /dev/null +++ b/dotnet/README.md @@ -0,0 +1,66 @@ +# StandardProducts — desktop-приложение (C# / .NET 8 / WPF) + +Каталог стандартных изделий для Windows 11: таблицы ГОСТ, поиск, импорт/экспорт JSON. +Хранилище — SQLite, та же схема, что в Python-версии проекта. + +## Требования + +- Windows 10/11 (для запуска) +- .NET SDK 8.0+ (для сборки) +- Visual Studio 2022 не обязательна: достаточно `dotnet` CLI + +## Сборка и запуск + +```bash +cd dotnet +dotnet build +dotnet run --project src/StandardProducts.App +``` + +## Публикация + +Self-contained один файл (не требует .NET у пользователя): + +```bash +dotnet publish src/StandardProducts.App \ + -c Release -r win-x64 --self-contained true \ + -p:PublishSingleFile=true \ + -o publish +``` + +Результат — `dotnet/publish/StandardProducts.exe` (~150 МБ, включает WPF и SQLite). +Для MSIX используйте Windows Application Packaging Project или `MakeAppx`; для +внутреннего распространения достаточно exe. + +## Возможности + +- таблица изделий с поиском по обозначению, наименованию, стандарту и атрибутам; +- загрузка семейства болтов ГОСТ 7805-70 (5 размеров × 9 длин = 45 изделий); +- импорт/экспорт JSON (формат совместим с Python-версией); +- удаление изделий, просмотр атрибутов выбранной позиции; +- регистронезависимый поиск по кириллице (SQLite-функция `ulower`). + +База создаётся автоматически: +`%LOCALAPPDATA%\StandardProducts\catalog.db`. + +## Структура + +``` +dotnet/ + StandardProducts.sln + src/StandardProducts.Core/ # модели, SQLite, ГОСТ 7805-70, JSON — net8.0 + src/StandardProducts.App/ # WPF-интерфейс — net8.0-windows + tests/StandardProducts.Core.Tests/ # xunit +``` + +Ядро (`Core`) не зависит от WPF и собирается/тестируется на любой ОС: + +```bash +dotnet test tests/StandardProducts.Core.Tests +``` + +## 3D / STEP + +В текущей версии не реализованы и не нужны. Если появятся: +отдельная нативная библиотека на OpenCASCADE (C++), вызываемая из C# +через P/Invoke/C++/CLI; UI и каталог при этом не меняются. diff --git a/dotnet/StandardProducts.sln b/dotnet/StandardProducts.sln new file mode 100644 index 0000000..aab8ee7 --- /dev/null +++ b/dotnet/StandardProducts.sln @@ -0,0 +1,43 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{33C46318-4A03-4E87-8161-D7DE7389818C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandardProducts.Core", "src\StandardProducts.Core\StandardProducts.Core.csproj", "{40DE1BD3-CD25-46E0-833D-1E30AB58D6FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandardProducts.App", "src\StandardProducts.App\StandardProducts.App.csproj", "{2D399870-3207-4B43-85EC-D30970310BE1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{27C9581B-1699-43CF-A22C-75DD00DF9939}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandardProducts.Core.Tests", "tests\StandardProducts.Core.Tests\StandardProducts.Core.Tests.csproj", "{786EEFC0-382C-4661-B558-E553A93784BF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {40DE1BD3-CD25-46E0-833D-1E30AB58D6FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40DE1BD3-CD25-46E0-833D-1E30AB58D6FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40DE1BD3-CD25-46E0-833D-1E30AB58D6FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40DE1BD3-CD25-46E0-833D-1E30AB58D6FE}.Release|Any CPU.Build.0 = Release|Any CPU + {2D399870-3207-4B43-85EC-D30970310BE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D399870-3207-4B43-85EC-D30970310BE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D399870-3207-4B43-85EC-D30970310BE1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D399870-3207-4B43-85EC-D30970310BE1}.Release|Any CPU.Build.0 = Release|Any CPU + {786EEFC0-382C-4661-B558-E553A93784BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {786EEFC0-382C-4661-B558-E553A93784BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {786EEFC0-382C-4661-B558-E553A93784BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {786EEFC0-382C-4661-B558-E553A93784BF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {40DE1BD3-CD25-46E0-833D-1E30AB58D6FE} = {33C46318-4A03-4E87-8161-D7DE7389818C} + {2D399870-3207-4B43-85EC-D30970310BE1} = {33C46318-4A03-4E87-8161-D7DE7389818C} + {786EEFC0-382C-4661-B558-E553A93784BF} = {27C9581B-1699-43CF-A22C-75DD00DF9939} + EndGlobalSection +EndGlobal diff --git a/dotnet/global.json b/dotnet/global.json new file mode 100644 index 0000000..391ba3c --- /dev/null +++ b/dotnet/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "8.0.100", + "rollForward": "latestFeature" + } +} diff --git a/dotnet/src/StandardProducts.App/App.xaml b/dotnet/src/StandardProducts.App/App.xaml new file mode 100644 index 0000000..63ca462 --- /dev/null +++ b/dotnet/src/StandardProducts.App/App.xaml @@ -0,0 +1,6 @@ + + + diff --git a/dotnet/src/StandardProducts.App/App.xaml.cs b/dotnet/src/StandardProducts.App/App.xaml.cs new file mode 100644 index 0000000..7ffd88e --- /dev/null +++ b/dotnet/src/StandardProducts.App/App.xaml.cs @@ -0,0 +1,7 @@ +using System.Windows; + +namespace StandardProducts.App; + +public partial class App : Application +{ +} diff --git a/dotnet/src/StandardProducts.App/MainWindow.xaml b/dotnet/src/StandardProducts.App/MainWindow.xaml new file mode 100644 index 0000000..efcab61 --- /dev/null +++ b/dotnet/src/StandardProducts.App/MainWindow.xaml @@ -0,0 +1,77 @@ + + + + + + + + + + + + +