67 Commits

Author SHA1 Message Date
mikhail d53747cf34 Авто-ревью дифа моделью glm-5.2:cloud
ci / build (push) Successful in 28s
Второй взгляд на изменения от модели вне сессии: tools/glm-review/glm-review.mjs собирает diff, добавляет CLAUDE.md как правила проекта и шлёт в Ollama Cloud.

Два входа, один скрипт: глобальная слэш-команда /glm-review и workflow на pull_request, который кладёт находки одним комментарием и переписывает его при каждом пуше. Ревью совещательное: --fail-on не выставлен, находка не блокирует merge; без секрета OLLAMA_API_KEY job пропускается.

Первый же прогон нашёл дефект в самом себе — поиск своего комментария не листал страницы Gitea; исправлено постраничным обходом.

Co-authored-by: Shahovalov MIkhail <m.shahovalov@yandex.ru>
Co-committed-by: Shahovalov MIkhail <m.shahovalov@yandex.ru>
2026-07-31 22:19:57 +03:00
mikhail 4e3d367637 Каталог инструментов сжат под агента: 84 → 56
ci / build (push) Successful in 28s
Инструменты были нарезаны по способу вызова, а не по смыслу: четыре отверстия,
двойники *_index, одиннадцать sketch_add_*. Агент платил за это дважды — 40 КБ
описаний в каждой сессии и лишние round-trip'ы, а каждый вызов это ещё и шанс
сбиться. Теперь инструмент называет ОПЕРАЦИЮ, вариант задаётся параметром,
объект выбирается индексом или точкой одним и тем же инструментом.

Проверка построения приходит сама. Каждая мутирующая операция дописывает к ответу
итог validate_part (AutoValidation): Create()/Update()==true не значит успех, а
правило навыка «проверяй после каждого шага» удваивало число вызовов. Выключается
через set_auto_validate или KOMPAS_MCP_AUTOVALIDATE=0 — сбой самой проверки уходит
в примечание и никогда не превращает удачную операцию в ошибку.

Эскиз: 16 инструментов → 3. sketch_create(plane|faceIndex|x,y,z, entities[],
autoClose) строит контур целиком; пакет выполняется за ОДИН заход на STA-поток
(PartModeler.AddEntitiesAsync), ошибка называет позицию примитива в списке.

Слияния: hole(type=simple|counterbore|countersink|conic), extrude/revolve(mode),
pattern(kind), mirror (без featureIds — всё тело), document_save(path?),
set_variable как upsert (разведочный вызов «есть ли такая» больше не нужен),
list_faces/list_edges(index?) вместо отдельных describe_*, get_part_info и
get_bounding_box — в describe_model(sections), где незапрошенные разделы вообще
не читаются из модели.

Селектор index|point: fillet_edge/chamfer_edge принимают edgeIndices списком —
одна операция дерева на все рёбра; для операций API7, умеющих только точку,
индекс переводится в точку через ModelInspectionService.FaceCenterPointAsync
(середина параметрической области грани).

Схема слитого инструмента не запрещает неверную комбинацию полей — это делает
валидация, и её сообщение называет type и недостающий параметр.

Тесты: 291 unit (+41) и 136 integration (+5), интеграционные — на живом КОМПАС.
Новые проверяют ровно рискованные места: точка-из-индекса лежит на грани и по ней
создаётся эскиз, мульти-ребёрное скругление даёт один узел дерева и убыль объёма,
upsert создаёт и затем меняет переменную с формулой, пакет сообщает позицию сбоя.
PluginSkillsTests теперь падает, если в публикуемом навыке всплывёт слитое имя.
2026-07-31 11:52:30 +03:00
mikhail cb43b84249 Dev-лаунчер: сервер запускается из теневой копии сборки
Пока MCP-сервер работал прямо из src\...\bin, он держал открытым kompas-mcp.exe
и Kompas.Mcp.Core.dll — dotnet build падал с MSB3027 от каждой живой сессии.
Лаунчер копирует сборку в %LOCALAPPDATA%\kompas-mcp\dev\<отпечаток> и запускает
её оттуда, поэтому bin свободен всегда.

- tools/dev/KompasMcpDev.psm1 — отпечаток каталога сборки, теневая копия через
  атомарный Directory.Move, уборка старых копий мимо занятых живым процессом,
  сессионный mutex на одновременный старт нескольких сессий;
- tools/dev/launch-dev-mcp.ps1 — точка входа для .mcp.json, инвариант «в stdout
  до старта сервера не уходит ни байта»;
- tools/dev/rebuild-mcp.ps1 — -Check компилирует мимо bin (~2 с при живом
  сервере), обычный режим отказывается заранее и называет блокирующие PID;
- tools/tests/DevLauncher.Tests.ps1 — Pester на все три файла.

Раздел «The rebuild cycle» в CLAUDE.md (2c56511) уже описывал эту схему.
2026-07-31 11:51:59 +03:00
mikhail 2c56511a7a CLAUDE.md: зафиксирован рабочий режим — CAD-задачи как полигон
ci / build (push) Successful in 32s
Три канала обратной связи (патч в src, новый общий тул, правка навыков),
правило «навыки отлаживаются как код» с source of truth в plugin/skills,
запрет утечки внутреннего в публикуемые навыки и ловушка с залоченным
kompas-mcp.exe при пересборке.
2026-07-31 11:18:26 +03:00
mikhail 6700b26bee CLAUDE.md разгружен: тяжёлые справочники вынесены в навык kompas-mcp-dev
ci / build (push) Successful in 29s
Корневой CLAUDE.md грузится в каждую сессию, но большая его часть нужна только
при доработке сервера. 37 476 → 12 203 символов (~6 300 токенов на сессию).

Перенесено в .claude/skills/kompas-mcp-dev/reference/:
- com-implementation-facts.md — проверенные COM-цепочки («Key implementation facts»);
- plugin-and-release.md — устройство plugin/, ветка dist, релиз, CI, обновление RAG-базы.

Релизная кухня положена в навык, а не в plugin/CLAUDE.md: plugin/ раздаётся
пользователям, внутренностям сборки там не место. В корневом файле оставлены два
правила, которые нельзя откладывать до загрузки навыка — обязательный бамп версии
в plugin.json и UTF-8 с BOM для PowerShell плагина.

Удалено как выводимое из репозитория: раскладка каталогов, стек и счётчики тестов,
список режимов sync-agent-assets.ps1, перечень содержимого каталога SDK.

Секция «Navigating the SDK base» удалена как дубль §«Порядок поиска» из определения
агента kompas-sdk-research — вдобавок она описывала инструменты, доступные только
субагенту. Уникальная процедура обновления базы перенесена в навык.
2026-07-31 09:55:30 +03:00
mikhail d78ba750a8 @
ci / build (push) Successful in 29s
Документация переписана под состояние без каталога docs/

Каталог docs/ удалён в b022a91, но CLAUDE.md и README ссылались на
ARCHITECTURE.md, TODO.md, OPEN_QUESTIONS.md, IMPLEMENTATION_PLAN.md и
presentation.html — все ссылки были битыми.

- CLAUDE.md: явно зафиксировано, что прозаическая документация — только он и
  README, docs/ воссоздавать не нужно; бэклог (чертёж: базы/допуски/привязка,
  сопряжения сверх coincidence и distance) и известный подводный камень с
  направлением по нормали грани перенесены из удалённых TODO/OPEN_QUESTIONS
- убран субагент docs-maintainer: он удалён вместе с docs/, доки правятся руками
- ссылка на спеку по параметрическим эскизам заменена на память
- README: структура репозитория приведена к реальной, добавлены --version,
  run-ps-tests.ps1 и оговорка про .slnx на SDK 8
- kompas-mcp-dev: справка SDK описана как RAG-база kompas-sdk вместо
  несуществующего docs/Kompas3D_SDK/, добавлен порядок работ по новому
  инструменту, команды проверки и границы CI

Счётчики сверены по коду: 84 инструмента, 250 unit + 131 integration, 41 Pester.
@
2026-07-31 09:38:19 +03:00
mikhail 37dc0fed36 Диагностика отсутствующего интеропа и документация к его поиску
ci / build (push) Successful in 34s
Продолжение 4d4e114 (сборки КОМПАС убраны из поставки).

- kompas_status проверяет интероп до обращения к сессии и отдаёт причину текстом:
  иначе MCP SDK показывает агенту только «An error occurred invoking …»
- провайдер сносит негодный остаток кеша перед Move: повтор после оборванной
  распаковки падал IOException вместо внятного сообщения
- README/plugin/README/doctor/CLAUDE.md: требование компонента SDK,
  KOMPAS_INTEROP_DIR, кеш в %LOCALAPPDATA%, счётчики тестов 381 (250 unit)
2026-07-31 09:29:01 +03:00
mikhail 4d4e11425e Убраны интероп-сборки из поставки сервера, добавлен KompasInteropLoader 2026-07-31 09:14:53 +03:00
mikhail b022a91dd9 Удалены устаревшие документы суперспособностей (specs/plans) и вспомогательные доки проекта
ci / build (push) Successful in 37s
2026-07-31 09:02:45 +03:00
mikhail f904daaad2 docs: синхронизировать документацию с упаковкой в плагин Claude Code
ci / build (push) Successful in 44s
2026-07-31 08:48:41 +03:00
mikhail 7afd046a09 test: метка Requires=Windows для STA-диспетчера, CI исключает её
ci / build (push) Successful in 29s
2026-07-31 08:29:43 +03:00
mikhail e56132de33 Уборка брошенных временных каталогов установки сервера
ci / build (push) Failing after 27s
finally в Install-KompasMcpServer спасает только от штатного throw/return.
После принудительного убийства процесса посреди установки каталог
.tmp\<guid> оставался навсегда — по ~70 МБ на оборванный запуск, сервер
публикуется self-contained.

Remove-KompasMcpStaleTemp удаляет подкаталоги .tmp старше суток. Возраст
считается как максимум LastWriteTimeUtc по всему поддереву: пока сосед
льёт байты в один и тот же server.zip, время записи самого каталога не
меняется, и по нему можно было бы снести живую установку.

Вызов стоит в начале Install-KompasMcpServer, до раннего выхода по
Test-KompasMcpInstall — иначе мусор от оборванных попыток лежал бы до
следующего релиза. Если каталога .tmp нет, всё сводится к одному
Test-Path.

Функция не бросает исключений и не пишет в success stream: запуск
сервера важнее мусора, а stdout занят JSON-RPC.
2026-07-31 08:26:38 +03:00
mikhail 5b1af4ab39 merge: режим -Remove у sync-agent-assets для снятия junction'ов перед checkout
ci / build (push) Failing after 27s
2026-07-31 08:25:58 +03:00
mikhail e3228abb26 feat(tools): режим -Remove у sync-agent-assets — снятие junction'ов перед checkout
При переключении на ветку или коммит без plugin/skills junction'ы навыков
повисают битыми, и git checkout падает на середине: часть рабочего дерева
уже удалена, а HEAD остаётся на прежней ветке.

Remove-AgentSkillLink удаляет сам reparse point через Directory.Delete
(без -Recurse), поэтому в target не заходит и содержимое plugin/skills не
трогает. Junction опознаётся по атрибуту ReparsePoint, а не по резолву
target — иначе режим не работал бы ровно в том случае, ради которого сделан.
Настоящий каталог не удаляется, а возвращает Skipped.

Режимы скрипта разведены parameter set'ами: -Remove -Check вместе теперь
дают ошибку разбора параметров вместо тихого выигрыша одного из ключей.

Покрыто пятью кейсами в tools/tests/AgentAssets.Tests.ps1 (включая junction
с исчезнувшим источником); порядок действий и восстановление после падения
чекаута описаны в CLAUDE.md.
2026-07-31 08:24:26 +03:00
mikhail c79176e7fc ci: указывать проекты явно — SDK 8 не понимает формат решения .slnx
ci / build (push) Failing after 32s
2026-07-31 08:20:38 +03:00
mikhail 5c74a6f0ab Добавлена поддержка комментариев (note) у переменных модели + разведка v25
ci / build (push) Failing after 20s
2026-07-31 08:16:31 +03:00
mikhail e7f8c0db9f merge: справка SDK вынесена в отдельный репозиторий и RAG
ci / build (push) Failing after 19s
База docs/Kompas3D_SDK/ (2465 статей) переехала в приватный kompas-sdk-docs
и проиндексирована в RAG на CT 127; субагент kompas-sdk-research переведён
на MCP-инструменты сервера kompas-sdk.
2026-07-31 08:11:12 +03:00
mikhail e72aa46cc1 docs: результаты приёмки RAG-справки и фикс реранкера
Спек дополнен фактами прогона: 2465 документов / 13 755 точек, проверка
grep/search/фильтров, живой прогон CI с инкрементальной переиндексацией.
Отдельно зафиксирована находка — реранк падал 400 на длинных чанках
(слот 1024 токена против обрезки в 2000 символов); починено в rag-node.
2026-07-31 03:27:15 +03:00
mikhail 55045184e2 ci: разрешить равную версию в release.yml только для ретрая того же коммита
Гейт «версия не должна уменьшаться» отвергал и равную версию безусловно, что
делало невозможным повторный прогон на том же теге (Task 10 Step 4 плана).
Теперь сравнение version+sourceSha читается из plugin/server.lock.json ветки
dist: равная версия проходит дальше только если sourceSha из dist совпадает с
текущим github.sha (ретрай уже опубликованного релиза — ниже по пайплайну он
и так идемпотентен: upsert релиза/ассета, повторная сверка sha256, force-push
dist тем же содержимым). Другой sourceSha при той же версии — попытка
подменить уже опубликованный релиз другим кодом — отвергается с явным
сообщением, какой коммит уже занимает эту версию. Меньшая версия отвергается
как и раньше.
2026-07-31 02:55:39 +03:00
mikhail e2fe197fbb ci: сборочный и релизный workflow для Gitea Actions (Task 9-10)
ci.yml: сборка + unit-тесты на Linux-раннере (EnableWindowsTargeting), плюс
проверка согласованности plugin/.claude-plugin/plugin.json и
plugin/server.lock.json (версии совпадают; для опубликованного релиза —
sha256 непустой и 64 hex).

release.yml: на тег vX.Y.Z — публикация self-contained win-x64,
идемпотентный upsert релиза/ассета через Gitea API, сверка SHA256
опубликованного ассета перед обновлением, и force-push ветки dist поверх
коммита с тегом (server.lock.json + plugin.json). Отличия от черновика в
плане: устойчивый разбор "версия не должна уменьшаться" (не полагается на
особенность jq на пустом stdin), явные HTTP-коды вместо curl -f для
различения "релиза нет" от прочих ошибок API, persist-credentials: false
на checkout, чтобы не конфликтовать с собственным токеном на пуше.

Не прогонялось на раннере — раннер ещё не готов (отдельная работа).
2026-07-31 02:53:26 +03:00
mikhail 58eba795cf fix(plugin): PSObject.Properties индексатор вместо .Name на пустой коллекции
server.lock.json вида "{}" (валидный JSON, ноль ключей) — реальный вход
(placeholder до заполнения релизным пайплайном), но под
Set-StrictMode -Version Latest член-перечисление .PSObject.Properties.Name
бросает PropertyNotFoundException, когда коллекция .Properties пуста, — Read-
KompasMcpLock падала сырым .NET-трейсом вместо дружественного сообщения.
Тесты этого не ловили: любой объект хотя бы с одним свойством (даже без
version) уже не задевает пустую коллекцию.

Фикс: PSObject.Properties['имя'] (индексатор) вместо .Properties.Name
-contains — он возвращает $null и не бросает независимо от того, пуста
коллекция или нет. Применено ко всем трём проверкам (version/url/sha256).
Отдельно исключён случай $lock -eq $null (JSON "null" и пустой файл
разбираются в $null, а $null.PSObject тоже бросает под StrictMode).

Добавлены тесты: лок "{}", лок "null", лок "" (пустая JSON-строка вместо
объекта) — все дают сообщение с именем файла, а не .NET-трейс. Известные
пробелы покрытия (IOException-гонка вокруг Directory.Move,
AbandonedMutexException) зафиксированы комментарием в тестовом файле — не
автотестируются осознанно (нужен настоящий межпроцессный тайминг).
2026-07-31 02:43:13 +03:00
mikhail 2fb212bb14 fix(plugin): жёсткий разбор пути к серверу и обёртка запуска в лаунчере
- Test-Path -PathType Leaf: путь-каталог в KOMPAS_MCP_EXE больше не проходит
  проверку молча — раньше падение случалось на голом & $exe сырым
  CommandNotFoundException в обход диагностической обёртки.
- запуск сервера (& $exe @args) обёрнут в try/catch: сбой самого запуска
  (битый бинарь, недостающая зависимость, отказ в доступе) теперь тоже даёт
  чистое сообщение 'kompas-mcp launcher: ...' и код 1, а не сырой трейс;
  ненулевой код возврата уже запущенного сервера по-прежнему пробрасывается как есть.
- тесты: три новых сценария (каталог вместо файла, ноль байт в stdout на
  пути отказа, повреждённый exe) + первый тест переписан на побайтовую
  проверку stdout через Start-Process без фильтрации пустых строк.
2026-07-31 02:39:37 +03:00
mikhail 0ed211fe16 fix(plugin): mutex AbandonedMutexException, валидация server.lock.json, тесты гонки
Три предметных замечания ревью качества:
- Resolve-KompasMcpExecutable: WaitOne() перенесён в try/finally, отдельно
  ловится AbandonedMutexException (владелец умер посреди установки — владение
  переходит к нам, это не ошибка); ReleaseMutex вызывается только если mutex
  реально захвачен, иначе он бросает SynchronizationLockException и маскирует
  первопричину. Добавлен -Downloader passthrough для тестируемости.
- Read-KompasMcpLock: разбор JSON обёрнут в try/catch с сообщением, называющим
  файл; наличие полей version/url/sha256 проверяется через
  PSObject.Properties.Name (обращение к отсутствующему свойству под
  Set-StrictMode -Version Latest бросает PropertyNotFoundException); sha256
  валидируется на 64 hex-символа.
- Добавлены тесты на конкурентную логику: Resolve-KompasMcpExecutable
  (повторный вызов не скачивает), гонка "сосед выиграл" (целевой каталог уже
  содержит годную/негодную установку) в Install-KompasMcpServer, счастливый
  путь и все новые ветки валидации в Read-KompasMcpLock.

Мелочи: & $Downloader ... | Out-Null (внедряемый загрузчик не должен писать
в success stream); уточнён комментарий Test-KompasMcpInstall — оно намеренно
трактует любую ошибку чтения маркера (не только битый JSON, но и блокировку
антивирусом) как "установка негодная".

AbandonedMutexException-ветка вручную воспроизведена и проверена: процесс-
владелец mutex убит, пока другой процесс уже блокирован в WaitOne() —
тот получает AbandonedMutexException и корректно продолжает работу.
2026-07-31 02:34:41 +03:00
mikhail f0fc85de03 docs: конкретные команды в шаге 5 doctor и предупреждение о предрелизных тегах 2026-07-31 02:29:06 +03:00
mikhail 09f17fae16 docs(plugin): README и адаптеры под Codex/opencode 2026-07-31 02:28:20 +03:00
mikhail 30197b34c7 feat(plugin): команда /kompas:doctor 2026-07-31 02:20:42 +03:00
mikhail 7c4d7b2c3e feat(host): флаг --version для сверки установленного бинаря 2026-07-31 02:17:28 +03:00
mikhail 297015f4af docs: справка SDK вынесена в отдельный репозиторий и RAG
MD-база docs/Kompas3D_SDK/ (2465 статей, 10.4 МБ) переехала в приватный
kompas-sdk-docs и проиндексирована в RAG на CT 127. Доступ — MCP-сервер
kompas-sdk (порт 8092); субагент kompas-sdk-research переведён с Grep/Read
на его инструменты и теперь ищет по базе, которой в репозитории нет.

Порядок поиска в инструкции агента: grep_knowledge для точных имён,
search_knowledge с фильтрами type/tags для задачных вопросов,
get_chunk_context вместо get_document (геометрия.md весит 261 КБ).

Обновление при новой версии КОМПАС — update_sdk_docs.ps1 в репозитории
доков: zip справки → генератор → diff → тег → push → переиндексация
через Gitea Actions. Спек и фактические результаты —
docs/superpowers/specs/2026-07-31-sdk-docs-rag-migration-design.md.
2026-07-31 02:16:11 +03:00
mikhail c65a890df9 docs(plugin): исправить обоснование сессионного mutex без Global\
Прежний комментарий утверждал, что Global\ требует отдельной привилегии —
ревью опровергло это эмпирически (мьютекс создался без ошибок под тем же
непривилегированным пользователем). Настоящая причина: плагин ставится на
чужие незнакомые машины, где политика безопасности может отличаться, и отказ
Global\ был бы фатальным для запуска сервера, тогда как остаточный риск
сессионного mutex (лишняя повторная загрузка при параллельных сессиях)
ограничен и не портит установку.
2026-07-31 02:14:15 +03:00
mikhail f1f2d05c96 fix(gitignore): якорить правило .mcp.json к корню — plugin/.mcp.json должен отслеживаться 2026-07-31 02:13:24 +03:00
mikhail ad0f5463c5 feat(plugin): точка входа лаунчера и объявление MCP-сервера 2026-07-31 02:12:02 +03:00
mikhail 1049a9b01a feat(plugin): bootstrap-модуль установки сервера с проверкой SHA256 2026-07-31 02:03:34 +03:00
mikhail 62fbc3742b fix(tools): UTF-8 BOM для PowerShell 5.1, безопасный AllowCopy, доп. тесты
- AgentAssets.psm1 и sync-agent-assets.ps1 пересохранены в UTF-8 с BOM:
  powershell.exe читает файлы без BOM в системной ANSI-кодировке и ломает
  парсинг на кириллических строковых литералах (pwsh 7 работал за счёт
  автодетекта и маскировал баг).
- Copy-Item в ветке -AllowCopy получил -ErrorAction Stop: без него ошибка
  копирования писалась как non-terminating и функция возвращала 'Copied'
  при частично скопированном каталоге, если вызывающий не выставил
  $ErrorActionPreference='Stop' сам.
- Test-AgentSkillLink сравнивает пути через
  [string]::Equals(...,OrdinalIgnoreCase) явно, а не через регистронезависимый -eq.
- Добавлены тесты: отсутствующий SourcePath, перелинковка на другой
  источник (старый target остаётся нетронутым) и AllowCopy-регрессия
  (мок Copy-Item с [CmdletBinding()], чтобы корректно эмулировать
  ErrorAction реального cmdlet).
2026-07-31 01:58:06 +03:00
mikhail 97e95d5f44 feat(tools): раскладка навыков junction'ами из plugin/skills 2026-07-31 01:36:42 +03:00
mikhail 4a6dbd1497 refactor(skills): пользовательская редакция навыков в plugin/skills, dev-материал в kompas-mcp-dev 2026-07-31 01:21:21 +03:00
mikhail 4b72f36fc9 test(plugin): вынести правило релизного лока в хелпер с theory-покрытием
Освобождает JsonDocument в Read(), покрывает IsReleasedLockValid синтетическими
JSON-кейсами (без релиза / валидный релиз / пустой url / некорректный sha256),
приводит имена тестов к конвенции Method_condition_result проекта.
2026-07-31 01:14:06 +03:00
mikhail febcb664a5 feat(plugin): скелет плагина kompas и тест согласованности манифеста 2026-07-31 01:06:23 +03:00
mikhail ad85ebf478 docs: план реализации плагина kompas (11 задач, TDD) 2026-07-31 01:02:57 +03:00
mikhail 7cc4ee7447 docs: ревизия спека плагина по ревью Codex (канал dist, контракт лаунчера, редакция навыков) 2026-07-31 00:52:52 +03:00
mikhail 63bd9db5f3 docs: спек упаковки в плагин Claude Code и публикации через Gitea 2026-07-31 00:37:26 +03:00
mikhail 4e119afdba docs: замкнуть жизненные циклы CAD-каталога 2026-07-17 02:15:32 +03:00
mikhail b188e1904f docs: уточнить статусы и приоритеты CAD-каталога 2026-07-17 01:57:53 +03:00
mikhail c0d855c171 docs: добавить каталог внешнего CAD-контракта 2026-07-17 01:39:39 +03:00
mikhail 8e56af61b3 docs: спроектировать каталог внешнего CAD-контракта 2026-07-17 01:18:10 +03:00
mikhail 69d037c875 chore: настроить Codex-агент поиска SDK 2026-07-17 01:12:53 +03:00
mikhail 6aa05b1adb docs: спроектировать Codex-агент поиска SDK 2026-07-17 01:06:25 +03:00
mikhail 7cb44a073e docs: handoff — инкремент 9 (выноска) завершён; далее — базы/допуски формы
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:34:18 +03:00
mikhail 16406a34be Merge feat/drawing-leader: линия-выноска с текстом (инкремент 9)
drawing_add_leader через ISymbols2DContainer.Leaders + IBranchs. 83 инструмента,
331 тест зелёный. Ревью: Codex + pi/glm-5.1 + pi/kimi-k2.6.
2026-05-28 00:33:33 +03:00
mikhail 5d51b9e1af docs: выноска — TODO, README, ARCHITECTURE, OPEN_QUESTIONS, presentation, CLAUDE.md
Инкремент 9. 83 инструмента, 331 тест. + заметка о ревью реализации в спеке
(Codex + pi/glm-5.1 + pi/kimi-k2.6).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:33:33 +03:00
mikhail beaa220510 review(drawing): правки по ревью реализации (Codex + pi/glm-5.1 + pi/kimi-k2.6)
- проверка возврата AddBranchByPoint/SetBranchTextPosition (bool) — ранняя диагностика
  вместо позднего RPC_E_SERVERFAULT (Codex, glm)
- RU-алиасы в сообщении ShelfDirections.Parse и в описании инструмента (glm, kimi)
- интеграционный тест направления полки параметризован Right/Left/Up/Down — покрывает
  всю поверхность ToKompas на реальном COM (glm, kimi)
- отклонено (обоснование): unit ToKompas (граница проекта), e2e tool-обёртки (тонкая),
  angleDeg (нет Angle у ILeader), default text у AddText (вне объёма)

331 тест зелёный, сборка Release чистая.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:28:04 +03:00
mikhail f89ad951ae feat(drawing): линия-выноска с текстом (drawing_add_leader)
Выноска на виде через API7 ISymbols2DContainer.Leaders. Стрелка указывает в (x,y),
текст на полке у (textX,textY). shelfDirection: auto|right|left|up|down.

- DrawingService.AddLeaderAsync + GetViewLeaderCountAsync
- ShelfDirection (enum + Parse/ToKompas), переиспользует DrawingAnnotationResult
- 13 unit + 7 интеграционных тестов (всего 328 зелёных), сборка Release чистая

КЛЮЧ (спайк): новая выноска имеет 0 ответвлений — сначала (IBranchs)bl.AddBranchByPoint(0,x,y)
(остриё), ИНАЧЕ КОМПАС падает RPC_E_SERVERFAULT; затем SetBranchTextPosition (полка),
(ILeader)bl.TextOnShelf.Str (текст), Update. Ревью спека Codex+pi/glm-5.1+pi/kimi-k2.6 учтено
(QI as?? throw, read-back ?? empty, RequireDistinctPoints, RU-алиасы, критический порядок).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 00:18:08 +03:00
mikhail 08191db25c docs: handoff — инкремент 8 (формат листа) завершён; ревью-гейт = Codex + pi/glm-5.1 + pi/kimi-k2.6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:35:22 +03:00
mikhail e60c8d48e4 Merge feat/drawing-sheet-format: формат и ориентация листа (инкремент 8)
drawing_set_sheet_format (A0–A5/user + книжная/альбомная) через ILayoutSheet.Format.
82 инструмента, 308 тестов зелёных. Ревью: Codex + pi/glm-5.1 + pi/kimi-k2.6.
2026-05-27 23:34:33 +03:00
mikhail 4937b9e677 docs: формат/ориентация листа — TODO, README, ARCHITECTURE, OPEN_QUESTIONS, presentation, CLAUDE.md
Инкремент 8. 82 инструмента, 308 тестов. + заметка о ревью реализации в спеке
(Codex + pi/glm-5.1 + pi/kimi-k2.6; K1 снят спайком — КОМПАС сам выводит ориентацию user).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:34:15 +03:00
mikhail 24f3531a3c review(drawing): правки по ревью реализации (Codex + pi/glm-5.1 + pi/kimi-k2.6)
- K1 (kimi, Major): спайк подтвердил — для User КОМПАС САМ выводит VerticalOrientation
  из W/H (игнорирует флаг, W/H не свопает); read-back корректен, правка не нужна —
  задокументировано комментарием + тесты на Landscape (500×300→альбомная, 300×500→книжная)
- K2: ValidateFormatDimensions называет точный нарушивший параметр (width/height)
- тесты: A1 в Parse (C3), A4 landscape со свопом 297×210 (G2), sheetNumber=0 (C2/G3)
- отклонено (нит): алиасы в описании (G4), сообщение NaN (G5), тип исключения standard (K5)

308 тестов зелёных, сборка Release чистая.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:28:34 +03:00
mikhail 56ed2cb0cf feat(drawing): формат и ориентация листа (drawing_set_sheet_format)
Задать формат (A0–A5/user) и ориентацию (книжная/альбомная) листа чертежа через
API7 ILayoutSheet.Format (ISheetFormat). Стандартный формат — размеры авто; user —
явные width/height (landscape игнорируется, ориентация из соотношения сторон).

- DrawingService.SetSheetFormatAsync + RequireLayoutSheet
- PaperFormat (enum + Parse/ToKompas/FromKompas), SheetFormatResult
- DrawingValidation.ValidateFormatDimensions (user: >0; стандартный: размеры запрещены)
- 19 unit + 7 интеграционных тестов (всего 304 зелёных), сборка Release чистая

Спайк подтвердил: дефолт A4 portrait; стандартный формат пересчитывает W/H авто
(A3 landscape→420×297); user применяет width/height. Ревью спека pi/glm-5.1 + pi/kimi-k2.6
учтено (FromKompas для дружелюбного имени, запрет размеров у стандартного, sheetNumber>0,
landscape игнорируется для user).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 23:19:37 +03:00
mikhail adc9da37fa Merge feat/skill-kompas-fdm-design: навык проектирования под FDM (DFM-методика + гео-аудит) 2026-05-27 23:00:00 +03:00
mikhail f490c146c7 fix(skill): kompas-fdm-design — уточнить угол θ_max vs α (финальное ревью) 2026-05-27 22:53:51 +03:00
mikhail a87957582c docs: упомянуть навык kompas-fdm-design (проектирование под FDM) 2026-05-27 22:49:30 +03:00
mikhail 178ca48faf feat(skill): kompas-fdm-design — references/geometry-audit.md (самопроверка + границы) 2026-05-27 22:45:23 +03:00
mikhail 38f2687c8d feat(skill): kompas-fdm-design — references/fdm-rules.md (полный свод DFM) 2026-05-27 22:44:06 +03:00
mikhail 2fb0f8347d feat(skill): kompas-fdm-design — диспетчер SKILL.md (правила DFM + гео-аудит) 2026-05-27 22:33:18 +03:00
mikhail a5de3566ba Update agent definitions (.claude/agents/docs-maintainer.md, kompaz-sdk-research.md) 2026-05-27 22:21:13 +03:00
mikhail df7bf92884 docs(skill): spec + план навыка kompas-fdm-design (проектирование под FDM)
Дизайн и план реализации нового навыка kompas-fdm-design — методика
проектирования деталей под FDM-печать (правила DFM + лёгкий гео-аудит),
отдельный от kompas-3d, без слайсера, экспорт через export_step.

Выверено консультациями pi (glm-5.1, kimi-k2.6) и 6 ревью (spec x3, план x3).
Сам навык (SKILL.md + references/) по плану — РЕАЛИЗАЦИЯ ПРЕДСТОИТ.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:18:27 +03:00
mikhail 7b50ac1a5d docs: handoff — инкремент 7 (ассоциативная привязка) завершён; далее — дуга/угловой/формат
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:01:00 +03:00
mikhail 8f4567732e Merge feat/drawing-associative-dimension: ассоциативная привязка размеров (инкремент 7)
Флаг associate у диаметрального/радиального — привязка к спроецированной окружности
через BaseObject (значение из геометрии). 81 инструмент, 278 тестов зелёных.
2026-05-27 22:00:16 +03:00
mikhail ff5fb27dd5 docs: ассоциативная привязка диам./радиального — TODO, README, ARCHITECTURE, OPEN_QUESTIONS, presentation, CLAUDE.md
Инкремент 7. 81 инструмент (associate — флаг существующих), 278 тестов.
CLAUDE.md также включает структурную чистку (делегирование каталога/дорожной карты/
бэклога в README/ARCHITECTURE/TODO без дублирования).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 21:57:45 +03:00
2609 changed files with 7539 additions and 252381 deletions
-62
View File
@@ -1,62 +0,0 @@
---
name: docs-maintainer
description: >
ОБЯЗАТЕЛЬНО делегируй этому субагенту (Sonnet) ВСЮ синхронизацию документации
проекта с кодом — README.md, CLAUDE.md, docs/ARCHITECTURE.md,
docs/OPEN_QUESTIONS.md, docs/presentation.html — НЕ правь эти файлы сам.
Срабатывает ПРОАКТИВНО как обязательный шаг рабочего цикла, а НЕ по явной команде:
как только фича реализована и протестирована, ПЕРЕД коммитом доков передай ему
сводку изменений (новые/переименованные/удалённые инструменты, классы, факты
реализации, закрытые вопросы OPEN_QUESTIONS, новые счётчики инструментов/тестов
для presentation.html). Не жди реплики «обнови доки» — делегируй сам после каждой
завершённой единицы работы. Триггеры (включая ТВОИ внутренние): «фича готова, надо
отразить в доках», «обнови README/ARCHITECTURE/CLAUDE.md/presentation»,
«закрыт вопрос в OPEN_QUESTIONS», «синхронизируй документацию», «задокументируй
изменения». Передавай сводку текстом — код/тесты он сам не запускает (Bash нет).
tools: Read, Edit, Write, Glob, Grep
model: sonnet
---
Ты — помощник по документации проекта **kompas3d-mcp** (MCP-сервер для
автоматизации CAD-системы КОМПАС-3D через COM API, .NET 8, C#).
Тебя вызывают, чтобы основная модель (Opus) не тратила контекст на рутинное
обновление документации: **сводка изменений придёт в промпте от вызывающего**.
Твоя задача — обновить документацию так, чтобы она точно отражала текущее
состояние проекта согласно этой сводке.
## Файлы для обновления (трогай только те, которых касаются изменения)
| Файл | Что содержит |
|------|-------------|
| `docs/presentation.html` | **Презентация проекта — синхронизируй ВСЕГДА.** Счётчики (число инструментов, тестов), бейдж статуса, прогресс-бар, панель инструментов, дорожная карта |
| `README.md` | Обзор проекта, список возможностей, команды сборки/запуска |
| `CLAUDE.md` | Гайд для агента: «Current state», ключевые факты реализации, что не сделано |
| `docs/ARCHITECTURE.md` | Архитектурные решения, стек, паттерны, ключевые факты |
| `docs/OPEN_QUESTIONS.md` | Нерешённые вопросы и ограничения |
## Правила
1. Прочитай каждый файл перед правкой — не угадывай содержимое.
2. Обновляй только секции, которые реально затронуты изменениями.
Не переписывай то, что остаётся актуальным.
3. Если изменение закрывает вопрос из `OPEN_QUESTIONS.md` — удали его
или перенеси в раздел «Решено» (если такой есть).
4. Сохраняй стиль, структуру и тон существующих документов.
5. Будь лаконичен: одно предложение вместо абзаца, если смысл не теряется.
6. Не добавляй раздел «Изменения» или «Changelog» — документы описывают
текущее состояние, а не историю.
7. Счётчики в `presentation.html` (число инструментов/тестов) бери из сводки
изменений; самостоятельно тесты не запускаешь (Bash недоступен).
После правок кратко сообщи, что именно было изменено в каждом файле.
## Пример сводки в промпте
```
- Добавлен инструмент get_part_info (масса, объём, материал)
- QueryTools.cs перенесён в отдельный файл
- Закрыт вопрос из OPEN_QUESTIONS про get_part_info
```
Или короче: «обнови доки — добавил get_part_info».
+44 -69
View File
@@ -1,34 +1,23 @@
--- ---
name: kompas-sdk-research name: kompas-sdk-research
description: > description: "ОБЯЗАТЕЛЬНО делегируй этому субагенту (Haiku, read-only) ЛЮБОЙ поиск по справке COM API КОМПАС — она живёт в RAG-базе `kompas-sdk` (MCP), а не в этом репозитории. Срабатывает ПРОАКТИВНО, без явной просьбы пользователя: как только при планировании или реализации фичи тебе понадобилась сигнатура метода (Automation/COM), значения перечисления (Obj3dType, ksHoleTypeEnum, ST_MIX_*, стили линий…), нужный интерфейс под задачу («чем/каким интерфейсом построить X»), единицы измерения или цепочка вызовов — СНАЧАЛА спроси этого субагента, ПОТОМ пиши код. Это дёшево: ответ Haiku ты всё равно перепроверяешь рефлексией по libs/kompas-interop/*.dll, поэтому ошибка стоит мало, а сэкономленный контекст Opus — много. Триггеры (в т.ч. ТВОИ внутренние, не только реплики пользователя): «нужна сигнатура …», «какие значения enum …», «каким интерфейсом сделать X через API КОМПАС», «что возвращает <метод>», «как через COM API построить …», «найди в справке КОМПАС». НЕ для построения геометрии в КОМПАС (это MCP-инструменты / навык kompas-3d) и НЕ для KsAPI (Qt/C++ — в базе его нет).\n"
ОБЯЗАТЕЛЬНО делегируй этому субагенту (Haiku, read-only) ЛЮБОЙ поиск по справке tools: "mcp__kompas-sdk__search_knowledge, mcp__kompas-sdk__grep_knowledge, mcp__kompas-sdk__get_document, mcp__kompas-sdk__get_chunk_context, mcp__kompas-sdk__knowledge_status"
COM API КОМПАС в MD-базе docs/Kompas3D_SDK/ — НЕ грепай справку сам. Срабатывает
ПРОАКТИВНО, без явной просьбы пользователя: как только при планировании или
реализации фичи тебе понадобилась сигнатура метода (Automation/COM), значения
перечисления (Obj3dType, ksHoleTypeEnum, ST_MIX_*, стили линий…), нужный
интерфейс под задачу («чем/каким интерфейсом построить X»), единицы измерения
или цепочка вызовов — СНАЧАЛА спроси этого субагента, ПОТОМ пиши код. Это дёшево:
ответ Haiku ты всё равно перепроверяешь рефлексией по libs/kompas-interop/*.dll,
поэтому ошибка стоит мало, а сэкономленный контекст Opus — много. Триггеры (в т.ч.
ТВОИ внутренние, не только реплики пользователя): «нужна сигнатура …»,
«какие значения enum …», «каким интерфейсом сделать X через API КОМПАС»,
«что возвращает <метод>», «как через COM API построить …», «найди в справке КОМПАС».
НЕ для построения геометрии в КОМПАС (это MCP-инструменты / навык kompas-3d) и
НЕ для KsAPI (Qt/C++ — в MD-базе его нет).
tools: Glob, Grep, Read
model: haiku model: haiku
color: cyan
--- ---
Ты — помощник по навигации в справке **КОМПАС SDK** для проекта
Ты — помощник по навигации в справке **КОМПАС SDK** в репозитории
**kompas3d-mcp** (MCP-сервер для КОМПАС-3D через COM API, .NET 8, C#). **kompas3d-mcp** (MCP-сервер для КОМПАС-3D через COM API, .NET 8, C#).
Справка — это MD-база знаний `docs/Kompas3D_SDK/`: статьи по интерфейсам с
YAML-фронтматтером (`type`, `api`, `domain`, `tags`, `sources`); методы и Справка — это RAG-база **`kompas-sdk`** (2465 статей из репозитория
свойства — заголовки `## ` внутри статьи интерфейса. `kompas-sdk-docs`, версия SDK v24): статьи по интерфейсам, перечислениям,
структурам и руководствам с полями `title`, `type`, `api`, `domain`, `tags`.
Методы и свойства — секции `## Имя - Описание` внутри статьи интерфейса.
**В репозитории проекта справки больше нет** — Grep/Read по нему бесполезны,
у тебя их и нет.
Тебя вызывают, чтобы основная модель (Opus) не тратила контекст на поиск: Тебя вызывают, чтобы основная модель (Opus) не тратила контекст на поиск:
**вопрос для исследования придёт в промпте от вызывающего**. Прогони Grep/Read **вопрос для исследования придёт в промпте от вызывающего**. Найди ответ через
по базе, прочитай нужную статью и верни сжатый ответ (интерфейс, сигнатура, инструменты `mcp__kompas-sdk__*` и верни сжатую выжимку.
параметры, значения констант, источник).
## Когда это про тебя ## Когда это про тебя
@@ -37,64 +26,50 @@ YAML-фронтматтером (`type`, `api`, `domain`, `tags`, `sources`); м
- Нужно найти интерфейс под задачу («чем построить массив», «как задать переменную»). - Нужно найти интерфейс под задачу («чем построить массив», «как задать переменную»).
- Нужен паттерн «как через API сделать X» с цепочкой вызовов. - Нужен паттерн «как через API сделать X» с цепочкой вызовов.
## Структура MD-базы `docs/Kompas3D_SDK/` ## Порядок поиска (соблюдай — он экономит и время, и контекст)
``` 1. **Знаешь точное имя** — начинай с `grep_knowledge`. Имена методов лежат в
index.md — оглавление по 4 категориям со ссылками на статьи заголовках `## SetSideParam - …`, поэтому точный поиск ведёт прямо в статью:
interfaces/*.md — одна статья на интерфейс/тему; все методы и свойства как ## секции `grep_knowledge("SetSideParam")`, `grep_knowledge("ksHoleTypeEnum")`,
enums/*.md — перечисления (пары «имя | значение | смысл») `grep_knowledge("o3d_incline")`. Регулярки работают.
structures/*.md — структуры и параметрические интерфейсы 2. **Вопрос задачный** («чем построить массив по сетке», «как задать уклон») —
guides/*.md — концепции и руководства `search_knowledge` с фильтрами:
resources/ — изображения (ссылки в статьях вида ../resources/имя.png) - `type`: `interface` / `enum` / `struct` / `guide`;
``` - `tags`: `api7`, `api5`, `3d`, `2d`, `sketch`, `assembly`, `drawing`, `feature`;
- `path_prefix`: `sdk/enums/`, `sdk/interfaces/`, `sdk/structures/`.
Каждая статья начинается с YAML-фронтматтера: `type` (interface/enum/struct/guide), 3. **Прочитать окрестность найденного**`get_chunk_context(document_id, chunk_index, window=2)`.
`api` (api7/api5), `domain` (3d/2d/sketch/assembly/…), `tags`, `sources` (исходные `*.html`). 4. `get_document`**только для небольших статей**. Крупные интерфейсы
Имя файла статьи — имя интерфейса (`iapplication.md`, `ksbossextrusiondefinition.md`) (`sdk/interfaces/геометрия.md` — 261 КБ, `ksdocument2d.md` — 241 КБ) выгрузкой
или читаемый слаг темы (`приложение.md`). Методы/свойства внутри — заголовки `## Имя - Описание`. целиком сожгут твой контекст и обесценят делегирование. Сомневаешься —
бери `get_chunk_context`.
> База **хранится в репозитории** (канонический источник справки) — отдельная 5. `knowledge_status` — если поиск подозрительно пуст: покажет коммит, число
> генерация не нужна. документов и точек в индексе.
## Инструменты (используй именно их, не веб)
- **Grep** по `docs/Kompas3D_SDK/` — ищи имя интерфейса/метода/свойства, русское
ключевое слово или тег. Имена методов — это заголовки `## SetSideParam - …`,
поэтому поиск по имени метода сразу ведёт в нужную статью.
- **Read** найденного `*.md` — статья интерфейса содержит все его методы/свойства,
блоки `Синтаксис Automation:`/`Синтаксис COM:` (в code-fence), параметры, примечания.
- `docs/Kompas3D_SDK/index.md` — оглавление по категориям, когда нужно осмотреть тему.
Полезные приёмы поиска:
- по перечислению: `Grep "ksMassUnitsEnum"` или загляни в `enums/`;
- фильтр по тегам в фронтматтере: `Grep "domain: \[.*3d"` , `Grep "type: enum"`;
- веер по многим интерфейсам сразу: `Grep "IPart7|IDocument3D|IPart"` по `interfaces/`.
Точные числовые значения констант при необходимости сверяй в заголовках SDK:
`C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK\Include\*.h` (например `ksConstants*.h`, `ldefin2d.h`).
## Важно — что в базе и чего нет
- База содержит **COM API7/API5** — то, что использует проект (файлы `iapplication*`,
`kspart*`, `ksmassinertiaparam*` и т.п.). Это твой основной источник.
- Кроссплатформенный Qt/C++ **KsAPI** (`ksapi_*`) в базу **не включён** — если задача
явно про KsAPI, скажи об этом (нужен отдельный источник).
## Правила ## Правила
1. Не угадывай — находи через Grep/Read по `docs/Kompas3D_SDK/` и читай первоисточник. 1. Не угадывай — находи через инструменты и цитируй первоисточник.
2. Верни **сжатую выжимку**, а не дамп статьи: 2. Верни **сжатую выжимку**, а не дамп статьи:
- имя интерфейса и метода/свойства; - имя интерфейса и метода/свойства;
- синтаксис Automation (и COM, если важен порядок out-параметров); - синтаксис Automation (и COM, если важен порядок out-параметров);
- параметры (имя, тип, смысл) и возвращаемое значение; - параметры (имя, тип, смысл) и возвращаемое значение;
- для enum/констант — пары «имя = значение» и их смысл; - для enum/констант — пары «имя = значение» и их смысл;
- важные примечания (единицы измерения, побочные эффекты, версия КОМПАС); - важные примечания (единицы измерения, побочные эффекты, версия КОМПАС);
- имя статьи / `sources` из фронтматтера как ссылку на источник. - `path` статьи (например `sdk/interfaces/kspart.md`) как ссылку на источник.
3. Если у метода несколько перегрузок или связанных интерфейсов — перечисли релевантные. 3. Если у метода несколько перегрузок или связанных интерфейсов — перечисли релевантные.
4. Если в COM-interop имя отличается от справки (частый случай в этом проекте), отметь это 4. Если в COM-interop имя отличается от справки (частый случай в этом проекте), отметь это
как вероятную тонкость и предложи свериться рефлексией по `libs/kompas-interop/*.dll`. как вероятную тонкость и предложи свериться рефлексией по `libs/kompas-interop/*.dll`.
5. Только исследование и ответ — правок в код или документацию не делаешь (инструменты 5. **Если MCP не отвечает — так и скажи**, не выдумывай сигнатуры: локальной копии
ограничены чтением). справки больше нет, проверить тебе будет нечем. Такой ответ полезнее выдумки.
6. Только исследование и ответ — правок в код или документацию не делаешь.
## Чего в базе нет
- Кроссплатформенный Qt/C++ **KsAPI** (`ksapi_*`) исключён намеренно — проект
использует COM API. Задача про KsAPI → скажи, что нужен отдельный источник.
- Точные числовые значения констант при необходимости сверяются в заголовках SDK
на машине разработчика: `C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK\Include\*.h`
(`ksConstants*.h`, `ldefin2d.h`) — этих файлов у тебя нет, поэтому просто укажи,
где смотреть.
## Пример задачи в промпте ## Пример задачи в промпте
+21
View File
@@ -0,0 +1,21 @@
{
"enabledPlugins": {
"obsidian-autodoc@home-repo-cc": true
},
"extraKnownMarketplaces": {
"home-repo-cc": {
"source": {
"source": "git",
"url": "https://git.shahovalov.ru/mikhail/home-repo-cc.git"
}
}
},
"pluginConfigs": {
"obsidian-autodoc@home-repo-cc": {
"options": {
"vault": "Obsidian",
"area": "Области/Разработка"
}
}
}
}
-133
View File
@@ -1,133 +0,0 @@
---
name: kompas-3d
description: >
Методика работы с КОМПАС-3D через MCP-сервер этого проекта: построение и
модификация деталей, импорт/экспорт STEP, работа со сборками, осмотр геометрии
снимками и запросами. Используй ВСЕГДА, когда задача — что-то СДЕЛАТЬ в КОМПАС
через MCP-инструменты (создать/править деталь, импортировать STEP, разобрать
сборку, померить, отрендерить, экспортировать). Здесь — playbook'и и эвристики,
выработанные в usecases/. Триггеры: «построй деталь в КОМПАС», «импортируй STEP»,
«что в этой сборке», «нарасти/измени деталь», «экспортируй STEP», «сделай снимок модели».
НЕ для поиска по справке SDK — это субагент kompas-sdk-research.
---
# kompas-3d — методика управления КОМПАС-3D через MCP
## Два слоя (важно не смешивать)
- **MCP-сервер** (`src/Kompas.Mcp.Host`) — *инструмент*. Он **транслирует возможности COM API/SDK
КОМПАС** в MCP-инструменты. Инструменты делаются **общими** (по возможностям SDK), а не под
конкретную задачу. Расширяя MCP, добавляй универсальную операцию (например `import_step`,
`list_components`, `export_step`, «переместить грань», «рассечь тело»), а не «сделать вот эту деталь».
- **Этот навык** — *методика*. Как из общих инструментов собрать решение: порядок шагов,
выбор геометрии, проверка результата, обход подводных камней. Подходы вырабатываются в
**`usecases/`** и поднимаются сюда.
Итог: **MCP = чем делать, навык = как делать.** Новый приём сначала обкатывается кейсом, потом
обобщается: инструмент → в MCP, метод → в этот навык.
## Когда применять
Любая задача «сделать что-то В КОМПАС» через MCP: создать/править деталь, эскизы и операции,
импорт/экспорт обменных форматов, разбор сборки, измерения, снимки. Для поиска сигнатур/констант
в справке — отдельный субагент `kompas-sdk-research`. Для правки документации — субагент `docs-maintainer`.
## Два правила прежде всего
**1. «Зрение» — структурное, не по картинке.** Чтобы «увидеть» деталь, вызывай **`describe_model`** —
это единый структурный паспорт одним запросом: габарит, МЦХ, тела, топология (грани/рёбра, сгруппированные
по типам), дерево построения с параметрами, переменные. Это **точнее и дешевле по контексту**, чем
`model_snapshot`. Для деталей углубляйся `describe_face` / `describe_edge` / `measure` / `list_faces|edges|bodies|features|variables`.
**`model_snapshot` бери только** для визуально-пространственных вопросов, на которые паспорт не отвечает
(общая форма, ориентация, правдоподобность результата, «куда смотрит грань»). **Не анализируй изображение
там, где достаточно чисел** — снимок дорог по контексту и менее точен.
**2. `validate_part` — после КАЖДОЙ операции.** Любая формообразующая или прямое редактирование
(`extrude_*`/`revolve_*`/`fillet_*`/`chamfer_*`/`move_face`/`split_solid_by_plane`/`move_body`/`boolean_union`)
может «пройти» (`Update()==true`), оставив деталь в ошибке. После каждой операции вызывай `validate_part`:
**пустой результат = чисто; непустой = провал** (напр. `et3dError54`) — не продолжай и не экспортируй,
исправь или переделай другим методом. Перед `export_step` / выдачей результата — обязательно чистый `validate_part`.
(`move_face`/`move_body`/`boolean_union` сами дописывают итог `validate_part` в ответ, но проверяй явно после
формообразующих тоже.)
## Инструменты MCP
**Реализованы (v2+, 46 инструментов):**
- *Система/документы:* `kompas_connect`, `kompas_set_visible`, `kompas_status`; `document_create|open|save|save_as|close|active`.
- *Эскиз:* `sketch_create`, `sketch_create_on_face[_index]`, `sketch_add_line|circle|rectangle|axis`, `sketch_close`.
- *Операции:* `extrude_boss|cut`, `revolve_boss|cut`, `fillet_edge[_index]`, `chamfer_edge[_index]`, `rebuild`.
- *Прямое редактирование (без дерева, в т.ч. импортированная B-rep):* `move_face` (сдвинуть грань на N мм по нормали), `split_solid_by_plane` (рассечь тело плоскостью), `move_body` (сдвинуть тело на вектор), `boolean_union` (объединить тела).
- *Обмен:* `import_step`, `export_step`.
- *Запрос/осмотр:* `get_part_info`, `get_bounding_box`, `list_faces`, `list_edges`, `list_components`, `list_bodies`, `list_features`, `list_variables`, `measure`, `describe_model|face|edge` (структурный осмотр без снимка), `model_snapshot`.
- *Проверка:* `validate_part` (операции в ошибке / требующие перестроения).
**Планируются (трансляция SDK, по мере кейсов):** массивы/паттерны, оболочка/уклон, запись переменных, 2D-чертёж, построение сборок.
> Если нужного инструмента ещё нет — не хардкодь обход под кейс. Заведи кейс в `usecases/`,
> докажи механику (тест или минимальный прогон в usecases/), затем продуктизируй как
> **общий** инструмент MCP (с тестами, TDD) и опиши приём здесь.
## Базовый цикл (эскиз → операция → осмотр)
Опорный сценарий построения, проверен end-to-end (см. `usecases/0001`):
1. `kompas_connect` (+ `kompas_set_visible true`).
2. `document_create part`.
3. `sketch_create XOY``sketch_add_*``sketch_close`.
4. `extrude_boss`/`revolve_boss`/… → **`validate_part`** (правило 2).
5. **Осмотр — структурно:** `describe_model` (паспорт: габарит, МЦХ, топология, дерево). Снимок — только если нужен визуальный контроль.
6. Итерация «на грани»: `describe_model`/`list_faces` (+`describe_face`) → `sketch_create_on_face_index` → операция → `validate_part`.
## Работа с импортом / сборками (выработано в usecases/0002)
Конвейер «импорт → разбор → извлечение детали → осмотр → модификация → экспорт»:
1. **Импорт STEP** в новый документ (под капотом: встроенный конвертер по коду формата
`ksConverterFromSTEP`, затем `ConvertFromAdditionFormat`). Тип документа выбирается по
содержимому: сборка → `.a3d`, одиночное тело → деталь.
2. **Разбор сборки**: перечислить компоненты (имя, обозначение, габарит, файл) — обход `TopPart → Parts`.
3. **Извлечение отдельной детали**: при импорте включать «создавать файлы компонентов», тогда
компоненты пишутся как отдельные `.m3d` рядом; открывать деталь самостоятельным документом
(`OpenSourceDocument`). Гашение видимости компонента на снимок **не влияет** — изоляция так не делается.
4. **Осмотр детали — структурно:** `describe_model` (габарит по осям → какая ось «высота», МЦХ,
тела, топология). Грани/рёбра под операцию — `list_faces`/`describe_face`, `measure`. `model_snapshot`
(или стандартные проекции `#Спереди/#Сверху/#Слева/#Справа/#Изометрия`) — **только** если нужен
визуально-пространственный контроль формы.
5. **Модификация** на «тупой» импортированной B-rep (после каждой операции — `validate_part`):
- *Простой случай* — `move_face`: сдвинуть плоскую грань на +N мм (наружу) или −N (внутрь).
⚠ На сложном торце (с отверстием/пазом) FaceMover может дать `et3dError54`.
- *Вставка N мм в середину призматической ножки* (надёжно, грани совпадают):
`split_solid_by_plane(plane, offset)``move_body(индекс верхнего тела, dz=N)`
`move_face(точка на грани реза, +N)` (мост) → `boolean_union()`.
6. **Проверка перед выдачей:** `validate_part` — чисто; затем **Экспорт STEP** `export_step(path, format=auto|ap203|ap214|ap242)`.
Точные COM-приёмы и сигнатуры — в авто-памяти `kompas-step-and-assembly-api` и в `usecases/0002/case.md`.
## Эвристики и подводные камни
- **Зрение — структурное (правило 1).** Осматривай через `describe_model`/`describe_face`/`describe_edge`/`measure`,
а не снимком. `model_snapshot` — только для визуально-пространственных вопросов; не гоняй картинку зря.
- **`validate_part` после каждой операции (правило 2).** `Update()==true` ≠ успех; непустой `validate_part`
(напр. `et3dError54`) — деталь невалидна, в STEP/печать не брать.
- **Грань/ребро по индексу надёжнее, чем по точке.** Сначала `list_faces`/`list_edges` (или `describe_model`),
затем `*_on_face_index` / `*_edge_index`. По точке (`SelectByPoint`) — только когда индекс не подходит.
- **Направление операции.** `extrude_boss(..., forward)` / `move_face(distance±)` может уйти «не туда» —
сверяй результат `get_bounding_box`/`describe_model` (числами), снимок лишь при необходимости.
- **МЦХ.** Объём/масса меняющейся геометрии бери через `get_part_info`/`describe_model`; перед чтением после правок — `rebuild`.
- **id эскизов/операций** недействительны после смены активного документа (create/open/close).
- **Единицы — мм** (геометрия) и кг (масса). Локальные координаты эскиза ≠ мировые координаты модели.
## Открытые вопросы / границы
- **Прямое редактирование B-rep — реализовано полностью:** `move_face`, `split_solid_by_plane`,
`move_body`, `boolean_union`. Цепочка cut→spread→union проверена end-to-end (usecases/0002,
top_spacer 39.45→41.45 мм, `validate_part` чисто).
- Не реализованы как инструменты: массивы/паттерны, оболочка/уклон, запись переменных, 2D, сборки.
## Связанное
- Инструменты и их реализация: `src/Kompas.Mcp.Host/Tools/*`, `src/Kompas.Mcp.Core/*`.
- Кейсы (полигон подходов): `usecases/` (см. `usecases/README.md`).
- Поиск по справке SDK: субагент **kompas-sdk-research**.
- Правка документации проекта: субагент **docs-maintainer**.
- Память: `kompas-step-and-assembly-api` (проверенные COM-приёмы импорта/экспорта/обхода).
+106
View File
@@ -0,0 +1,106 @@
---
name: kompas-mcp-dev
description: Внутренняя методика доработки самого MCP-сервера КОМПАС-3D в этом репозитории — два слоя (инструмент/методика), полигон usecases/, продуктизация приёма в общий инструмент, делегирование поиска по справке SDK субагенту kompas-sdk-research. Используй, когда задача — доработать сервер (новый инструмент, тесты, плагин, CI), а не построить деталь. Для построения деталей — навык kompas-3d.
---
# kompas-mcp-dev — доработка MCP-сервера КОМПАС-3D
Область: код сервера, тесты, упаковка в плагин. Построение деталей — навык `kompas-3d`.
Архитектура, принципы и бэклог — в `CLAUDE.md` (каталога `docs/` в репозитории нет и заводить его
не нужно). Тяжёлые справочники вынесены сюда, чтобы не висеть в контексте каждой сессии:
- **`reference/com-implementation-facts.md`** — проверенные COM-цепочки: загрузка interop, STA-диспетчер,
построение через API5 `ksPart`, выбор граней/рёбер, МЦХ, снимки, дерево построения, переменные,
STEP, прямое редактирование B-rep, формообразующие, массивы и зеркало, отверстия, сборки, чертежи,
примитивы эскиза. **Читай перед правкой COM-слоя** и дописывай туда каждую новую проверенную цепочку.
- **`reference/plugin-and-release.md`** — устройство `plugin/`, доставка сервера, ветка `dist`, релизный
workflow, подводные камни CI, обновление RAG-базы справки SDK.
## Два слоя (важно не смешивать)
- **MCP-сервер** (`src/Kompas.Mcp.Host`) — *инструмент*. Он **транслирует возможности COM API/SDK
КОМПАС** в MCP-инструменты. Инструменты делаются **общими** (по возможностям SDK), а не под
конкретную задачу. Расширяя MCP, добавляй универсальную операцию (`import_step`, `list_components`,
«переместить грань», «рассечь тело»), а не «сделать вот эту деталь».
- **Навык `kompas-3d`** — *методика*. Как из общих инструментов собрать решение: порядок шагов,
выбор геометрии, проверка результата, обход подводных камней.
Итог: **MCP = чем делать, навык = как делать.** Новый приём сначала обкатывается кейсом, потом
обобщается: инструмент → в MCP, метод → в навык `kompas-3d`.
## Правила формы инструмента (каталог оптимизирован под агента)
Каталог сознательно сжат с 84 инструментов до 56 — экономится не только контекст, но и число
вызовов, а каждый лишний вызов это лишний шанс сбиться. Держи форму:
- **Инструмент = смысл операции, вариант = параметр.** `extrude(mode=boss|cut)`,
`hole(type=simple|counterbore|…)`, `pattern(kind=linear|circular)`. Отдельный инструмент заводи,
только если у варианта своя схема параметров (`sweep`, `loft`, `rib` — законно отдельные).
- **Объект выбирается индексом ИЛИ точкой одним инструментом.** Не плоди `*_index`-двойники:
`faceIndex`/`edgeIndices` из `list_faces`/`list_edges` — основной путь, `x,y,z` — запасной.
У операций API7, которые умеют только точку, индекс переводится в точку через
`ModelInspectionService.FaceCenterPointAsync` (середина параметрической области грани).
- **Пакет вместо серии вызовов.** Списочный параметр (`entities[]`, `edgeIndices[]`, `featureIds[]`)
выполняется за ОДИН заход на STA-поток: см. `PartModeler.AddEntitiesAsync` и синхронные ядра
примитивов рядом с ним. Ошибка обязана называть позицию в пакете.
- **Схема не запрещает неверную комбинацию полей — это делает валидация.** Сообщение называет
`type=…` и недостающий параметр (`SketchEntityInputs`, `FeatureTools.Required`), иначе агент
тратит лишний ход на догадки.
- **Мутирующая операция сама дописывает итог проверки** через `AutoValidation.AnnotateAsync`
(`Core/Validation`). Переключатель — `set_auto_validate` и `KOMPAS_MCP_AUTOVALIDATE`; проверка
никогда не превращает удачную операцию в ошибку (сбой самой проверки уходит в примечание).
## Продуктизация приёма
> Если нужного инструмента ещё нет — не хардкодь обход под кейс. Заведи кейс в `usecases/`,
> докажи механику (спайк или минимальный прогон), затем продуктизируй как **общий** инструмент MCP
> (с тестами, TDD) и опиши приём в навыке `kompas-3d`.
Порядок для нового инструмента:
1. **Сигнатуры и константы** — через субагента `kompas-sdk-research` (см. ниже), затем перепроверка
рефлексией по `libs/kompas-interop/*.dll`: справка врёт (напр. `IRadialDimension.NominalValue`
отдаёт радиус, а не диаметр; `direction` у `ksInclineDefinition` инвертирован).
2. **Спайк вживую** — минимальный прогон на запущенном КОМПАС; COM-цепочка считается верной только
после этого.
3. **Сервис в `src/Kompas.Mcp.Core/<домен>/`** + валидация параметров отдельным статическим классом
(`*Validation`, `SketchGeometry`) — она покрывается unit-тестами без COM.
4. **Инструмент в `src/Kompas.Mcp.Host/Tools/<Группа>Tools.cs`** — по файлу на группу.
5. **Тесты**: unit на валидацию/маппинг перечислений, integration на реальную геометрию
(класс наследует `IntegrationTestBase`, артефакты — в `.scratch/`).
6. **Документация**: каталог инструментов в `README.md` (+ счётчик в заголовке), проверенная
COM-цепочка и подводные камни — в `reference/com-implementation-facts.md` (здесь же, в навыке)
и в память (`kompas-*-api*.md`). Правь эти файлы сам — субагента для документации больше нет.
## Проверка
```powershell
dotnet build -c Release
dotnet test --filter "Category=Unit" # без COM
dotnet test --filter "Category=Integration" # нужен запущенный КОМПАС
pwsh -NoProfile -File tools/tests/run-ps-tests.ps1 # PowerShell плагина (Pester)
```
CI гоняет только `Category=Unit&Requires!=Windows` на Linux-раннере — integration там не запустится
никогда. Формат решения `.slnx` понимает лишь SDK 9+, поэтому в CI проекты указаны путями.
## Делегирование
**Поиск по справке SDK** (сигнатуры, константы, перечисления, цепочки COM-вызовов) — субагент
**`kompas-sdk-research`** (Haiku, read-only). Справка живёт **не в репозитории**, а в RAG-базе
`kompas-sdk` (MCP-сервер, репозиторий `kompas-sdk-docs`) — грепать по проекту бесполезно, доступ к
базе есть только у субагента. Ошибка стоит дёшево: ответ всё равно перепроверяется рефлексией по
interop-сборкам.
## Ориентиры в репозитории
- Инструменты и реализация: `src/Kompas.Mcp.Host/Tools/*`, `src/Kompas.Mcp.Core/*`.
- Кейсы (полигон подходов): `usecases/` — локальный, в `.gitignore`, в плагин не входит.
- Публикуемые навыки плагина: `plugin/skills/` (`kompas-3d`, `kompas-fdm-design`) — источник истины;
`.claude/skills/<навык>` это junction'ы, раскладку делает `tools/sync-agent-assets.ps1`.
Перед `git checkout` на ревизию без `plugin/skills` — сначала `-Remove`, иначе checkout ломается
на полпути (подробности в `CLAUDE.md`).
- Плагин и доставка сервера: `plugin/` (манифест, `server.lock.json`, лаунчер) — версия в
`plugin.json` и `server.lock.json` должна совпадать, это проверяет CI.
- Память: `kompas-step-and-assembly-api`, `kompas-drawing-api7`, `kompas-hole-api7`,
`kompas-formative-features-api5`, `kompas-pattern-mirror-api5`, `kompas-variables-api5`.
@@ -0,0 +1,207 @@
# Key implementation facts (don't relearn)
Проверенные COM-цепочки сервера. Перенесено из `CLAUDE.md`, чтобы не грузить эти ~19 КБ
в каждую сессию: они нужны при доработке сервера, а не при любом вопросе по репозиторию.
Правь этот файл, когда проверил новую цепочку вживую.
- **Interop assemblies are not shipped** (`KompasAPI7`, `Kompas6API5`, `Kompas6Constants`,
`Kompas6Constants3D` belong to ASCON). `libs/kompas-interop` is referenced with `<Private>false</Private>`
— compile-time only, absent from `bin/` **and** from the published archive/`deps.json`. At runtime
`KompasInteropLoader.Install()` (first line of `Program.cs`) hooks `AssemblyLoadContext.Default.Resolving`;
lookup order: `KOMPAS_INTEROP_DIR` → next to `kompas-mcp.exe` → cache → the installed КОМПАС.
**The install has no loose interop DLLs** — they live only inside `<install>\SDK\Samples\CSharp.zip`
under `Common/`, so the provider unzips them into `%LOCALAPPDATA%\kompas-mcp\interop\<key>` (key = hash
of the zip's path+size+mtime, so a КОМПАС upgrade re-extracts; staging dir + `Directory.Move` for
atomicity). The install dir comes from `HKCR\<ProgID>\CLSID``HKCR\CLSID\{…}\LocalServer32`
(`"…\Bin\kHome.Exe"` on v24 Home) — `HKLM\SOFTWARE\ASCON` holds settings, not the path. All interop
identities are `Version=1.0.0.0` with **no strong name**, so resolving by simple name is version-agnostic
across КОМПАС releases. Failure throws `KompasInteropException` with an actionable message; `Program`
logs it at startup (non-fatal — `--version` must work without КОМПАС) and `kompas_status` returns it
(it checks interop **before** touching `KompasSession`, otherwise the MCP SDK shows only «An error
occurred invoking …»). **The test project copies the DLLs itself**
(`<None Include="$(KompasInteropDir)\*.dll">`) — the Linux CI runner has no КОМПАС to resolve from.
- **All COM calls run on one dedicated STA thread** (`KompasDispatcher.InvokeAsync`); КОМПАС is
single-instance STA. Services never touch COM off that thread.
- **Connection**: API5 (`KOMPAS.Application.5``KompasObject`) then `ksGetApplication7()``IApplication`;
the API5 root is needed for `ksPart` 3D building and `ksDocument3D` snapshots. API7 drives app/documents,
holes, assemblies, drawings and direct B-rep edit.
- **3D via API5 `ksPart`**: `NewEntity(o3d_*)` + matching definition; always check `entity.Create()` return.
Entity codes: `o3d_sketch`/`o3d_bossExtrusion`/`o3d_cutExtrusion`/`o3d_bossRotated`/`o3d_fillet`/`o3d_chamfer`,
`o3d_shellOperation=43`, `o3d_ribOperation=44`, `o3d_baseEvolution=45` (sweep), `o3d_baseLoft=30`,
`o3d_planeOffset=14`, `o3d_meshCopy=35` (linear pattern), `o3d_circularCopy=36`, `o3d_mirrorOperation=48`,
`o3d_mirrorAllOperation=49`, `o3d_incline=42` (draft), axes `o3d_axisOX/OY/OZ=71/72/73`. Definitions:
`ksBossExtrusionDefinition`/`ksCutExtrusionDefinition`/`ksBossRotatedDefinition`/`ksFilletDefinition`/
`ksChamferDefinition`/`ksShellDefinition`/`ksRibDefinition`/`ksBaseEvolutionDefinition`/
`ksBaseLoftDefinition`/`ksPlaneOffsetDefinition`/`ksMeshCopyDefinition`/`ksCircularCopyDefinition`/
`ksMirrorCopyDefinition`/`ksMirrorCopyAllDefinition`/`ksInclineDefinition`. Cut-through holes use
`dtBoth` + `etThroughAll`.
- **Face/edge selection**: `ksPart.EntityCollection(o3d_face|o3d_edge)``SelectByPoint(x,y,z)` (world mm)
`GetByIndex(0)`; or by stable index from `list_faces`/`list_edges` (helpers `SelectFaceByIndex`/
`SelectEdgeByIndex`, range-checked before mutation; by-index is more reliable than by-point). Classify:
`ksFaceDefinition.IsPlanar/IsCylinder/…` + `GetArea(ST_MIX_MM)`; `ksEdgeDefinition.IsLineSeg/IsCircle/IsArc/…`
+ `GetLength()`. A sketch axis is a line with system style **3** (осевая).
- **МЦХ / mass props**: use **API5 `ksPart.CalcMassInertiaProperties(ST_MIX_MM|ST_MIX_KG)`**
`ksMassInertiaParam` (`v`/`m`/`F`/`xc`/`yc`/`zc`), computed on demand. **Do NOT** use API7
`IMassInertiaParam7.Calculate()` — its `Actual` flag sticks after the first calc and won't refresh on
API5 geometry changes (stale volume). Bounding box: `ksPart.GetGabarit(full:false, …)`.
- **Snapshot**: `ksDocument3D.SaveAsToRasterFormat(file, ksRasterFormatParam)` renders to a temp file (the
in-memory `resultArrayBytes` stays empty when a filename is given); read the bytes back. Return to MCP via
`ImageContentBlock.FromBytes(bytes, mime)`**not** `Data = bytes` (Data holds base64). Use
`model_snapshot` only for visually-spatial questions; **prefer `describe_model` first** (structural
«passport» — bbox + МЦХ + bodies + topology + feature tree + variables, no image token cost).
- Logs go to **stderr** (stdout is the MCP channel). Integration tests reuse one КОМПАС via `KompasFixture`;
artifacts land in gitignored `.scratch/`. All integration test classes inherit `IntegrationTestBase`
(`IAsyncLifetime`) → `DocumentService.CloseAllAsync` after each test (prevents tab accumulation).
- **Feature tree API**: read via API5 `ksPart.GetFeature()``(ksFeature).SubFeatureCollection(true,false)`
`ksFeatureCollection`. Casting `(ksFeature)part` does NOT work (RCW QI returns null) — must use
`GetFeature()`. `ksFeature.type` returns only a coarse `o3d_entity` and does NOT distinguish operations;
the precise type and params come from `ksFeature.GetObject()``ksEntity.GetDefinition()` + the matching
definition (`ksBossExtrusionDefinition.GetSideParam`, `ksFilletDefinition.radius`,
`ksChamferDefinition.GetChamferParam`, …). Node names («Элемент выдавливания:1») are localized by КОМПАС.
Features registered by id in `_features` support patterns/mirror; helpers `RequireSketch`/`RequireFeature`.
- **Variables (API5)**: create/read via `ksPart.GetFeature().VariableCollection` (property on the root
ksFeature) — **NOT** `ksPart.VariableCollection()` (returns external-only). Expression is the leading
field; value is derived. Apply via `ksPart.RebuildModel()` (check the return); after a rebuild the RCW
variable is stale → re-read via a fresh collection (`ReadValueFresh`). Dependents recalculate
automatically; deletion fails while dependents exist (`RemoveVariable` returns FALSE).
**Geometry limitation:** variables drive geometry only in a parametric model (sketch dims linked to
variable names); our sketches use literal coordinates → `set_variable` stores/computes the value but does
NOT move geometry. Parametric sketches are **unavailable via COM** (`ksCDimWithVariable` is not
constructible from external automation — see memory `kompas-parametric-sketch-findings`; do not retry
without new information).
- **Topology / measure API**: `ksFaceDefinition.EdgeCollection` / `GetCylinderParam` /
`GetSurface().GetNormal` + `normalOrientation`; `ksEdgeDefinition.GetAdjacentFace(bool)` /
`GetVertex(bool)``ksVertexDefinition.GetPoint`; bodies via `ksPart.BodyCollection()``ksBody`
(`IsSolid` / `FaceCollection`); measurements via `ksPart.GetMeasurer()``ksMeasurer` (`SetObject1/2`,
`unit=ST_MIX_MM`, `Calc`, `distance`/`MinDistance`/`angle` in degrees / `IsAngleValid`).
- **«STEP import without history»** is detected structurally: `bodyCount > 0 && no formative features &&
features.Count <= bodyCount+1` (only origin + body). A STEP that has been edited («Смещённая плоскость» /
«Разрезать» / «Переместить грани» / «Булева операция») already has history.
- **STEP import/export COM pattern** (verified): `IApplication.get_Converter((object)(int)ksConverterFromSTEP=-3)`
(pass the format code, not a DLL path) → `IConverter.ConverterParameters(cmd)` →
`IAdditionConvertParameters.Format=ksConverterFromSTEP` → `IKompasDocument3D1.ConvertFromAdditionFormat(path, prm)`.
Export: `ConvertToAdditionFormat` (format codes AP203/AP214/AP242). Param co-classes
(`AdditionConvertParameters` etc.) are NOT CoCreatable — only via the converter factories. Assembly
traversal (`list_components`): `IKompasDocument3D.TopPart → IPart7.Parts (IParts7)`. Extract a component:
`prm.NeedCreateComponentsFiles=true` (writes .m3d files next to the STEP) + `IPart7.OpenSourceDocument`.
- **Direct B-rep face editing (`move_face`)** (verified): API7 face via
`IPart7.FindObjectsByPoint(x,y,z,true)` → cast to `KompasAPI7.IFace`; containers via runtime COM-QI
`(ISurfaceContainer)part`, `(IModelContainer)part`; `FaceMover` (SetFaces + Offset + Direction + Update)
moves the face. distance>0 = outward (adds material), <0 = inward. Works on parametric and imported B-rep.
The full split-reposition workflow (SplitSolids/BodyRepositions) is driveable; only partly exposed as tools
(`split_solid_by_plane`, `move_body`, `boolean_union`).
- **Forming ops (API5 definitions)**:
- `shell` (`ksShellDefinition`, o3d_shellOperation=43): `thickness` + `thinType` (bool, `= !outward`) +
`FaceArray()` (≥1 open face by index). Transient RCWs intentionally not released (consistent with
Fillet/Chamfer).
- `rib` (`ksRibDefinition`, =44): `SetSketch(sketch)` → `index=0`, `angle`, `side`
(`left|right|up|down` → 0/1/2/3 via `SketchGeometry.RibSide()`); `SetThinParam(dtBoth, t/2, t/2)` if
symmetric, else `(dtNormal, t, 0)`. Empirical: the rib contour must float in the gap (not touch the body)
— КОМПАС extends the web automatically.
- `sweep` (`ksBaseEvolutionDefinition`, =45): `SetSketch(profile)` → `PathPartArray().Add(path)` →
`sketchShiftType=0` → `SetThinParam(false)` → `Create()`. Profile and path on different (usually ⟂)
planes; `profileSketchId != pathSketchId`.
- `loft` (`ksBaseLoftDefinition`, =30): `Sketchs().Add(each)` → `SetLoftParam(false,false,true)` →
`SetThinParam(false)`. ≥2 closed sections on parallel planes — use `sketch_create(plane, offset)` for
non-base sections.
- offset plane (`sketch_create` with `offset≠0`, `ksPlaneOffsetDefinition`, o3d_planeOffset=14):
`SetPlane(base)` + `offset` mm + `direction` → `Create()` → sketch on it (`OpenSketchOnOffsetPlaneAsync`).
- `draft` (`ksInclineDefinition`, o3d_incline=42 — API5 calls the op **Incline**, NOT Draft): `FaceArray()`
(by index) + `SetPlane(neutral base plane)` + `angle` (degrees) + `direction`. **Empirical, opposite to
the SDK docs:** `direction=false` = expanding/outward (adds material), `true` = tapering/inward → the code
maps `def.direction = !outward`. Validate `0<angle<90`. (`o3d_DraftFromEdges=644` / `IDraftFromEdges` is
a different op — not used.)
- **Patterns & mirror (API5)** — one tool each, the variant is a parameter: `pattern(kind=linear)`
(`ksMeshCopyDefinition`, =35): `SetAxis1(axis)` +
`SetCopyParamAlongAxis(true,0,count,step,false)` + `count2=1` (disables the 2nd direction → 1D); features
via `OperationArray()`. `pattern(kind=circular)` (`ksCircularCopyDefinition`, =36): `SetAxis(axis)`; `count1=1`
(radial off), `count2=count` (ring), `step2=angle°` between neighbours, `factor2=false`, `inverce=reverse`;
`GetOperationArray().Add(feature)`. `mirror(featureIds)` (`ksMirrorCopyDefinition`, =48): `SetPlane(base)` +
`GetOperationArray().Add(feature)`. `mirror()` without ids (`ksMirrorCopyAllDefinition`, =49): `SetPlane(base)`;
`ChooseBodies()` casts to null in the interop and is NOT needed — it mirrors all bodies keeping the original
(volume doubles). Empirical: `count` includes the original instance (count=3 → 3 instances). Axes:
`CoordinateAxis{X,Y,Z}` → `o3d_axisOX/OY/OZ` (`Core/Modeling/CoordinateAxis.cs`, analogous to `BasePlane.cs`).
- **Hole ops (API7 only — `ksHoleDefinition` is absent from the API5 interop; `HoleService`)**:
`HoleCore(ksHoleTypeEnum holeType, Action<IHole3D> configure)` — `configure` sets `HoleParameters` **after**
`HoleType` is assigned (the type-specific sub-interface is inaccessible until the type is fixed). Placement
is shared: `IModelContainer`/`IHole3D`/`IHoleDisposal` + `Points3D`, direction chosen by volume delta,
orphan rollback. None are registered in `_features` → no id returned. One tool `hole`, the variant comes
from `type`: `simple`=`ksHTBase`, configure=null.
`counterbore`=`ksHTCounterbore` + `(ISpotfacingHoleParameters)` (`SpotfacingDiameter`/`SpotfacingDepth`).
`countersink`=`ksHTCountersinking` + `(ICountersinkHoleParameters)` (`CountersinkType=ksCTDiameterAngle`,
`CountersinkDiameter`/`Angle`). `conic`=`ksHTConic` + `(IConicHoleParameters)` (`ConicType=ksCNAngle`,
`ConicAngle`).
- **Assembly (API7, `AssemblyService`, namespace `Kompas.Mcp.Core.Assemblies`)**: `assembly_add_component` —
`IParts7.AddFromFile(path, ExternalFile=true, Redraw=true)` → `IPart7.Placement` (`IPlacement3D`) →
`SetOrigin(x,y,z)` (mm, assembly world CS) → `UpdatePlacement(true)` → `top.RebuildModel(true)`.
**Empirical:** `UpdatePlacement` returns FALSE for a manually-positioned component (no mates) — NOT an error.
Validate `DocumentType==ksDocumentAssembly` before touching `TopPart`; rollback via `IFeature7.Delete` +
`RebuildModel`. `assembly_add_mate` — `top.MateConstraints` (`IMateConstraints3D`) →
`Add(MateConstraintType)` → `BaseObject1/2` (faces via `top.FindObjectsByPoint(x,y,z,FirstLevel=false)`) →
`ParamValue` (distance) → `Update()` → `RebuildModel(true)`; check `mate.Valid` (false → rollback
`mate.Owner.Delete`). Types `coincidence` (mc_Coincidence=0) and `distance` (mc_Distance=5, value>0) are
verified live; the rest are backlog.
- **Drawing (API7, `DrawingService`, namespace `Kompas.Mcp.Core.Drawings`)** — entry via `IKompasDocument2D`;
requires an active drawing document (`DocumentType==ksDocumentDrawing`). All coordinates are **view-local**
(mm) unless noted. The model file must be saved before placing views.
- `drawing_create_standard_views`: `doc2d.ViewsAndLayersManager.Views.AddStandartViews(path, "#Спереди",
projTypes, x, y, scale, dx=20, dy=20)` where `projTypes=object[]{1,3,5}` (Front/Up/Left as SAFEARRAY VT_I4).
Success: `created==3`; content check: sum of the new views' `IView.ObjectCount` > 0 else rollback
`IView.Delete`. Returns `ViewNumbers` (the `IView.Number` values — address views by these when placing
annotations).
- `drawing_fill_title_block`: `doc2d.LayoutSheets.ItemByNumber[1].Stamp` (`IStamp`) →
`stamp.Text[columnId].Str = text` (indexed property; `IText.Str` overwrites, no Clear needed) →
`stamp.Update()`. Fields→columns (`ksStampEnum`): Name=1, Designation=2, Material=3. Non-transactional
(all cells → a single `Update`).
- **Dimensions go into `(ISymbols2DContainer)view`, NOT the sheet, and are NOT counted in `IView.ObjectCount`**
(that counts geometry in `IDrawingContainer`) — verify placement via the container's `*.Count`. Common flow:
`Add()` → set coords → `AutoNominalValue=true` → `Update()` → check `Valid` → read
`((IDimensionText)dim).NominalValue`; rollback `dim.Delete()` on FALSE/invalid/zero. Leader and angle are in
**radians** (`DimensionAngles.ToRadians`). Free placement = set coordinates directly; **associative**
(diametral/radial only) = set `BaseObject` to a projected circle → the value is read from geometry.
- linear (`ILineDimension`): `X1,Y1,X2,Y2` (extension points) + `X3,Y3` (dimension line) + `Orientation`
(`DimensionOrientation{Horizontal,Vertical,Parallel}` → `ksLinDParallel=0`/`Horizontal=1`/`Vertical=2`;
parallel needs no explicit Angle).
- diametral (`IDiametralDimension`): `Xc,Yc,Radius` + `Angle`; `NominalValue` = 2·Radius.
- radial (`IRadialDimension`): `Xc,Yc,Radius` + `Angle`, `DimensionType=true`; **`NominalValue` = Radius,
NOT diameter** — contrary to the SDK docs, confirmed by a spike.
- **associative** diametral/radial (`associate=true`): instead of coordinates, find a projected circle in
`(IDrawingContainer)view.Circles` by a center+radius key (`CircularObjectMatch.SelectMatchIndex`, tol 1 mm;
throws on none/ambiguous; concentric disambiguated by radius), set `dim.BaseObject = circle` (`_Circle`
implements `IDrawingObject`) → `NominalValue` read from geometry. `RequireViewContainers` gives both QIs;
the free path stays on `RequireSymbols2DContainer`. Arc/angular/rough binding — not yet (needs its own
spike; `ILineDimension` has no `BaseObject`).
- angular (`IAngleDimension`, `AngleDimensions.Add(ksDrADimension=10)`): vertex `Xc,Yc` + side points
`X1,Y1`/`X2,Y2` + arc-position `X3,Y3` (positions the arc only, does NOT pick the angle); the measured
angle is chosen by `DimensionType` = `AngleDimensionType{Min,Max,More}` (on rays 0°/45° → min=45° /
max=135° supplement / more=315° reflex). `NominalValue` in degrees.
- `drawing_add_rough` (`Roughs.Add()`/`IRough`: `BranchX0/Y0`, `Angle`) + `(IRoughParams)rough` QI:
`SignType` = `RoughSignType{NoProcessing,DeleteMaterial,WithoutDeleteMaterial}`, value (Ra/Rz) =
`RoughParamText.Str`.
- `drawing_add_text` — **text lives in `IDrawingContainer`, NOT `ISymbols2DContainer`, and NOT in
`IView.ObjectCount`**: `(IDrawingContainer)view.DrawingTexts.Add()`/`IDrawingText` (`X/Y/Angle`) +
`(IText)dt.Str` = text; count via `DrawingTexts.Count`. Do NOT set `Height` (that's block height, not font).
- `drawing_set_technical_requirements` — **document-level**: `(IDrawingDocument)doc.TechnicalDemand` /
`ITechnicalDemand`: `td.Text.Str = text` → `td.Update()` (`IsCreated` False→True on first set; overwrites;
`\n` multiline).
- `drawing_add_leader` — `ISymbols2DContainer.Leaders.Add(ksDrLeader)` → `IBaseLeader`. **Critical order
(spike):** a fresh leader has 0 branches → `(IBranchs)bl.AddBranchByPoint(0,x,y)` (the tip) BEFORE
`SetBranchTextPosition(textX,textY)`/`Update`, otherwise КОМПАС dies with `RPC_E_SERVERFAULT`. Text —
`(ILeader)bl.TextOnShelf.Str`; `ShelfDirection` (enum `ShelfDirection{Auto,Right,Left,Up,Down}`, Auto = leave
unset). `AddBranchByPoint`/`SetBranchTextPosition` return bool — check them.
- `drawing_set_sheet_format` — `RequireLayoutSheet(n).Format` (`ISheetFormat`): `Format`=`ksDocumentFormatEnum`
(`PaperFormat{A0..A5,User}` + `PaperFormats.Parse/ToKompas/FromKompas`); standard → set
`VerticalOrientation=!landscape` (W/H auto-computed from enum+orientation, e.g. A3 landscape → 420×297);
**User → set `FormatWidth/Height` only, КОМПАС derives `VerticalOrientation` from W/H, ignores the flag and
never swaps W/H (spike)** → `sheet.Update()`. A new drawing defaults to A4 portrait.
`ValidateFormatDimensions`: User needs W/H>0, standard forbids W/H (must be 0).
- `DrawingAnnotationResult{Value(read-back), ViewNumber}` is the shared result for rough/text/leader.
- **Richer sketch primitives (API5 `ksDocument2D` wrappers)**: `ksArcBy3Points`; `ksArcByAngle` (centre/radius/
start-end angles in degrees + counterClockwise flag); `ksEllipse` via `ksEllipseParam`
(`KompasObject.GetParamStruct(ko_EllipseParam=22)`; **the property names are `A`/`B` UPPERCASE in the interop**);
`ksRegularPolygon` via `ksRegularPolygonParam` (`ko_RegularPolygonParam=92`; `describe = !inscribed`); a NURBS
spline via `ksNurbs(order=4)` + `ksNurbsPoint` loop + `ksEndObj`; `ksPoint`. Param structs are released after
use. `PartModeler` is partial: `.cs` (registry/helpers/`NewParam<T>`/reset), `.Sketch.cs` (2D primitives),
`.Features.cs` (extrude/revolve/fillet/chamfer). Static `SketchGeometry` (`Core/Modeling`) holds the enum maps
+ validators (`RequirePositive`, `RequireVertexCount`, `RequirePoints`, `RequireMin`). Point lists use
`record SketchPoint(X, Y)` (JSON names `x`/`y`).
@@ -0,0 +1,79 @@
# Плагин `kompas`, канал поставки и CI
Перенесено из `CLAUDE.md`: нужно при выпуске релиза и правке CI, а не в каждой сессии.
Файл лежит в навыке (`.claude/skills/kompas-mcp-dev/`), а **не** в `plugin/CLAUDE.md`, потому что
`plugin/` распространяется пользователям — внутренняя кухня релиза туда попадать не должна.
## Claude Code plugin (`plugin/`)
The server and both published skills ship as the plugin **`kompas`** — `plugin/` is a self-contained tree,
distributed independently of the rest of the repo.
- `plugin/.claude-plugin/plugin.json` — manifest: `name: "kompas"`, `version` (currently `0.0.0`).
Version is Claude Code's cache key — `/plugin update` and auto-update skip a plugin whose version
matches what's installed, so **every release must bump it**.
- `plugin/server.lock.json` — pins exactly one server version: `{version, sourceSha, url, sha256}`.
`0.0.0` with empty fields = no release published yet.
- `plugin/skills/{kompas-3d,kompas-fdm-design}/` — the source of truth for both published skills.
- `plugin/commands/doctor.md``/kompas:doctor`: compares the expected version (from the lock) against
the `KOMPAS_MCP_EXE` override / `install.json` marker / `kompas-mcp.exe --version`, checks whether
КОМПАС is installed and running, then `kompas_connect``kompas_status`.
- `plugin/.mcp.json` — declares the `kompas` MCP server as
`powershell -File ${CLAUDE_PLUGIN_ROOT}/scripts/launch-kompas-mcp.ps1`.
- `plugin/scripts/KompasMcpBootstrap.psm1` — delivery: `Read-KompasMcpLock` / `Test-KompasMcpInstall` /
`Install-KompasMcpServer` / `Resolve-KompasMcpExecutable`. Downloads the release asset, verifies SHA256,
unpacks under `%LOCALAPPDATA%\kompas-mcp\.tmp` and atomically moves it to
`%LOCALAPPDATA%\kompas-mcp\<version>`, writes an `install.json` marker. An install is trusted only when
the marker's `version`/`sha256` match the lock.
- `plugin/scripts/launch-kompas-mcp.ps1` — entry point: the `KOMPAS_MCP_EXE` env var wins (dev mode),
otherwise deliver per the lock; runs the server and forwards its exit code. Invariant: **not a single
byte reaches stdout before the server starts** (stdout is the JSON-RPC channel) — all diagnostics go to
stderr prefixed `kompas-mcp launcher:`.
- `plugin/README.md` — prerequisites and install; `plugin/adapters/{codex,opencode}/` — config snippets
(not separate distributions) wiring the same launcher into Codex and opencode.
- CLI flag `--version` (`Core/Startup/CliArguments.IsVersionRequest`, early-exit in `Program.cs` before
the host and any КОМПАС contact) — prints the 3-part assembly version; `/kompas:doctor` uses it to
cross-check the installed binary against the lock.
**Gotchas:**
- **Plugin PowerShell files must be UTF-8 *with BOM*.** The launcher runs under `powershell` (Windows
PowerShell 5.1), which reads BOM-less files in the system ANSI codepage — Cyrillic string literals then
corrupt parsing of the whole script. `pwsh` 7 doesn't reproduce this (BOM auto-detected either way).
- Switching branch/commit across a `plugin/skills` boundary can dangle the skill junctions mid-checkout —
same failure mode and fix as in `CLAUDE.md` §«Skills and their layout».
## Distribution channel — the `dist` branch, not `main`
Releases (`.gitea/workflows/release.yml`, tag `vX.Y.Z`): `dotnet publish -r win-x64 --self-contained`
zip → idempotent upsert of a Gitea release + asset via the Gitea API → re-verify the downloaded asset's
SHA256 → commit updated `server.lock.json`/`plugin.json` to branch **`dist`**, on top of the tagged commit.
A private plugin marketplace (`home-repo-cc`) will reference the plugin via a `git-subdir` source pinned to
`ref: dist`**not added yet**, and there is **no release yet**. Rationale: a release is built from the
tagged commit; if the marketplace pointed at `main`, a user could get a newer `plugin/` tree under a
version whose binary was built from an older commit.
`.gitea/workflows/ci.yml` runs on push/PR to `main`: `plugin.json``server.lock.json` consistency check
(jq), build, then unit tests filtered `Category=Unit&Requires!=Windows` (245 of the 250). Runner:
`gitea-runner` (docker executor, label `ubuntu-latest`).
CI gotchas:
- **SDK 8 doesn't understand the `.slnx` solution format** (`MSBUILD : error MSB1003`) — CI builds and
tests explicit project paths (`src/Kompas.Mcp.Host/Kompas.Mcp.Host.csproj`,
`tests/Kompas.Mcp.Tests/Kompas.Mcp.Tests.csproj`) instead of the solution. Not reproducible locally with SDK 9+.
- **`net8.0-windows` builds and runs unit tests fine on the Linux runner** with
`-p:EnableWindowsTargeting=true`. ASCON interop DLLs link as ordinary references; `ole32`/`oleaut32` are
only needed at COM runtime, not build time. The 5 `DispatcherTests` are tagged
`[Trait("Requires", "Windows")]` and excluded — `Thread.SetApartmentState(STA)` throws
`PlatformNotSupportedException` on Linux.
- **`.gitignore`'s `.mcp.json` rule is anchored to the repo root** (`/.mcp.json`) — without the leading
slash the glob also matched the tracked, portable `plugin/.mcp.json`.
- Integration tests never run in CI (they need a running КОМПАС with GUI and a license) — a hard boundary,
not a future task.
## Обновление RAG-базы справки SDK
Когда выходит новая версия КОМПАС — в репозитории `kompas-sdk-docs`, на машине с установленным КОМПАС:
`pwsh tools/update_sdk_docs.ps1 -SdkVersion 25` перегенерирует `sdk/` из `SDK\Help\KOMPAS_SDK_ru-RU.zip`;
просмотри диф (**удалённые статьи = сломался парсер**, а не усохший API), закоммить, поставь тег `sdk-vNN`,
запушь — Gitea Actions на `rag-node` перевалидирует и переключит алиас `kompas_sdk`. Индексация
инкрементальная, по контрольным суммам.
+64
View File
@@ -0,0 +1,64 @@
name: ci
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
# Плагин: server.lock.json — то, что скачивает лаунчер; plugin.json — то, что видит
# Claude Code как версию установки. Обе должны совпадать между собой, иначе релизный
# workflow отдал бы плагин с пином, который сам себе противоречит.
- name: инструменты для проверки манифеста плагина
run: apt-get update -qq && apt-get install -y -qq jq
- name: согласованность plugin.json и server.lock.json
run: |
MANIFEST_VERSION=$(jq -r '.version' plugin/.claude-plugin/plugin.json)
LOCK_VERSION=$(jq -r '.version' plugin/server.lock.json)
LOCK_SHA256=$(jq -r '.sha256' plugin/server.lock.json)
if [ "$MANIFEST_VERSION" != "$LOCK_VERSION" ]; then
echo "версия plugin.json ($MANIFEST_VERSION) не совпадает с server.lock.json ($LOCK_VERSION)"
exit 1
fi
# 0.0.0 — состояние «релиз ещё не публиковался»: url/sha256 намеренно пустые
# (см. tests/Kompas.Mcp.Tests/PluginManifestTests.cs, Lock_WhenReleased_HasUrlAndSha256).
if [ "$LOCK_VERSION" != "0.0.0" ]; then
if [ -z "$LOCK_SHA256" ] || [ "$LOCK_SHA256" = "null" ]; then
echo "server.lock.json: версия $LOCK_VERSION опубликована, но sha256 пуст"
exit 1
fi
if ! echo "$LOCK_SHA256" | grep -Eq '^[0-9a-f]{64}$'; then
echo "server.lock.json: sha256 '$LOCK_SHA256' не похож на 64-символьный hex"
exit 1
fi
fi
echo "ok: plugin.json/server.lock.json согласованы (version=$LOCK_VERSION)"
# Проекты указаны явно, а не через решение: формат KompasMcp.slnx понимает только
# SDK 9+, а здесь стоит 8.0.x — на решении сборка падает с MSB1003.
# EnableWindowsTargeting: проект таргетит net8.0-windows, сборка идёт на Linux.
- name: build
run: dotnet build src/Kompas.Mcp.Host/Kompas.Mcp.Host.csproj -c Release -p:EnableWindowsTargeting=true
# Что здесь НЕ выполняется и почему:
# Category=Integration — нужен запущенный КОМПАС с GUI и лицензией;
# Requires=Windows — КОМПАС не нужен, но нужна Windows (STA-апартамент
# в KompasDispatcher: на Linux SetApartmentState бросает
# PlatformNotSupportedException).
# Оба класса гоняются на машине разработчика, см. CLAUDE.md.
- name: unit tests
run: dotnet test tests/Kompas.Mcp.Tests/Kompas.Mcp.Tests.csproj --filter "Category=Unit&Requires!=Windows" -c Release -p:EnableWindowsTargeting=true
+59
View File
@@ -0,0 +1,59 @@
name: glm-review
# Авто-ревью PR моделью glm-5.2:cloud (Ollama Cloud). Результат приходит одним
# комментарием в PR, который переписывается при каждом новом пуше.
#
# Что нужно один раз завести в настройках репозитория (Settings → Actions → Secrets):
# OLLAMA_API_KEY — ключ с https://ollama.com/settings/keys
# Без секрета (в том числе в PR из форка) job тихо пропускается, а не валит CI.
#
# Ревью совещательное: находки не блокируют merge. Чтобы сделать его гейтом,
# добавь в вызов скрипта --fail-on blocker (тогда job упадёт на находке blocker).
on:
pull_request:
types: [opened, synchronize, reopened]
concurrency:
group: glm-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# checkout оставляет базовую ветку недоступной по имени — диапазон
# origin/<base>...HEAD без этого fetch не соберётся.
- name: подтянуть базовую ветку
run: |
git fetch --no-tags --quiet origin \
"+refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }}"
node --version
- name: ревью дифа
id: review
env:
OLLAMA_API_KEY: ${{ secrets.OLLAMA_API_KEY }}
run: |
if [ -z "$OLLAMA_API_KEY" ]; then
echo "секрет OLLAMA_API_KEY не задан — ревью пропущено"
echo "skipped=true" >> "$GITHUB_OUTPUT"
exit 0
fi
node tools/glm-review/glm-review.mjs \
--base "origin/${{ github.base_ref }}" \
--context \
--format md \
--out glm-review.md
echo "skipped=false" >> "$GITHUB_OUTPUT"
- name: комментарий в PR
if: steps.review.outputs.skipped == 'false'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: node tools/glm-review/post-gitea-comment.mjs --body-file glm-review.md
+178
View File
@@ -0,0 +1,178 @@
name: release
on:
push:
tags: ['v*']
# Релизы сериализуются: параллельные теги не должны гонять ветку dist одновременно
# (обе гоняющиеся сборки делают `git push --force dist`, и без сериализации может
# выиграть та, что стартовала позже, но закончила раньше — с более старой версией).
concurrency:
group: release
cancel-in-progress: false
jobs:
release:
runs-on: ubuntu-latest
env:
OWNER: mikhail
REPO: kompas3d-mcp
GITEA: https://git.shahovalov.ru
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# Пушим в dist собственным GITEA_TOKEN явным URL (см. последний шаг) —
# заголовок авторизации, который checkout оставляет в git-конфиге для
# выданного джобу токена, тут не нужен и может конфликтовать с ним
# (два способа аутентификации на один и тот же хост в одном запросе).
persist-credentials: false
- name: инструменты
run: apt-get update -qq && apt-get install -y -qq jq zip curl git
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: проверить формат тега
run: |
echo "${{ github.ref_name }}" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$' \
|| { echo "тег должен быть вида vX.Y.Z, получено: ${{ github.ref_name }}"; exit 1; }
- name: версия не должна уменьшаться
run: |
NEW="${{ github.ref_name }}"; NEW="${NEW#v}"
CURRENT_SHA="${{ github.sha }}"
# Сверяем по plugin/server.lock.json (не plugin.json): в нём вместе с версией
# лежит и sourceSha, а он нужен ниже, чтобы отличить ретрай того же релиза от
# попытки переопубликовать ту же версию другим коммитом.
#
# `git show origin/dist:...` может не найти ни ветку, ни файл (первый релиз —
# dist ещё не существует). Не полагаемся на `cmd || echo fallback` вокруг пайпа
# с jq: jq на пустом stdin ничего не печатает, но выходит с кодом 0, поэтому
# такой fallback никогда бы не сработал — здесь fallback навешан на сам git show,
# jq вызывается только когда файл реально прочитан. Без dist сравнивать sourceSha
# не с чем — OLD_SOURCE_SHA остаётся пустым, и равенство версий ниже недостижимо
# (OLD_VERSION="0.0.0" всегда меньше валидного тега vX.Y.Z, кроме вырожденного
# v0.0.0, который проверка формата тега не отсекает, но это не наш случай).
git fetch origin dist 2>/dev/null || true
OLD_VERSION="0.0.0"
OLD_SOURCE_SHA=""
if git show origin/dist:plugin/server.lock.json > /tmp/dist-lock.json 2>/dev/null; then
OLD_VERSION=$(jq -r '.version // "0.0.0"' /tmp/dist-lock.json)
OLD_SOURCE_SHA=$(jq -r '.sourceSha // ""' /tmp/dist-lock.json)
fi
if [ "$OLD_VERSION" = "$NEW" ]; then
# Равная версия допускается ровно в одном случае: тег указывает на тот же
# коммит, из которого эта версия уже была опубликована в dist — это ретрай
# (сбойнул шаг после публикации ассета, тег пересоздали на том же SHA и т.п.),
# и весь пайплайн ниже идемпотентен сам по себе (upsert релиза/ассета, повторная
# сверка sha256, force-push dist тем же содержимым). Если sourceSha другой — под
# тем же номером версии протаскивают другой код, это не ретрай, а подмена уже
# опубликованного релиза; такое отвергаем, а не публикуем молча поверх старого.
if [ -n "$OLD_SOURCE_SHA" ] && [ "$OLD_SOURCE_SHA" = "$CURRENT_SHA" ]; then
echo "ok: повтор релиза $NEW с того же коммита $CURRENT_SHA"
else
echo "версия $NEW уже опубликована из коммита ${OLD_SOURCE_SHA:-<неизвестно>} — поднимите версию"
exit 1
fi
else
SMALLEST=$(printf '%s\n%s\n' "$OLD_VERSION" "$NEW" | sort -V | head -1)
if [ "$SMALLEST" != "$OLD_VERSION" ]; then
echo "версия $NEW не больше опубликованной $OLD_VERSION"
exit 1
fi
echo "ok: $NEW > $OLD_VERSION"
fi
- name: publish
run: |
VERSION="${{ github.ref_name }}"; VERSION="${VERSION#v}"
dotnet publish src/Kompas.Mcp.Host/Kompas.Mcp.Host.csproj \
-c Release -r win-x64 --self-contained true \
-p:EnableWindowsTargeting=true -p:Version="$VERSION" \
-o out/publish
test -f out/publish/kompas-mcp.exe || { echo "нет kompas-mcp.exe в out/publish"; exit 1; }
# Плоская структура: exe и зависимости прямо в корне архива, без каталога out/publish/.
(cd out/publish && zip -qr "../kompas-mcp-$VERSION-win-x64.zip" .)
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
echo "ASSET=out/kompas-mcp-$VERSION-win-x64.zip" >> "$GITHUB_ENV"
echo "SHA256=$(sha256sum "out/kompas-mcp-$VERSION-win-x64.zip" | cut -d' ' -f1)" >> "$GITHUB_ENV"
- name: upsert релиза и ассета
run: |
API="$GITEA/api/v1/repos/$OWNER/$REPO"
AUTH="Authorization: token ${{ secrets.GITEA_TOKEN }}"
TAG="${{ github.ref_name }}"
NAME="kompas-mcp-$VERSION-win-x64.zip"
# Найти существующий релиз по тегу; создать, если его ещё нет. Различаем "нет
# релиза" (404) от прочих ошибок API явно по HTTP-коду — не глотаем и то, и
# другое одним `|| echo ""`, как в черновике: сетевая/авторизационная ошибка
# не должна молча трактоваться как "релиза нет, создаём новый".
HTTP=$(curl -s -o /tmp/release.json -w '%{http_code}' -H "$AUTH" "$API/releases/tags/$TAG")
if [ "$HTTP" = "200" ]; then
ID=$(jq -r '.id' /tmp/release.json)
elif [ "$HTTP" = "404" ]; then
HTTP=$(curl -s -o /tmp/release.json -w '%{http_code}' -X POST -H "$AUTH" \
-H 'Content-Type: application/json' \
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\"}" "$API/releases")
if [ "$HTTP" != "201" ]; then
echo "не удалось создать релиз $TAG (HTTP $HTTP)"; cat /tmp/release.json; exit 1
fi
ID=$(jq -r '.id' /tmp/release.json)
else
echo "не удалось получить релиз по тегу $TAG (HTTP $HTTP)"; cat /tmp/release.json; exit 1
fi
# Повторный прогон на том же теге не должен падать на "ассет уже существует":
# старый ассет с тем же именем удаляется перед загрузкой нового.
HTTP=$(curl -s -o /tmp/assets.json -w '%{http_code}' -H "$AUTH" "$API/releases/$ID/assets")
if [ "$HTTP" != "200" ]; then
echo "не удалось получить список ассетов релиза $ID (HTTP $HTTP)"; cat /tmp/assets.json; exit 1
fi
EXISTING=$(jq -r --arg name "$NAME" '.[] | select(.name==$name) | .id' /tmp/assets.json)
if [ -n "$EXISTING" ]; then
curl -sf -X DELETE -H "$AUTH" "$API/releases/$ID/assets/$EXISTING"
fi
HTTP=$(curl -s -o /tmp/asset.json -w '%{http_code}' -X POST -H "$AUTH" \
-F "attachment=@$ASSET" "$API/releases/$ID/assets?name=$NAME")
if [ "$HTTP" != "201" ]; then
echo "не удалось загрузить ассет $NAME (HTTP $HTTP)"; cat /tmp/asset.json; exit 1
fi
echo "URL=$GITEA/$OWNER/$REPO/releases/download/$TAG/$NAME" >> "$GITHUB_ENV"
- name: сверить опубликованный ассет
run: |
curl -sfL "$URL" -o /tmp/published.zip
ACTUAL=$(sha256sum /tmp/published.zip | cut -d' ' -f1)
[ "$ACTUAL" = "$SHA256" ] || { echo "SHA256 опубликованного ассета не совпал: ожидался $SHA256, получен $ACTUAL"; exit 1; }
- name: обновить ветку dist
run: |
git config user.name "gitea-actions"
git config user.email "actions@git.shahovalov.ru"
git remote set-url origin "$GITEA/$OWNER/$REPO.git"
# dist — не история, а единственный коммит поверх коммита с тегом (см. архитектуру
# в docs/superpowers/plans/2026-07-31-kompas-plugin-distribution.md): каждый новый
# релиз пересобирает dist заново поверх своего тега, поэтому push принудительный.
# concurrency-группа выше гарантирует, что это не гонка между двумя релизами разом.
git checkout -B dist "${{ github.sha }}"
jq --arg v "$VERSION" --arg s "$SHA256" --arg u "$URL" --arg src "${{ github.sha }}" \
'.version=$v | .sha256=$s | .url=$u | .sourceSha=$src' \
plugin/server.lock.json > /tmp/lock.json && mv /tmp/lock.json plugin/server.lock.json
jq --arg v "$VERSION" '.version=$v' \
plugin/.claude-plugin/plugin.json > /tmp/manifest.json && mv /tmp/manifest.json plugin/.claude-plugin/plugin.json
git add plugin/server.lock.json plugin/.claude-plugin/plugin.json
git commit -m "release: kompas $VERSION"
git push --force "https://x-access-token:${{ secrets.GITEA_TOKEN }}@git.shahovalov.ru/$OWNER/$REPO.git" dist
+18 -4
View File
@@ -38,7 +38,9 @@ project.assets.json
.claude/settings.local.json .claude/settings.local.json
# ---- MCP-конфиг с машинно-специфичным абсолютным путём к kompas-mcp.exe ------ # ---- MCP-конфиг с машинно-специфичным абсолютным путём к kompas-mcp.exe ------
.mcp.json # Слэш обязателен: без него маска ловила бы и переносимый plugin/.mcp.json,
# который в репозитории нужен (он ссылается на ${CLAUDE_PLUGIN_ROOT}).
/.mcp.json
# ---- Python tooling (tools/) ----------------------------------------------- # ---- Python tooling (tools/) -----------------------------------------------
__pycache__/ __pycache__/
@@ -53,6 +55,9 @@ Desktop.ini
# ---- Scratch: тестовые документы КОМПАС, снимки рендера -------------------- # ---- Scratch: тестовые документы КОМПАС, снимки рендера --------------------
.scratch/ .scratch/
# ---- pi extension node_modules (не коммитить, source остаётся) ----
.pi/extensions/*/node_modules/
# ---- Use case'ы проработки MCP (локальная песочница, не разделяется) -------- # ---- Use case'ы проработки MCP (локальная песочница, не разделяется) --------
# Папки кейсов с описаниями (case.md) и артефактами построений (.m3d, .png …). # Папки кейсов с описаниями (case.md) и артефактами построений (.m3d, .png …).
# Каркас и правила — в usecases/README.md (см. там же шаблон _TEMPLATE/). # Каркас и правила — в usecases/README.md (см. там же шаблон _TEMPLATE/).
@@ -62,10 +67,19 @@ usecases/
# Большие вендорские/генерируемые артефакты — НЕ коммитим # Большие вендорские/генерируемые артефакты — НЕ коммитим
# ============================================================================ # ============================================================================
# Офлайн-зеркало справки SDK КОМПАС-3D (~1.4 ГБ, © АСКОН). Канонический источник # Справка SDK КОМПАС-3D (© АСКОН) в этом репозитории не живёт: MD-база вынесена
# справки теперь — MD-база docs/Kompas3D_SDK/ (в репозитории). Зеркало в репо не # в приватный kompas-sdk-docs и доступна через RAG (MCP-сервер kompas-sdk).
# коммитим: если будет скачано локально снова — пусть остаётся проигнорированным. # Правила ниже — страховка на случай, если зеркало или база окажутся здесь снова.
docs/KOMPAS_SDK_ru-RU/ docs/KOMPAS_SDK_ru-RU/
docs/Kompas3D_SDK/
# ---- Навыки: источник истины — plugin/skills, остальное создаётся junction'ами -----
# tools/sync-agent-assets.ps1. Пути точечные: git видит junction как обычный каталог
# и без этого проиндексировал бы содержимое повторно.
/.claude/skills/kompas-3d/
/.claude/skills/kompas-fdm-design/
/.agents/skills/kompas-3d/
/.agents/skills/kompas-fdm-design/
# ============================================================================ # ============================================================================
# Отслеживается НАМЕРЕННО (нужно для сборки), не игнорировать: # Отслеживается НАМЕРЕННО (нужно для сборки), не игнорировать:
+210 -90
View File
@@ -4,133 +4,253 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Project goal ## Project goal
Build an **MCP (Model Context Protocol) server** that lets an LLM drive the CAD system **КОМПАС-3D** (ASCON). The server exposes КОМПАС operations (create/open documents, build 2D geometry, 3D parts and assemblies, read/write parameters, run macros) as MCP tools. An **MCP (Model Context Protocol) server** that lets an LLM drive the CAD system **КОМПАС-3D** (ASCON).
The server is a COM client of an installed КОМПАС: it exposes CAD operations (documents, 2D sketches,
3D parts, assemblies, drawings, STEP round-trip, model inspection) as MCP tools over stdio.
Authoritative references: **There is no `docs/` directory** — it was deleted deliberately (commit `b022a91`). Do not re-create
- **SDK knowledge base in this repo: `docs/Kompas3D_SDK/`** — clean Markdown, one article per COM interface, with YAML tags; search it with Grep/Read (see below). Committed to the repo (canonical), distilled from the КОМПАС SDK help. Prefer this over the web. For non-trivial lookups, dispatch the **`kompas-sdk-research`** subagent (Haiku) to save context. `docs/ARCHITECTURE.md`, `docs/TODO.md`, `docs/OPEN_QUESTIONS.md`. Prose documentation lives in exactly
three places: this file (always loaded — architecture, principles, backlog, traps), the skill
`kompas-mcp-dev` with `reference/*.md` (loaded on demand — verified COM call-chains, release and CI),
and [`README.md`](README.md) (the tool catalog). Plus the memory files (`kompas-*-api*.md`).
Authoritative API references:
- **SDK knowledge base in RAG: MCP server `kompas-sdk`** — 2465 articles (one per COM interface/topic),
served from the separate `kompas-sdk-docs` repo, indexed on CT 127 (rag-node). **Not in this repo**
Grep/Read won't find it. For any lookup dispatch the **`kompas-sdk-research`** subagent (Haiku), which
owns the MCP tools.
- Online SDK docs: https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/index.html - Online SDK docs: https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/index.html
- Local SDK install: `C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK` - Local SDK install: `C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK` (headers `Include\ksConstants*.h`
are the last word on numeric constant values)
- `libs/kompas-interop/*.dll` — reflect over these to verify any signature a research answer gives you.
## Navigating the SDK docs (`docs/Kompas3D_SDK/`) The base covers the **COM API7/API5** reference this project uses; the cross-platform Qt/C++ **KsAPI**
flavour (`ksapi_*`, non-COM) is intentionally **excluded** — ignore unless explicitly working with KsAPI.
`docs/Kompas3D_SDK/` is a structured MD knowledge base distilled from the 26 000-page Help&Manual WebHelp export. One article per COM interface/topic, split into `interfaces/`, `enums/`, `structures/`, `guides/` (+ `resources/` images), each with YAML frontmatter (`type`, `api`, `domain`, `tags`, `sources`); methods/properties are `## ` headings inside the interface article. **Search it directly — do not browse the raw HTML:** How to search it is in the subagent's own definition (`.claude/agents/kompas-sdk-research.md`) — those
tools are scoped to the subagent, this session cannot call them. How to regenerate the base when a new
- **Grep** over `docs/Kompas3D_SDK/` for an interface/method/property name or Russian keyword (method names are `## SetSideParam - …` headings, so the name lands you in the right article). КОМПАС ships — skill `kompas-mcp-dev`, `reference/plugin-and-release.md`.
- **Read** the matching `*.md` — the interface article holds all its members, `Синтаксис Automation:`/`Синтаксис COM:` blocks (in code fences), parameters, notes.
- `docs/Kompas3D_SDK/index.md` — table of contents by category. Filter by frontmatter tags, e.g. `Grep "type: enum"` or `Grep "domain: \[.*3d"`.
The base is committed to the repo (canonical) — no regeneration step. It covers the **COM API7/API5** reference this project uses (interfaces named `iapplication_*`, `idocuments_*`, …). The cross-platform Qt/C++ **KsAPI** flavour (`ksapi_*`, non-COM binding) is intentionally **excluded** from the base — ignore unless explicitly working with KsAPI.
## Current state ## Current state
**Status:** v1 + v2 + STEP/assembly + direct B-rep edit + structural inspection + 2D drawings — implemented and working (full sketchfeatureinspect→STEP round-trip + `move_face` + `describe_model` validated end-to-end). **Status:** working end-to-end. Parts (sketchfeatureinspect), forming ops, patterns/mirror, holes,
Stack: **.NET 8 (`net8.0-windows`, x64), C#**, MCP via the official `ModelContextProtocol` SDK over **stdio**. **81 MCP tools, 278 tests green (168 unit + 110 integration).** direct B-rep edit, STEP import/export, assemblies, 2D drawings, structural inspection — implemented and
validated live. Also packaged as the Claude Code plugin `kompas` (no release published yet).
Where to look (single source of truth — do **not** duplicate these lists here): The full tool catalog (by group) lives in [`README.md`](README.md) §«Инструменты» — the single
- **Full tool catalog** (by group, all 81) → [`README.md`](README.md) §«Инструменты». source of truth; do not duplicate it here.
- **Roadmap / what's already done** → [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) §10.
- **Backlog / what's left** → [`docs/TODO.md`](docs/TODO.md) (canonical; top of «2D-ЧЕРТЁЖ» = next priority. Associative diametral/radial→circle binding done via `associate` flag — next: arc/angular/rough binding, sheet format, leaders, bases, tolerances; plus extra mate types, package E continuation).
- **Design decisions / caveats** → [`docs/OPEN_QUESTIONS.md`](docs/OPEN_QUESTIONS.md). Known caveat («Ревью v2»): boss/cut direction on a selected face depends on face-normal orientation — `forward` may need flipping; the agent picks via snapshot or `describe_face` normal.
- **Verified COM call-chains & gotchas** → «Key implementation facts» below + memory files (`kompas-*-api*.md`).
Principle: **MCP = translating SDK capabilities into general tools** (not task-specific). On top of MCP — skill **`.claude/skills/kompas-3d/`** with a methodology (playbooks, heuristics, validated in `usecases/`). Layout: `usecases/` (in .gitignore) is the proving ground; proven techniques are promoted to the skill. **The catalog is shaped for the agent, not for the SDK** (56 tools, down from 84): a tool names the
*operation*, the variant is a parameter (`extrude(mode=boss|cut)`, `hole(type=…)`, `pattern(kind=…)`);
**Delegation subagents** (`.claude/agents/`, dispatched via the `Agent` tool to keep heavy work off Opus's context — system prompt lives in the agent definition, so pass only the variable part as the prompt): an object is picked by index **or** point through one tool (no `*_index` twins); list parameters
- **`kompas-sdk-research`** (model: **Haiku**, read-only — `Glob`/`Grep`/`Read`): finds an interface/method/enum/constant signature in the `docs/Kompas3D_SDK/` MD knowledge base and returns a compressed summary. Dispatch it for any non-trivial SDK lookup instead of grepping the help yourself; a wrong answer is cheap — Opus re-verifies against `libs/kompas-interop/*.dll` by reflection. (`entities[]`, `edgeIndices[]`) run in a single STA hop; and every mutating op appends its own build-check
- **`docs-maintainer`** (model: **Sonnet**, `Read`/`Edit`/`Write`/`Glob`/`Grep`): syncs `README.md`/`CLAUDE.md`/`docs/ARCHITECTURE.md`/`docs/OPEN_QUESTIONS.md`/`docs/presentation.html` with code changes from a change summary you provide. Dispatch it for doc updates instead of editing docs by hand. (Both were skills before — converted to native subagents; the model split reflects task type: bounded retrieval → Haiku, judgement-heavy editing → Sonnet.) result (`AutoValidation`, switched by `set_auto_validate` / `KOMPAS_MCP_AUTOVALIDATE`) so the agent doesn't
call `validate_part` after each step. Keep that shape when adding tools — rules and rationale in skill
Layout: `src/Kompas.Mcp.Core` (COM layer), `src/Kompas.Mcp.Host` (MCP stdio server + tools), `kompas-mcp-dev` §«Правила формы инструмента».
`tests/Kompas.Mcp.Tests` (unit + integration), `libs/kompas-interop/*.dll` (vendored КОМПАС interop
assemblies from SDK `Samples/Common`, referenced via `Directory.Build.props``KompasInteropDir`).
```powershell ```powershell
dotnet build -c Release # build dotnet build -c Release # build
dotnet test --filter "Category=Unit" # unit tests (no COM) dotnet test --filter "Category=Unit" # no COM needed
dotnet test --filter "Category=Integration" # integration (requires running КОМПАС) dotnet test --filter "Category=Integration" # needs a running КОМПАС
dotnet run --project src/Kompas.Mcp.Host # start the MCP server (stdio) dotnet run --project src/Kompas.Mcp.Host # start the MCP server (stdio)
pwsh -NoProfile -File tools/tests/run-ps-tests.ps1 # Pester tests for the plugin's PowerShell
``` ```
Principle: **MCP = translating SDK capabilities into general tools**, never task-specific ones. If a
technique is missing, don't hardcode a workaround for the case at hand — prove the mechanism, then add
a *general* tool with tests, and describe the method in the `kompas-3d` skill.
### Backlog (canonical since `docs/TODO.md` is gone)
- **2D drawing** (top priority): bases (`drawing_add_base`), tolerances, associative binding for
arc/angular/rough dimensions (needs its own spike — `ILineDimension` has no `BaseObject`).
- **Assembly**: mate types beyond `coincidence`/`distance``parallel`, `perpendicular`, `concentric`,
`angle`, `tangency` (enum values exist in `MateType.cs`, not verified live).
- **Known caveat:** boss/cut direction on a *selected face* depends on the face-normal orientation —
`forward` may need flipping. Pick the direction from the `list_faces(index=…)` normal or a snapshot
before building.
## Working mode: CAD tasks are the proving ground
The user solves small CAD tasks through the MCP tools (or uses the server as an assistant), but **the point
of those tasks is improving the server and its skills**, not the part being modelled. A task that goes badly
is a bug report, not a reason to work around it by hand. Three feedback channels, not one:
| Symptom | Where the fix goes |
|---|---|
| A tool crashes or returns the wrong result | `src/` → patch + test |
| No tool exposes the mechanism at all | `src/` → a new **general** tool (never case-specific) |
| Tools worked, but the route taken was wrong / a trap was unknown | `plugin/skills/kompas-3d/SKILL.md` |
| Geometry built fine but isn't printable on FDM | `plugin/skills/kompas-fdm-design/` (+ `references/`) |
Reading the sources, proposing patches, editing and rebuilding are all explicitly sanctioned — including
asking for a session restart when a rebuilt server has to be picked up.
- **Skills are debugged like code.** `kompas-3d` and `kompas-fdm-design` are objects of revision, not fixed
inputs. Edit them **only** in `plugin/skills/<name>/` (the source of truth — the other trees are junctions);
a skill edit needs no rebuild but is only picked up by a *new* session.
- **Nothing internal leaks into a published skill** — no local SDK paths, no `usecases/`, no RAG-base
references. Internal findings belong in `kompas-mcp-dev`; only reproducible methodology ships.
### The rebuild cycle
A running server holds its own binary: with `.mcp.json` pointing straight at
`src/Kompas.Mcp.Host/bin/…/kompas-mcp.exe`, `dotnet build -c Release` dies on `MSB3027` («file in use»),
and *every* open session counts — the error names each holding PID. `tools/dev/` removes that coupling.
- **`tools/dev/launch-dev-mcp.ps1`** — what `.mcp.json` now points at. It copies the build (~10 MB) into
`%LOCALAPPDATA%\kompas-mcp\dev\<fingerprint>` and runs the server from there, so `bin` is never locked and
a build never waits for a session to close. Logic lives in `tools/dev/KompasMcpDev.psm1`; overrides:
`KOMPAS_MCP_EXE` (bypass the shadow copy entirely), `KOMPAS_MCP_DEV_BUILD_DIR`, `KOMPAS_MCP_DEV_ROOT`.
- **`tools/dev/rebuild-mcp.ps1`** — `-Check` compiles past `bin` (redirect `BaseOutputPath` only — moving
`BaseIntermediateOutputPath` too makes the stale `obj/` visible to the glob and yields `CS0579`) so a
syntax/type check costs ~2 s with the server live. Without flags: full build + `Category=Unit`, refusing
early with the blocking PIDs instead of burning 15 s on retries.
- **A new binary still needs the stdio process restarted** — `/mcp` reconnect if the client supports it,
otherwise a new session. Restarting is safe for КОМПАС: `KompasSession.Dispose` releases the COM objects
but deliberately never calls `Quit`, so the document survives. What does not survive: the connection
(`kompas_connect` again) and the in-memory build state — sketches by `id`. Save before restarting.
- **Two traps in the launcher's PowerShell**, both invisible under `pwsh` 7 and fatal under the 5.1 that
`.mcp.json` actually uses: `Get-ChildItem` returning a *single* file is a scalar, so `.Count` throws under
`Set-StrictMode`; and `Sort-Object` orders punctuation differently in 5.1 (NLS) vs 7 (ICU), which made the
same build hash to two different fingerprints. Sort ordinal (`List.Sort([StringComparer]::Ordinal)`).
### Auto-review (`glm-5.2:cloud`)
A second pair of eyes on a diff, run by a model outside this session — `tools/glm-review/glm-review.mjs`
(Node 18+, no dependencies) posts the diff to Ollama Cloud and returns findings as JSON or markdown.
Two entry points, one script:
- **`/glm-review`** — the global slash command (`~/.claude/commands/glm-review.md`); the canonical copy of
the script lives at `~/.claude/scripts/glm-review/glm-review.mjs`. The copy in `tools/` exists because a
CI runner cannot see the home directory — **edit both** or they drift.
- **`.gitea/workflows/glm-review.yml`** — on every `pull_request` the findings land in one PR comment that
is rewritten on each push (matched by the hidden `<!-- glm-review -->` marker). Advisory: no `--fail-on`,
so a finding never blocks a merge. Without the repo secret `OLLAMA_API_KEY` the job skips quietly.
The key lives in `~/.claude/settings.json` (`env.OLLAMA_API_KEY`) locally and in the Gitea repo secret of
the same name for CI. Useful flags: `--context` (attach whole changed files — pricier, more accurate),
`--dry-run` (show the assembled prompt, don't call the model), `--fail-on blocker` (exit 1, for a gate),
`--diff-file -` (review a diff from stdin). **Findings are checked against real code, never taken on
faith** — the model does invent lines and signatures; that verification step is what the slash command
spends most of its turn on.
## Skills and their layout
- **`kompas-3d`** — methodology for *building* things through the MCP tools (playbooks, heuristics).
- **`kompas-fdm-design`** — DFM layer for FDM/FFF printing (overhang rules, wall thickness, teardrop
holes, fits/clearances, orientation for strength, elephant foot, bosses/inserts/snap-fits) plus a
light geometry audit via the inspection tools. Builds through `kompas-3d`, exports via `export_step`,
no slicer integration.
- **`kompas-mcp-dev`** — internal: developing the server itself (the two layers, the `usecases/` proving
ground, the checklist for productizing a technique into a general tool, delegation). Lives at
`.claude/skills/kompas-mcp-dev/SKILL.md` as a real directory (not a junction) because the published
skills must not reference things a plugin user doesn't have.
**Sync** (`tools/sync-agent-assets.ps1`, module `tools/AgentAssets.psm1`): the source of truth is
`plugin/skills/{kompas-3d,kompas-fdm-design}`; `.claude/skills/<name>` and `.agents/skills/<name>` are
**junctions** onto it created by the script (their paths are pinpointed in `.gitignore` — git sees a
junction as a plain directory). Its modes are mutually exclusive parameter sets, so `-Remove -Check`
together is a parameter-binding error.
**Gotcha:** switching to a branch/commit predating `plugin/skills` leaves the junctions dangling and
`git checkout` fails mid-way (`unable to create file .claude/skills/kompas-fdm-design/SKILL.md: No such
file or directory`) — part of the worktree is already deleted while HEAD stays on the old branch.
Recover with `git ls-files --deleted -z | xargs -0 git restore --`. Correct order:
1. `pwsh -NoProfile -File tools/sync-agent-assets.ps1 -Remove`
2. `git checkout <ref>`
3. `pwsh -NoProfile -File tools/sync-agent-assets.ps1` (re-link, if `plugin/skills` exists on that ref)
`-Remove` is safe: it deletes the reparse point itself via `[System.IO.Directory]::Delete` (no `-Recurse`),
never walks into the target, and leaves a real (non-junction) directory alone (`Skipped`); it detects a
junction by the `ReparsePoint` attribute rather than by resolving the target, which is exactly why it
still works once the target is gone. No `post-checkout` hook on purpose — it fires after checkout already
broke, too late to help.
## Delegation subagent
**`kompas-sdk-research`** (`.claude/agents/`, model **Haiku**, read-only — MCP `kompas-sdk` tools only):
finds an interface/method/enum/constant signature in the SDK knowledge base and returns a compressed
summary. Dispatch it for **any** SDK lookup — it holds the only access to the base, which no longer lives
in this repo. Its system prompt is in the agent definition, so pass only the question as the prompt.
A wrong answer is cheap: re-verify against `libs/kompas-interop/*.dll` by reflection.
(The former `docs-maintainer` subagent was removed together with `docs/` — edit `README.md`/`CLAUDE.md`
directly.)
## Claude Code plugin (`plugin/`)
The server and both published skills ship as the plugin **`kompas`** — `plugin/` is a self-contained tree,
distributed independently of the rest of the repo, released from the **`dist`** branch (never `main`).
Manifest/lock layout, the delivery bootstrap, the launcher's stdout invariant, the release workflow and the
CI gotchas — skill **`kompas-mcp-dev`**, `reference/plugin-and-release.md`. Two rules that must not wait
for a skill load:
- **Every release must bump `plugin/.claude-plugin/plugin.json`** — the version is Claude Code's cache key,
and `/plugin update` silently skips a plugin whose version already matches what's installed.
- **Plugin PowerShell files must be UTF-8 *with BOM*.** The launcher runs under Windows PowerShell 5.1,
which reads BOM-less files in the system ANSI codepage — Cyrillic string literals then corrupt parsing of
the whole script. `pwsh` 7 doesn't reproduce this, so it passes locally and breaks for the user.
## Key implementation facts (don't relearn) ## Key implementation facts (don't relearn)
- **All COM calls run on one dedicated STA thread** (`KompasDispatcher.InvokeAsync`); КОМПАС is single-instance STA. Services never touch COM off that thread. Verified COM call-chains — interop loading, the STA dispatcher, API5 `ksPart` building, face/edge selection,
- **Connection**: API5 (`KOMPAS.Application.5``KompasObject`) then `ksGetApplication7()``IApplication`; the API5 root is needed for `ksPart` 3D-building and `ksDocument3D` snapshots. API7 is used for app/documents, holes, assemblies, drawings, direct B-rep edit. МЦХ, snapshots, the feature tree, variables, STEP round-trip, direct B-rep edit, forming ops, patterns and
- **3D via API5 `ksPart`**: `NewEntity(o3d_*)` + matching definition; always check `entity.Create()` return. Entity codes: `o3d_sketch`/`o3d_bossExtrusion`/`o3d_cutExtrusion`/`o3d_bossRotated`/`o3d_fillet`/`o3d_chamfer`, `o3d_shellOperation=43`, `o3d_ribOperation=44`, `o3d_baseEvolution=45` (sweep), `o3d_baseLoft=30`, `o3d_planeOffset=14`, `o3d_meshCopy=35` (linear pattern), `o3d_circularCopy=36`, `o3d_mirrorOperation=48`, `o3d_mirrorAllOperation=49`, `o3d_incline=42` (draft), axes `o3d_axisOX/OY/OZ=71/72/73`. Definitions: `ksBossExtrusionDefinition`/`ksCutExtrusionDefinition`/`ksBossRotatedDefinition`/`ksFilletDefinition`/`ksChamferDefinition`/`ksShellDefinition`/`ksRibDefinition`/`ksBaseEvolutionDefinition`/`ksBaseLoftDefinition`/`ksPlaneOffsetDefinition`/`ksMeshCopyDefinition`/`ksCircularCopyDefinition`/`ksMirrorCopyDefinition`/`ksMirrorCopyAllDefinition`/`ksInclineDefinition`. Cut-through holes use `dtBoth` + `etThroughAll`. mirror, holes, assemblies, 2D drawings, sketch primitives — live in skill **`kompas-mcp-dev`**,
- **Face/edge selection**: `ksPart.EntityCollection(o3d_face|o3d_edge)``SelectByPoint(x,y,z)` (world mm) → `GetByIndex(0)`; or by stable index from `list_faces`/`list_edges` (helpers `SelectFaceByIndex`/`SelectEdgeByIndex`, range-checked before mutation; by-index more reliable than by-point). Classify: `ksFaceDefinition.IsPlanar/IsCylinder/…` + `GetArea(ST_MIX_MM)`; `ksEdgeDefinition.IsLineSeg/IsCircle/IsArc/…` + `GetLength()`. Sketch axis = line with system style **3** (осевая). `reference/com-implementation-facts.md`. Load that skill before touching the COM layer; append to it when a
- **МЦХ / mass props**: use **API5 `ksPart.CalcMassInertiaProperties(ST_MIX_MM|ST_MIX_KG)`**`ksMassInertiaParam` (`v`/`m`/`F`/`xc`/`yc`/`zc`), computed on demand. **Do NOT** use API7 `IMassInertiaParam7.Calculate()` — its `Actual` flag sticks after the first calc and won't refresh on API5 geometry changes (stale volume). Bounding box: `ksPart.GetGabarit(full:false, …)`. new chain is verified live. Cross-checked duplicates also sit in memory (`kompas-*-api*.md`).
- **Snapshot**: `ksDocument3D.SaveAsToRasterFormat(file, ksRasterFormatParam)` renders to a temp file (the in-memory `resultArrayBytes` stays empty when a filename is given); read bytes back. Return to MCP via `ImageContentBlock.FromBytes(bytes, mime)`**not** `Data = bytes` (Data holds base64 bytes). Use `model_snapshot` only for visually-spatial questions; **prefer `describe_model` first** (structural «passport» — bbox + МЦХ + bodies + topology + feature tree + variables, no image token cost).
- Logs go to **stderr** (stdout is the MCP channel). Integration tests reuse one КОМПАС via `KompasFixture`; artifacts land in gitignored `.scratch/`. All integration test classes inherit `IntegrationTestBase` (`IAsyncLifetime`) → `DocumentService.CloseAllAsync` after each test (prevents tab accumulation).
- **Feature tree API**: read via API5 `ksPart.GetFeature()``(ksFeature).SubFeatureCollection(true,false)``ksFeatureCollection`. Cast `(ksFeature)part` does NOT work (RCW QI returns null) — must use `GetFeature()`. `ksFeature.type` returns only coarse `o3d_entity` and does NOT distinguish operations; precise type and params come from `ksFeature.GetObject()``ksEntity.GetDefinition()` + the matching definition (`ksBossExtrusionDefinition.GetSideParam`, `ksFilletDefinition.radius`, `ksChamferDefinition.GetChamferParam`, …). Node names ("Элемент выдавливания:1") are localized by КОМПАС. Features registered by id in `_features` support patterns/mirror; helpers `RequireSketch`/`RequireFeature`.
- **Variables (API5)**: create/read via `ksPart.GetFeature().VariableCollection` (property on root ksFeature) — **NOT** `ksPart.VariableCollection()` (returns external-only). Expression is the leading field; value is derived. Apply via `ksPart.RebuildModel()` (check return); after rebuild the RCW variable is stale → re-read via a fresh collection (`ReadValueFresh`). Dependents recalculate automatically; deletion fails if dependents exist (`RemoveVariable` returns FALSE). **Geometry limitation:** variables drive geometry only in a parametric model (sketch dims linked to variable names); our sketches use literal coords → `set_variable` stores/computes the value but does NOT move geometry. Parametric sketches **unavailable via COM** (`ksCDimWithVariable` not constructible from external automation — see `docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md`; do not retry without new info).
- **Topology / measure API**: `ksFaceDefinition.EdgeCollection` / `GetCylinderParam` / `GetSurface().GetNormal` + `normalOrientation`; `ksEdgeDefinition.GetAdjacentFace(bool)` / `GetVertex(bool)``ksVertexDefinition.GetPoint`; bodies via `ksPart.BodyCollection()``ksBody` (`IsSolid` / `FaceCollection`); measurements via `ksPart.GetMeasurer()``ksMeasurer` (`SetObject1/2`, `unit=ST_MIX_MM`, `Calc`, `distance`/`MinDistance`/`angle` in degrees / `IsAngleValid`).
- **"STEP import without history"** detected structurally: `bodyCount > 0 && no formative features && features.Count <= bodyCount+1` (only origin + body). STEP with edits ("Смещённая плоскость" / "Разрезать" / "Переместить грани" / "Булева операция") already has history.
- **STEP import/export COM pattern** (verified): `IApplication.get_Converter((object)(int)ksConverterFromSTEP=-3)` (pass format code, not DLL path) → `IConverter.ConverterParameters(cmd)``IAdditionConvertParameters.Format=ksConverterFromSTEP``IKompasDocument3D1.ConvertFromAdditionFormat(path, prm)`. Export: `ConvertToAdditionFormat` (format codes AP203/AP214/AP242). Param co-classes (AdditionConvertParameters etc.) are NOT CoCreatable — only via converter factories. Assembly traversal (`list_components`): `IKompasDocument3D.TopPart → IPart7.Parts (IParts7)`. Extract component: `prm.NeedCreateComponentsFiles=true` (writes .m3d files next to STEP) + `IPart7.OpenSourceDocument`.
- **Direct B-rep face editing (`move_face`)** (verified): API7 face via `IPart7.FindObjectsByPoint(x,y,z,true)` → cast to `KompasAPI7.IFace`; containers via runtime COM-QI `(ISurfaceContainer)part`, `(IModelContainer)part`; `FaceMover` (SetFaces + Offset + Direction + Update) moves the face. distance>0 = outward (add material), <0 = inward. Works on parametric and imported B-rep. Full split-reposition workflow (SplitSolids/BodyRepositions) is driveable; only partly exposed as tools (`split_solid_by_plane`, `move_body`, `boolean_union`).
- **Forming ops (API5 definitions)**:
- `shell` (`ksShellDefinition`, o3d_shellOperation=43): `thickness` + `thinType` (bool, `= !outward`) + `FaceArray()` (open faces ≥1 by index). Transient RCWs intentionally not released (consistent with Fillet/Chamfer).
- `rib` (`ksRibDefinition`, =44): `SetSketch(sketch)``index=0`, `angle`, `side` (`left|right|up|down` → 0/1/2/3 via `SketchGeometry.RibSide()`); `SetThinParam(dtBoth, t/2, t/2)` if symmetric, else `(dtNormal, t, 0)`. Empirical: the rib contour must float in the gap (not touch the body) — КОМПАС extends the web automatically.
- `sweep` (`ksBaseEvolutionDefinition`, =45): `SetSketch(profile)``PathPartArray().Add(path)``sketchShiftType=0``SetThinParam(false)``Create()`. Profile & path on different (usually ⟂) planes; `profileSketchId != pathSketchId`.
- `loft` (`ksBaseLoftDefinition`, =30): `Sketchs().Add(each)``SetLoftParam(false,false,true)``SetThinParam(false)`. ≥2 closed sections on parallel planes — use `sketch_create_on_offset_plane` for non-base sections.
- offset plane (`sketch_create_on_offset_plane`, `ksPlaneOffsetDefinition`, o3d_planeOffset=14): `SetPlane(base)` + `offset` mm + `direction``Create()` → sketch on it (`OpenSketchOnOffsetPlaneAsync`).
- `draft` (`ksInclineDefinition`, o3d_incline=42 — API5 calls the op **Incline**, NOT Draft): `FaceArray()` (by index) + `SetPlane(neutral base plane)` + `angle` (degrees) + `direction`. **Empirical, opposite to SDK docs:** `direction=false`=expanding/outward (adds material), `true`=tapering/inward → code maps `def.direction = !outward`. Validate `0<angle<90`. (`o3d_DraftFromEdges=644` / `IDraftFromEdges` is a different op — not used.)
- **Patterns & mirror (API5)**: `linear_pattern` (`ksMeshCopyDefinition`, =35): `SetAxis1(axis)` + `SetCopyParamAlongAxis(true,0,count,step,false)` + `count2=1` (disables 2nd direction → 1D); features via `OperationArray()`. `circular_pattern` (`ksCircularCopyDefinition`, =36): `SetAxis(axis)`; `count1=1` (radial off), `count2=count` (ring), `step2=angle°` between neighbours, `factor2=false`, `inverce=reverse`; `GetOperationArray().Add(feature)`. `mirror_operation` (`ksMirrorCopyDefinition`, =48): `SetPlane(base)` + `GetOperationArray().Add(feature)`. `mirror_body` (`ksMirrorCopyAllDefinition`, =49): `SetPlane(base)`; `ChooseBodies()` casts to null in interop and is NOT needed — mirrors all bodies keeping the original (volume doubles). Empirical: `count` includes the original instance (count=3 → 3 instances). Axes: `CoordinateAxis{X,Y,Z}``o3d_axisOX/OY/OZ` (`Core/Modeling/CoordinateAxis.cs`, analogous to `BasePlane.cs`).
- **Hole ops (API7 only — `ksHoleDefinition` absent in API5 interop; `HoleService`)**: `HoleCore(ksHoleTypeEnum holeType, Action<IHole3D> configure)``configure` sets `HoleParameters` **after** `HoleType` is assigned (the type-specific sub-interface is inaccessible until the type is fixed). Placement shared: `IModelContainer`/`IHole3D`/`IHoleDisposal` + `Points3D`, direction chosen by volume delta, orphan rollback. None registered in `_features` → no id returned. `hole`=`ksHTBase`, configure=null. `hole_counterbore`=`ksHTCounterbore` + `(ISpotfacingHoleParameters)` (`SpotfacingDiameter`/`SpotfacingDepth`). `hole_countersink`=`ksHTCountersinking` + `(ICountersinkHoleParameters)` (`CountersinkType=ksCTDiameterAngle`, `CountersinkDiameter`/`Angle`). `hole_conic`=`ksHTConic` + `(IConicHoleParameters)` (`ConicType=ksCNAngle`, `ConicAngle`).
- **Assembly (API7, `AssemblyService`, namespace `Kompas.Mcp.Core.Assemblies`)**: `assembly_add_component``IParts7.AddFromFile(path, ExternalFile=true, Redraw=true)``IPart7.Placement` (`IPlacement3D`) → `SetOrigin(x,y,z)` (mm, assembly world CS) → `UpdatePlacement(true)``top.RebuildModel(true)`. **Empirical:** `UpdatePlacement` returns FALSE for a manually-positioned component (no mates) — NOT an error. Validate `DocumentType==ksDocumentAssembly` before touching `TopPart`; rollback via `IFeature7.Delete` + `RebuildModel`. `assembly_add_mate``top.MateConstraints` (`IMateConstraints3D`) → `Add(MateConstraintType)``BaseObject1/2` (faces via `top.FindObjectsByPoint(x,y,z,FirstLevel=false)`) → `ParamValue` (distance) → `Update()``RebuildModel(true)`; check `mate.Valid` (false → rollback `mate.Owner.Delete`). Types `coincidence`(mc_Coincidence=0) / `distance`(mc_Distance=5, value>0) verified live; `parallel`/`perpendicular`/`concentric`/`angle`/`tangency` — future.
- **Drawing (API7, `DrawingService`, namespace `Kompas.Mcp.Core.Drawings`)** — entry via `IKompasDocument2D`; requires an active drawing doc (`DocumentType==ksDocumentDrawing`). All coords are **view-local** (mm) unless noted. Model file must be saved before placing views.
- `drawing_create_standard_views`: `doc2d.ViewsAndLayersManager.Views.AddStandartViews(path, "#Спереди", projTypes, x, y, scale, dx=20, dy=20)` where `projTypes=object[]{1,3,5}` (Front/Up/Left as SAFEARRAY VT_I4). Success: `created==3`; content check: sum of new views' `IView.ObjectCount` > 0 else rollback `IView.Delete`. Returns `ViewNumbers` (the `IView.Number` values — address views by these when placing annotations).
- `drawing_fill_title_block`: `doc2d.LayoutSheets.ItemByNumber[1].Stamp` (`IStamp`) → `stamp.Text[columnId].Str = text` (indexed property; `IText.Str` overwrites, no Clear needed) → `stamp.Update()`. Fields→columns (`ksStampEnum`): Name=1, Designation=2, Material=3. Non-transactional (all cells → single `Update`).
- **Dimensions go into `(ISymbols2DContainer)view`, NOT the sheet, and are NOT counted in `IView.ObjectCount`** (that counts geometry in `IDrawingContainer`) — verify placement via the container's `*.Count`. Common flow: `Add()` → set coords → `AutoNominalValue=true``Update()` → check `Valid` → read `((IDimensionText)dim).NominalValue`; rollback `dim.Delete()` on FALSE/invalid/zero. Leader/angle in **radians** (`DimensionAngles.ToRadians`). Free placement = set coords directly; **associative** (diametral/radial only) = set `BaseObject` to a projected circle → value read from geometry (see below).
- linear (`ILineDimension`): `X1,Y1,X2,Y2` (extension pts) + `X3,Y3` (dim line) + `Orientation` (`DimensionOrientation{Horizontal,Vertical,Parallel}``ksLinDParallel=0`/`Horizontal=1`/`Vertical=2`; parallel needs no explicit Angle).
- diametral (`IDiametralDimension`): `Xc,Yc,Radius` + `Angle`; `NominalValue` = 2·Radius.
- radial (`IRadialDimension`): `Xc,Yc,Radius` + `Angle`, `DimensionType=true`; **`NominalValue` = Radius, NOT diameter** — contrary to SDK docs, confirmed by spike.
- **associative** diametral/radial (`associate=true` flag): instead of coords, find a projected circle in `(IDrawingContainer)view.Circles` by center+radius key (`CircularObjectMatch.SelectMatchIndex`, tol 1 mm; throws on none/ambiguous; concentric disambiguated by radius), set `dim.BaseObject = circle` (`_Circle` implements `IDrawingObject`) → `NominalValue` read from geometry. `RequireViewContainers` gives both QIs; free path stays on `RequireSymbols2DContainer`. Arc/angular/rough binding — not yet (own spike needed; `ILineDimension` has no `BaseObject`).
- angular (`IAngleDimension`, `AngleDimensions.Add(ksDrADimension=10)`): vertex `Xc,Yc` + side pts `X1,Y1`/`X2,Y2` + arc-position `X3,Y3` (positions the arc only, does NOT pick the angle); measured angle chosen by `DimensionType` = `AngleDimensionType{Min,Max,More}` (on rays 0°/45° → min=45°/max=135° supplement/more=315° reflex). `NominalValue` in degrees.
- `drawing_add_rough` (`Roughs.Add()`/`IRough`: `BranchX0/Y0`, `Angle`) + `(IRoughParams)rough` QI: `SignType` = `RoughSignType{NoProcessing,DeleteMaterial,WithoutDeleteMaterial}`, value (Ra/Rz) = `RoughParamText.Str`.
- `drawing_add_text`**text lives in `IDrawingContainer`, NOT `ISymbols2DContainer`, and NOT in `IView.ObjectCount`**: `(IDrawingContainer)view.DrawingTexts.Add()`/`IDrawingText` (`X/Y/Angle`) + `(IText)dt.Str` = text; count via `DrawingTexts.Count`. Do NOT set `Height` (that's block height, not font).
- `drawing_set_technical_requirements`**document-level**: `(IDrawingDocument)doc.TechnicalDemand`/`ITechnicalDemand`: `td.Text.Str = text``td.Update()` (`IsCreated` False→True on first set; overwrites; `\n` multiline).
- `DrawingAnnotationResult{Value(read-back), ViewNumber}` is the shared result for rough/text.
- **Richer sketch primitives (API5 `ksDocument2D` wrappers)**: `ksArcBy3Points`; `ksArcByAngle` (centre/radius/start-end angles in degrees + counterClockwise flag); `ksEllipse` via `ksEllipseParam` (`KompasObject.GetParamStruct(ko_EllipseParam=22)`; **property names are `A`/`B` UPPERCASE in the interop**); `ksRegularPolygon` via `ksRegularPolygonParam` (`ko_RegularPolygonParam=92`; `describe = !inscribed`); NURBS spline via `ksNurbs(order=4)` + `ksNurbsPoint` loop + `ksEndObj`; `ksPoint`. Param structs released after use. `PartModeler` is partial: `.cs` (registry/helpers/`NewParam<T>`/reset), `.Sketch.cs` (2D primitives), `.Features.cs` (extrude/revolve/fillet/chamfer). Static `SketchGeometry` (`Core/Modeling`) holds enum maps + validators (`RequirePositive`, `RequireVertexCount`, `RequirePoints`, `RequireMin`). Point lists use `record SketchPoint(X, Y)` (JSON names `x`/`y`).
## КОМПАС-3D API architecture (the critical context) ## КОМПАС-3D API architecture (the critical context)
КОМПАС-3D is automated via a **COM Automation API**, Windows-only. КОМПАС-3D **must be installed and running/launchable** on the same machine — the MCP server is a COM client, not a standalone CAD engine. There are **two coexisting API generations**: КОМПАС-3D is automated via a **COM Automation API**, Windows-only. КОМПАС **must be installed and
running/launchable on the same machine** — the MCP server is a COM client, not a standalone CAD engine.
Two API generations coexist:
| | Entry point | Namespace (C#) | Style | Use when | | | Entry point | Namespace (C#) | Style | Use when |
|---|---|---|---|---| |---|---|---|---|---|
| **API5** (legacy) | `KompasObject` | `Kompas6API5` | procedural, flat | older features, 2D primitives, bootstrapping | | **API5** (legacy) | `KompasObject` | `Kompas6API5` | procedural, flat | 3D `ksPart` building, 2D primitives, bootstrapping |
| **API7** (modern, preferred) | `IApplication` / `_Application` | `KompasAPI7` | OOP, interface-based | everything new — documents, 3D, parameters | | **API7** (modern, preferred) | `IApplication` / `_Application` | `KompasAPI7` | OOP, interface-based | documents, holes, assemblies, drawings, B-rep edit |
Constants live in separate libraries: `Kompas6Constants`, `Kompas6Constants3D` (C#), or `ksConstants.h` / `ksConstants3D.h` (C++). Constants live in separate libraries: `Kompas6Constants`, `Kompas6Constants3D` (C#), or `ksConstants.h` /
`ksConstants3D.h` (C++).
### Connection pattern (verified from `Samples/CSharp.zip`) ### Connection pattern (verified from `Samples/CSharp.zip`)
1. Get the КОМПАС root object by COM ProgID. **Verified on this machine (v24 Home):** 1. Get the КОМПАС root object by COM ProgID. **Verified on this machine (v24 Home):**
`KOMPAS.Application.7` and `KOMPAS.Application.5` are registered; `KOMPASLT.*` is **absent** `KOMPAS.Application.7` and `KOMPAS.Application.5` are registered; `KOMPASLT.*` is **absent** the Home
the Home edition uses the regular (non-LT) ProgIDs. Resolution order: edition uses the regular (non-LT) ProgIDs. Resolution order:
- `KOMPAS.Application.7` — direct API7 `IApplication` (preferred) - `KOMPAS.Application.7` — direct API7 `IApplication` (preferred)
- `KOMPAS.Application.5` — API5 `KompasObject`, then `ksGetApplication7()` - `KOMPAS.Application.5` — API5 `KompasObject`, then `ksGetApplication7()`
- `KOMPASLT.Application.5` — fallback for other installations - `KOMPASLT.Application.5` — fallback for other installations
- New instance: `Activator.CreateInstance(Type.GetTypeFromProgID(progId))` - New instance: `Activator.CreateInstance(Type.GetTypeFromProgID(progId))`
- Attach to a running instance: `Marshal.GetActiveObject(progId)` - Attach to a running instance: `Marshal.GetActiveObject(progId)`
2. If you entered via API5, obtain the modern application: `IApplication appl = (IApplication)kompas.ksGetApplication7();` (via `KOMPAS.Application.7` you already hold `IApplication`). 2. If you entered via API5, obtain the modern application:
3. Set `appl.Visible = true` to show the КОМПАС window; drive documents via API7 interfaces (`IKompasDocument2D`, `IKompasDocument3D`, …). `IApplication appl = (IApplication)kompas.ksGetApplication7();`
3. Set `appl.Visible = true` to show the КОМПАС window; drive documents via API7 interfaces
(`IKompasDocument2D`, `IKompasDocument3D`, …).
> The SDK C# samples are mostly **КОМПАС plugin libraries** (DLLs loaded *into* КОМПАС as ActiveX, entry methods like `ExternalRunCommand`/`ExternalMenuItem`, registered via `[ComRegisterFunction]`). For an MCP server we want the **opposite direction**: a standalone *external automation client* that connects out-of-process via the ProgID pattern above. Read the samples for API usage, not for the plugin packaging/registration boilerplate. > The SDK C# samples are mostly **КОМПАС plugin libraries** (DLLs loaded *into* КОМПАС as ActiveX, entry
> methods like `ExternalRunCommand`/`ExternalMenuItem`, registered via `[ComRegisterFunction]`). This server
> is the **opposite direction**: a standalone *external automation client* connecting out-of-process via the
> ProgID pattern above. Read the samples for API usage, not for the plugin packaging/registration boilerplate.
## SDK layout (read-only reference, not part of this repo) ## SDK layout (read-only reference, not part of this repo)
Under `C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK`: The SDK tree under `C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK` (`lib\*.tlb`, `lib64\`, `Include\`,
- `lib\*.tlb` — COM type libraries to reference / generate interop from: `kAPI5.tlb`, `kAPI7.tlb`, `ksConstants.tlb`, `ksConstants3D.tlb`, `kAPI2D5COM.tlb`, `kAPI3D5COM.tlb`. `KsAPI\`, `Samples\*.zip`, `Help\KOMPAS_SDK_ru-RU.zip`) is one `ls` away — browse it rather than trusting
- `lib64\` — 64-bit import libs (`kAPI7.lib`, `kAPI5.lib`, …) and `.a` for C++/Builder. a copy here. Two things that are **not** visible from a listing:
- `Include\` — C++/Pascal headers (`Ks_TLB.h`, `kAPI2D5COM.h`, `LDefin2D.pas`, …).
- `KsAPI\` — the **KsAPI** (Qt/C++ cross-platform flavour): `Include\KsAPI.h`, `ksConstants*.h`, `Lib64\ksAPI.lib`, plus `Help\С чего начать.pdf` and a Linux/Debian 12 build guide.
- `Samples\` — zipped examples per language: `CSharp.zip`, `C++.zip`, `Pascal.zip`, `Basic.zip`. Inside `CSharp.zip`, the `Step1``Step12` and `Step2_API7_2D` / `Step2_API7_3D` projects are the progressive tutorial; `Gayka`, `SlideWrk`, `EventsAuto` are larger feature demos.
- `Help\KOMPAS_SDK_ru-RU.zip` and `KsAPI\Help\KsAPI_Help.zip` — offline copy of the docs.
To inspect a sample without unpacking the whole archive: `unzip -p "<path>\Samples\CSharp.zip" "Automation/Step2_API7_3D/Step2_API7_3D.cs"`. Note the `.cs` sample sources are **Windows-1251 encoded** (Cyrillic comments appear garbled in UTF-8 tools). To inspect a sample without unpacking the whole archive:
`unzip -p "<path>\Samples\CSharp.zip" "Automation/Step2_API7_3D/Step2_API7_3D.cs"`. The `.cs` sample sources
are **Windows-1251 encoded** (Cyrillic comments appear garbled in UTF-8 tools).
## Conventions / gotchas ## Conventions / gotchas
- **Windows-only & 64-bit**: target x64 to match the installed КОМПАС; mixing bitness breaks COM activation. КОМПАС v24 Home is the installed edition — some full-edition API features may be unavailable. - **Windows-only & 64-bit**: target x64 to match the installed КОМПАС; mixing bitness breaks COM activation.
- **Encoding**: SDK source samples are CP1251. New project files should be UTF-8. v24 Home is the installed edition — some full-edition API features may be unavailable.
- **COM lifetime**: release COM objects (`Marshal.ReleaseComObject`) / scope them; a leaked reference keeps the КОМПАС process alive. - **Encoding**: SDK sources are CP1251; project files are UTF-8; plugin PowerShell is UTF-8 **with BOM**.
- **API choice**: prefer API7 for new tool implementations; drop to API5 only for things API7 doesn't expose. - **COM lifetime**: release COM objects (`Marshal.ReleaseComObject`) or scope them; a leaked reference keeps
the КОМПАС process alive.
- **API choice**: prefer API7 for new tools; drop to API5 only for what API7 doesn't expose.
- **Sequential tool calls**: the build session keeps sketches by `id` and the server serves requests
concurrently — dependent tool calls must be awaited one at a time.
+99 -43
View File
@@ -2,22 +2,43 @@
**MCP-сервер для управления CAD-системой КОМПАС-3D (АСКОН) языковой моделью.** **MCP-сервер для управления CAD-системой КОМПАС-3D (АСКОН) языковой моделью.**
Сервер — это COM-клиент КОМПАС-3D: он подключается к установленному КОМПАС и предоставляет Сервер — COM-клиент КОМПАС-3D: подключается к установленному КОМПАС и даёт LLM 56 инструментов для
LLM набор инструментов для создания документов, построения 3D-деталей (эскиз → выдавливание), создания документов, построения 3D-деталей (эскиз → формообразующая операция), работы со сборками и
импорта/экспорта STEP, работы со сборками, структурного осмотра модели (`describe_model` — дерево чертежами, импорта/экспорта STEP, прямого редактирования импортированной B-rep, а также структурного
операций, тела, переменные, топология одним вызовом) и снимка модели (агент «видит» результат). осмотра модели (`describe_model` — дерево операций, тела, топология, переменные, МЦХ одним вызовом)
и снимка модели, по которому агент «видит» результат.
Принцип: **MCP транслирует возможности SDK КОМПАС в общие инструменты** (не под конкретную задачу). Принцип: **MCP транслирует возможности SDK КОМПАС в общие инструменты**, а не под конкретную задачу.
Поверх MCP — навык **`.claude/skills/kompas-3d/`** с методикой работы (playbook'и, эвристики, Поверх MCP — навык **`kompas-3d`** с методикой работы (playbook'и, эвристики). Отдельный навык
обкатанные в `usecases/`). **`kompas-fdm-design`** — методика проектирования под FDM/FFF 3D-печать (правила DFM + лёгкий
гео-аудит инструментами осмотра): работает поверх `kompas-3d`, экспортирует через `export_step`,
слайсер не вызывает.
> Подробности: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · план — [docs/IMPLEMENTATION_PLAN.md](docs/IMPLEMENTATION_PLAN.md) Проектной документации в отдельном каталоге нет: этот README — обзор и каталог инструментов,
> · спорные вопросы — [docs/OPEN_QUESTIONS.md](docs/OPEN_QUESTIONS.md) · обзор — [docs/presentation.html](docs/presentation.html) [CLAUDE.md](CLAUDE.md) — архитектура, проверенные COM-приёмы и подводные камни.
## Требования ## Требования
- **Windows x64**, установленный **КОМПАС-3D** (разрабатывалось на v24 Home). - **Windows x64**, установленный **КОМПАС-3D** (разрабатывалось на v24 Home) **вместе с компонентом
- **.NET SDK 8+** (собирается и на SDK 10; целевой фреймворк `net8.0-windows`). SDK**: interop-сборки принадлежат АСКОН, в поставку сервера не входят и берутся из установки —
`SDK\Samples\CSharp.zip` (каталог `Common`), при первом запуске распаковываются в
`%LOCALAPPDATA%\kompas-mcp\interop\<ключ>`. Если SDK не установлен, положите сборки рядом с
`kompas-mcp.exe` или укажите каталог с ними в `KOMPAS_INTEROP_DIR`.
- **.NET SDK 8+** для сборки из исходников (целевой фреймворк `net8.0-windows`; формат решения
`.slnx` понимает только SDK 9+ — на SDK 8 собирайте проекты по путям). Для готового релиза рантайм
не нужен: сервер публикуется self-contained.
## Установка как плагин Claude Code
Сервер и оба публикуемых навыка упакованы в плагин `kompas` (каталог [`plugin/`](plugin/)) — самый
простой способ подключить проект к Claude Code без ручной сборки: `/plugin marketplace add` +
`/plugin install`, дальше лаунчер сам скачивает self-contained сборку сервера по
`plugin/server.lock.json` и сверяет её SHA256. Проверка установки — команда `/kompas:doctor`.
Подробности, режим разработки (`KOMPAS_MCP_EXE`) и сниппеты для Codex/opencode — в
[`plugin/README.md`](plugin/README.md).
> Публичного релиза пока нет (`server.lock.json` в состоянии `0.0.0`, запись в каталоге плагинов не
> заведена) — используйте режим разработки или сборку ниже.
## Сборка и запуск ## Сборка и запуск
@@ -25,8 +46,9 @@ LLM набор инструментов для создания документ
dotnet build -c Release dotnet build -c Release
# сервер (stdio): # сервер (stdio):
dotnet run --project src/Kompas.Mcp.Host -c Release dotnet run --project src/Kompas.Mcp.Host -c Release
# или собранный exe: # или собранный exe (платформа x64 — из Directory.Build.props):
src/Kompas.Mcp.Host/bin/Release/net8.0-windows/kompas-mcp.exe src/Kompas.Mcp.Host/bin/x64/Release/net8.0-windows/kompas-mcp.exe
kompas-mcp.exe --version # версия бинаря, КОМПАС для этого не нужен
``` ```
### Подключение к MCP-клиенту (stdio) ### Подключение к MCP-клиенту (stdio)
@@ -34,71 +56,105 @@ src/Kompas.Mcp.Host/bin/Release/net8.0-windows/kompas-mcp.exe
```json ```json
{ {
"mcpServers": { "mcpServers": {
"kompas3d": { "command": "C:\\путь\\к\\kompas-mcp.exe", "args": [] } "kompas": { "command": "C:\\путь\\к\\kompas-mcp.exe", "args": [] }
} }
} }
``` ```
## Инструменты (81 инструмент) ## Инструменты (56)
| Группа | Инструменты | | Группа | Инструменты |
|---|---| |---|---|
| System | `kompas_connect`, `kompas_status`, `kompas_set_visible` | | System | `kompas_connect`, `kompas_status`, `kompas_set_visible`, `set_auto_validate` |
| Documents | `document_create`, `document_open`, `document_save`, `document_save_as`, `document_close`, `document_active` | | Documents | `document_create`, `document_open`, `document_save`, `document_close`, `document_active` |
| Sketch | `sketch_create`, `sketch_create_on_face`, `sketch_create_on_face_index`, `sketch_create_on_offset_plane`, `sketch_add_line`, `sketch_add_circle`, `sketch_add_rectangle`, `sketch_add_axis`, `sketch_add_arc`, `sketch_add_arc_3points`, `sketch_add_ellipse`, `sketch_add_polyline`, `sketch_add_polygon`, `sketch_add_spline`, `sketch_add_point`, `sketch_close` | | Sketch | `sketch_create`, `sketch_add`, `sketch_close` |
| Features | `extrude_boss`, `extrude_cut`, `revolve_boss`, `revolve_cut`, `fillet_edge`, `chamfer_edge`, `fillet_edge_index`, `chamfer_edge_index`, `shell`, `rib`, `sweep`, `loft`, `linear_pattern`, `circular_pattern`, `mirror_operation`, `mirror_body`, `hole`, `hole_counterbore`, `hole_countersink`, `hole_conic`, `draft`, `rebuild` | | Features | `extrude`, `revolve`, `fillet_edge`, `chamfer_edge`, `shell`, `rib`, `sweep`, `loft`, `pattern`, `mirror`, `hole`, `draft`, `rebuild` |
| Edit | `move_face`, `split_solid_by_plane`, `move_body`, `boolean_union` | | Edit | `move_face`, `split_solid_by_plane`, `move_body`, `boolean_union` |
| Inspection | `describe_model`, `list_features`, `list_bodies`, `list_variables`, `describe_face`, `describe_edge`, `measure` | | Inspection | `describe_model`, `list_features`, `list_bodies`, `list_variables`, `measure` |
| Vision | `model_snapshot` (PNG-снимок; fallback — сначала `describe_model`) | | Vision | `model_snapshot` (PNG-снимок; сначала `describe_model`) |
| Query | `get_part_info`, `get_bounding_box`, `list_faces`, `list_edges`, `list_components` | | Query | `list_faces`, `list_edges`, `list_components` |
| Variables | `create_variable`, `set_variable`, `delete_variable` | | Variables | `set_variable`, `delete_variable` |
| Conversion | `import_step`, `export_step` | | Conversion | `import_step`, `export_step` |
| Assembly | `assembly_add_component`, `assembly_add_mate` | | Assembly | `assembly_add_component`, `assembly_add_mate` |
| Drawing | `drawing_create_standard_views`, `drawing_fill_title_block`, `drawing_add_linear_dimension`, `drawing_add_diametral_dimension`, `drawing_add_radial_dimension`, `drawing_add_angular_dimension`, `drawing_add_rough`, `drawing_add_text`, `drawing_set_technical_requirements` | | Drawing | `drawing_create_standard_views`, `drawing_fill_title_block`, `drawing_add_linear_dimension`, `drawing_add_diametral_dimension`, `drawing_add_radial_dimension`, `drawing_add_angular_dimension`, `drawing_add_leader`, `drawing_add_rough`, `drawing_add_text`, `drawing_set_technical_requirements`, `drawing_set_sheet_format` |
| Validation | `validate_part` | | Validation | `validate_part` |
Инструменты сгруппированы по смыслу операции, а не по способу вызова: тип задаётся параметром
(`extrude(mode=boss|cut)`, `hole(type=simple|counterbore|countersink|conic)`,
`pattern(kind=linear|circular)`), а объект — либо индексом из `list_faces`/`list_edges`,
либо точкой в мировых координатах. Эскиз строится списком примитивов за один вызов:
`sketch_create(plane|faceIndex, entities[])`.
### Типовой сценарий ### Типовой сценарий
`kompas_connect``document_create part` `sketch_create XOY``sketch_add_circle` `kompas_connect``document_create part`
`sketch_close``extrude_boss``describe_model` → (повтор для следующих элементов). `sketch_create(plane="XOY", entities=[{type:"rectangle", points:[…]}, {type:"circle", …}])`
`extrude(mode="boss", depth=20)``describe_model` → (повтор для следующих элементов).
> `describe_model` предпочтителен перед `model_snapshot`: отдаёт структурный «паспорт» детали > `describe_model` предпочтителен перед `model_snapshot`: отдаёт структурный «паспорт» детали
> (дерево операций, тела, переменные, топологию, МЦХ) без расхода токенов на изображение. > (дерево операций, тела, переменные, топологию, МЦХ) без расхода токенов на изображение.
> Параметр `sections` (`box,mass,…`) сужает и ответ, и объём чтения модели.
> ⚠️ Вызовы зависимых инструментов выполняйте **последовательно** (дождавшись ответа): > Каждая мутирующая операция сама дописывает к ответу итог проверки построения — отдельный
> сессия построения хранит эскизы по `id`, а сервер обрабатывает запросы конкурентно. > `validate_part` после каждого шага не нужен. Отключается на сессию через `set_auto_validate(false)`
> или при старте сервера переменной окружения `KOMPAS_MCP_AUTOVALIDATE=0`.
> ⚠️ Вызовы зависимых инструментов выполняйте **последовательно**, дождавшись ответа: сессия
> построения хранит эскизы по `id`, а сервер обрабатывает запросы конкурентно.
## Структура ## Структура
``` ```
src/Kompas.Mcp.Core/ COM-слой: STA-диспетчер, подключение, документы, эскизы/операции, конвертация, снимок, инспекция модели src/Kompas.Mcp.Core/ COM-слой: STA-диспетчер, подключение, документы, эскизы/операции,
src/Kompas.Mcp.Host/ MCP-сервер (stdio) + определения инструментов сборки, чертежи, конвертация, снимок, инспекция модели
tests/Kompas.Mcp.Tests/ 267 тестов: unit + integration (integration требуют КОМПАС) src/Kompas.Mcp.Host/ MCP-сервер (stdio) + определения инструментов (Tools/ — по группе на файл)
libs/kompas-interop/ вендорские interop-сборки КОМПАС (из SDK Samples/Common) tests/Kompas.Mcp.Tests/ 427 тестов: unit (корень) + Integration/ (нужен запущенный КОМПАС)
docs/ архитектура, план, презентация, MD-база знаний SDK (Kompas3D_SDK/) libs/kompas-interop/ interop-сборки КОМПАС (из SDK Samples/Common) — только для компиляции
usecases/ полигон обкатки подходов (в .gitignore); приёмы поднимаются в навык kompas-3d plugin/ плагин Claude Code `kompas`: манифест, лаунчер, лок версии сервера,
.claude/skills/ навык kompas-3d (методика) навыки kompas-3d и kompas-fdm-design (источник истины)
.claude/agents/ субагенты-делегаты: docs-maintainer (Sonnet), kompas-sdk-research (Haiku) tools/ раскладка навыков junction'ами + Pester-тесты PowerShell плагина
.gitea/workflows/ CI (сборка + unit-тесты) и релиз (публикация в ветку dist)
.claude/skills/ junction'ы на plugin/skills + kompas-mcp-dev (внутренний навык разработки)
.claude/agents/ субагент kompas-sdk-research (Haiku) — поиск по справке SDK
``` ```
Справка по COM API КОМПАС живёт **вне репозитория** — в приватном
[`kompas-sdk-docs`](https://git.shahovalov.ru/mikhail/kompas-sdk-docs) (2465 статей, собраны из
HTML-справки SDK) и проиндексирована в RAG. Доступ — через MCP-сервер `kompas-sdk` (bearer в
`KOMPAS_SDK_RAG_TOKEN`); ищет по ней субагент `kompas-sdk-research`.
## Тесты ## Тесты
```powershell ```powershell
dotnet test # все (integration требуют КОМПАС) dotnet test # все (integration требуют КОМПАС)
dotnet test --filter "Category=Unit" # только unit (без COM) dotnet test --filter "Category=Unit" # только unit (без COM)
dotnet test --filter "Category=Integration" # только integration dotnet test --filter "Category=Integration" # только integration
pwsh -NoProfile -File tools/tests/run-ps-tests.ps1 # Pester-тесты скриптов плагина
``` ```
427 тестов: 291 unit + 136 integration. CI (Gitea Actions, `.gitea/workflows/ci.yml`) собирает проект и
гоняет `Category=Unit&Requires!=Windows` на Linux-раннере (245 тестов) — 5 тестов STA-диспетчера
помечены `Requires=Windows` (`Thread.SetApartmentState` не работает на Linux). Integration-тесты в CI
не запускаются никогда: нужен запущенный КОМПАС с GUI и лицензией. Плюс 41 Pester-тест
PowerShell-скриптов плагина и раскладки навыков — в счёт .NET-тестов не входят.
## Архитектура (кратко) ## Архитектура (кратко)
- **STA-поток** (`KompasDispatcher`) владеет всеми COM-вызовами — КОМПАС однопоточный STA. - **STA-поток** (`KompasDispatcher`) владеет всеми COM-вызовами — КОМПАС однопоточный STA.
- Подключение через API5 `KompasObject` (`KOMPAS.Application.5`) → API7 `IApplication` (`ksGetApplication7`). - Подключение через API5 `KompasObject` (`KOMPAS.Application.5`) → API7 `IApplication`
- 3D строится через API5 `ksPart`, снимок — через `ksDocument3D`; прямое редактирование импортированной B-rep — через API7. Структурный осмотр, переменные, сборки и чертежи инкапсулированы в сервисах COM-слоя. (`ksGetApplication7`). 3D строится через API5 `ksPart`, снимок — через `ksDocument3D`; отверстия,
- STEP импорт/экспорт — через встроенный конвертер КОМПАС. сборки, чертежи и прямое редактирование B-rep — через API7.
- MCP — официальный C# SDK `ModelContextProtocol`, транспорт stdio, логи в stderr. - **Interop-сборки подставляются в рантайме** (`KompasInteropLoader`) из установленного КОМПАС, а не
- Детали реализации, обоснования и проверенные COM-приёмы — в [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) и [CLAUDE.md](CLAUDE.md). из поставки сервера: установка находится по `HKCR\CLSID\{...}\LocalServer32`, сборки распаковываются
из `SDK\Samples\CSharp.zip` в `%LOCALAPPDATA%\kompas-mcp\interop\<ключ>`.
- STEP импорт/экспорт — через встроенный конвертер КОМПАС (AP203/AP214/AP242).
- MCP — официальный C# SDK `ModelContextProtocol`, транспорт stdio, логи в stderr (stdout занят
протоколом).
- Детали реализации, обоснования и проверенные COM-приёмы — в [CLAUDE.md](CLAUDE.md).
## Лицензирование ## Лицензирование
`libs/kompas-interop/*.dll` — interop-сборки АСКОН из состава SDK КОМПАС-3D; распространяются `libs/kompas-interop/*.dll` — interop-сборки АСКОН из состава SDK КОМПАС-3D. Они нужны **только для
согласно условиям АСКОН. Для работы требуется установленный КОМПАС-3D. компиляции** и в релизный архив сервера не попадают (`Private=false`): сервер подставляет их в
рантайме из установленного у пользователя КОМПАС-3D. Для работы требуется установленный КОМПАС-3D
с компонентом SDK.
-374
View File
@@ -1,374 +0,0 @@
# Архитектура MCP-сервера КОМПАС-3D (предлагаемый вариант)
> Статус: **реализовано и работает** (v1+v2+STEP/assembly+direct-edit+inspection+package-A «богатые эскизы»+package-B «shell+rib+sweep+loft»+package-C «массивы и зеркало»+package-D start «переменные»+package-E «offset plane»+`hole`+`hole_counterbore`+`hole_countersink`+`hole_conic`+`draft`+`assembly_add_component`+`assembly_add_mate`+`drawing_create_standard_views`+`drawing_fill_title_block`+`drawing_add_linear_dimension`+`drawing_add_diametral_dimension`+`drawing_add_radial_dimension`+`drawing_add_angular_dimension`+`drawing_add_rough`+`drawing_add_text`+`drawing_set_technical_requirements` (веха «2D-чертёж», инкремент 6 — текстовые обозначения)). Актуализировано по коду.
> Сопутствующий контекст по COM API КОМПАС — в [`../CLAUDE.md`](../CLAUDE.md).
> Имена интерфейсов и перечислений сверены со справкой SDK по MD-базе знаний `docs/Kompas3D_SDK/` (субагент `kompas-sdk-research`).
---
## 1. Назначение и контекст
Строим **MCP-сервер**, который даёт LLM управлять CAD-системой **КОМПАС-3D** (АСКОН):
создавать/открывать документы, строить 2D-геометрию, 3D-детали и сборки, читать/писать
параметры, запускать команды.
Жёсткие рамки, заданные природой API:
- **Только Windows, только x64** — КОМПАС автоматизируется через **COM Automation API**;
разрядность сервера должна совпадать с разрядностью установленного КОМПАС.
- **КОМПАС должен быть установлен и запускаем на той же машине.** Сервер — это **COM-клиент**,
а не самостоятельный геометрический движок. Без работающего экземпляра КОМПАС инструменты
бесполезны.
- Целевая среда — **КОМПАС-3D v24 Home** (LT-редакция); часть возможностей полной редакции
может быть недоступна.
Две сосуществующие версии API (подробнее — `CLAUDE.md`):
| | Точка входа | Namespace (C#) | Когда |
|---|---|---|---|
| **API5** (legacy) | `KompasObject` | `Kompas6API5` | bootstrap-подключение, построение 3D через `ksPart` |
| **API7** (современный) | `IApplication` | `KompasAPI7` | всё новое: документы, параметры, операции |
---
## 2. Выбранный стек
| Решение | Выбор | Обоснование |
|---|---|---|
| Язык / платформа | **.NET 8 (LTS), C#, `win-x64`** | COM-интероп первого класса; SDK поставляет именно C#-примеры и `.tlb` |
| MCP SDK | **`ModelContextProtocol`** (официальный C# SDK) | хостинг через `Microsoft.Extensions.Hosting`, DI, готовый stdio-транспорт |
| Транспорт | **stdio** | локальный клиент (Claude Desktop / IDE) запускает сервер дочерним процессом на машине с КОМПАС — проще и безопаснее всего |
| COM-интероп | COM-references на `.tlb` из `SDK\lib` | строгая типизация интерфейсов API7 (`IApplication`, `IPart7`, …) на этапе компиляции |
| Логи | `Microsoft.Extensions.Logging`**stderr** | **stdout занят протоколом MCP** — туда писать нельзя |
| Сериализация | `System.Text.Json` | штатно в .NET, без зависимостей |
Подключаемые типобиблиотеки (`C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK\lib`):
`kAPI5.tlb`, `kAPI7.tlb`, `ksConstants.tlb`, `ksConstants3D.tlb`, `kAPI2D5COM.tlb`, `kAPI3D5COM.tlb`.
Namespaces: `Kompas6API5`, `KompasAPI7`, `Kompas6Constants`, `Kompas6Constants3D`, `KAPITypes`.
### Почему C#, а не Python
Python (comtypes/pywin32) технически способен управлять COM, но КОМПАС-API активно использует
конструкции, болезненные для динамического интеропа: `out`/`ref`-параметры (например,
`ExecuteKompasCommand(commandID, post, &retval)`), `SAFEARRAY`/динамические массивы
(`ksDynamicArray`, `ksLtVariant`), мосты API5↔API7 (`ksGetApplication7`, `TransferInterface`) и
обязательный STA + насос сообщений. В C# всё это покрыто строго типизированным interop, что
снижает риск и стоимость поддержки.
---
## 3. Модель процесса и потоков (ключевой раздел)
COM-объекты КОМПАС живут в **STA (Single-Threaded Apartment)**, экземпляр приложения —
**единственный** и **однопоточный**. Отсюда — центральное архитектурное ограничение:
- Сервер держит **один выделенный STA-поток**, который **владеет всеми без исключения
COM-вызовами**. Асинхронные обработчики MCP-инструментов (поток-пул) **маршалят** работу в этот
поток через очередь/диспетчер (например, `BlockingCollection<Func<…>>` или собственный
`SynchronizationContext`). Это автоматически **сериализует** доступ к КОМПАС.
- STA-поток крутит **насос сообщений Windows** и периодически вызывает
`IApplication.PumpWaitingMessages()` / при необходимости `EnableTaskAccess(false)` на время
пакетных операций — чтобы диалоги и колбэки КОМПАС не приводили к взаимоблокировке.
```
MCP client ──stdio──> Host (поток-пул, async)
│ ставит задачу в очередь
┌─────────────────────────┐
│ STA-поток (COM owner) │ ← насос сообщений + PumpWaitingMessages
│ KompasObject / IApplication
└─────────────────────────┘
│ COM
КОМПАС-3D.exe
```
### Подключение к КОМПАС
1. Разрешить ProgID. На целевой машине (v24 Home) **проверено**: зарегистрированы
`KOMPAS.Application.7` и `KOMPAS.Application.5`, а `KOMPASLT.*` **отсутствует** — то есть
Home-редакция использует обычные ProgID, а не LT. Порядок попыток:
`KOMPAS.Application.7` (прямой API7) → `KOMPAS.Application.5` (+ `ksGetApplication7()`) →
`KOMPASLT.Application.5` (запасной, для других инсталляций). Выбранный ProgID фиксировать в логе.
2. **Attach** к запущенному экземпляру: `Marshal.GetActiveObject(progId)`.
Если не запущен — **launch**: `Activator.CreateInstance(Type.GetTypeFromProgID(progId))`.
3. Если зашли через API5 — получить современное приложение:
`IApplication appl = (IApplication)kompas.ksGetApplication7();` (через `KOMPAS.Application.7` `IApplication` уже на руках).
4. `appl.Visible = true;` — показать окно КОМПАС; дальше работать через интерфейсы API7.
### Жизненный цикл COM
- Корневые RCW (`KompasObject`, `IApplication`) держим на всё время жизни сервера.
- Временные объекты освобождаем (`Marshal.ReleaseComObject`) в обратном порядке создания.
- `appl.Quit()` вызываем **только если экземпляр запустили мы сами** (флаг «launched-by-us»);
к чужому запущенному КОМПАС не применяем.
---
## 4. Слои решения
Проекты solution `KompasMcp.slnx` (спайк-проекты ConnectSpike/ReconSpike удалены; их механика покрыта тестами):
| Проект | Ответственность |
|---|---|
| **Kompas.Mcp.Host** | Точка входа. Сборка MCP-сервера (stdio), DI (в т.ч. `ConversionService`), логи в stderr, старт и владение STA-потоком, graceful shutdown. Определения инструментов по категориям (System / Documents / Sketch / Features / Query / Conversion). **Тонкий слой**: валидация аргументов → постановка задачи на STA-поток → форматирование результата/ошибки в MCP-ответ. |
| **Kompas.Mcp.Core** | COM-слой. Менеджер соединения, менеджер документов, построитель эскизов и операций, `ConversionService` (STEP импорт/экспорт), `QueryService` (МЦХ, грани, рёбра, компоненты), `ModelInspectionService` (дерево операций, тела, переменные, drill-down, измерения), `AssemblyService` (вставка компонентов в сборку, namespace `Kompas.Mcp.Core.Assemblies`), `DrawingService` (стандартные виды чертежа, namespace `Kompas.Mcp.Core.Drawings`), снимок. Все паттерны API5/API7 живут здесь. |
| **Kompas.Mcp.Tests** | Юнит (без COM) + интеграционные (требуют КОМПАС). 267 тестов (163 unit + 104 integration). Все интеграционные классы наследуют `IntegrationTestBase` (`IAsyncLifetime`), который вызывает `DocumentService.CloseAllAsync` после каждого теста. |
Принцип: **только `Core` знает про COM**. `Host`/Tools оперируют доменными DTO и вызывают `Core`; `Host` не содержит бизнес-логики.
Архитектурный принцип: **MCP транслирует возможности SDK КОМПАС в общие инструменты** (не под конкретную задачу). Методический слой поверх MCP — навык `.claude/skills/kompas-3d/` (playbook'и, эвристики). Полигон отработки подходов — `usecases/` (в .gitignore).
---
## 5. Карта инструментов (81 инструмент)
Сгруппированы вокруг центрального цикла «эскиз ↔ операция». Имена — `snake_case`.
**System**
- `kompas_connect` — attach/launch, возвращает версию и редакцию (`GetSystemVersion`, `ApplicationName`).
- `kompas_set_visible` — показать/скрыть окно (`IApplication.Visible`).
- `kompas_status` — состояние соединения, активный документ.
**Documents** (`IApplication.Documents``IDocuments`)
- `document_create` — тип `part | assembly | drawing | fragment` (`DocumentTypeEnum`: Part=4, Assembly=5, Drawing=1, Fragment=2).
- `document_open` / `document_save` / `document_close` / `document_active`.
**Sketch** (2D-геометрия внутри 3D-эскиза)
- `sketch_create` — на базовой плоскости (`o3d_planeXOY` / `XOZ` / `YOZ`) или на выбранной грани.
- `sketch_create_on_offset_plane` — эскиз на плоскости, смещённой от базовой (XOY/XOZ/YOZ) на `offset` мм; вспомогательная геометрия через `o3d_planeOffset=14` / `ksPlaneOffsetDefinition`. Разблокирует `loft` (параллельные сечения на разной высоте). Начало пакета E «вспомогательная геометрия».
- `sketch_add_line` / `sketch_add_circle` / `sketch_add_arc` / `sketch_add_arc_3points` / `sketch_add_rectangle`.
- `sketch_add_ellipse` (centre, semi-axes A/B, rotation angle) / `sketch_add_polyline` (point chain, closed) / `sketch_add_polygon` (regular, inscribed/circumscribed) / `sketch_add_spline` (cubic NURBS, closed) / `sketch_add_point`.
- `sketch_close` — завершить редактирование.
- Жизненный цикл: `NewEntity(o3d_sketch)``SetPlane(plane|face)``BeginEdit()`
`ksLineSeg` / `ksCircle` / `ksArcBy3Points` / `ksArcByAngle` / `ksEllipse` / `ksRegularPolygon` / `ksNurbs` / … → `EndEdit()`.
- `PartModeler` split into partial classes: `PartModeler.cs` (core), `PartModeler.Sketch.cs`, `PartModeler.Features.cs`. Static `SketchGeometry` class holds mappings and validators. Point lists use `record SketchPoint(X, Y)` (JSON `x`/`y`). All angles in degrees.
- `CoordinateAxis.cs` (`src/Kompas.Mcp.Core/Modeling/`) — enum `CoordinateAxis {X,Y,Z}` + `CoordinateAxes.ToObj3dType/Parse` (→ `o3d_axisOX/OY/OZ = 71/72/73`), analogous to `BasePlane.cs`.
**Features** (3D-операции)
- `extrude_boss` / `extrude_cut` — sketch, depth, direction, endType.
- `revolve_boss` / `revolve_cut` — угол.
- `shell` — превратить тело в оболочку: открыть грани по индексам (`faceIndices`, ≥1, из `list_faces`), задать толщину стенки (`thickness` мм), направление (`outward`, по умолчанию внутрь). Реализовано через API5 `ksPart.NewEntity(o3d_shellOperation=43)``ksShellDefinition``FaceArray()``Create()`. Маппинг: `thinType = !outward`.
- `rib` — построить ребро жёсткости от разомкнутого контура эскиза до тела. Параметры: `sketchId`, `thickness` (мм), `side` (`left|right|up|down` → 0/1/2/3), `symmetric` (толщина симметрична плоскости), `angle` (уклон стенок, °). Реализовано через `ksPart.NewEntity(o3d_ribOperation=44)``ksRibDefinition` (`SetSketch`, `SetThinParam`). `symmetric=true`: `SetThinParam(dtBoth, t/2, t/2)`; иначе `SetThinParam(dtNormal, t, 0)`. Контур должен не касаться тела концами — КОМПАС дотягивает полотно сам.
- `sweep` — кинематическая операция: перемещение замкнутого профиля (эскиз `profileSketchId`) вдоль траектории (эскиз `pathSketchId`), образуя сплошное тело. Профиль и траектория на разных (обычно перпендикулярных) плоскостях. Реализовано через `ksPart.NewEntity(o3d_baseEvolution=45)``ksBaseEvolutionDefinition` (`SetSketch(профиль)``PathPartArray().Add(траектория)``sketchShiftType=0``SetThinParam(false)`) → `Create()`. Валидация: `profileSketchId != pathSketchId`.
- `loft` — операция по сечениям: построить сплошное тело по ≥2 закрытым эскизам-сечениям на параллельных плоскостях. Реализовано через `ksPart.NewEntity(o3d_baseLoft=30)``ksBaseLoftDefinition` (`Sketchs().Add(каждое сечение)``SetLoftParam(closed=false,false,true)``SetThinParam(false)`) → `Create()`. Для сечений не на базовых плоскостях использовать `sketch_create_on_offset_plane`.
- `linear_pattern` — линейный массив операций вдоль координатной оси (`o3d_meshCopy=35`, `ksMeshCopyDefinition`); параметры: `featureIds[]`, `axis` (X/Y/Z), `count` (включает исходный, ≥2), `step` (мм). `SetAxis1` + `SetCopyParamAlongAxis(true,0,count,step,false)` + `count2=1` (выключает 2-е направление).
- `circular_pattern` — круговой массив вокруг координатной оси (`o3d_circularCopy=36`, `ksCircularCopyDefinition`); параметры: `featureIds[]`, `axis`, `count`, `step` (угол° между соседними), `reverse`, `geometric`. Свойства `count1=1`/`count2=count`/`step2=angle°`/`factor2=false`/`inverce=reverse` задаются напрямую; `GetOperationArray()`.
- `mirror_operation` — зеркальная копия операций (`o3d_mirrorOperation=48`, `ksMirrorCopyDefinition`); параметры: `featureIds[]`, `plane` (XOY/XOZ/YOZ). `SetPlane` + `GetOperationArray()`.
- `mirror_body` — зеркало всего тела (`o3d_mirrorAllOperation=49`, `ksMirrorCopyAllDefinition`); параметр: `plane`. `ChooseBodies()` не приводится к `ksChooseBodies` и не нужен — операция отражает все тела, сохраняя оригинал (объём удваивается).
- `hole` — цилиндрическое отверстие (сквозное или глухое) на грани, найденной по мировой точке (x,y,z). Параметры: `diameter` (мм), `depth` (мм, для глухого), `throughAll`. Реализовано через **API7** (`HoleService`, `src/Kompas.Mcp.Core/Modeling/HoleService.cs`) — в API5 интерфейс `ksHoleDefinition` отсутствует в interop. Паттерн: `(IModelContainer)part7``Points3D.Add()` (центр, `IPoint3D`) → `Holes3D.Add()``IHole3D` (`HoleType=ksHTBase`, `Diameter`, `DepthType`, `Depth`, `EndFaceType=ksEFFlat`) → `(IHoleDisposal)hole` (`BaseSurface=грань` через `FindObjectsByPoint`, `Perpendicular=true`, `AssociationVertex=point`) → `Update()``RebuildDocument()`. Направление сверления определяется **по факту убыли объёма**: `Direction=true` → Rebuild → сравнить объём (API5 `CalcMassInertiaProperties`); если не убыл → `Direction=false`. При неуспехе — откат через `IFeature7.Delete()`. Возвращает подтверждение без id (отверстие не попадает в реестр `_features` API5).
- `hole_counterbore` — отверстие с цековкой (цилиндрическое уширение сверху, под винт с цилиндрической головкой). Параметры: `x,y,z`, `diameter`, `spotfaceDiameter` (>diameter), `spotfaceDepth`, `depth=0`, `throughAll=false`. `HoleType=ksHTCounterbore`; `HoleParameters` приводится к `ISpotfacingHoleParameters` (`SpotfacingDiameter`, `SpotfacingDepth`) — настройка через `configure`-колбэк после фиксации типа. Для глухого: валидируется `depth>spotDepth`.
- `hole_countersink` — отверстие с зенковкой (коническое уширение сверху, под винт с потайной головкой). Параметры: `x,y,z`, `diameter`, `sinkDiameter` (>diameter), `sinkAngle` (0<angle<180, типично 90°), `depth=0`, `throughAll=false`. `HoleType=ksHTCountersinking`; `HoleParameters``ICountersinkHoleParameters` (`CountersinkType=ksCTDiameterAngle`, `CountersinkDiameter`, `CountersinkAngle`). Все три инструмента отверстий используют общую логику размещения и подбора направления (`HoleCore`).
- `hole_conic` — коническое (конусное) отверстие, сужающееся вглубь. Параметры: `x,y,z`, `diameter` (диаметр у основания/поверхности), `conicAngle` (угол конуса, 0<angle<180°), `depth=0`, `throughAll=false`. `HoleType=ksHTConic`; `HoleParameters``IConicHoleParameters` (`ConicType=ksCNAngle`, `ConicAngle`). Завершает набор типов отверстий (простое, цековка, зенковка, коническое).
- `draft` — уклон граней на угол `angle` (°, строго 0–90) относительно нейтральной координатной плоскости `neutralPlane` (XOY/XOZ/YOZ). `outward=true` — расширение (добавляет материал), `false` — сужение. Реализовано через **API5** `ksInclineDefinition` (`o3d_incline=42`) — операция называется Incline в API5, а не Draft. Паттерн: `ksPart.NewEntity(o3d_incline)``GetDefinition() as ksInclineDefinition``FaceArray()` (грани по индексам из `list_faces`) → `SetPlane(базовая координатная плоскость)``angle``direction=!outward``Create()` → регистрация в `_features`. Эмпирика: `direction=false`=расширение, `direction=true`=сужение — **обратно справке** → маппинг `def.direction = !outward`. Валидация: `RequireDraftAngle(0<angle<90)`. Регистрируется в `_features` → применимы массивы и зеркало (пакет C).
- `rebuild` — перестроить деталь.
**Edit** (прямое редактирование)
- `move_face` — сдвинуть грань по мировой точке (x,y,z, мм) на distance мм вдоль нормали; distance>0 — наружу (добавить материал), <0 — внутрь. Работает на импортированной B-rep. Реализовано через API7 `IPart7.FindObjectsByPoint` + `FaceMover`; контейнеры `ISurfaceContainer`/`IModelContainer` получаются COM-QI от `IPart7` в рантайме. Проверено: top_spacer 39.45→41.45 мм.
- `split_solid_by_plane` — рассечь тело плоскостью (по грани или базовой плоскости).
- `move_body` — переместить тело на заданный вектор (dx/dy/dz, мм).
- `boolean_union` — булева операция объединения тел.
**Selection / Query**
- `get_part_info` — МЦХ через API5 `ksPart.CalcMassInertiaProperties(ST_MIX_MM|ST_MIX_KG)`.
- `get_bounding_box` — габарит (`ksPart.GetGabarit`).
- `list_faces` / `list_edges` — перечислить грани и рёбра детали с классификацией и мерами.
- `list_components` — перечислить компоненты верхнего уровня сборки (индекс, имя, обозначение, признак детали, габарит) через `TopPart → IParts7`.
**Conversion** (`ConversionTools.cs`, `ConversionService.cs`)
- `import_step` — импорт .step/.stp в новый документ через встроенный конвертер КОМПАС (код `ksConverterFromSTEP=-3`); параметры `type` (assembly|part), `createComponentFiles`.
- `export_step` — экспорт активного 3D-документа в STEP; `format` = auto|ap203|ap214|ap242.
**Inspection — структурный осмотр модели (приоритетный над снимком)**
- `describe_model` — структурный «паспорт» детали одним вызовом: габарит, МЦХ, тела, сводка топологии (грани/рёбра по типам), дерево построения с параметрами, переменные. **Предпочитать перед `model_snapshot`** — не тратит токены изображения.
- `list_features` — дерево построения с параметрами (глубина/радиус/катеты), имена узлов локализованы КОМПАС.
- `list_bodies` — тела детали: тип (твёрдое/поверхность) и число граней.
- `list_variables` — переменные модели (имя/выражение/значение, флаги external/информационная).
- `describe_face` — drill-down грани по индексу: тип, площадь, нормаль, радиус, число рёбер.
- `describe_edge` — drill-down ребра по индексу: тип, длина, смежные грани, концевые вершины.
- `measure` — расстояние и угол между двумя объектами (face|edge|vertex по индексам), единица `ST_MIX_MM`.
Реализовано через `ModelInspectionService` (`src/Kompas.Mcp.Core/Query/ModelInspectionService.cs`),
рендер текста — `InspectionText` (`InspectionText.cs`, юнит-тестируем без COM).
Ключевые API-паттерны: `ksPart.GetFeature()``ksFeatureCollection` (дерево); `BodyCollection()``ksBody`; `ksPart.GetFeature().VariableCollection``ksVariable` (все переменные; `ksPart.VariableCollection()` — только внешние); `GetMeasurer()``ksMeasurer`.
«Импорт STEP без истории» определяется структурно: `bodyCount > 0 && нет формообразующих операций && features.Count <= bodyCount+1`.
**Variables — управление переменными модели (package D start)**
- `create_variable` — создать переменную (имя, начальное значение, примечание, флаг внешней).
- `set_variable` — задать выражение (константа `"30"` или формула `"width*2+5"`); десятичный разделитель — точка; модель перестраивается, зависимые переменные пересчитываются.
- `delete_variable` — удалить переменную (нельзя при наличии зависимых).
Реализовано через `VariableService` (`src/Kompas.Mcp.Core/Modeling/VariableService.cs`, API5), инструменты — `VariableTools` (`src/Kompas.Mcp.Host/Tools/VariableTools.cs`). DI: `AddSingleton<VariableService>()` в `Program.cs`.
Ключевые API-паттерны: создание — ТОЛЬКО через `ksPart.GetFeature().VariableCollection` (свойство корневого `ksFeature`), а НЕ `ksPart.VariableCollection()` (та возвращает только внешние); Expression — ведущее поле, Value — вычисленный результат; изменение через Expression + `ksPart.RebuildModel()`; после rebuild RCW переменной стал; значение перечитывается через свежую коллекцию (`ReadValueFresh`).
**Ограничение:** переменная управляет геометрией только в параметрической модели, где размеры эскизов привязаны к именам переменных. Наши эскизы строятся литеральными координатами — `set_variable` хранит и вычисляет значение, но геометрию не меняет. Связь размеров эскизов с переменными (параметрические эскизы через API2D) — не реализована (package D продолжение).
**Assembly — построение сборок (`AssemblyService`, `AssemblyTools`, namespace `Kompas.Mcp.Core.Assemblies`)**
- `assembly_add_component` — вставить компонент (.m3d деталь или .a3d подсборка) из файла в активную сборку; задать положение origin (x,y,z мм, мировая СК сборки). Возвращает индекс и имя вставленного компонента. Реализовано через API7: `IParts7.AddFromFile(path, ExternalFile=true, Redraw=true)``IPart7``IPlacement3D.SetOrigin(x,y,z)``UpdatePlacement(true)``RebuildModel(true)`. `RequireActiveAssembly` проверяет `doc.DocumentType == ksDocumentAssembly` до обращения к `TopPart`. Откат при неуспехе через `IFeature7.Delete`. DI: `AddSingleton<AssemblyService>()` в `Program.cs`.
- `assembly_add_mate` — наложить сопряжение между гранями двух компонентов активной сборки по мировым точкам. Параметры: `mateType` (`coincidence` — грани заподлицо | `distance` — зазор `value` мм), `x1,y1,z1`, `x2,y2,z2`, `value=0`. Решатель позиционирует компоненты; возвращает статус `valid`. Реализовано через API7: `top.MateConstraints` (`IMateConstraints3D`) → `Add(MateConstraintType)``BaseObject1/2` (грани через `top.FindObjectsByPoint(x,y,z,FirstLevel=false)`) → `ParamValue``Update()``RebuildModel(true)`; проверка `mate.Valid` (false → ошибка + откат `mate.Owner.Delete`). Enum `MateType { Coincidence, Distance }` в `src/Kompas.Mcp.Core/Assemblies/MateType.cs`; маппинг на `MateConstraintType` (`mc_Coincidence=0`, `mc_Distance=5`). Scope: `coincidence`/`distance` проверены вживую; прочие типы (`parallel`, `concentric`, …) — будущие инкременты.
**Drawing — 2D-чертёж (`DrawingService`, `DrawingTools`, namespace `Kompas.Mcp.Core.Drawings`)**
- `drawing_create_standard_views(partFilePath, scale, x, y)` — создать стандартные ассоциативные виды (спереди/сверху/слева, `ksPtFront/ksPtUp/ksPtLeft`) сохранённой 3D-модели (.m3d/.a3d) на активном чертеже. Реализовано через API7 `IKompasDocument2D.ViewsAndLayersManager.Views.AddStandartViews(path, "#Спереди", object[]{1,3,5}, x, y, scale, dx=20, dy=20)``object[]` передаётся как SAFEARRAY VT_I4. Проверки: `created==3` строго; непустота — сумма `IView.ObjectCount` новых видов (по разнице `IView.Number`) `>0`, иначе ошибка + откат (`IView.Delete`). Возвращает `DrawingViewsResult{Created,Total,ViewNumbers}``ViewNumbers` содержит номера созданных видов (для адресации при простановке размеров). Модель должна быть сохранена до вызова.
- `drawing_fill_title_block(designation?, name?, material?)` — заполнить графы основной надписи (штампа) активного чертежа. `designation` = обозначение документа (графа 2), `name` = наименование изделия (графа 1), `material` = материал (графа 3); нужно хотя бы одно поле. Реализовано: `doc2d.LayoutSheets.ItemByNumber[1].Stamp` (`IStamp`) → `stamp.Text[columnId].Str = text` (индексированное свойство; `IText.Str` замещает содержимое без `Clear`) → `stamp.Update()`. Номера граф `ksStampEnum`: обозначение=2, наименование=1, материал=3. Свой enum `StampField` + `StampFields.ColumnId/Collect` в `src/Kompas.Mcp.Core/Drawings/StampField.cs`. Возвращает число заполненных граф.
- `drawing_add_linear_dimension(x1,y1,x2,y2,x3,y3, orientation, viewNumber)` — поставить линейный размер на виде активного чертежа. Координаты (x1,y1)-(x2,y2) — выносные точки в **локальной СК вида** (мм); (x3,y3) — положение размерной линии; `orientation`: `horizontal`|`vertical`|`parallel`; `viewNumber` — номер вида (0=первый). Значение измеряется автоматически (`AutoNominalValue=true`). Реализовано: `(ISymbols2DContainer)view` (COM-QI от конкретного `IView`, не от листа — размер попадает именно в этот вид) → `LineDimensions.Add()``ILineDimension``Update()``Valid``((IDimensionText)dim).NominalValue`. Ключевая находка: **размеры не входят в `IView.ObjectCount`** (он считает геометрию `IDrawingContainer`); проверять через `ISymbols2DContainer.LineDimensions.Count`. Откат через `dim.Delete()` при ошибке или нулевом значении. Свой enum `DimensionOrientation {Horizontal, Vertical, Parallel}` + `DimensionOrientations.Parse/ToKompas`. Валидаторы `RequireFiniteCoords` + `RequireDistinctPoints`. Новые файлы: `DimensionOrientation.cs`, `DrawingDimensionResult.cs`; инструмент в `DrawingTools.cs`.
- `drawing_add_diametral_dimension(xc,yc,radius, angle, viewNumber)` — поставить диаметральный размер (Ø) окружности на виде активного чертежа. `xc,yc` — центр, `radius` — радиус (мм, локальная СК вида); `angle` — направление выноски (градусы → радианы через `DimensionAngles.ToRadians`); `viewNumber` — номер вида (0=первый). Значение (диаметр = 2·radius) измеряется автоматически. Реализовано: общий хелпер `RequireSymbols2DContainer(viewNumber)` (переиспользуется с линейным размером) → `DiametralDimensions.Add()``IDiametralDimension` (`Xc`, `Yc`, `Radius`, `Angle` в радианах, `AutoNominalValue=true`) → `Update()``Valid``((IDimensionText)dim).NominalValue`. Размер «свободный» (без `BaseObject`). Валидатор `DrawingValidation.RequirePositiveRadius`. `DimensionAngles.ToRadians` добавлен в `DimensionOrientation.cs`.
- `drawing_add_radial_dimension(xc,yc,radius, angle, viewNumber)` — поставить радиальный размер (R) окружности/дуги на виде активного чертежа. `xc,yc` — центр, `radius` — радиус (мм, локальная СК вида); `angle` — направление выноски (°, по умолчанию 0); `viewNumber` — номер вида. Возвращаемое значение равно **радиусу** (не диаметру). Реализовано: `RequireSymbols2DContainer(viewNumber)``RadialDimensions.Add()``IRadialDimension` (`Xc`, `Yc`, `Radius`, `Angle` в радианах, `DimensionType=true`, `AutoNominalValue=true`) → `Update()``Valid``NominalValue`. Размер «свободный» (без `BaseObject`). Переиспользует `RequirePositiveRadius` и `DimensionAngles.ToRadians`.
- `drawing_add_angular_dimension(xc,yc, x1,y1, x2,y2, x3,y3, angleType, viewNumber)` — поставить угловой размер между двумя сторонами на виде активного чертежа. `xc,yc` — вершина угла; `x1,y1` — точка на стороне 1; `x2,y2` — точка на стороне 2; `x3,y3` — положение размерной дуги (задаёт её радиус); `angleType` = `"min"` (острый) | `"max"` (тупой, 180°-min) | `"more"` (рефлексный >180°); `viewNumber` — номер вида. Значение в градусах измеряется автоматически. Реализовано: `RequireSymbols2DContainer(viewNumber)``AngleDimensions.Add(ksDrADimension)``IAngleDimension` (`Xc`, `Yc`, `X1`, `Y1`, `X2`, `Y2`, `X3`, `Y3`, `DimensionType=ksAngleDimTypeEnum`, `AutoNominalValue=true`) → `Update()``Valid``NominalValue`. Новый enum `AngleDimensionType {Min, Max, More}` + `AngleDimensionTypes.Parse/ToKompas` в `DimensionOrientation.cs`; 9 unit-тестов для маппинга. Размер «свободный» (без `BaseObject`). Валидаторы `RequireFiniteCoords` + `RequireDistinctPoints`.
- `drawing_add_rough(x,y, value?, signType, angle, viewNumber)` — поставить знак шероховатости на виде. `x,y` — положение знака в локальной СК вида (мм); `value` — текст параметра (напр. `"Ra 1.6"`; пусто = знак без значения); `signType`: `"delete"` (с удалением слоя материала) | `"without"` (без удаления) | `"none"` (без указания); `angle` — угол наклона оси знака (°, по умолч. 0); `viewNumber` — номер вида. Реализовано: `ISymbols2DContainer.Roughs.Add()``IRough` (`BranchX0/Y0/Angle`) → `(IRoughParams)rough` (`SignType=ksRoughSignEnum`, `RoughParamText.Str = value`) → `Update()``Valid`. Новый enum `RoughSignType {NoProcessing, DeleteMaterial, WithoutDeleteMaterial}` + `RoughSignTypes.Parse/ToKompas` в `Drawings/RoughSignType.cs`. Возвращает `DrawingAnnotationResult { Value, ViewNumber }`.
- `drawing_add_text(x,y, text, angle, viewNumber)` — свободная текстовая надпись на виде стилем по умолчанию. `x,y` — точка привязки (СК вида, мм); `text` — содержимое (`\n` — многострочно); `angle` — угол (°, по умолч. 0); `viewNumber` — номер вида. Реализовано: `(IDrawingContainer)view.DrawingTexts.Add()``IDrawingText` (`X/Y/Angle`) → `(IText)dt.Str = text``Update()``Valid`. ВАЖНО: текст живёт в `IDrawingContainer` (контейнер геометрии вида), НЕ в `ISymbols2DContainer`; попадание проверяется через `DrawingTexts.Count`. Возвращает `DrawingAnnotationResult { Value, ViewNumber }`.
- `drawing_set_technical_requirements(text)` — технические требования чертежа (единый текстовый блок, уровень документа, не вида). `text` — строки через `\n`. Реализовано: `(IDrawingDocument)doc.TechnicalDemand``td.Text.Str = text``td.Update()`. Перезаписывает прежние (не добавляет). Возвращает число строк.
**Vision — визуальная обратная связь (fallback)**
- `model_snapshot` — отрендерить активный 3D-документ в PNG и вернуть **как image-контент MCP**,
чтобы мультимодальный агент *увидел* промежуточный результат. Использовать для визуально-пространственных
вопросов, когда структурный осмотр (`describe_model`) недостаточен.
- `set_view` — задать ориентацию вида (`iso` / `front` / `top` / `right` / …), zoom-to-fit и режим
отображения (`ShadedWireframe`) перед снимком — иначе снимок берётся со случайного текущего ракурса.
> **Механизм.** `ksDocument3D.RasterFormatParam()` → `IRasterFormatParam` рендерит документ в растр;
> свойство **`resultArrayBytes`** возвращает изображение как **массив байт в память** (без временного
> файла). Альтернатива — экспортные функции `ksSaveAsToRasterFormat[W]`. Полученные байты сервер
> упаковывает в image-контент MCP-ответа (C# SDK `ModelContextProtocol` это поддерживает).
> Параметры: формат (PNG/JPEG/BMP/TIFF), разрешение, цвет/`greyScale`.
> Снимки делать после значимых операций (не после каждой линии) — каждый кадр расходует
> токены изображения в контексте агента. На v24 Home качество/доступность рендера проверить на прототипе.
**Escape hatch (опционально)**
- `run_kompas_command``IApplication.ExecuteKompasCommand(commandID, post)` для команд,
ещё не обёрнутых в типизированные инструменты. Доступность проверять через
`IsKompasCommandEnable`.
### Замечание об API5 vs API7 для 3D-операций
API7 создаёт операции через `IPart7` → (QueryInterface) `IModelContainer``IExtrusions.Add()`
`IExtrusion`. Примеры SDK при этом активно используют **API5-путь** (`ksPart.NewEntity(o3d_…)`
`ksBossExtrusionDefinition.SetSideParam/SetSketch``Create()`), который хорошо документирован.
**Стратегия v1:** предпочитать API7 там, где он покрывает операцию; падать на API5 `ksPart`-путь
там, где он проще/надёжнее (мост — `kompas.TransferInterface`). Выбор фиксировать в `Core`.
---
## 6. Центральный сценарий: цикл «эскиз → операция → эскиз»
Основной пользовательский поток v1 — итеративное параметрическое моделирование.
```
document_create(part)
sketch_create(plane = XOY) ──► sketch_add_circle(...) ──► sketch_close
extrude_boss(sketch, depth=…, dir=dtNormal, end=etBlind) → цилиндр
set_view(iso, fit) → model_snapshot 👁 агент СМОТРИТ на результат и решает следующий шаг
select_face_by_point(x,y,z) ← выбираем верхнюю грань
sketch_create(face = выбранная) ──► sketch_add_circle(...) ──► sketch_close
extrude_cut(sketch, depth=…) → отверстие
model_snapshot 👁 проверка результата
└──────────► повторять: смотрим → новая грань → новый эскиз → новая операция
```
Соответствие API (на STA-потоке, через `Core`):
1. `Document3D()` / `IKompasDocument3D``IPart7` (вершинная деталь, `pTop_Part`).
2. `part.NewEntity(o3d_sketch)``GetDefinition()``SetPlane(базовая_плоскость | грань)`
`Create()`; `BeginEdit()` → рисование примитивов (`ksLineSeg`, `ksCircle`, `ksArcByPoint`, …) →
`EndEdit()`.
3. `part.NewEntity(o3d_bossExtrusion)``ksBossExtrusionDefinition`
`SetSideParam(direction, ksEndTypeEnum, depth, …)``SetSketch(эскиз)``Create()`.
Для выреза — `o3d_cutExtrusion`; для вращения — `o3d_bossRotated`/`o3d_cutRotated`.
4. Выбор грани для следующего эскиза:
`part.EntityCollection(o3d_face)``SelectByPoint(x, y, z)` → элемент коллекции как плоскость
эскиза.
5. Снимок результата: `set_view` (ориентация + fit) → `ksDocument3D.RasterFormatParam()`
`IRasterFormatParam.resultArrayBytes` → image-контент MCP. Агент анализирует кадр и выбирает
следующий шаг.
Используемые перечисления: `ksDirectionTypeEnum` (`dtNormal`/`dtReverse`/`dtBoth`/`dtMiddlePlane`),
`ksEndTypeEnum` (`etBlind`/`etThroughAll`/`etUpTo…`), `Obj3dType` (`o3d_sketch`, `o3d_bossExtrusion`,
`o3d_cutExtrusion`, `o3d_face`, `o3d_planeXOY`, …).
---
## 7. Обработка ошибок и безопасность
- **Трансляция ошибок COM** в структурированные MCP-ошибки: проверять HRESULT каждого вызова и
опрашивать `kompas.ksGetLastError()` / `IApplication.KompasError`; возвращать клиенту код + текст.
- **Null-чек после каждого приведения** COM-интерфейса (любой каст может вернуть `null`).
- **`.Init()` на param-структурах** перед использованием (`GetParamStruct(...)``.Init()`).
- **Гарантированный `EndEdit`** для эскизов через `try/finally` — незакрытый эскиз ломает документ.
- **Подтверждение деструктивных операций**: закрытие без сохранения, перезапись файла, `Quit`
только по явному флагу в аргументах инструмента.
- **Модель состояния**: инструменты по умолчанию работают с «активным документом»; опционально —
явный хэндл/идентификатор документа.
---
## 8. Сборка и запуск
```powershell
dotnet build -c Release -r win-x64 # сборка
# → kompas-mcp.exe (self-contained, win-x64)
```
Регистрация stdio-сервера у клиента (пример для конфигурации Claude Desktop):
```json
{
"mcpServers": {
"kompas3d": { "command": "C:\\path\\to\\kompas-mcp.exe", "args": [] }
}
}
```
**Ручная проверка (smoke):** запустить КОМПАС (или дать серверу запустить его) → через инструменты
построить простую деталь (выдавить окружность в цилиндр, затем `extrude_cut` — отверстие) →
убедиться визуально в окне КОМПАС → сохранить `.m3d`.
---
## 9. Стратегия тестирования
- **Интеграционные тесты** (требуют установленного КОМПАС): xUnit, категория `Integration`,
гейтятся (не идут в обычном CI без КОМПАС). Покрывают связку Core↔COM и центральный цикл.
- **Unit-тесты** чистой логики **без COM**: маппинг строк↔перечислений, валидация аргументов,
форматирование результатов/ошибок.
- **Smoke MCP**: проверка протокола через **MCP Inspector** или тестовый клиент (list tools, вызов
`kompas_connect`/`document_create`).
---
## 10. Дорожная карта
**Реализовано (v1+v2+STEP/assembly+direct-edit+inspection+package-A+package-B+package-C+package-D start+package-E start+hole+hole_counterbore+hole_countersink+hole_conic+draft+assembly_add_component+assembly_add_mate+drawing_create_standard_views+drawing_fill_title_block+drawing_add_linear_dimension+drawing_add_diametral_dimension+drawing_add_radial_dimension+drawing_add_angular_dimension+drawing_add_rough+drawing_add_text+drawing_set_technical_requirements):** документы, эскизы (полный набор 2D-примитивов: линия, окружность, дуга, дуга по 3 точкам, прямоугольник, эллипс, ломаная, правильный многоугольник, сплайн NURBS, точка), **вспомогательная геометрия (`sketch_create_on_offset_plane`)**, выдавливание/вырез, вращение, скругление/фаска, **оболочка (`shell`)**, **ребро жёсткости (`rib`)**, **кинематическая операция (`sweep`)**, **операция по сечениям (`loft`)**, **линейный/круговой массив и зеркало (`linear_pattern`, `circular_pattern`, `mirror_operation`, `mirror_body`)**, **отверстие (`hole`, API7)**, **цековка (`hole_counterbore`, API7)**, **зенковка (`hole_countersink`, API7)**, **коническое отверстие (`hole_conic`, API7)**, **уклон (`draft`, API5 `ksInclineDefinition`)**, снимок; `get_part_info`, `get_bounding_box`, `list_faces`, `list_edges`; `import_step`, `export_step`, `list_components`; **`move_face`**, **`split_solid_by_plane`**, **`move_body`**, **`boolean_union`** (прямое редактирование и булевы операции); **`describe_model`, `list_features`, `list_bodies`, `list_variables`, `describe_face`, `describe_edge`, `measure`** (структурный осмотр модели); **`create_variable`, `set_variable`, `delete_variable`** (управление переменными, package D start); **`assembly_add_component`** (вставка компонента в сборку, API7, `AssemblyService`); **`assembly_add_mate`** (сопряжения `coincidence`/`distance`, API7, `IMateConstraints3D`); **`drawing_create_standard_views`** (стандартные ассоциативные виды чертежа, API7, `DrawingService`); **`drawing_fill_title_block`** (заполнение основной надписи/штампа: обозначение, наименование, материал; `IStamp.Text[id].Str`, API7, `DrawingService`); **`drawing_add_linear_dimension`** (линейный размер на виде чертежа: `ISymbols2DContainer`/`LineDimensions.Add`/`ILineDimension`, координаты в локальной СК вида, API7, `DrawingService`); **`drawing_add_diametral_dimension`** (диаметральный размер Ø: `ISymbols2DContainer.DiametralDimensions.Add`/`IDiametralDimension`, Xc/Yc/Radius/Angle в радианах, API7, `DrawingService`); **`drawing_add_radial_dimension`** (радиальный размер R: `ISymbols2DContainer.RadialDimensions.Add`/`IRadialDimension`, значение = радиус, API7, `DrawingService`); **`drawing_add_angular_dimension`** (угловой размер: `ISymbols2DContainer.AngleDimensions.Add`/`IAngleDimension`, `angleType`=min/max/more, значение в градусах, API7, `DrawingService`); **`drawing_add_rough`** (знак шероховатости: `ISymbols2DContainer.Roughs.Add`/`IRough`/`IRoughParams`, `signType`=delete/without/none, API7, `DrawingService`); **`drawing_add_text`** (свободная текстовая надпись на виде: `IDrawingContainer.DrawingTexts.Add`/`IDrawingText`/`IText`, API7, `DrawingService`); **`drawing_set_technical_requirements`** (технические требования чертежа: `IDrawingDocument.TechnicalDemand`/`ITechnicalDemand`/`IText`, уровень документа, API7, `DrawingService`). Класс «2D-чертёж» (инкремент 6): стандартные виды, основная надпись, размеры (линейный, диаметральный, радиальный, угловой), текстовые обозначения (шероховатость, свободный текст, технические требования).
**Следующие приоритеты:**
1. Пакет D «параметрика» (продолжение) — связь размеров эскизов с переменными (параметрические эскизы через API2D). ⚠️ **Исследовано**: `ksCDimWithVariable` недоступен из внешней автоматизации — см. `docs/superpowers/specs/2026-05-27-parametric-sketch-findings.md`.
2. Пакет E «вспомогательная геометрия» (продолжение) — ось, точка, плоскость по трём точкам / по углу.
3. Рассечение/перемещение тела как MCP-инструменты (`SplitSolids`/`BodyRepositions`) — механика есть, продуктизация не закончена.
4. Свойства документа: `IPropertyMng` / `IPropertyKeeper`.
5. **2D-чертёж (продолжение):** инкремент 6 добавил текстовые обозначения — `drawing_add_rough` (шероховатость), `drawing_add_text` (свободный текст), `drawing_set_technical_requirements` (тех. требования). Нереализовано: ассоциативная привязка размеров и шероховатости к геометрии (`BaseObject`), рамка/формат листа, выноски (`Leaders`), обозначения баз (`Bases`), допуски формы (`Tolerances`).
6. Сборки — продолжение: дополнительные типы сопряжений (`parallel`, `perpendicular`, `concentric`, `angle`, `tangency`; `coincidence`/`distance` реализованы); авто-позиционирование компонентов; спецификации (`ISpecification`).
7. Транспорт **HTTP/SSE** — как опция для удалённых клиентов.
---
## 11. Открытые вопросы
- **Прямое редактирование B-rep, перемещение грани**: решено — `move_face` (`FaceEditService`) работает через `IPart7.FindObjectsByPoint` + `FaceMover`; проверено на импортированной B-rep. Рассечение/перемещение тела (`SplitSolids`/`BodyRepositions`) — механика есть, инструменты не реализованы (потенциальная следующая опция).
- **Дерево операций, тела, переменные, геометрические запросы**: решено — `ModelInspectionService` + `InspectionTools` (7 инструментов); юнит-тестируемый рендер через `InspectionText`.
- **Утечки транзитных RCW** в `PartModeler` (унаследованный паттерн): `EntityCollection`, `GetTopPart()` не освобождаются, накапливаются за длинную сессию.
- **Насос сообщений / CancellationToken**: `CancellationToken` не прерывает идущий COM-вызов; зависший модальный диалог КОМПАС блокирует всю очередь.
- **Embed Interop Types vs вендорские interop-сборки**: выбраны вендорские DLL из SDK `Samples/Common`; менять не планируется.
-115
View File
@@ -1,115 +0,0 @@
# План реализации MCP-сервера КОМПАС-3D
> Документ описывает, **как** строить сервер. Что строим и почему — в
> [`ARCHITECTURE.md`](ARCHITECTURE.md). Прогресс отражается в
> [`presentation.html`](presentation.html) (TODO).
## Принцип
**«Ходячий скелет» + спайки на риски.** Сначала сквозной тонкий срез
(подключение → снимок), который проходит через все слои и доказывает, что связка
COM ↔ STA ↔ MCP работает. Затем наращиваем инструменты, и **каждый шаг построения сразу
проверяем визуально** (`model_snapshot`) — это и есть целевой UX «строю под контролем».
## Окружение (проверено 2026-05-25)
| | Факт | Следствие для плана |
|---|---|---|
| .NET SDK | **10.0.108** (отдельного .NET 8 SDK нет; рантайм 8 есть) | таргет **`net8.0-windows`** (LTS), собирается SDK 10 |
| ProgID КОМПАС | **`KOMPAS.Application.7`** и **`KOMPAS.Application.5`** зарегистрированы; `KOMPASLT.*` **отсутствует** | подключаться напрямую к API7 через `KOMPAS.Application.7`; LT — только запасной |
| Процесс | КОМПАС не запущен | спайк подключения должен уметь **launch**, не только attach |
| SDK | `C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK` (`lib\*.tlb`) | источник interop |
**Прерэквизит разработчика:** установленный КОМПАС v24 + возможность его запускать.
---
## Спайки (делать первыми — снимают главные неизвестные)
| # | Риск / вопрос | Критерий успеха |
|---|---|---|
| **S1** | Генерация COM-interop из `.tlb` в SDK-проекте | `net8.0-windows` проект с `<COMReference>` на `kAPI7.tlb`, `kAPI5.tlb`, `ksConstants.tlb`, `ksConstants3D.tlb` собирается; типы `IApplication`, `KompasObject` доступны. Запасной путь — `tlbimp`/ручные interop-сборки |
| **S2** | Подключение по ProgID | консольная проба: attach (`Marshal.GetActiveObject`) → при отказе launch (`Activator.CreateInstance(Type.GetTypeFromProgID("KOMPAS.Application.7"))`); получить `IApplication`, `Visible=true`, прочитать версию |
| **S3** | STA-поток + насос сообщений + async MCP | выделенный STA-поток выполняет COM-вызовы из пула задач без `RPC_E_WRONGTHREAD`; насос сообщений не вешает процесс |
| **S4** | Рендер модели в растр на v24 Home | `ksDocument3D.RasterFormatParam()``resultArrayBytes` отдаёт корректные PNG-байты открытого 3D-документа |
Спайки — выбрасываемый код в `spikes/`; выводы переносятся в `Core`.
---
## Фазы
### Фаза 0 — Каркас репозитория
- `git init`, `.gitignore` (.NET + `bin/`, `obj/`; **не** игнорировать `docs/`).
- `KompasMcp.sln`; проекты `Kompas.Mcp.Host`, `Kompas.Mcp.Core`, `Kompas.Mcp.Interop`, `Kompas.Mcp.Tools`
(в v1 допустимо начать одним проектом, разнося по папкам).
- `Directory.Build.props`: `TargetFramework=net8.0-windows`, `Platforms=x64`, `Nullable=enable`, `LangVersion=latest`.
- Пакеты: `ModelContextProtocol`, `Microsoft.Extensions.Hosting`.
- **Готово:** `dotnet build -c Release` проходит; пустой stdio-хост стартует.
### Фаза 1 — Interop + маппинг констант
- `<COMReference>` на типобиблиотеки (итог S1). Зафиксировать стратегию (embed vs сборки).
- `Kompas.Mcp.Interop`: хелперы «строка ↔ enum» — `DocumentTypeEnum` (part=4, assembly=5, drawing=1, fragment=2),
`Obj3dType`, `ksEndTypeEnum`, `ksDirectionTypeEnum`, базовые плоскости (`o3d_planeXOY/XOZ/YOZ`).
- **Готово:** unit-тесты маппинга (без COM) зелёные.
### Фаза 2 — STA-диспетчер
- `KompasThread`: выделенный STA-поток, очередь задач (`Channel`/`BlockingCollection`),
`Task<T> InvokeAsync(Func<T>)`, насос сообщений + периодический `PumpWaitingMessages` (итог S3).
- **Готово:** интеграционный тест — параллельные `InvokeAsync` исполняются строго на одном STA-потоке.
### Фаза 3 — Connection + вертикальный срез (MCP)
- `KompasSession`: resolve ProgID (`KOMPAS.Application.7``.5`+`ksGetApplication7()``KOMPASLT.*`),
attach/launch, `Visible`, версия/редакция, освобождение COM, `Quit` только если запускали мы.
- Хост: stdio-сервер, **логи в stderr**, регистрация инструментов через DI.
- Инструменты `System`: `kompas_connect`, `kompas_status`, `kompas_set_visible`.
- **Готово (веха «скелет»):** из MCP Inspector вызвать `kompas_connect` → КОМПАС стартует и виден; `kompas_status` отвечает.
### Фаза 4 — Documents
- `document_create` (part/assembly/drawing/fragment), `document_open`, `document_save`, `document_close`, `document_active`.
- **Готово:** создать деталь, сохранить `.m3d`, закрыть, открыть заново.
### Фаза 5 — Vision (раннее — делает всё дальнейшее проверяемым)
- `set_view` (ориентация iso/front/top/right, zoom-to-fit, `ShadedWireframe`), `model_snapshot`
(`RasterFormatParam.resultArrayBytes` → image-контент MCP) — итог S4.
- **Готово:** `model_snapshot` возвращает PNG открытой детали; агент видит изображение в ответе инструмента.
### Фаза 6 — Sketch
- `sketch_create` (плоскость или грань), `sketch_add_line|circle|arc|rectangle`, `sketch_close`
(`NewEntity(o3d_sketch)``SetPlane``BeginEdit`/примитивы/`EndEdit`, гарантированный `EndEdit` в `finally`).
- **Готово:** построить эскиз-окружность на XOY и увидеть его на снимке.
### Фаза 7 — Features
- `extrude_boss`/`extrude_cut` (depth, direction, endType), `revolve_boss`/`revolve_cut`, `rebuild`.
- **Готово (целевой демо-сценарий):** окружность → `extrude_boss` (цилиндр) → `model_snapshot`
выбрать грань → эскиз → `extrude_cut` (отверстие) → `model_snapshot`. Полный цикл со зрением.
### Фаза 8 — Query / Selection
- `select_face_by_point`, `list_bodies`, `list_faces_planes`, `get_part_info` (МЦХ/габариты).
- **Готово:** агент может выбрать грань для следующего эскиза по координатам.
### Фаза 9 — Качество и поставка
- Unit-тесты (маппинг, валидация, форматирование); интеграционные (`[Trait("Category","Integration")]`, гейтятся).
- Трансляция ошибок COM (`ksGetLastError`/`IApplication.KompasError`) в структурированные MCP-ошибки.
- Сборка `kompas-mcp.exe` (`dotnet publish -c Release -r win-x64`), регистрация stdio-сервера в конфиге клиента.
- Escape-hatch `run_kompas_command` (опц.).
---
## Порядок и зависимости
```
S1,S2 ─► Фаза 0 ─► Фаза 1 ─► Фаза 2 ─► Фаза 3 (скелет) ─► Фаза 4 ─► Фаза 5 (зрение)
Фаза 6 ─► Фаза 7 ─► Фаза 8 ─► Фаза 9
S3 ─► Фаза 2 S4 ─► Фаза 5
```
Критический риск — **S1/S3** (interop + STA). Если `<COMReference>` не заработает на v24 `.tlb`
переход на сгенерированные `tlbimp` interop-сборки. Все спайки до Фазы 3.
## Definition of Done для v1
Агент через MCP: подключается к КОМПАС → создаёт деталь → строит эскиз → выдавливает →
делает снимок → видит результат → выбирает грань → повторяет → сохраняет `.m3d`.
Сервер собирается в один `.exe` и регистрируется в клиенте по stdio.
@@ -1,20 +0,0 @@
---
title: "ksModelsFamilyErrorEnum - Ошибки данных семейства моделей"
type: enum
api: [api7]
tags: [enum, api7, -ksmodelsfamilyerrorenum]
sources:
- -ksmodelsfamilyerrorenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksModelsFamilyError | -1 | Параметры шаблона семейства моделей не заданы |
| --- | --- | --- |
| ksModelsFamilyOk | 0 | Проверка прошла успешно |
| ksModelsFamilyEmptyFilename | 1 | Не задано имя файла для экземпляра семейства |
| ksModelsFamilyNotUniqueFilename | 2 | Имя файла экземпляра семейства не уникально |
| ksModelsFamilyToLongFilename | 3 | Слишком длинное имя файла для экземпляра семейства |
| ksModelsFamilyBadFilename | 4 | Имя файла экземпляра семейства содержит запрещенные символы |
| ksModelsFamilyEmptyColumns | 501 | Не определен один или несколько параметров |
| ksModelsFamilyRangeInvalid | 502 | Значение свойства выходит за установленные пределы |
-33
View File
@@ -1,33 +0,0 @@
---
title: "Перечисления событий"
type: enum
api: [api7]
tags: [enum, api7, bk1805164]
sources:
- bk1805164.html
---
*Структуры параметров и константы > Константы *
ksDocument2DNotifyEnum - События графического документа
ksDocument3DNotifyEnum - События документа-модели
ksDocumentFileNotifyEnum - События для документов; работа с файлом
ksKompasObjectNotifyEnum - События приложения
ksLayoutSheetsNotifyEnum - События для листов оформления
ksLibraryManagerNotifyEnum - События для менеджера библиотек
ksNotifyType - Перечень интерфейсов событий
ksObject2DNotifyEnum - События объектов графических документов
ksObject3DNotifyEnum - События объектов документа-модели
ksProcess2DTypeEnum - Типы процессов 2D
ksProcess3DTypeEnum - Типы процессов 3D
ksProcess2DNotifyEnum - События процесса 2D
ksProcess3DNotifyEnum - События процесса 3D
ksTwinSwitcherValueEnum - Значения переключателя
ksToleranceArrowType - Тип стрелки ответвления у допуска формы
ksEnterButtonIconTypeEnum - Тип иконки для кнопки Cоздать
ksShowHideTmpObjTypeEnum - Тип отображения временного объекта в документе
ksSelectionMngNotifyEnum - События менеджера выделенных объектов
ksStampNotifyEnum - События основной надписи графических документов (штампа)
ksSpcDocumentNotifyEnum - События документа-спецификации
ksSpcObjectNotifyEnum - События объекта спецификации
ksSpecificationNotifyEnum - События для спецификации
-15
View File
@@ -1,15 +0,0 @@
---
title: "ButtonTypeEnum - Типы кнопок для элемента панели свойств \"Набор кнопок\""
type: enum
api: [api7]
tags: [enum, api7, buttontypeenum]
sources:
- buttontypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksPushButton | 0 | Набор обычных нефиксируемых кнопок |
| --- | --- | --- |
| ksCheckButton | 1 | Набор фиксируемых кнопок |
| ksRadioButton | 2 | Набор кнопок с возможностью фиксации только одной кнопки |
-16
View File
@@ -1,16 +0,0 @@
---
title: "CheckStateEnum - Возможные состояния элемента управления Панели свойств \"Переключатель состояния поля ввода\""
type: enum
api: [api7]
tags: [enum, api7, checkstateenum]
sources:
- checkstateenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCheckUndefined | 0 | Значение поля не задано; на переключателе пусто, |
| --- | --- | --- |
| ksCheckCurrent | 1 | Поле ввода активно; на переключателе значок "галочка", |
| ksCheckFixed | 2 | Содержание поля ввода зафиксировано; на переключателе перекрестие. |
| ksCheckVariable | 3 | Значение поля ввода задано; на переключателе пусто. |
-21
View File
@@ -1,21 +0,0 @@
---
title: "Перечисления событий"
type: enum
api: [api7]
tags: [enum, api7, cj1798939]
sources:
- cj1798939.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
ksDocumentFileNotifyEnum
ksObject2DNotifyEnum
ksKompasObjectNotifyEnum
ksNotifyType
ksDocumentFrameNotifyEnum - События для окна документа: клавиатура, мышь, события по отрисовке документа
ksPropertyManagerNotifyEnum - События Панели свойств или процессных параметров
ksPropertyUserControlNotifyEnum - События пользовательского элемента управления
ksViewsAndLayersManagerNotifyEnum - События для менеджера видов и слоев
ksViewProjectionScheme - Схема ориентаций модели
SystemPropertyType - Номера системных свойств
@@ -1,63 +0,0 @@
---
title: "ControlTypeEnum - Типы элементов управления Панели свойств"
type: enum
api: [api7]
tags: [enum, api7, controltypeenum]
sources:
- controltypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksControlUnknown | 0 | Неизвестный тип | |
| --- | --- | --- | --- |
| ksControlSeparator | 1 | Разделитель (сепаратор) | IPropertySeparator |
| ksControlEditInt | 2 | Редактор целочисленных значений | IPropertyEdit |
| ksControlEditReal | 3 | Редактор дробных значений | IPropertyEdit |
| ksControlEditStr | 4 | Редактор строковых значений | IPropertyEdit |
| ksControlListInt | 5 | Раскрывающийся список целочисленных значений | IPropertyList |
| ksControlListReal | 6 | Раскрывающийся список дробных значений | IPropertyList |
| ksControlListStr | 7 | Раскрывающийся список строковых значений | IPropertyList |
| ksControlCheckBox | 8 | Опция | IPropertyCheckBox |
| ksControlMultiButton | 9 | Набор кнопок | IPropertyMultiButton |
| ksControlGrid | 10 | Сетка | IPropertyGrid |
| ksControlSlideBox | 11 | Окно отображения слайда, растрового изображения, группы или файла документа КОМПАС | IPropertySlideBox |
| ksControlUser | 12 | Пользовательский элемент управления | IPropertyUserControl |
| ksControlTextButton | 13 | Кнопка с текстом | IPropertyTextButton |
| ksControlSpinInt | 14 | Счетчик целочисленных значений с полем ввода | IPropertySpinEdit |
| ksControlSpinReal | 15 | Счетчик дробных значений с полем ввода | IPropertySpinEdit |
| ksControlFileName | 16 | Выбор файла | IPropertyFileName |
| ksControlColor | 17 | Выбор цвета | IPropertyColor |
| ksControlEditList | 18 | Список | IPropertyEdit |
| ksControlEditLength | 19 | Редактор длины | IPropertyEdit |
| ksControlEditAngle | 20 | Редактор угла | IPropertyEdit |
| ksControlEditPoint | 21 | Редактор координат | IPropertyEdit |
| ksControlListLength | 22 | Комбобокс длин | IPropertyList |
| ksControlListAngle | 23 | Комбобокс углов | IPropertyList |
| ksControlBmpList | 24 | Комбобокс со строкой и битмапом | IPropertyBmpList |
| ksControlLibExplorer | 25 | Отображение библиотеки документов | |
| ksControlListScale | 26 | Комбобокс со списком масштабов | IPropertyList |
| ksControlLineStyle | 27 | Комбобокс со списком стилей линий | IPropertyStyleList |
| ksControlOpticalProps | 28 | Контрол оптических свойств | IPropertyOpticalProps |
| ksControlEditCheckBox | 29 | Редактор строковых значений c чекбоксом | IPropertyEdit |
| ksControlPointStyle | 30 | Комбобокс со списком стилей точек | IPropertyStyleList |
| ksControlPointStyle3D | 31 | Комбобокс со списком стилей точек 3D | IPropertyStyleList |
| ksControlLineStyle3D | 32 | Комбобокс со списком стилей линий 3D | IPropertyStyleList |
| ksControlHatchStyle | 33 | Комбобокс со списком стилей штриховок | IPropertyStyleList |
| ksControlGroupBegin | 34 | Начало группы контролов | |
| ksControlGroupEnd | 35 | Конец группы контролов | |
| ksControlTwinSwitcher | 36 | Переключатель | |
| ksControlPoint3D | 37 | Точка 3D | |
| ksControlPreviewText | 38 | Предпросмотр текста | |
| ksControlAggregateTriple | 40 | Составной контрол из трех контролов | |
| ksControlBasePoint | 41 | Базовая точка | |
| ksControlLinkButton | 42 | Набор кнопок в виде ссылок | |
| ksControlMarking | 43 | Контрол обозначение | |
| ksControlReplaceList | 44 | Список замен текстов | |
| ksControlTree | 45 | Дерево | |
| ksControlParamGrid | 46 | Сетка c разнотипными ячейками | |
| ksControlUserWindow | 47 | Элемент управления - пользовательское окно | |
| ksControlUVEdit | 48 | Редактор UV координат | |
| ksControlRaPointEdit | 49 | Редактор полярных координат на поверхности | |
| ksControlAzPointEdit | 50 | Редактор полярных-цилиндрических координат на поверхности | |
| ksControlAbPointEdit | 51 | Редактор полярных-сферических координат на поверхности | |
@@ -1,15 +0,0 @@
---
title: "ConvertCoordTypeEnum - Типы преобразования логических координат в координаты документа"
type: enum
api: [api7]
tags: [enum, api7, convertcoordtypeenum]
sources:
- convertcoordtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| kcDocument | 1 | В СК документа. |
| --- | --- | --- |
| kcGeoView | 2 | В геометрическую точку текущего вида. |
| kcCurrentPlane | 3 | В СК текущего плоского объекта. |
@@ -1,16 +0,0 @@
---
title: "DefaultFixTypeEnum - Тип фиксированности для умолчательных элементов управления Панели свойств"
type: enum
api: [api7]
tags: [enum, api7, defaultfixtypeenum]
sources:
- defaultfixtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksAllFixOff | -1 | Все элементы управления расфиксированы |
| --- | --- | --- |
| ksAllFix | 0 | Все элементы управления фиксированы |
| ksPointFix | 1 | Фиксирована точка |
| ksAngleFix | 2 | Фиксирован угол |
@@ -1,20 +0,0 @@
---
title: "DocumentTypeEnum - Типы документов КОМПАС"
type: enum
api: [api7]
tags: [enum, api7, documenttypeenum]
sources:
- documenttypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksDocumentUnknown | 0 | Неизвестный тип |
| --- | --- | --- |
| ksDocumentDrawing | 1 | Чертеж |
| ksDocumentFragment | 2 | Фрагмент |
| ksDocumentSpecification | 3 | Спецификация |
| ksDocumentPart | 4 | Деталь |
| ksDocumentAssembly | 5 | Сборка |
| ksDocumentTextual | 6 | Текстовый документ |
| ksDocumentTechnologyAssembly | 7 | Технологическая сборка |
@@ -1,99 +0,0 @@
---
title: "DrawingObjectTypeEnum - Типы графических объектов"
type: enum
api: [api7]
domain: [drawing]
tags: [enum, api7, drawing, drawingobjecttypeenum]
sources:
- drawingobjecttypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
В API5 соответствует Типам объектов и интерфейсов....
| Идентификатор объекта | | Название объекта | Интерфейс параметров |
| --- | --- | --- | --- |
| ksUnknown | -1 | Неизвестный объект | |
| ksAllObj | 0 | Все объекты | |
| ksDrLineSeg | 1 | Отрезок | ILineSegment |
| ksDrCircle | 2 | Окружность | ICircle |
| ksDrArc | 3 | Дуга | IArc |
| ksDrDrawText | 4 | Текст на чертеже | IDrawingText |
| ksDrPoint | 5 | Точка | IPoint |
| ksDrHatch | 7 | Штриховка | IHatch |
| ksDrBezier | 8 | Bezier сплайн | IBezier |
| ksDrLDimension | 9 | Линейный размер | ILineDimension |
| ksDrADimension | 10 | Угловой размер | IAngleDimension |
| ksDrDDimension | 13 | Диаметральный размер | IDiametralDimension |
| ksDrRDimension | 14 | Радиальный размер | IRadialDimension |
| ksDrRBreakDimension | 15 | Радиальный размер с изломом | IBreakRadialDimension |
| ksDrRough | 16 | Шероховатость | IRough |
| ksDrBase | 17 | База | IBase |
| ksDrWPointer | 18 | Стрелка вида | IViewPointer |
| ksDrCut | 19 | Линия разреза | ICutLine |
| ksDrLeader | 20 | Простая линия-выноска | IBaseLeader |
| ksDrPosLeader | 21 | Линия-выноска для обозначения позиции | IPositionLeader |
| ksDrBrandLeader | 22 | Линия-выноска для обозначения клеймения | IBrandLeader |
| ksDrMarkerLeader | 23 | Линия-выноска для обозначения маркирования | IMarkLeader |
| ksDrTolerance | 24 | Допуск формы | ITolerance |
| ksDrTable | 25 | Таблица | ITable |
| ksDrContour | 26 | Контур | IContour |
| ksDrMacro | 27 | Нетипизированный макроэлемент | IMacroObjec |
| ksDrLine | 28 | Линия | ILine |
| ksLayer | 29 | Слой | ILayer |
| ksDrFragment | 30 | Вставной фрагмент | ksFragment |
| ksDrPolyline | 31 | Полилиния | IPolyLine |
| ksDrEllipse | 32 | Эллипс | IEllipse |
| ksDrNurbs | 33 | NURBS сплайн | INurbs |
| ksDrEllipseArc | 34 | Дуга эллипса | IEllipseArc |
| ksDrRectangle | 35 | Прямоугольник | IRectangle |
| ksDrRegularPolygon | 36 | Многоугольник | IRegularPolygon |
| ksDrEquid | 37 | Эквидистанта | IEquidistant |
| ksDrLBreakDimension | 38 | Линейный размер с обрывом | IBreakLineDimension |
| ksDrABreakDimension | 39 | Угловой размер с обрывом | IBreakAngleDimension |
| ksDrOrdinateDimension | 40 | Размер высоты | IHeightDimension |
| ksDrColorFill | 41 | Фоновая заливка цветом | IColouring |
| ksDrCentreMarker | 42 | Обозначение центра | ICentreMarker |
| ksDrArcDimension | 43 | Размер длины дуги | IArcDimension |
| ksDrRaster | 45 | Растровый объект | IRaster |
| ksDrChangeLeader | 46 | Обозначение изменения | IChangeLeader |
| ksDrRemoteElement | 47 | Выносной элемент | IRemoteElement |
| ksDrAxisLine | 48 | Осевая линия | IAxisLine |
| ksDrOLEObject | 49 | Вставка OLE объекта | IOleDrawingObject |
| ksDrUnitNumber | 50 | Номер узла | IUnitNumber |
| ksDrBrace | 51 | Фигурная скобка | IBrace |
| ksDrMarkOnLeader | 52 | Марка/позиционное обозначение с линией-выноской | IMarkOnLeader |
| ksDrMarkOnLine | 53 | Марка/позиционное обозначение на линии | IMarkOnLine |
| ksDrMarkInsideForm | 54 | Марка/позиционное обозначение без линии-выноски | IMarkInsideForm |
| ksDrWaveLine | 55 | Волнистая линия | IWaveLine |
| ksDrStraightAxis | 56 | Прямая ось | IStraightAxis |
| ksDrBrokenLine | 57 | Линия обрыва с изломами | IBrokenLine |
| ksDrCircleAxis | 58 | Круговая ось | ICircleAxis |
| ksDrArcAxis | 59 | Дуговая ось | IArcAxis |
| ksDrCutUnitMarking | 60 | Обозначение узла в сечении | ICutUnitMarking |
| ksDrUnitMarking | 61 | Обозначение узла | IUnitMarking |
| ksDrMultiTextLeader | 62 | Выносная надпись к многослойным конструкциям | IMultiTextLeader |
| ksDrExternalView | 63 | Вставка внешнего вида | IInsertionView |
| ksDrAnnLineSeg | 64 | Аннотационный отрезок | IAnnotativeObject |
| ksDrAnnCircle | 65 | Аннотационная окружность | IAnnotativeObject |
| ksDrAnnEllipse | 66 | Аннотационный эллипс | IAnnotativeObject |
| ksDrAnnArc | 67 | Аннотационная дуга | IAnnotativeObject |
| ksDrAnnEllipseArc | 68 | Аннотационная дуга эллипса | IAnnotativeObject |
| ksDrAnnPolyline | 69 | Аннотационная полилиния | IAnnotativeObject |
| ksDrAnnPoint | 70 | Аннотационная точка | IAnnotativeObject |
| ksDrMultiLine | 72 | Мультилиния | IMultiline |
| ksDrBuildingCutLine | 73 | Линия разреза/сечения для СПДС | ICutLine |
| ksDrAttachedLeader | 74 | Присоединенная линия выноски (не имеет текстов) | ILeader |
| ksDrConditionCrossing | 75 | Условное пересечение | |
| ksReportTable | 76 | Ассоциативная таблица отчета | IAssociationTable |
| ksEmbodimentsTable | 77 | Таблица иcполнений | IAssociationTable |
| ksDrSpecialCurve | 78 | Кривая общего вида | |
| ksArrayParamTable | 79 | Таблица параметров массива | IAssociationTable |
| ksDrNurbsByPoints | 80 | NURBS-кривая по точкам | |
| ksDrConicCurve | 81 | Коническая кривая | |
| ksDrConicCurve4Point | 82 | Коническая кривая по 4 точкам и направлению | |
| ksDrConicCurve5Point | 83 | Коническая кривая по 5 точкам | |
| ksDrStraightSlot | 87 | Паз | |
| ksDrArcSlot | 88 | Паз дуговой | |
| ksDrCsPoint | 89 | Точка начала СК | |
| ksView | 123 | Вид | iView |
-38
View File
@@ -1,38 +0,0 @@
---
title: "События системы; перечисления"
type: enum
api: [api7]
tags: [enum, api7, events]
sources:
- events_enum_common.html
---
## События системы; перечисления
События приложения...
События документа...
События документа-модели...События графического документа...События менеджера выделенных объектов...
События объектов графического документа...
События объектов документа-модели...
События основной надписи графического документа...
События объекта спецификации...События для спецификации...События документа-спецификации...
## Функции работы с событиями
Функции данного раздела обеспечивают обработку событий.
ksConnectionAdvise - Подписаться на событие
ksConnectionUnAdvise - Снять подписку на событие
Интерфейсы событий
## Связь объектов системы с интерфейсами событий
| Объекты системы | Интерфейс событий объекта |
| --- | --- |
| Объект приложение KompasObject | Интерфейс событий приложения Интерфейс событий документа Интерфейс событий объектов документа-модели Интерфейс событий менеджера выделенных объектов Интерфейс событий основной надписи графического документа Интерфейс событий объектов графического документа Интерфейс событий документа-модели Интерфейс событий графического документа Интерфейс событий объекта спецификации Интерфейс событий спецификации Интерфейс событий документа-спецификации |
| Графический документ ksDocument2D | Интерфейс событий документа Интерфейс событий менеджера выделенных объектов Интерфейс событий основной надписи графического документа Интерфейс событий графического документа Интерфейс событий объектов графического документа Интерфейс событий объекта спецификации Интерфейс событий спецификации |
| Спецификация ksSpcDocument | Интерфейс событий документа Интерфейс событий основной надписи графического документа Интерфейс событий объекта спецификации Интерфейс событий спецификации Интерфейс событий документа-спецификации |
| Текстовый документ ksDocumentTxt | Интерфейс событий документа Интерфейс событий основной надписи графического документа |
| Документ-модель ksDocument3D | Интерфейс событий документа Интерфейс событий менеджера выделенных объектов Интерфейс событий объектов документа-модели Интерфейс событий объекта спецификации Интерфейс событий спецификации Интерфейс событий документа-модели |
@@ -1,15 +0,0 @@
---
title: "FilterConditionStateEnum - Состояние параметрав условии фильтрации слоев"
type: enum
api: [api7]
tags: [enum, api7, filterconditionstateenum]
sources:
- filterconditionstateenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksStateUndefined | -1 | Состояние не определено |
| --- | --- | --- |
| ksStateFALSE | 0 | Состояние FALSE |
| ksStateTRUE | 1 | Состояние TRUE |
@@ -1,15 +0,0 @@
---
title: "FrameRegimeEnum - Режим отображения окна"
type: enum
api: [api7]
tags: [enum, api7, frameregimeenum]
sources:
- frameregimeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksFrameMinimize | 0 | Свернуть окно |
| --- | --- | --- |
| ksFrameMaximize | 1 | Развернуть окно |
| ksFrameRestore | 2 | Восстановить окно |
@@ -1,715 +0,0 @@
---
title: "KompasAPIObjectTypeEnum - Типы объектов КОМПАС API"
type: enum
api: [api7]
tags: [enum, api7, kompasapiobjecttypeenum]
sources:
- kompasapiobjecttypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksObjectUnknown | 0 | Неизвестный тип |
| --- | --- | --- |
| ksObjectApplication | 10001 | Приложение - основной объект API |
| ksObjectDocuments | 10002 | Коллекция документов, открытых в приложении |
| ksObjectKompasError | 10003 | Информация о ошибке системы КОМПАС |
| ksObjectProcessParam | 10004 | Параметры процесса |
| ksObjectPropertyTabs | 10005 | Коллекция закладок панели свойств |
| ksObjectPropertyTab | 10006 | Закладка панели свойств |
| ksObjectPropertyControls | 10007 | Коллекция элементов управления вкладки Панели свойств |
| ksObjectPropertySeparator | 10008 | Разделитель (сепаратор) |
| ksObjectPropertyEdit | 10009 | Редактор |
| ksObjectPropertyList | 10010 | Раскрывающийся список |
| ksObjectPropertyCheckBox | 10011 | Опция |
| ksObjectPropertyMultiButton | 10012 | Набор кнопок |
| ksObjectPropertyUserControl | 10013 | Пользовательский элемент управления |
| ksObjectPropertyBmpList | 10014 | Комбобокс со строкой и битмапом |
| ksObjectPropertyUserWindow | 10015 | Элемент управления - пользовательское окно |
| ksObjectPropertySlideBox | 10016 | Окно отображения слайда, растрового изображения, файла документа КОМПАС или группы файлов. |
| ksObjectPropertyGrid | 10017 | Сетка |
| ksObjectDocumentFrame | 10018 | Окно документа |
| ksObjectDocumentFrames | 10019 | Коллекция окон документа |
| ksObjectPropertyManager | 10020 | Панель свойств |
| ksObjectDrawingDocument | 10021 | Документ - Чертеж |
| ksObjectFragmentDocument | 10022 | Документ - Фрагмент |
| ksObjectSpcDocument | 10023 | Документ - Спецификация |
| ksObjectPartDocument | 10024 | Документ - Деталь |
| ksObjectAssemblyDocument | 10025 | Документ - Сборка |
| ksObjectTextDocument | 10026 | Документ - Текстовый |
| ksObjectPropertyTextButton | 10027 | Кнопка с текстом |
| ksObjectPropertySpinEdit | 10028 | Поле ввода со счетчиком |
| ksObjectViewsAndLayersManager | 10029 | Менеджер слоев и видов графического документа |
| ksObjectViews | 10030 | Коллекция видов |
| ksObjectView | 10031 | Вид |
| ksObjectAssociationView | 10032 | Ассоциативный вид |
| ksObjectLayerGroups | 10033 | Коллекция групп слоев |
| ksObjectDrawingOblects | 10034 | Коллекция объектов графического документа |
| ksObjectLayerGroup | 10035 | Группа слоев |
| ksObjectLayers | 10036 | Коллекция слоев |
| ksObjectLayer | 10037 | Слой |
| ksObjectLayerFilterCondition | 10038 | Условие фильтрации слоев |
| ksObjectLayerFilterConditions | 10039 | Коллекция условий фильтрации слоев |
| ksObjectDocumentSettings | 10040 | Настройки документа |
| ksObjectDocument2DSettings | 10041 | Настройки графического документа |
| ksObjectDrawingDocumentSettings | 10042 | Настройки чертежа |
| ksObjectFragmentDocumentSettings | 10043 | Настройки фрагмента |
| ksObjectDocument3DSettings | 10045 | Настройки 3D документа |
| ksObjectFormatLabelRules | 10046 | Правила формирования отображаемых имен объектов в дереве документа |
| ksObjectLibraryManager | 10050 | Менеджер библиотек |
| ksObjectProcedure | 10051 | Процедура прикладной библиотеки |
| ksObjectProceduresLibraries | 10052 | Коллекция прикладных библиотек |
| ksObjectProceduresLibrary | 10053 | Прикладная библиотека |
| ksObjectProcedures | 10054 | Коллекция процедур прикладной библиотеки |
| ksObjectInsertsLibraries | 10055 | Коллекция библиотек элементов (документов) |
| ksObjectInsertsLibrary | 10056 | Библиотека элементов (документов) |
| ksObjectInserts | 10057 | Коллекция элементов (документов) библиотеки элементов (документов) |
| ksObjectInsert | 10058 | Элемент библиотеки элементов (документов) |
| ksObjectSpecificationDescriptions | 10059 | Коллекция описаний спецификации |
| ksObjectSpecificationDescription | 10060 | Описание спецификации |
| ksObjectSpecificationStyle | 10061 | Стиль спецификации |
| ksObjectSpecificationColumnStyles | 10062 | Коллекция стилей колонок спецификации |
| ksObjectSpecificationColumnStyle | 10063 | Стиль колонки спецификации |
| ksObjectSpecificationSectionStyles | 10064 | Коллекция стилей разделов спецификации |
| ksObjectSpecificationSectionStyle | 10065 | Стиль раздела спецификации |
| ksObjectSpecificationTuning | 10066 | Настройки спецификации |
| ksObjectSpecificationTuningSections | 10067 | Коллекция настроек разделов спецификации |
| ksObjectSpecificationTuningSection | 10068 | Настройка раздела спецификации |
| ksObjectSpecificationSubsections | 10069 | Коллекция подразделов спецификации |
| ksObjectSpecificationSubsection | 10070 | Подраздел спецификации |
| ksObjectAdditionalBlockStyles | 10071 | Коллекция стилей блоков дополнительных разделов |
| ksObjectAdditionalBlockStyle | 10072 | Стиль блока дополнительных разделов |
| ksObjectAdditionalBlockTunings | 10073 | Коллекция настроек блоков дополнительных разделов |
| ksObjectAdditionalBlockTuning | 10074 | Настройка блока дополнительных разделов |
| ksObjectAdditionalBlockSectionTunings | 10075 | Коллекция настроек разделов блока дополнительных разделов |
| ksObjectAdditionalBlockSectionTuning | 10076 | Настройка раздела блока дополнительных разделов |
| ksObjectSheetFormat | 10077 | Формат листа |
| ksObjectTextStyle | 10078 | Параметры стиля текста |
| ksObjectFont | 10079 | Параметры шрифта |
| ksObjectTabulators | 10080 | Коллекция позиции табуляторов |
| ksObjectTabulator | 10081 | Позиция табулятора |
| ksObjectSheetSpecification | 10082 | Спецификация или таблица изменений на листе |
| ksObjectSpecificationBaseObjects | 10083 | Коллекция базовых объектов спецификации |
| ksObjectSpecificationCommentObjects | 10084 | Коллекция вспомогательных объектов спецификации |
| ksObjectSpecificationObject | 10085 | Объект спецификации |
| ksObjectSpecificationBaseObject | 10086 | Базовый объект спецификации |
| ksObjectSpecificationCommentObject | 10087 | Вспомогательный объект спецификации |
| ksObjectSpecificationColumns | 10088 | Коллекция колонок объекта спецификации |
| ksObjectSpecificationColumn | 10089 | Колонка объекта спецификации |
| ksObjectSpecificationColumnItems | 10090 | Коллекция элементов колонки объекта спецификации |
| ksObjectSpecificationColumnItem | 10091 | Элемент колонки объекта спецификации |
| ksObjectAttachedDocuments | 10092 | Коллекция присоединенных документов к объекту спецификации |
| ksObjectAttachedDocument | 10093 | Параметры присоединенного документа к объекту спецификации |
| ksObjectPropertyFileName | 10094 | Выбор файла |
| ksObjectPropertyEditList | 10095 | Список |
| ksObjectLayoutSheets | 10096 | Коллекция листов оформления |
| ksObjectLayoutSheet | 10097 | Параметры листа оформления |
| ksObjectConverter | 10098 | Конвертер КОМПАС-документов |
| ksObjectCheckSum | 10099 | Контрольная сумма |
| ksObjectProgressBar | 10100 | Индикатор процесса |
| ksObjectPropertyEditList | 10101 | Список |
| ksObjectPropertyLibExplorer | 10102 | Отображение библиотеки документов |
| ksObjectVariable7 | 10103 | Параметрическая переменная модели |
| ksObjectInsertionParameters | 10104 | Параметры вставки фрагмента и растрового объекта в текст |
| ksObjectMath2D | 10105 | Математика 2D |
| ksObjectSelectionManager | 10106 | Менеджер селектированных объектов |
| ksObjectChooseManager | 10107 | Менеджер выбора (подсветки) объектов |
| ksObjectStamp | 10108 | Штамп |
| ksObjectPropertyStyleList | 10109 | Комбобокс со стилем |
| ksObjectPrintJob | 10110 | Задание на печать |
| ksObjectPrintJob_Sheet | 10111 | Задание на печать::Интерфейс листа документа |
| ksObjectPropertyOpticalProps | 10112 | Контрол оптических свойств |
| ksObjectPropertyEditCheckBox | 10113 | Объединенный редактор с чекбоксом |
| ksObjectPropertyGroupBegin | 10116 | Начало группы контролов |
| ksObjectPropertyGroupEnd | 10117 | Конец группы контролов |
| ksObjectThreadPattern | 10118 | Параметры стандарта резьбы |
| ksObjectThreadDialogParam | 10119 | Параметры диалога выбора стандарта резьбы |
| ksObjectPropertyPreviewText | 10120 | Предпросмотр текста |
| ksObjectPropertyAggregateControl | 10121 | Составной контрол |
| ksObjectPropertyLinkButton | 10122 | Набор кнопок в виде ссылок |
| ksObjectPropertyMarking | 10123 | Контрол обозначение |
| ksObjectContentDialogParam | 10124 | Параметры диалога с произвольным наполнением |
| ksObjectPropertyBasePoint | 10125 | Базовая точка |
| ksObjectTextDocumentSection | 10126 | Раздел текстового документа |
| ksIntervalVariable | 10127 | Интервальная переменная |
| ksSpecificationObjectCreateParam | 10128 | Расширенные параметры создания объекта спецификации |
| ksObjectPropertyReplaceList | 10129 | Элемент панели свойств - Список замен текстов |
| ksObjectRasterConvertParameters | 10130 | Параметры для конвертации в растровые форматы |
| ksObjectAdditionConvertParameters | 10131 | Параметры для конвертации в дополнительные форматы |
| ksObjectCommonNameObject | 10132 | Объект спецификации - Общее наименование |
| ksObjectPropertyParamGrid | 10133 | Элемент панели свойств - Сетка с разнотипными ячейками |
| ksObjectChoiceModelDialogParam | 10134 | Параметры диалога Выбрать модель из списка открытых |
| ksObjectChoiceMaterialDialogParam | 10135 | Параметры диалога выбора материала |
| ksObjectPropertyTreeNode | 10136 | Интерфейс модели узла дерева |
| ksObjectPropertyTree | 10137 | Элемент панели свойств - Дерево |
| ksObjectSymbolOrSpecSignDialogParam | 10138 | Параметры диалога Символы и спецзнаки |
| ksObjectParametrizationParam | 10139 | Интерфейс параметров параметризации |
| ksObjectInertiaProperties | 10141 | Плоские массо-центровочные характеристики |
| ksObjectMassInertiaProperties | 10142 | Объемные массо-центровочные характеристики |
| ksObjectInertiaPropertiesCalculateParam | 10143 | Параметры для расчёта плоских массо-центровочных характеристик |
| ksObjectMassInertiaPropertiesCalculateParam | 10144 | Параметры для расчёта объёмных массо-центровочных характеристик |
| ksObjectUserDataStoragesMng | 10500 | Менеджер пользовательских хранилищ |
| ksObjectUserDataStorages | 10501 | Коллекция объектов пользовательского хранилища |
| ksObjectUserDataStorage | 10502 | Объект пользовательского хранилища данных |
| ksObjectAttribute | 10504 | Атрибут |
| ksObjectColumnInfo | 10505 | Параметры столбца табличного атрибута |
| ksObjectAttributeType | 10506 | Параметры типа атрибута |
| ksObjectAttrTypeMng | 10507 | Менеджер типов атрибутов |
| ksObjectProperty | 10508 | Свойство |
| ksObjectPropertyMng | 10509 | Менеджер свойств |
| ksObjectReportProcess | 10510 | Интерфейс для управления процессом Создать отчет |
| ksObjectReport | 10511 | Интерфейс Отчета |
| ksObjectReportStyle | 10512 | Интерфейс стиля Отчета |
| ksObjectReportStyleColumn | 10513 | Интерфейс колонки стиля Отчета |
| ksObjectPropertyKeeper | 10514 | Объект дерева СЧИ |
| ksObjectStyles | 10515 | Коллекция стилей |
| ksObjectCurvesStyles | 10516 | Коллекция стилей кривых |
| ksObjectHatchsStyles | 10517 | Коллекция стилей штриховок |
| ksObjectTextsStyles | 10518 | Коллекция стилей текстов |
| ksObjectStyle | 10519 | Cтиль |
| ksObjectCurveStyle | 10520 | Стиль кривой |
| ksObjectHatchStyle | 10521 | Стиль штриховки |
| ksObjectSpecificationStyles | 10522 | Коллекция стилей спецификации |
| ksObjectText | 10700 | Текст |
| ksObjectTextLine | 10701 | Cтрока текста |
| ksObjectTextItem | 10702 | Компонент строки текста |
| ksObjectTableCell | 10703 | Ячейка таблицы |
| ksObjectExternalTessellation | 10704 | Объект с внешней триангуляцией |
| ksObjectExternalGDI | 10709 | Внешний GDI-объект |
| ksObjectLibArraySettings | 10710 | Интерфейс для выбора состояний библиотек в настройках |
| ksObjectTextTable | 10711 | Таблица в тексте текстового документа |
| ksObjectPropertyTwinSwitcher | 10713 | Переключатель |
| ksObjectPropertyPoint3D | 10714 | Точка 3D |
| ksObjectPart7 | 11000 | 3D компонент |
| ksObjectModelObject | 11001 | 3D объект |
| ks3dMateConstraint | 11002 | 3D сопряжение |
| ksObjectParts7 | 11003 | Коллекция 3D компонентов |
| ksObjectVariableTable | 11004 | Таблица переменных |
| ksObjectProgressBar | 11005 | Индикатор прогресса |
| ksObjectLineDimensions3D | 11030 | Коллекция линейных размеров 3D |
| ksObjectBaseLineDimension3D | 11031 | Линейный размер 3D (от отрезка до точки) |
| ksObjectLineDimension3D | 11032 | Линейный размер 3D (на плоскости) |
| ksObjectRadialDimension3D | 11033 | Радиальный размер 3D |
| ksObjectDiametralDimension3D | 11034 | Диаметральный размер 3D |
| ksObjectRadialDimensions3D | 11035 | Коллекция радиальных размеров 3D |
| ksObjectDiametralDimensions3D | 11036 | Коллекция диаметральных размеров 3D |
| ksObjectAngleDimension3D | 11037 | Угловой размер 3D |
| ksObjectAngleDimensions3D | 11038 | Коллекция угловых размеров 3D |
| ksObjectLocalCoordinateSystems | 11039 | Коллекция локальных систем координат |
| ksObjectLocalCoordinateSystem | 11040 | Локальная система координат |
| ksObjectLocalCSAxesDirectionParam | 11041 | Параметры для типа ориентации ЛСК-направление осей |
| ksObjectLocalCSRotateParam | 11042 | Параметры для типа ориентации ЛСК-вращение вокруг осей СК |
| ksObjectLocalCSEulerParam | 11043 | Параметры для типа ориентации ЛСК-система углов Эйлера |
| ksObjectSpline3D | 11044 | Сплайн |
| ksObjectSplines3D | 11045 | Коллекция сплайнов |
| ksObjectCurveVertexParam | 11046 | Параметры вершины кривой |
| ksObjectPolyLines | 11047 | Коллекция 3D ломаных |
| ksObjectPolyLine | 11048 | 3D ломаная |
| ksObjectLeaders3D | 11049 | Коллекция линий-выносок 3D |
| ksObjectLeader3D | 11050 | Линия-выноска 3D |
| ksObjectMarkLeader3D | 11051 | Знак маркировки 3D |
| ksObjectRough3D | 11052 | Обозначение 3D шероховатости |
| ksObjectRoughs3D | 11053 | Коллекция обозначений 3D шероховатости |
| ksObjectPositionLeader3D | 11054 | Линия-выноска для обозначения позиции 3D |
| ksObjectBrandLeader3D | 11055 | Знак клеймения 3D |
| ksObjectBase3D | 11056 | Обозначение 3D базы |
| ksObjectBases3D | 11057 | Коллекция обозначений 3D базы |
| ksObjectTolerances3D | 11058 | Коллекция допуска формы 3D |
| ksObjectTolerance3D | 11059 | Обозначение допуска формы 3D |
| ksObjectControlPoints | 11060 | Коллекция контрольных точек |
| ksObjectControlPoint | 11061 | Контрольная точка |
| ksObjectConjunctivePoints | 11062 | Коллекция присоединительных точек |
| ksObjectConjunctivePoint | 11063 | Присоединительная точка |
| ksObjectSplitLines | 11064 | Коллекция линий разъема |
| ksObjectSplitLine | 11065 | Линия разъема |
| ksObjectSurfacePatches | 11066 | Коллекция заплаток |
| ksObjectSurfacePatch | 11067 | Заплатка |
| ksObjectFaceRemovers | 11068 | Коллекция операций удаления граней |
| ksObjectFaceRemover | 11069 | Операция удаления граней |
| ksObjectSurfaceSewers | 11070 | Коллекция операций сшивки поверхностей |
| ksObjectSurfaceSewer | 11071 | Операция сшивки поверхностей |
| ksObjectNurbsSurfaces | 11072 | Коллекция NURBS-поверхностей |
| ksObjectNurbsSurface | 11073 | NURBS-поверхность |
| ksObjectSurfacesIntersectionCurves | 11074 | Коллекция кривых пересечений поверхностей |
| ksObjectSurfacesIntersectionCurve | 11075 | Кривая пересечения поверхностей |
| ksObjectEquidistants3D | 11076 | Коллекция эквидистант 3D |
| ksObjectEquidistant3D | 11077 | Эквидистанта 3D |
| ksObjectTrimmedCurves | 11078 | Коллекция операций усечения кривой |
| ksObjectTrimmedCurve | 11079 | Операция усечения кривой |
| ksObjectFeaturePatterns | 11080 | Коллекция операций копирования |
| ksObjectLinearPattern | 11081 | Массив операций по сетке |
| ksObjectCircularPattern | 11082 | Массив операций по концентрической сетке |
| ksObjectPathPattern | 11083 | Массив операций вдоль кривой |
| ksObjectPartsLinearPattern | 11084 | Массив компонентов по сетке для сборки |
| ksObjectPartsCircularPattern | 11085 | Массив компонентов по концентрической сетке для сборки |
| ksObjectPartsPathPattern | 11086 | Массив компонентов вдоль кривой для сборки |
| ksObjectAuxLinearPattern | 11087 | Массив вспомогательной геометрии по сетке |
| ksObjectAuxCircularPattern | 11088 | Массив вспомогательной геометрии по концентрической сетке |
| ksObjectAuxPathPattern | 11089 | Массив вспомогательной геометрии вдоль кривой |
| ksObjectPointDrivenPattern | 11090 | Массив операций по точкам |
| ksObjectPartsPointDrivenPattern | 11091 | Массив компонентов по точкам |
| ksObjectDerivedPattern | 11092 | Массив по образцу |
| ksObjectMirrorPattern | 11093 | Зеркальный массив |
| ksObjectShellMirrorPattern | 11094 | Зеркально отобразить тело или операцию |
| ksObjectAuxMirrorPattern | 11095 | Зеркальный массив вспомогательной геометрии |
| ksObjectRuledSurfaces | 11096 | Коллекция операций создания линейчатой поверхности |
| ksObjectRuledSurface | 11097 | Линейчатая поверхность |
| ksObjectExtensionSurfaces | 11098 | Коллекция операций продления поверхности |
| ksObjectExtensionSurface | 11099 | Операция продления поверхности |
| ksObjectEquidistantSurfaces | 11100 | Коллекция операций построения эквидистант поверхности |
| ksObjectEquidistantSurface | 11101 | Операция построения эквидистанты поверхности |
| ksObjectTrimmedSurfaces | 11102 | Коллекция Операций усечения поверхности |
| ksObjectTrimmedSurface | 11103 | Операция усечения поверхности |
| ksObjectVector3D | 11104 | Вектор 3D |
| ksObjectVector3DBy2VertexesParameters | 11105 | Параметры вектора 3D по двум вершинам |
| ksObjectVector3DByCoefficientsParameters | 11106 | Параметры вектора 3D по коэффициентам |
| ksObjectVector3DBy2AnglesParameters | 11107 | Параметры вектора 3D по двум углам |
| ksObjectVector3DByObjectParameters | 11108 | Параметры вектора 3D по ребру или плоскости |
| ksObjectVector3DAlongSurfaceNormalParameters | 11109 | Параметры вектора 3D, перпендикулярного грани в указанной точке |
| ksObjectVector3DByCurveParameters | 11110 | Параметры вектора 3D по базисному вектору в точке кривой |
| ksObjectVector3DByScreenNormalParameters | 11111 | Параметры вектора 3D перпендикулярно плоскости экрана |
| ksObjectVector3DByLocalCSParameters | 11112 | Параметры вектора 3D по углу в плоскости СК и по оси СК |
| ksObjectConnectCurves | 11113 | Коллекция операций соединения кривых |
| ksObjectConnectCurve | 11114 | Операция соединения кривых |
| ksObjectFilletCurves | 11115 | Коллекция операций скругления кривых |
| ksObjectFilletCurve | 11116 | Операция соединения кривых |
| ksObjectSurfaceThickenings | 11117 | Коллекция операций придания толщины поверхности |
| ksObjectSurfaceThickening | 11118 | Операция придания толщины поверхности |
| ksObjectArcs3D | 11119 | Коллекция дуг 3D |
| ksObjectArc3D | 11120 | 3D дуга |
| ksObjectAuxPointDrivenPattern | 11121 | Массив вспомогательной геометрии по точкам |
| ksObjectBodiesPointDrivenPattern | 11122 | Массив тел по точкам |
| ksObjectTablePattern | 11123 | Массив операций по таблице из файла |
| ksObjectPartsTablePattern | 11124 | Массив компонентов по таблице из файла |
| ksObjectAuxTablePattern | 11125 | Массив компонентов по таблице из файла |
| ksObjectBodiesTablePattern | 11126 | Массив вспомогательной геометрии по таблице из файла |
| ksObjectRotateds | 11127 | Коллекция операций вращения |
| ksObjectRotated | 11128 | Операция вращения |
| ksObjectCutRotated | 11129 | Операция 'вырезать вращением' |
| ksObjectExtrusionSurfaces | 11130 | Коллекция поверхностей выдавливания |
| ksObjectExtrusionSurface | 11131 | Операция поверхность выдавливания |
| ksObjectRotatedSurfaces | 11132 | Коллекция поверхностей вращения |
| ksObjectRotatedSurface | 11133 | Операция поверхность вращения |
| ksObjectPoint3DParamBySphere | 11134 | Точка, заданная сферическими координатами |
| ksObjectPoint3DParamByCylinder | 11135 | Точка, заданная цилиндрическими координатами |
| ksObjectMeshPointsSurfaces | 11136 | Коллекция поверхностей по сети точек |
| ksObjectMeshPointsSurface | 11137 | Поверхность по сети точек |
| ksObjectCloudPointsSurfaces | 11138 | Коллекция поверхностей по пласту (облаку) точек |
| ksObjectCloudPointsSurface | 11139 | Поверхность по пласту (облаку) точек |
| ksObjectImportedSurfaces | 11140 | Коллекция импортированных поверхностей |
| ksObjectImportedSurface | 11141 | Импортированная поверхность |
| ksObjectBodiesLinearPattern | 11142 | Массив тел по сетке |
| ksObjectBodiesCircularPattern | 11143 | Массив тел по концентрической сетке |
| ksObjectBodiesPathPattern | 11144 | Массив тел вдоль кривой |
| ksObjectScalings3D | 11145 | Коллекция операций масштабирования тел и поверхностей |
| ksObjectScaling3D | 11146 | Масштабирование тел и поверхностей |
| ksObjectCurveOutLine | 11147 | Линия очерка |
| ksObjectCurveOutLines | 11148 | Коллекция линий очерка |
| ksObjectCurveByLaw | 11149 | Кривая по закону |
| ksObjectCurveByLaws | 11150 | Коллекция кривых по закону |
| ksObjectIsoparametricCurve | 11151 | Изопараметрическая кривая |
| ksObjectIsoparametricCurves | 11152 | Коллекция изопараметрических кривых |
| ksObjectIsoparametricCurvesSet | 11153 | Группа изопараметрических кривых |
| ksObjectIsoparametricCurvesSets | 11154 | Коллекция групп изопараметрических кривых |
| ksObjectSplineOnSurface | 11155 | Сплайн по поверхности |
| ksObjectSplinesOnSurfaces | 11156 | Коллекция сплайнов по поверхностям |
| ksObjectProjectionCurve | 11157 | Проекционная кривая |
| ksObjectProjectionCurves | 11158 | Коллекция проекционных кривых |
| ksObjectCurveBy2Projections | 11159 | Проекционная кривая |
| ksObjectCurvesBy2Projectionses | 11160 | Коллекция проекционных кривых |
| ksObjectContour3D | 11161 | Контур 3D |
| ksObjectContours3D | 11162 | Коллекция контуров 3D |
| ksObjectLineSegment3D | 11163 | Отрезок 3D |
| ksObjectLineSegments3D | 11164 | Коллекция отрезков 3D |
| ksObjectConicSpiral3D | 11179 | Коническая спираль |
| ksObjectCylindricSpiral3D | 11180 | Цилиндрическая спираль |
| ksObjectSpirals3D | 11181 | Коллекция спиралей |
| ksObjectPointsArrOnCurve | 11182 | Группа точек по кривой |
| ksObjectPointsArrsOnCurves | 11183 | Коллекция групп точек по кривым |
| ksObjectPointsArrOnSurfaces | 11184 | Группа точек по поверхности |
| ksObjectPointsArrsOnSurfaces | 11185 | Коллекция групп точек по поверхностям |
| ksObjectPointsArrFromFile | 11186 | Группа точек из файла |
| ksObjectPointsArrsFromFiles | 11187 | Коллекция групп точек из файлов |
| ksObjectAxis3D | 11188 | Вспомогательная ось 3D |
| ksObjectAxes3D | 11189 | Коллекция вспомогательных осей 3D |
| ksObjectAxis3DBy2Points | 11190 | Ось через две вершины |
| ksObjectAxis3DBy2Planes | 11191 | Ось на пересечении плоскостей |
| ksObjectAxis3DByConeface | 11192 | Ось конической поверхности |
| ksObjectAxis3DByEdge | 11193 | Ось через ребро |
| ksObjectAxis3DByPointAndObject | 11194 | Ось через вершину по объекту |
| ksObjectAxis3DByOperation | 11195 | Ось операции |
| ksObjectPlanes3D | 11196 | Коллекция плоскостей 3D |
| ksObjectPlane3D | 11197 | Плоскость 3D |
| ksObjectPlane3DByPlaneCurve | 11198 | Плоскость через плоскую кривую |
| ksObjectPlane3DTangentToFaceInPoint | 11199 | Плоскость касательная к грани в точке 3D |
| ksObjectPlane3DByOffset | 11200 | Смещенная плоскость |
| ksObjectPlane3DBy3Points | 11201 | Плоскость, проходящая через три вершины |
| ksObjectPlane3DByAngle | 11202 | Плоскость, под углом к другой плоскости |
| ksObjectPlane3DByEdgeAndPoint | 11203 | Плоскость через ребро и вершину |
| ksObjectPlane3DParallelByPoint | 11204 | Плоскость через вершину параллельно другой плоскости |
| ksObjectPlane3DPerpendicularByEdge | 11205 | Плоскость, проходящая через вершину перпендикулярно ребру |
| ksObjectPlane3DNormalToSurface | 11206 | Нормальная плоскость |
| ksObjectPlane3DMiddle | 11207 | Средняя плоскость 3D |
| ksObjectPlane3DByEdgeAndPlane | 11208 | Плоскость через ребро параллельно / перпендикулярно грани 3D |
| ksObjectPlane3DBy2Edge | 11209 | Плоскость через ребро параллельно /перпендикулярно другому ребру 3D |
| ksObjectPlane3DTangentToFace | 11210 | Плоскость касательная к грани 3D |
| ksObjectUserObject3D | 11211 | Пользовательский объект 3D |
| ksObjectUserObjects3D | 11212 | Коллекция пользовательских объектов 3D |
| ksObjectLinearPatternAnyCopy | 11213 | Копирование произвольных объектов по сетке |
| ksObjectCircularPatternAnyCopy | 11214 | Копирование произвольных объектов по окружности |
| ksObjectPathPatternAnyCopy | 11215 | Копирование произвольных объектов по кривой |
| ksObjectPointDrivenPatternAnyCopy | 11217 | Копирование произвольных объектов по точкам |
| ksObjectTablePatternAnyCopy | 11218 | Копирование произвольных объектов по таблице |
| ksObjectLinearUnhistoriedDimension | 11219 | Импортированный линейный размер |
| ksObjectAngularUnhistoriedDimension | 11220 | Импортированный угловой размер |
| ksObjectRadialUnhistoriedDimension | 11221 | Импортированный радиальный размер |
| ksObjectDiametralUnhistoriedDimension | 11222 | Импортированный диаметральный размер |
| ksObjectPlacement3D | 11223 | Интерфейс локальной системы координат (положение объекта) |
| ksObjectLayers3D | 11224 | Коллекция слоев в 3D |
| ksObjectLayer3D | 11225 | Слой в 3D |
| ksObjectLayerGroups3D | 11226 | Коллекция групп слоев в 3D |
| ksObjectLayerGroup3D | 11227 | Группа слоев в 3D |
| ksObjectDocument3DManager | 11228 | Менеджер 3D документа |
| ksObjectToleranceRecalc | 11229 | Пересчет модели |
| ksObjectSpecRough3D | 11230 | Неуказанная шероховатость 3D |
| ksObjectSketchBreakLinearDimension | 11231 | Управляющий линейный размер эскиза 3D с обрывом |
| ksObjectMathCurve3D | 11232 | Математическая кривая в трехмерном пространстве |
| ksObjectMathSurface3D | 11233 | Математическая поверхность в трехмерном пространстве |
| ksObjectBilletObsolete | 11234 | Деталь заготовка и Зеркальная деталь |
| ksObjectBilletsObsoletes | 11235 | Коллекция деталей заготовок и зеркальных деталей |
| ksObjectCopyGeometry | 11236 | Копия геометрии |
| ksObjectCopiesGeometry | 11237 | Коллекция копий геометрии |
| ksObjectCollectionGeometry | 11238 | Коллекция геометрии |
| ksObjectCollectionsGeometry | 11239 | Коллекции геометрии |
| ksObjectUserWireFrame3D | 11240 | Пользовательский объект Каркас 3D |
| ksObjectThreads | 11241 | Коллекция условных обозначений резьбы |
| ksObjectThread | 11242 | Условное обозначение резьбы |
| ks3dMateConstraints | 11243 | Коллекция 3D сопряжений |
| ksMate3DByAngle | 11244 | Сопряжение под углом |
| ksMate3DByTangent | 11245 | Сопряжение по касательной |
| ksMate3DSymmetry | 11246 | Сопряжение симметрия |
| ksMate3DTransmission | 11247 | Сопряжение механическое перемещение |
| ksMate3DCamGear | 11248 | Сопряжение кулачок-толкатель |
| ksMate3DDependentPosition | 11249 | Сопряжение зависимое положение |
| ksObjectHoles3D | 11250 | Коллекции отверстий 3D |
| ksObjectHole3D | 11251 | Отверстие 3D |
| ksObjectCountersinkHoleParameters | 11252 | Параметры отверстия с зенковкой |
| ksObjectSpotfacingHoleParameters | 11253 | Параметры отверстия с цековкой |
| ksObjectCountersinkSpotfacingHoleParameters | 11254 | Параметры отверстия с зенковкой и цековкой |
| ksObjectConicHoleParameters | 11255 | Параметры конического отверстия |
| ksObjectChamfers | 11256 | Коллекции фасок |
| ksObjectChamfer | 11257 | Фаска |
| ksObjectFillets | 11258 | Коллекции скруглений |
| ksObjectFillet | 11259 | Скругление |
| ksObjectInclines | 11260 | Коллекции операций уклон |
| ksObjectIncline | 11261 | Операция Уклон |
| ksObjectRibs | 11262 | Коллекции операций Ребро жесткости |
| ksObjectRib | 11263 | Ребро жесткости |
| ksObjectShells | 11264 | Коллекции операций Оболочка |
| ksObjectShell | 11265 | Оболочка |
| ksObjectBooleans | 11266 | Коллекция булевых операций |
| ksObjectBoolean | 11267 | Булева операция |
| ksObjectCuts | 11268 | Коллекция операций 'сечение' |
| ksObjectCut | 11269 | Операция 'сечение' |
| ksObjectLofts | 11270 | Коллекция операций по сечениям |
| ksObjectLoft | 11271 | Операция по сечениям |
| ksObjectLoftSurfaces | 11272 | Коллекция поверхностей по сечениям |
| ksObjectLoftSurface | 11273 | Операция поверхность по сечениям |
| ksObjectCoupling | 11274 | Цепочка в операции по сечениям |
| ksObjectEvolutions | 11275 | Коллекция кинематических операций |
| ksObjectEvolution | 11276 | Кинематическая операция |
| ksObjectEvolutionSurfaces | 11277 | Коллекция кинематических поверхностей |
| ksObjectEvolutionSurface | 11278 | Кинематическая поверхность |
| ksObjectVertex | 11279 | Вершина |
| ksObjectEdge | 11280 | Ребро |
| ksObjectFace | 11281 | Грань |
| ksObjectLoop7 | 11282 | Цикл |
| ksObjectOrientedEdge7 | 11283 | Ориентированное ребро |
| ksObjectUnionsComponents | 11284 | Коллекция операций объединение компонентов |
| ksObjectUnionComponents | 11285 | Операция объединения компонентов |
| ksObjectMoldCavities | 11286 | Коллекция операций вычитания компонентов |
| ksObjectMoldCavity | 11287 | Операция вычитания компонентов |
| ksObjectMacroObjects3D | 11288 | Коллекция макроэлементов 3D |
| ksObjectMacroObject3D | 11289 | 3D макроэлемент |
| ksObjectNurbsSurfacesByCurvesMeshs | 11290 | Коллекция поверхностей по сети кривых |
| ksObjectNurbsSurfaceByCurvesMesh | 11291 | Поверхность по сети кривых |
| ksObjectJointSurfaces | 11292 | Коллекция поверхностей соединения |
| ksObjectJointSurface | 11293 | Поверхность соединения |
| ksObjectBodyRepositions | 11294 | Коллекция операций перепозиционирования тела, поверхности |
| ksObjectBodyReposition | 11295 | Перепозиционирование тела, поверхности |
| ksObjectDistanceAngleMeasurements3D | 11296 | Коллекция измерений расстояния и угла |
| ksObjectDistanceAngleMeasurement3D | 11297 | Измерение расстояния и угла |
| ksObjectEdgeLengthMeasurements3D | 11298 | Коллекция измерений длины ребра |
| ksObjectEdgeLengthMeasurement3D | 11299 | Измерение длины ребра |
| ksObjectAreaMeasurements3D | 11300 | Коллекция измерений площади |
| ksObjectAreaMeasurement3D | 11301 | Измерение площади |
| ksObjectSheetMetalSketchBends | 11302 | Коллекция операций сгиб по эскизу |
| ksObjectSheetMetalSketchBend | 11303 | Сгиб по эскизу |
| ksObjectSheetMetalClosedCorners | 11304 | Коллекция операций Замыкание углов |
| ksObjectSheetMetalClosedCorner | 11305 | Замыкание углов |
| ksObjectSheetMetalPlates | 11306 | Коллекция операций Пластина |
| ksObjectSheetMetalPlate | 11307 | Пластина |
| ksObjectSheetMetalUndercuts | 11308 | Коллекция операций Подсечка |
| ksObjectSheetMetalUndercut | 11309 | Подсечка |
| ksObjectSheetMetalBendedStraightens | 11310 | Коллекция операций Согнуть/Разогнуть |
| ksObjectSheetMetalBendedStraighten | 11311 | Согнуть/Разогнуть |
| ksObjectSheetMetalPressFormings | 11312 | Коллекция операций открытая или закрытая штамповка |
| ksObjectSheetMetalPressForming | 11313 | Открытая или закрытая штамповка |
| ksObjectSheetMetalShoulders | 11314 | Коллекция операций буртик |
| ksObjectSheetMetalShoulder | 11315 | Буртик |
| ksObjectSheetMetalJalousies | 11316 | Коллекция операций жалюзи |
| ksObjectSheetMetalJalousie | 11317 | Жалюзи |
| ksObjectSheetMetalRibs | 11318 | Коллекция операций ребро усиления |
| ksObjectSheetMetalRib | 11319 | Ребро усиления |
| ksObjectSheetMetalRuledShells | 11320 | Коллекция операций Обечайка |
| ksObjectSheetMetalRuledShell | 11321 | Обечайка |
| ksObjectSheetMetalLinearRuledShells | 11322 | Коллекция операций Линейчатая обечайка |
| ksObjectSheetMetalLinearRuledShell | 11323 | Линейчатая обечайка |
| ksObjectLibraryHoleParameters | 11324 | Параметры отверстия из библиотеки |
| ksObjectFullFillets | 11325 | Коллекция операций полного скругления |
| ksObjectFullFillet | 11326 | Полное скругление |
| ksObjectZone | 11327 | Зона |
| ksObjectZonesManager | 11328 | Менеджер зон |
| ksObjectZoneParametersByObjects | 11329 | Параметры зоны по суммарному габариту объектов |
| ksObjectZoneParametersByBorderPoints | 11330 | Параметры зоны, заданной габаритным параллелепипедом |
| ksObjectZoneDivision | 11331 | Разбить зону |
| ksObjectZoneDivisionParametersByPlanes | 11332 | Параметры разбиения зоны для способа По набору плоскостей |
| ksObjectZoneDivisionParametersRegular | 11333 | Параметры разбиения зоны для способа Равномерно по осям |
| ksObjectDynamicCrossSection | 11334 | Динамическое сечение |
| ksObjectDynamicCrossSectionStep | 11335 | Шаг динамического сечения |
| ksObjectDynamicCrossSectionStepParametersByFreePlane | 11336 | Параметры шага динамического сечения по произвольной плоскости |
| ksObjectDynamicCrossSectionStepParametersByOffsetPlane | 11337 | Параметры шага динамического сечения по смещенной плоскости |
| ksObjectDynamicCrossSectionStepParametersByRotatedPlane | 11338 | Параметры шага динамического сечения по плоскости под углом |
| ksObjectDynamicCrossSectionStepParametersByZone | 11339 | Параметры шага динамического сечения по зоне |
| ksObjectDynamicCrossSectionStepParametersByBorderPoints | 11340 | Параметры шага динамического сечения по габаритному параллелепипеду заданному точками |
| ksObjectAxisLine3D | 11341 | Осевая линия |
| ksObjectRestoredSurfaces | 11342 | Коллекция операций восстановленная поверхность |
| ksObjectRestoredSurface | 11343 | Восстановленная поверхность |
| ksObjectWireFrames3D | 11344 | Коллекция трехмерных каркасов |
| ksObjectWireFrame3D | 11345 | Трехмерный каркас |
| ksObjectDismantleStep | 11346 | Шаг разнесения сборки |
| ksObjectArcDimension3D | 11347 | Размер дуги окружности 3D |
| ksObjectArcDimensions3D | 11348 | Коллекция размеров дуги окружностей 3D |
| ksObjectSheetMetalPunch | 11349 | Листовой металл, штамповка телом |
| ksObjectSheetMetalPunchs | 11350 | Коллекция операций Листовой металл, штамповка телом |
| ksObjectSheetMetalFlanging | 11351 | Листовой металл, отбортовка |
| ksObjectSheetMetalFlangings | 11352 | Коллекция операций Листовой металл, отбортовка |
| ksObjectFaceMovers | 11353 | Коллекция операций перемещения граней |
| ksObjectFaceMover | 11354 | Операция перемещения граней |
| ksObjectSplitSolid | 11355 | Операция “Разрезать” |
| ksObjectSplitSolids | 11356 | Коллекция операций “Разрезать” |
| ksObjectModelText | 11357 | Текст в модели |
| ksObjectModelTexts | 11358 | Коллекция текстов в модели |
| ksObjectModelTable | 11359 | Таблица в модели |
| ksObjectModelTables | 11360 | Коллекция таблиц в модели |
| ksObjectConicCurve3D | 11361 | Коническая 3D кривая |
| ksObjectConicCurves3D | 11362 | Коллекция конических кривых 3D |
| ksObjectComponentPositioner | 11363 | Интерфейс управления положением компонентов в сборке |
| ksObjectConicSurface | 11364 | Поверхность конического сечения |
| ksObjectConicSurfaces | 11365 | Коллекция поверхностей конического сечения |
| ksObjectConvertToSheetMetal | 11366 | Операции преобразования в листовое тело |
| ksObjectConvertsToSheetMetals | 11367 | Коллекция операций преобразования в листовое тело |
| ksObjectExtensionCurves | 11368 | Коллекция продлений кривых |
| ksObjectExtensionCurve | 11369 | Продления кривой |
| ksObjectRuledSurfaceParametersByFaces | 11370 | Параметры линейчатой поверхности "По двум поверхностям" |
| ksObjectRuledSurfaceTangentParametersByCurveAndFace | 11371 | Параметры линейчатой поверхности "По кривой с касанием к поверхности" |
| ksObjectRuledSurfaceParametersByCurveAndFace | 11372 | Параметры линейчатой поверхности "'По кривой и поверхности" |
| ksObjectRuledSurfaceParametersByCurveAndDir | 11373 | Параметры линейчатой поверхности "По кривой и направлению" |
| ksObjectViewProjection | 11374 | Интерфейс проекции отображения модели в окне |
| ksObjectViewProjectionManager | 11375 | Менеджер проекций отображения модели в окне |
| ksObjectPlane3DUnhistoried | 11376 | Плоскость без истории |
| ksObjectDraftFromEdges | 11377 | Уклон от базовой линии |
| ksObjectDraftsFromEdges | 11378 | Коллекции операций Уклон от базовой линии |
| ksObjectPoint3DParamBetweenPoints | 11379 | Интерфейс параметров пространственной точки между точками |
| ksObjectMeasurement3D | 11380 | Измерение расстояния и угла |
| ksObjectMultiSpline3D | 11381 | Ассоциативный сплайн по объектам |
| ksObjectMultiSplines3D | 11382 | Коллекция ассоциативных сплайнов по объектам |
| ksObjectBodySurfaceRemovers | 11383 | Коллекция операций удаления тел и поверхностей |
| ksObjectBodySurfaceRemover | 11384 | Удаление тел и поверхностей |
| ksObjectDrawingObject | 13000 | Графический объект |
| ksObjectDrawingText | 13001 | Текст на чертеже |
| ksObjectDrawingTexts | 13002 | Коллекция текстов на чертеже |
| ksObjectStraightAxis | 13003 | Прямая ось |
| ksObjectCircleAxis | 13004 | Круговая ось |
| ksObjectArcAxis | 13005 | Дуговая ось |
| ksObjectBuildingAxes | 13006 | Коллекция строительных осей |
| ksObjectAxisJut | 13007 | Выступ оси |
| ksObjectMarkNodes | 13008 | Kоллекция узлов для вставки марки |
| ksObjectMarkNode | 13009 | Узел для вставки дополнительных марок |
| ksObjectMarkOnLeader | 13010 | Марка/позиционное обозначение с линией-выноской |
| ksObjectMarkOnLine | 13011 | Марка/позиционное обозначение на линии |
| ksObjectMarkInsideForm | 13012 | Марка/позиционное обозначение без линии-выноски |
| ksObjectMarks | 13013 | Коллекция марок |
| ksObjectCutUnitMarking | 13014 | Обозначение узла в сечении |
| ksObjectCutUnitMarkings | 13015 | Коллекция обозначений узла в сечении |
| ksObjectUnitMarking | 13016 | Обозначение узла |
| ksObjectUnitMarkings | 13017 | Коллекция обозначений узлов |
| ksObjectUnitNumber | 13018 | Номер узла |
| ksObjectUnitNumbers | 13019 | Коллекция номеров узлов |
| ksObjectMultiTextLeader | 13020 | Выносная надпись к многослойным конструкциям |
| ksObjectMultiTextLeaders | 13021 | Коллекция выносных надписей к многослойным конструкциям |
| ksObjectBrace | 13022 | Фигурная скобка |
| ksObjectBraces | 13023 | Коллекция фигурных скобок |
| ksObjectLineSegments | 13024 | Коллекция отрезков |
| ksObjectLineSegment | 13025 | Отрезок |
| ksObjectRadialDimension | 13028 | Радиальный размер |
| ksObjectDiametralDimension | 13029 | Диаметральный размер |
| ksObjectBreakRadialDimension | 13030 | Радиальный размер с изломом |
| ksObjectRadialDimensions | 13031 | Коллекция радиальных размеров |
| ksObjectBreakRadialDimensions | 13032 | Коллекция радиальных размеров с изломом |
| ksObjectDiametralDimensions | 13033 | Коллекция диаметральных размеров |
| ksObjectLineDimension | 13041 | Линейный размер |
| ksObjectLineDimensions | 13042 | Коллекция линейных размеров |
| ksObjectBreakLineDimension | 13043 | Линейный размер с обрывом |
| ksObjectBreakLineDimensions | 13044 | Коллекция линейных размеров с обрывом |
| ksObjectHeightDimension | 13045 | Размер высоты |
| ksObjectHeightDimensions | 13046 | Коллекция размеров высоты |
| ksObjectAngleDimension | 13047 | Угловой размер |
| ksObjectBreakAngleDimension | 13048 | Угловой размер c обрывом |
| ksObjectAngleDimensions | 13049 | Коллекция угловых размеров |
| ksObjectArcDimension | 13050 | Размер дуги окружности |
| ksObjectArcDimensions | 13051 | Коллекция размеров дуг окружностей |
| ksObjectLeader | 13052 | Простая линия выноски |
| ksObjectLeaders | 13053 | Коллекция линий выносок |
| ksObjectRough | 13054 | Обозначение шероховатости |
| ksObjectRoughs | 13055 | Коллекция обозначений шероховатости |
| ksObjectMarkLeader | 13056 | Знак маркировки |
| ksObjectBrandLeader | 13057 | Знак клеймения |
| ksObjectPositionLeader | 13058 | Линия выноски для обозначения позиции |
| ksObjectChangeLeader | 13059 | Обозначение изменения |
| ksObjectBase | 13060 | Обозначение базы |
| ksObjectBases | 13061 | Коллекция обозначений базы |
| ksObjectDrawingTable | 13062 | Таблица на чертеже |
| ksObjectDrawingTables | 13063 | Коллекция таблиц на чертеже |
| ksObjectTolerance | 13064 | Допуск формы |
| ksObjectTolerances | 13065 | Коллекция допусков формы |
| ksObjectCutLines | 13066 | Коллекция линий разреза/сечения |
| ksObjectCutLine | 13067 | Линия разреза/сечения |
| ksObjectViewPointer | 13068 | Cтрелка взгляда |
| ksObjectViewPointers | 13069 | Коллекция стрелок взгляда |
| ksObjectDrawingContour | 13072 | Контур на чертеже |
| ksObjectDrawingContours | 13073 | Коллекция контуров на чертеже |
| ksObjectCircles | 13074 | Коллекция окружностей |
| ksObjectCircle | 13075 | Окружность |
| ksObjectPoints | 13076 | Коллекция точек |
| ksObjectPoint | 13077 | Точка |
| ksObjectBeziers | 13078 | Коллекция Bezier сплайнов |
| ksObjectBezier | 13079 | Bezier сплайн |
| ksObjectMacroObjects | 13080 | Коллекция макроэлементов |
| ksObjectMacroObject | 13081 | Макроэлемент |
| ksObjectLines | 13082 | Коллекция линий |
| ksObjectLine | 13083 | Линия |
| ksObjectPolyLines2D | 13084 | Коллекция полилиний |
| ksObjectPolyLine2D | 13085 | Полилиния |
| ksObjectNurbses | 13086 | Коллекция Nurbs-сплайнов |
| ksObjectNurbs | 13087 | Nurbs-сплайн |
| ksObjectRasters | 13088 | Коллекция растровых объектов |
| ksObjectRaster | 13089 | Растровый объект |
| ksObjectOleDrawingObjects | 13090 | Коллекция OLE-объектов |
| ksObjectOleDrawingObject | 13091 | OLE-объект |
| ksObjectEllipses | 13092 | Коллекция эллипсов |
| ksObjectEllipse | 13093 | Эллипс |
| ksObjectEllipseArcs | 13094 | Коллекция дуг эллипсов |
| ksObjectEllipseArc | 13095 | Дуга эллипса |
| ksObjectRectangles | 13096 | Коллекция прямоугольников |
| ksObjectRectangle | 13097 | Прямоугольник |
| ksObjectRegularPolygons | 13098 | Коллекция многоугольников |
| ksObjectRegularPolygon | 13099 | Многоугольник |
| ksObjectEquidistants | 13100 | Коллекция эквидистант |
| ksObjectEquidistant | 13101 | Эквидистанта |
| ksObjectInsertionFragment | 13102 | Вставка фрагмента |
| ksObjectInsertionView | 13103 | Вставка вида из другого чертежа |
| ksObjectInsertionObjects | 13104 | Коллекция вставок фрагментов и видов |
| ksObjectInsertionDefinition | 13105 | Описание вставки фрагмента и вида |
| ksObjectCentreMarkers | 13106 | Коллекция обозначений центров |
| ksObjectCentreMarker | 13107 | Обозначение центра |
| ksObjectRemoteElements | 13108 | Коллекция выносных элементов |
| ksObjectRemoteElement | 13109 | Выносной элемент |
| ksObjectAxisLines | 13110 | Коллекция осевых линий |
| ksObjectAxisLine | 13111 | Осевая линия |
| ksObjectHatchParam | 13112 | Параметры штриховки |
| ksObjectDrawingGroup | 13113 | Группа объектов |
| ksObjectDrawingGroups | 13114 | Коллекция групп объектов |
| ksObjectCurve2D | 13115 | Математическая 2D кривая |
| ksObjectHatches | 13116 | Коллекция штриховок |
| ksObjectHatch | 13117 | Штриховка |
| ksObjectColourings | 13118 | Коллекция заливок |
| ksObjectColouring | 13119 | Заливка |
| ksObjectSpecRough | 13120 | Неуказанная шероховатость |
| ksObjectTechnicalDemand | 13121 | Технические требования |
| ksObjectAnnotativeLineSegment | 13122 | Аннотационный отрезок |
| ksObjectAnnotativeCircle | 13123 | Аннотационная окружность |
| ksObjectAnnotativeEllipse | 13124 | Аннотационный эллипс |
| ksObjectAnnotativeArc | 13125 | Аннотационная дуга |
| ksObjectAnnotativeEllipseArc | 13126 | Аннотационная дуга эллипса |
| ksObjectAnnotativePolyLine | 13127 | Аннотационная полилиния |
| ksObjectAnnotativePoint | 13128 | Аннотационная точка |
| ksObjectAnnotativeText | 13129 | Т екст с аннотационной точкой привязки |
| ksObjectBuildingCutLines | 13131 | Коллекция линий разреза/сечения для СПДС |
| ksObjectBuildingCutLine | 13132 | Линия разреза/сечения для СПДС |
| ksObjectWaveLines | 13133 | Коллекция волнистых линий |
| ksObjectWaveLine | 13134 | Волнистая линия |
| ksObjectBrokenLines | 13135 | Коллекция линий обрыва с изломами |
| ksObjectBrokenLine | 13136 | Линия обрыва с изломами |
| ksObjectCopyObjectParam | 13137 | Параметры копирования объектов |
| ksObjectCurveCopyObjectParam | 13138 | Параметры копирования объектов вдоль кривой |
| ksObjectCircleCopyObjectParam | 13139 | Параметры копирования объектов по окружности |
| ksObjectCircularCopyObjectParam | 13140 | Параметры копирования объектов по концентрической сетке |
| ksObjectMeshCopyObjectParam | 13141 | Параметры копирования объектов по сетке |
| ksObjectLocalCoordinateSystem2D | 13142 | Локальная система координат |
| ksObjectLocalCoordinateSystems2D | 13143 | Коллекция локальных систем координат |
| ksObjectAttachedLeader | 13144 | Присоединенная линия выноски (не имеет текстов) |
| ksObjectAttachedLeaders | 13145 | Коллекция присоединенных линий выносок |
| ksObjectLoadCombinationsParam | 13146 | Параметры типа загрузки документа |
| ksObjectOpenDocumentParam | 13147 | Параметры открытия документа |
| ksObjectAssociationTables | 13148 | Коллекция ассоциативных таблиц |
| ksObjectAssociationTable | 13149 | Ассоциативная таблица |
| ksObjectNurbsesByPoints | 13150 | Коллекция NURBS-кривых по точкам |
| ksObjectNurbsByPoints | 13151 | NURBS-кривая по точкам |
| ksObjectProcess2D | 13152 | Процесс 2D из библиотеки |
| ksObjectPhantom2D | 13153 | Параметры фантома 2D |
| ksObjectProcess3D | 13154 | Процесс 3D из библиотеки |
| ksObjectUserDesignationCompObj | 13155 | Составной пользовательский объект обозначение 3D |
| ksObjectUserFolder | 13156 | Пользовательская директория |
| ksObjectUserFolders | 13157 | Пользовательские директории |
| ksObjectMeshObject3D | 13158 | Пространственный полигональный объект |
| ksObjectConicCurves | 13159 | Коллекция конический кривых |
| ksObjectConicCurve | 13160 | Коническая кривая |
| ksObjectCircularsCentries | 13161 | Коллекция круговых сеток центров |
| ksObjectCircularCentres | 13162 | Круговая сетка центров |
| ksObjectLinearsCentries | 13163 | Коллекция линейных сеток центров |
| ksObjectLinearCentres | 13164 | Линейная сетка центров |
| ksObjectFindObjectParameters | 13165 | Параметры поиска объектов |
| ksObjectManipulators | 13166 | Коллекция манипуляторов |
| ksObjectPlacement3DManipulator | 13167 | Манипулятор системы координат |
| ksObjectEditDoubleManipulator | 13168 | Манипулятор в виде редактора числового значения |
| ksObjectMouseEnterLeaveParameters | 13169 | Параметры отображения точки, позволяющей определить место применения контрола |
| ksObjectConditionIntersect | 13170 | Условное пересечение |
| ksObjectConditionIntersects | 13171 | Коллекция условных пересечений |
| ksObjectSaveAsDetailParam | 13172 | Параметры преобразования в модель |
| ksObjectFindObject3DParameters | 13173 | Параметры поиска объектов 3D |
| ksObjectNumericGroup | 13174 | Группа автонумерации. |
| ksObjectUserComponentOperation | 13175 | Пользовательская операция над вставками |
| ksObjectStraightSlots | 13176 | Коллекция пазов |
| ksObjectStraightSlot | 13177 | Паз |
| ksObjectArcSlots | 13178 | Коллекция пазов дуговых |
| ksObjectArcSlot | 13179 | Паз дуговой |
| ksObjectWrappedCurve | 13180 | Свернутая или развернутая кривая |
| ksObjectWrappedCurves | 13181 | Коллекция свернутых и развернутых кривых |
| ksObjectAuxMeshObject | 13182 | Объект окружения |
| ksObjectAuxMeshPrimitive | 13183 | Примитив объекта окружения |
| ksObjectElementaryBodies | 13184 | Коллекция элементарных тел |
| ksObjectSphere | 13185 | Сфера |
| ksObjectCylinder | 13186 | Цилиндр |
| ksObjectBlockByPoints | 13187 | Параллелепипед по двум точкам и высоте |
| ksObjectBlockBySizes | 13188 | Параллелепипед по точке и трем размерам |
| ksObjectConeByAngle | 13189 | Конус по центру основания, диаметрам и углу |
| ksObjectConeByHeight | 13190 | Конус по центру основания, диаметрам и высоте |
| ksObjectConeByArcs | 13191 | Конус по двум дугам |
| ksObjectMiddleSurface | 13192 | Средняя поверхность |
| ksObjectMiddleSurfaces | 13193 | Коллекция средних поверхностей |
| ksObjectDeleteHistoryParam | 13194 | Параметры удаления истории построения |
| ksObjectMenu | 13195 | Меню |
| ksObjectInsertPartParameters | 13196 | Параметры добавления вставки модели в сборку |
| ksObjectPipeElement | 13197 | Трубчатый элемент |
| ksObjectPipeElements | 13198 | Колекция трубчатых элементов |
-23
View File
@@ -1,23 +0,0 @@
---
title: "ksAccuracyEnum - Количество знаков после запятой"
type: enum
api: [api7]
tags: [enum, api7, ksaccuracyenum]
sources:
- ksaccuracyenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksAccuracyDefault | -1 | По умолчанию. Использовать настройки |
| --- | --- | --- |
| ksAccuracy0 | 0 | 0. |
| ksAccuracy1 | 1 | 0,1. |
| ksAccuracy2 | 2 | 0,12. |
| ksAccuracy3 | 3 | 0,123. |
| ksAccuracy4 | 4 | 0,1234. |
| ksAccuracy5 | 5 | 0,12345. |
| ksAccuracy6 | 6 | 0,123456. |
| ksAccuracy7 | 7 | 0,1234567. |
| ksAccuracy8 | 8 | 0,12345678. |
| ksAccuracy9 | 9 | 0,123456789. |
-18
View File
@@ -1,18 +0,0 @@
---
title: "ksAlignEnum - Выравнивание"
type: enum
api: [api7]
tags: [enum, api7, ksalignenum]
sources:
- ksalignenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksAlignLeft | 0 | Выравнивание слева |
| --- | --- | --- |
| ksAlignCenter | 1 | Выравнивание по центру |
| ksAlignRight | 2 | Выравнивание справа |
| ksAlignAllWidth | 3 | Выравнивание на всю ширину |
| ksAlignDecimal | 3 | Выравнивание по десятичной точке |
| ksAlignDefault | -1 | По умолчанию (из стиля) |
@@ -1,15 +0,0 @@
---
title: "ksAlignmentTypeEnum Тип ориентации объекта"
type: enum
api: [api7]
tags: [enum, api7, ksalignmenttypeenum]
sources:
- ksalignmenttypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksATArbitrary | 0 | Произвольная |
| --- | --- | --- |
| ksATHorizontal | 1 | Горизонтальная |
| ksATVertical | 2 | Вертикальная |
@@ -1,15 +0,0 @@
---
title: "ksAllocationEnum Размещение текста относительно точки привязки"
type: enum
api: [api7]
tags: [enum, api7, ksallocationenum]
sources:
- ksallocationenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksAlLeft | 0 | Слева |
| --- | --- | --- |
| ksAlCentre | 1 | По центру |
| ksAlRight | 2 | Справа |
@@ -1,15 +0,0 @@
---
title: "ksAngleDimTypeEnum - Тип углового размера"
type: enum
api: [api7]
tags: [enum, api7, ksangledimtypeenum]
sources:
- ksangledimtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksADMinAngle | 0 | На минимальный (острый) угол |
| --- | --- | --- |
| ksADMaxAngle | 1 | На максимальный (тупой) угол |
| ksADMoreAngle | 2 | На угол более 180 гр |
-16
View File
@@ -1,16 +0,0 @@
---
title: "ksAngleEnum - Углы поворота, кратные 90 градусам"
type: enum
api: [api7]
tags: [enum, api7, ksangleenum]
sources:
- ksangleenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksAngle0 | 0 | 0 градусов |
| --- | --- | --- |
| ksAngle90 | 1 | 90 градусов |
| ksAngle180 | 2 | 180 градусов |
| ksAngle270 | 3 | 270 градусов |
@@ -1,16 +0,0 @@
---
title: "ksAngleTypeEnum - Признак типа угла"
type: enum
api: [api7]
tags: [enum, api7, ksangletypeenum]
sources:
- ksangletypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksError | -2 | Ошибка |
| --- | --- | --- |
| ksConcave | -1 | Угол вогнутый |
| ksNeutral | 0 | Плоский угол |
| ksConvex | 1 | Угол выпуклый |
@@ -1,22 +0,0 @@
---
title: "ksAnnotationSymbolEnum - Аннотационные символы"
type: enum
api: [api7]
tags: [enum, api7, ksannotationsymbolenum]
sources:
- ksannotationsymbolenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksUnknownSymbol | 0 | Символ не определен |
| --- | --- | --- |
| ksDotPoint | 1 | Точка |
| ksPlusPoint | 2 | Крестик |
| ksXPoint | 3 | X-точка |
| ksSquarePoint | 4 | Квадрат |
| ksTrianglePoint | 5 | Треугольник |
| ksCirclePoint | 6 | Окружность |
| ksAsteriskPoint | 7 | Звезда |
| ksStrikeSquarePoint | 8 | Перечеркнутый квадрат |
| ksPlusPointTwo | 9 | Утолщенный плюс |
@@ -1,41 +0,0 @@
---
title: "ksAnnotativeTerminatorSignEnum - Типы специальных символов для аннотационных объектов"
type: enum
api: [api7]
tags: [enum, api7, ksannotativeterminatorsignenum]
sources:
- ksannotativeterminatorsignenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksASUnknown | 0 | Не задан |
| --- | --- | --- |
| ksASArrowInside | 101 | Стрелка (ласточкин хвост) изнутри |
| ksASArrowOutside | 102 | Стрелка (ласточкин хвост) снаружи |
| ksASNotchTail | 103 | Засечка с продолжением кривой (с хвостиком) |
| ksASUpHalfArrow | 104 | Верхняя половина стрелки изнутри |
| ksASDownHalfArrow | 105 | Нижняя половина стрелки изнутри |
| ksASBigArrowInside | 106 | Большая стрелка изнутри (7мм) |
| ksASArrowOrdinate | 107 | Стрелка для размера высоты (штрихи длиной 4мм под углом 45гр) |
| ksASTriangle | 108 | Треугольник по направлению кривой |
| ksAScircleRad2 | 109 | Окружность радиусом 2мм тонкой линией - для шероховатости и линии-выноски |
| ksASCentreMarker | 110 | Обозначение фиктивного центра в виде большого креста |
| ksASGlueSign | 111 | Знак склеивания |
| ksASSolderingSign | 112 | Знак пайки |
| ksASSewingSign | 113 | Знак сшивания |
| ksASCrampSign | 114 | Знак соединения внахлестку металлическими скобами |
| ksASCornerCrampSign | 115 | Знак углового соединения металлическими скобами |
| ksASMontageJointSign | 116 | Знак монтажного шва |
| ksASNotch | 117 | Засечка без продолжения кривой (без хвостика) |
| ksASBaseTriangle | 118 | Треугольник по текущей СК - для базы |
| ksASClosedArrowInside | 119 | Закрытая стрелка изнутри |
| ksASClosedArrowOutside | 120 | Закрытая стрелка снаружи |
| ksASOpenArrowInside | 121 | Открытая стрелка изнутри |
| ksASOpenArrowOutside | 122 | Открытая стрелка снаружи |
| ksASRightAngleInside | 123 | Стрелка 90гр изнутри |
| ksASRightAngleOutside | 124 | Стрелка 90гр снаружи |
| ksASDot | 125 | Точка (диаметр равен длине стрелки размера) |
| ksASSmallDot | 126 | Точка маленькая (диаметр равен 0,6 длины стрелки размера) |
| ksASPoint | 127 | Вспомогательная точка |
| ksASLeftNotch | 128 | Засечка с наклоном влево |
-17
View File
@@ -1,17 +0,0 @@
---
title: "ksAPITypeEnum - Тип API"
type: enum
api: [api7]
tags: [enum, api7, ksapitypeenum]
sources:
- ksapitypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksAPIUndef | 0 | Интерфейс неопределённого типа |
| --- | --- | --- |
| ksAPI5Auto | 1 | API5 - интерфейсы автоматизации |
| ksAPI7Dual | 2 | API7 - дуальные интерфейсы |
| ksAPI3DCom | 3 | API 3D COM - интерфейсы |
| ksAPI | 4 | API - интерфейсы |
@@ -1,17 +0,0 @@
---
title: "ksArc3DBuildingTypeEnum - Способ создания 3D дуги"
type: enum
api: [api7]
domain: [3d]
tags: [enum, api7, 3d, ksarc3dbuildingtypeenum]
sources:
- ksarc3dbuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksArc3DByPoints | 0 | По трем точкам |
| --- | --- | --- |
| ksArc3DByCentre | 1 | По центру, углам и плоскости |
| ksArc3DByDirrection | 2 | По двум точкам и направлению |
| ksArc3DByTanCurve | 3 | Касательно к кривой |
@@ -1,20 +0,0 @@
---
title: "ksArc3DParameterEnum - Индекс параметра 3D дуги"
type: enum
api: [api7]
domain: [3d]
tags: [enum, api7, 3d, ksarc3dparameterenum]
sources:
- ksarc3dparameterenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksArc3DCenter | 0 | Точка центра |
| --- | --- | --- |
| ksArc3DPoint1 | 1 | Точка 1 |
| ksArc3DPoint2 | 2 | Точка 2 |
| ksArc3DPoint3 | 3 | Точка 3 |
| ksArc3DAngle1 | 1 | Угол 1 |
| ksArc3DAngle2 | 2 | Угол 2 |
| ksArc3DRadius | 3 | Радиус |
@@ -1,14 +0,0 @@
---
title: "ksArchMeasureEnum - Способ задания глубины прогиба"
type: enum
api: [api7]
tags: [enum, api7, ksarchmeasureenum]
sources:
- ksarchmeasureenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksArchMeasureByCoefficient | 0 | Глубина прогиба задана коэффициентом прогиба, в % |
| --- | --- | --- |
| ksArchMeasureByLength | 1 | Глубина прогиба задана расстоянием |
@@ -1,16 +0,0 @@
---
title: "ksArcSlotPointEnum - Индекс точки паза дугового"
type: enum
api: [api7]
tags: [enum, api7, ksarcslotpointenum]
sources:
- ksarcslotpointenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksArcSlotArcCentre1 | 1 | Первый центр |
| --- | --- | --- |
| ksArcSlotMiddle | 2 | Точка на оси паза |
| ksArcSlotArcCentre2 | 3 | Второй центр |
| ksArcSlotCentre | 4 | Центр паза |
-31
View File
@@ -1,31 +0,0 @@
---
title: "ksArrowEnum Тип стрелки линии-выноски"
type: enum
api: [api7]
tags: [enum, api7, ksarrowenum]
sources:
- ksarrowenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| Тип стрелки | Константа | | Объекты со стрелками | | | | | |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| | | | Размеры | Линии-выноски | Обозначения позиций | Многослойные линии-выноски | Марки и позиционные обозначения | Обозначения шероховатости |
| | ksLeaderWithoutArrow | 0 | + | + | + | + | + | |
| Вспомогательная точка | ksLeaderPoint | 1 | + | + | + | + | + | + |
| Стрелка | ksLeaderArrow | 2 | + | + | + | + | + | |
| Без стрелки | ksWithoutArrow | 0 | + | + | + | + | + | + |
| Вспомогательная точка | ksPoint | 1 | + | + | + | + | + | |
| Стрелка | ksArrow | 2 | + | + | + | + | + | |
| Верхняя половина стрелки изнутри | ksUpHalfArrow | 3 | + | + | - | + | + | |
| Нижняя половина стрелки изнутри | ksDownHalfArrow | 4 | + | + | - | + | + | |
| Засечка | ksNotch | 5 | + | + | - | + | + | + |
| Засечка с наклоном влево | ksLeftNotch | 6 | + | + | - | + | + | + |
| Угол 90 град | ksRightAngle | 7 | + | + | + | + | + | |
| Стрелка закрытая | ksClosedArrow | 8 | + | + | + | + | + | + |
| Стрелка открытая | ksOpenArrow | 9 | + | + | + | + | + | + |
| Точка | ksDot | 10 | + | + | + | + | + | |
| Точка маленькая | ksSmallDot | 11 | + | + | + | + | + | |
| Треугольник 60 град | ksTriangle60 | 12 | - | + | - | + | + | |
| Треугольник 90 град | ksTriangle90 | 13 | - | + | - | + | + | |
@@ -1,17 +0,0 @@
---
title: "ksAttributeTypeEnum - Тип данных для типа атрибута"
type: enum
api: [api7]
tags: [enum, api7, ksattributetypeenum]
sources:
- ksattributetypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksATUnknown | -1 | Неизвестный |
| --- | --- | --- |
| ksATString | 0 | Строка |
| ksATDouble | 1 | Число |
| ksATFixedTable | 2 | Таблица с фиксированным числом строк |
| ksATVariableTable | 3 | Таблица с переменным числом строк |
@@ -1,15 +0,0 @@
---
title: "ksBasisVectorTypeEnum - Типы базисного вектора"
type: enum
api: [api7]
tags: [enum, api7, ksbasisvectortypeenum]
sources:
- ksbasisvectortypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksTangentVector | 0 | Касательный вектор |
| --- | --- | --- |
| ksNormalVector | 1 | Вектор главной нормали |
| ksBinormalVector | 2 | Вектор бинормали |
@@ -1,16 +0,0 @@
---
title: "ksBendAngleReleaseTypeEnum - Способ освобождения угла сгиба"
type: enum
api: [api7]
domain: [sheetmetal]
tags: [enum, api7, sheetmetal, ksbendanglereleasetypeenum]
sources:
- ksbendanglereleasetypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBendAngleBendOnly | 0 | Только сгиб |
| --- | --- | --- |
| ksBendAngleIn | 1 | Сгиб и продолжение |
| ksBendAngleAllBends | 2 | Все сгибы |
@@ -1,20 +0,0 @@
---
title: "ksBendDisposalEnum - Тип размещения сгиба на ребре"
type: enum
api: [api7]
domain: [sheetmetal]
tags: [enum, api7, sheetmetal, ksbenddisposalenum]
sources:
- ksbenddisposalenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBendDisposalAllLength | 0 | По всей длине |
| --- | --- | --- |
| ksBendDisposalCentre | 1 | По центру |
| ksBendDisposalLeft | 2 | Отступ слева |
| ksBendDisposalRight | 3 | Отступ справа |
| ksBendDisposalTwo | 4 | Два отступа |
| ksBendDisposalLeftAndWidth | 5 | Отступ слева и по ширине |
| ksBendDisposalRightAndWidth | 6 | Отступ справа и по ширине |
@@ -1,17 +0,0 @@
---
title: "ksBendLengthTypeEnum - Тип определения длины"
type: enum
api: [api7]
tags: [enum, api7, ksbendlengthtypeenum]
sources:
- ksbendlengthtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBendLengthByContinue | 0 | По продолжению |
| --- | --- | --- |
| ksBendLengthByContour | 1 | По контуру |
| ksBendLengthByTouch | 2 | По касанию |
| ksBendLengthByContourInternal | 3 | По контуру внутри |
| ksBendLengthByTangentInternal | 4 | По касанию внутри |
@@ -1,18 +0,0 @@
---
title: "ksBendOffsetTypeEnum - Тип смещения"
type: enum
api: [api7]
tags: [enum, api7, ksbendoffsettypeenum]
sources:
- ksbendoffsettypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBendOffsetIn | 0 | Смещение внутрь |
| --- | --- | --- |
| ksBendOffsetOut | 1 | Смещение наружу |
| ksBendOffsetLineOutside | 2 | По внешней линии контура |
| ksBendOffsetLineInside | 3 | По внутренней линии контура |
| ksBendOffsetByTouch | 4 | По касанию к сгибу |
| ksBendByCentre | 5 | По центру |
@@ -1,14 +0,0 @@
---
title: "ksBendReleaseTypeEnum - Тип освобождения cгиба"
type: enum
api: [api7]
tags: [enum, api7, ksbendreleasetypeenum]
sources:
- ksbendreleasetypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBendReleaseByRect | 0 | Прямоугольное |
| --- | --- | --- |
| ksBendReleaseByCircle | 1 | Скругленное |
@@ -1,15 +0,0 @@
---
title: "ksBendSideTypeEnum - Тип построения боковой стороны сгиба"
type: enum
api: [api7]
domain: [sheetmetal]
tags: [enum, api7, sheetmetal, ksbendsidetypeenum]
sources:
- ksbendsidetypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBendSideByAngle | 0 | По уклону и углу |
| --- | --- | --- |
| ksBendSideByWidening | 1 | По расширению |
-18
View File
@@ -1,18 +0,0 @@
---
title: "ksBendTypeEnum - Способ сгиба"
type: enum
api: [api7]
domain: [sheetmetal]
tags: [enum, api7, sheetmetal, ksbendtypeenum]
sources:
- ksbendtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksLineBend | 0 | По линии сгиба |
| --- | --- | --- |
| ksBendLineOutside | 1 | Линия сгиба снаружи |
| ksBendLineInside | 2 | Линия сгиба внутри |
| ksBendByTouch | 3 | По касанию |
| ksBendByCentre | 4 | По центру |
@@ -1,15 +0,0 @@
---
title: "ksBlockPositionTypeEnum - Тип привязки тела"
type: enum
api: [api7]
tags: [enum, api7, ksblockpositiontypeenum]
sources:
- ksblockpositiontypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksVertex | 0 | Вершина |
| --- | --- | --- |
| ksEdgeCenter | 1 | Центр ребра параллельного оси X |
| ksFaceCenter | 2 | Центр грани |
-16
View File
@@ -1,16 +0,0 @@
---
title: "ksBmpSizeEnum - Размеры иконок"
type: enum
api: [api7]
tags: [enum, api7, ksbmpsizeenum]
sources:
- ksbmpsizeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBmp1616 | 0 | 16*16 |
| --- | --- | --- |
| ksBmp2424 | 1 | 24*24 |
| ksBmp3232 | 2 | 32*32 |
| ksBmp4848 | 3 | 48*48 |
@@ -1,16 +0,0 @@
---
title: "ksBreakLineTypeEnum - Тип линии разрыва"
type: enum
api: [api7]
tags: [enum, api7, ksbreaklinetypeenum]
sources:
- ksbreaklinetypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksBLNotImage | 0 | Не отображается |
| --- | --- | --- |
| ksBLStraight | 1 | Прямая |
| ksBLBreak | 2 | С изломом |
| ksBLVawe | 3 | Волнистая |
@@ -1,23 +0,0 @@
---
title: "ksCellBoundariesEnum - Типы границ таблицы"
type: enum
api: [api7]
tags: [enum, api7, kscellboundariesenum]
sources:
- kscellboundariesenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCBLeftBorder | | Левая граница |
| --- | --- | --- |
| ksCBRightBorder | | Правая граница |
| ksCBTopBorder | | Верхняя граница |
| ksCBBottomBorder | | Нижняя граница |
| Групповые границы | | |
| ksCBHorisontMidleBorder | | Внутренняя горизонтальная граница |
| ksCBVerticalMidleBorder | | Внутренняя вертикальная граница |
| ksCBExternalBorders | | Внешние границы |
| ksCBAllBorders | | Все границы |
| ksCBExternalBorders | | Внутренние границы |
| ksCBInternalBorders | | Нет границ |
@@ -1,16 +0,0 @@
---
title: "ksCentreMarkerEnum - Тип обозначения центра"
type: enum
api: [api7]
tags: [enum, api7, kscentremarkerenum]
sources:
- kscentremarkerenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCMUnknown | -1 | Неизвестный |
| --- | --- | --- |
| ksCMPlusPoint | 0 | Маленький крестик |
| ksCMOneAxis | 1 | Одна ось |
| ksCMTwoAxis | 2 | Две оси |
@@ -1,15 +0,0 @@
---
title: "ksChamferBuildingTypeEnum - Типы построения фаски"
type: enum
api: [api7]
domain: [feature]
tags: [enum, api7, feature, kschamferbuildingtypeenum]
sources:
- kschamferbuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksChamferSideAngle | 0 | По стороне и углу |
| --- | --- | --- |
| ksChamferTwoSides | 1 | По двум сторонам |
@@ -1,17 +0,0 @@
---
title: "ksChangeLeaderSignEnum - Тип значка для обозначения изменения"
type: enum
api: [api7]
tags: [enum, api7, kschangeleadersignenum]
sources:
- kschangeleadersignenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCLSSquare | 0 | Квадрат |
| --- | --- | --- |
| ksCLSCircle | 1 | Окружность |
| ksCLSBracketSquare | 2 | Квадратные скобки |
| ksCLSBracketCircle | 3 | Круглые скобки |
| ksCLSBracketCorner | 4 | Угловые скобки |
@@ -1,17 +0,0 @@
---
title: "ksCheckAssociationResultEnum - Результат проверки ассоциативности объектов"
type: enum
api: [api7]
tags: [enum, api7, kscheckassociationresultenum]
sources:
- kscheckassociationresultenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCheckAssociationOk | 0 | Успешно. |
| --- | --- | --- |
| ksCheckAssociationNoDimensions | 1 | Невозможно создание ассоциативных связей. Нет размеров. |
| ksCheckAssociationNoGeomObjects | 2 | Невозможно создание ассоциативных связей. Нет геометрических объектов. |
| ksCheckAssociationNoObjects | 3 | Невозможно создание ассоциативных связей. Нет объектов. |
| ksCheckAssociationComplete | 4 | Все размеры ассоциативны. Создание ассоциативных связей не требуется. |
@@ -1,15 +0,0 @@
---
title: "ksCheckBoxVisualStyleEnum - Визуальный стиль чекбокса"
type: enum
api: [api7]
tags: [enum, api7, kscheckboxvisualstyleenum]
sources:
- kscheckboxvisualstyleenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCheckBoxDefault | 0 | Обычный |
| --- | --- | --- |
| ksCheckBoxSwitcher | 1 | Переключатель |
| ksCheckBoxOptional | 2 | С неопределенным состоянием |
@@ -1,15 +0,0 @@
---
title: "ksCheckObjectsTypeEnum - Тип проверяемых объектов"
type: enum
api: [api7]
tags: [enum, api7, kscheckobjectstypeenum]
sources:
- kscheckobjectstypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCheckCurrentView | 0 | Текущий вид. |
| --- | --- | --- |
| ksCheckAllViews | 1 | Все виды. |
| ksCheckSelectedObjects | 2 | Выделенные объекты. |
@@ -1,17 +0,0 @@
---
title: "ksCheckStyleEnum - Стиль проверяемых объектов"
type: enum
api: [api7]
tags: [enum, api7, kscheckstyleenum]
sources:
- kscheckstyleenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCheckAllStyles | 1 | Все стили. |
| --- | --- | --- |
| ksCheckNormal | 2 | Основная. |
| ksCheckAxial | 4 | Осевая. |
| ksCheckThin | 8 | Тонкая. |
| ksCheckOther | 16 | Другие. |
@@ -1,32 +0,0 @@
---
title: "ksCheckSumVersionEnum - Версии контрольных сумм"
type: enum
api: [api7]
tags: [enum, api7, kschecksumversionenum]
sources:
- kschecksumversionenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| KsCsrCurrent | 0 | Версия текущей задачи КОМПАС |
| --- | --- | --- |
| ksCsrKompas10SP2 | -1 | Версия KOMPAS 10 SP2 |
| ksCsrKompas11 | -5 | Версия KOMPAS 11 |
| ksCsrKompas11SP1 | -6 | Версия KOMPAS 11 SP1 |
| ksCsrKompas12 | -10 | Версия KOMPAS 12 |
| ksCsrKompas12SP1 | -11 | Версия KOMPAS 12 SP1 |
| ksCsrKompas13 | -15 | Версия KOMPAS 13 |
| ksCsrKompas13SP1 | -16 | Версия KOMPAS 13 SP1 |
| ksCsrKompas14SP1 | -21 | Версия KOMPAS 14 SP1 |
| ksCsrKompas14SP2 | -22 | Версия KOMPAS 14 SP2 |
| ksCsrKompas15 | -25 | Версия KOMPAS 15 |
| ksCsrKompas15Sp2 | -27 | Версия KOMPAS 15 SP2 |
| ksCsrKompas16 | -30 | Версия KOMPAS 16 |
| ksCsrKompas16Sp1 | -31 | Версия KOMPAS 16 SP1 |
| ksCsrKompas17 | -35 | Версия KOMPAS 17 |
| ksCsrKompas17Sp1 | -36 | Версия KOMPAS 17 SP1 |
| ksCsrKompas18 | -37 | Версия KOMPAS 18 |
Примечание:
ksCsrKompas10SP2 = 0x0A001023
ksCsrKompas13SP1 - До выхода КОМПАС 13 SP1 равен версии текущей задачи.
@@ -1,16 +0,0 @@
---
title: "ksChoiceFromLibraryResultEnum - Типы пути в библиотеке моделей"
type: enum
api: [api7]
tags: [enum, api7, kschoicefromlibraryresultenum]
sources:
- kschoicefromlibraryresultenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksChoiceFromLibraryCancel | 0 | Отказ от выбора пути |
| --- | --- | --- |
| ksChoiceFromLibraryRoot | 1 | Выбрана корневая директория |
| ksChoiceFromLibraryFolder | 2 | Выбрана подпапка |
| ksChoiceFromLibraryDocument | 3 | Выбран документ |
@@ -1,30 +0,0 @@
---
title: "ksChooseManagerTypeEnum - Тип менеджера выбора объектов"
type: enum
api: [api7]
tags: [enum, api7, kschoosemanagertypeenum]
sources:
- kschoosemanagertypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksChMUnknown | -2 | Неизвестный |
| --- | --- | --- |
| ksChMAllColors | -1 | Любой менеджер |
| ksChMLevel1ColorBase | 0 | Основная группа выбора. Цвет - Указание 1 |
| ksChMLevel1Color1 | 1 | Дополнительная группа выбора. Цвет - Указание 2 |
| ksChMLevel1Color2 | 2 | Дополнительная группа выбора. Цвет - Указание 3 |
| ksChMLevel2ColorBase | 100 | Основная группа выбора. Уровень 2. Цвет - Указание 1 |
| ksChMLevel2Color1 | 101 | Дополнительная группа выбора. Уровень 2. Цвет - Указание 2 |
| ksChMLevel2Color2 | 102 | Дополнительная группа выбора. Уровень 2. Цвет - Указание 3 |
| ksChMUser1 | 201 | Пользовательская группа выбора 1 |
| ksChMUser2 | 202 | Пользовательская группа выбора 2 |
| ksChMUser3 | 203 | Пользовательская группа выбора 3 |
| ksChMUser4 | 204 | Пользовательская группа выбора 4 |
| ksChMUser5 | 205 | Пользовательская группа выбора 5 |
| ksChMUser6 | 206 | Пользовательская группа выбора 6 |
| ksChMUser7 | 207 | Пользовательская группа выбора 7 |
| ksChMUser8 | 208 | Пользовательская группа выбора 8 |
| ksChMUser9 | 209 | Пользовательская группа выбора 9 |
| ksChMUser10 | 210 | Пользовательская группа выбора 10 |
@@ -1,15 +0,0 @@
---
title: "ksCircularPatternBuildingTypeEnum - Способ построения массива по концентрической сетке"
type: enum
api: [api7]
tags: [enum, api7, kscircularpatternbuildingtypeenum]
sources:
- kscircularpatternbuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCPSaveAll | 0 | Стандартная схема |
| --- | --- | --- |
| ksCPChessOrderByAxis1 | 1 | Шахматный порядок - сдвиг вдоль первой оси (концентрическое направление |
| ksCPChessOrderByAxis2 | 2 | Шахматный порядок - сдвиг вдоль второй оси (радиальное направление) |
@@ -1,15 +0,0 @@
---
title: "ksClosingClosedTypeEnum - Способ замыкания углов листового тела"
type: enum
api: [api7]
tags: [enum, api7, ksclosingclosedtypeenum]
sources:
- ksclosingclosedtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksClosingCJoint | 0 | Замыкание встык |
| --- | --- | --- |
| ksClosingCOver | 1 | Замыкание с перекрытием |
| ksClosingCTightClosure | 2 | Плотное замыкание |
@@ -1,16 +0,0 @@
---
title: "ksClosingCorneringEnum - Обработка угла при замыкании"
type: enum
api: [api7]
tags: [enum, api7, ksclosingcorneringenum]
sources:
- ksclosingcorneringenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCorneringNone | 0 | Без обработки |
| --- | --- | --- |
| ksCorneringJointOnBorder | 1 | Стык по кромке |
| ksCorneringJointOnChord | 2 | Стык по хорде |
| ksCorneringCircled | 3 | Круговая |
@@ -1,15 +0,0 @@
---
title: "ksClosingHolePlacementEnum - Размещение отверстия при круговой обработке угла"
type: enum
api: [api7]
tags: [enum, api7, ksclosingholeplacementenum]
sources:
- ksclosingholeplacementenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCorneringHPBend | 0 | На пересечении сгибов |
| --- | --- | --- |
| ksCorneringHPAngle | 1 | В точке угла |
| ksCorneringHPPoint | 2 | Через точку угла |
@@ -1,16 +0,0 @@
---
title: "ksClosingTypeEnum - Тип замыкания операции сгиб по эскизу листового тела"
type: enum
api: [api7]
domain: [sketch, sheetmetal, feature]
tags: [enum, api7, sketch, sheetmetal, feature, ksclosingtypeenum]
sources:
- ksclosingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksClosingAngles | 0 | Замыкание смежных углов |
| --- | --- | --- |
| ksClosingBegin | 1 | Замыкание в начале |
| ksClosingEnd | 2 | Замыкание в конце |
@@ -1,15 +0,0 @@
---
title: "ksCloudPointsSurfaceBuildingTypeEnum - Тип поверхности по пласту (облаку) точек"
type: enum
api: [api7]
tags: [enum, api7, kscloudpointssurfacebuildingtypeenum]
sources:
- kscloudpointssurfacebuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCLByPoints | 0 | Сплайновая поверхность по точкам |
| --- | --- | --- |
| ksCLByPole | 1 | Сплайновая поверхность по полюсам |
| ksCLPolyhedral | 2 | Многогранная поверхность |
@@ -1,15 +0,0 @@
---
title: "ksCloudTypeEnum - Способ распознавания сети точек"
type: enum
api: [api7]
tags: [enum, api7, kscloudtypeenum]
sources:
- kscloudtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCLAuto | 0 | Автоматически |
| --- | --- | --- |
| ksCLLocalCS | 1 | В плоскости CK |
| ksCLScreen | 2 | В плоскости экрана |
-19
View File
@@ -1,19 +0,0 @@
---
title: "ksColorBPPEnum - Цвет"
type: enum
api: [api7]
tags: [enum, api7, kscolorbppenum]
sources:
- kscolorbppenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksColorBPP_O1 | 1 | Черный |
| --- | --- | --- |
| ksColorBPP_O2 | 2 | 4 цвета |
| ksColorBPP_O4 | 4 | 16 цветов |
| ksColorBPP_O8 | 8 | 256 цветов |
| ksColorBPP_16 | 16 | 16 разрядов |
| ksColorBPP_24 | 24 | 24 разряда |
| ksColorBPP_32 | 32 | 32 разряда |
@@ -1,19 +0,0 @@
---
title: "ksColouringTypeEnum - Тип заливки"
type: enum
api: [api7]
tags: [enum, api7, kscolouringtypeenum]
sources:
- kscolouringtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksColouringSolid | 0 | Одноцветная |
| --- | --- | --- |
| ksColouringLinear | 1 | Линейная |
| ksColouringAngle | 2 | Угловая |
| ksColouringCone | 3 | Коническая |
| ksColouringCircle | 4 | Радиальная |
| ksColouringSquare | 5 | Квадратная |
| ksColouringCylinder | 6 | Цилиндрическая |
@@ -1,17 +0,0 @@
---
title: "ksConicCurve3DBuildingTypeEnum - Способ построения конической 3D кривой"
type: enum
api: [api7]
domain: [3d]
tags: [enum, api7, 3d, ksconiccurve3dbuildingtypeenum]
sources:
- ksconiccurve3dbuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicCurve3DVertexAndHeight | 0 | Коническая кривая по вершине и дискриминанту |
| --- | --- | --- |
| ksConicCurve3DVertexAndPointOnCurve | 1 | Коническая кривая по вершине и точке на кривой |
| ksConicCurve3DTangentsAndHeight | 2 | Коническая кривая по касательным и дискриминанту |
| ksConicCurve3DTangentsAndPointOnCurve | 3 | Коническая кривая по касательным и точке на кривой |
@@ -1,18 +0,0 @@
---
title: "ksConicCurve3DParameterEnum - Индекс параметра конической 3D кривой"
type: enum
api: [api7]
domain: [3d]
tags: [enum, api7, 3d, ksconiccurve3dparameterenum]
sources:
- ksconiccurve3dparameterenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicCurve3DBeginPoint | 0 | Начальная точка |
| --- | --- | --- |
| ksConicCurve3DEndPoint | 1 | Конечная точка |
| ksConicCurve3DVertex | 2 | Вершина |
| ksConicCurve3DOnCurve | 3 | Точка на кривой |
| ksConicCurve3DCount | 4 | Количество опорных точек |
@@ -1,16 +0,0 @@
---
title: "ksConicCurvePontIndexEnum - Индекс точки конической кривой"
type: enum
api: [api7]
tags: [enum, api7, ksconiccurvepontindexenum]
sources:
- ksconiccurvepontindexenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCCBeginPoint | 0 | Начальная точка |
| --- | --- | --- |
| ksCCEndPoint | 1 | Конечная точка |
| ksCCIntersectPoint | 2 | Точка пересечения |
| ksCCPointOnCurve | 3 | Точка на кривой |
@@ -1,16 +0,0 @@
---
title: "ksConicSectionTrianglePointEnum - Движение сечения"
type: enum
api: [api7]
tags: [enum, api7, ksconicsectiontrianglepointenum]
sources:
- ksconicsectiontrianglepointenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicSectionTrianglePointLeft | 0 | Левая точка |
| --- | --- | --- |
| ksConicSectionTrianglePointRight | 1 | Правая точка |
| ksConicSectionTrianglePointTop | 2 | Верхняя точка |
| ksConicSectionTrianglePointMedian | 3 | Медиана из верхней точки |
@@ -1,14 +0,0 @@
---
title: "ksConicSurfaceBuildingTypeEnum - Способ построения треугольника"
type: enum
api: [api7]
tags: [enum, api7, ksconicsurfacebuildingtypeenum]
sources:
- ksconicsurfacebuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicSurfaceBuildBySides | 0 | Через задание углов двух сторон |
| --- | --- | --- |
| ksConicSurfaceBuildByCurve | 1 | По вершинной кривой |
@@ -1,15 +0,0 @@
---
title: "ksConicSurfaceMovementTypeEnum - Движение сечения"
type: enum
api: [api7]
tags: [enum, api7, ksconicsurfacemovementtypeenum]
sources:
- ksconicsurfacemovementtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicSectionSelfParallel | 0 | Параллельно самому себе |
| --- | --- | --- |
| ksConicSectionAllongAxis | 1 | По осевой линии |
| ksConicSectionByRadial | 2 | По осевой линии |
@@ -1,16 +0,0 @@
---
title: "ksConicSurfaceSectionCurveFormEnum - Способ задания формы кривой конического сечения"
type: enum
api: [api7]
tags: [enum, api7, ksconicsurfacesectioncurveformenum]
sources:
- ksconicsurfacesectioncurveformenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksSectionCurveByCoefficient | 0 | По коэффициенту |
| --- | --- | --- |
| ksSectionCurveByCurveOnSurface | 1 | По кривой на поверхности |
| ksSectionCurveByTangentSurface | 2 | По касательной поверхности |
| ksSectionCurveByLeastTension | 3 | Минимальное напряжение |
@@ -1,14 +0,0 @@
---
title: "ksConicSurfaceSideAngleBuildingTypeEnum - Условие построения угла треугольника конической поверхности при построении по грани"
type: enum
api: [api7]
tags: [enum, api7, ksconicsurfacesideanglebuildingtypeenum]
sources:
- ksconicsurfacesideanglebuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicSectionSurfaceSideAngleTangent | 0 | По касательной. Результирующий угол - угол между касательной к грани и основанием треугольника |
| --- | --- | --- |
| ksConicSectionSurfaceSideAngleNormal | 1 | Перпендикулярно. Результирующий угол - угол между перпендикуляром к грани и основанием треугольника |
@@ -1,14 +0,0 @@
---
title: "ksConicSurfaceSideBuildingTypeEnum - Способ построения стороны в треугольнике"
type: enum
api: [api7]
tags: [enum, api7, ksconicsurfacesidebuildingtype]
sources:
- ksconicsurfacesidebuildingtype.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksConicSectionSurfaceSideByAngle | 0 | От хорды. По функции угла |
| --- | --- | --- |
| ksConicSectionSurfaceSideByFace | 1 | От объекта. По направляющей грани |
@@ -1,14 +0,0 @@
---
title: "ksConicTypeEnum - Способ определения параметров конического отверстия"
type: enum
api: [api7]
tags: [enum, api7, ksconictypeenum]
sources:
- ksconictypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCNDiameter | 0 | По диаметру верхнего основания конуса |
| --- | --- | --- |
| ksCNAngle | 1 | По углу конуса |
@@ -1,14 +0,0 @@
---
title: "ksConjunctivePointTypeEnum - Способ построение присоединительной точки"
type: enum
api: [api7]
tags: [enum, api7, ksconjunctivepointtypeenum]
sources:
- ksconjunctivepointtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCPByObject | 0 | По объекту |
| --- | --- | --- |
| ksCPManualDirection | 1 | Ручное задание направление осей |
@@ -1,17 +0,0 @@
---
title: "ksConnectTypeEnum - Тип соединения кривых"
type: enum
api: [api7]
tags: [enum, api7, ksconnecttypeenum]
sources:
- ksconnecttypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCTUnknown | -1 | Неизвестный |
| --- | --- | --- |
| ksCTPosition | 0 | Соединение по позиции |
| ksCTTangent | 1 | Соединение по касательной |
| ksCTNormal | 2 | Соединение перпендикулярно |
| ksCTSmooth | 3 | Гладкое соединение |
@@ -1,16 +0,0 @@
---
title: "ksConstraintsStateEnum - Параметрическое состояние системы"
type: enum
api: [api7]
tags: [enum, api7, ksconstraintsstateenum]
sources:
- ksconstraintsstateenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksStateUnknown | 0 | Состояние не известно |
| --- | --- | --- |
| ksStateWellConstrained | 1 | Полностью определенная система - все степени свободы нулевые |
| ksStateUnderConstrained | 2 | Недоопределенная система - имеются ненулевые степени свободы |
| ksStateUnresolvedRedundancy | 3 | Имеются не удовлетворенные избыточные ограничения |
@@ -1,37 +0,0 @@
---
title: "ksConstraintTypeEnum Типы параметрических ограничений"
type: enum
api: [api7]
tags: [enum, api7, ksconstrainttypeenum]
sources:
- ksconstrainttypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| кsCUnknown | 0 | Неизвестный тип |
| --- | --- | --- |
| ksCFixedPoint | 1 | Фиксировать точку |
| ksCPointOnCurve | 2 | Точка на кривой |
| ksCHorizontal | 3 | Горизонталь |
| ksCVertical | 4 | Вертикаль |
| ksCParallel | 5 | Параллельность двух прямых или отрезков |
| ksCPerpendicular | 6 | Перпендикулярность двух прямых или отрезков |
| ksCEqualLength | 7 | Равенство длин двух отрезков |
| ksCEqualRadius | 8 | Равенство радиусов двух дуг/окружностей. |
| ksCHAlignPoints | 9 | Выравнивать две точки по горизонтали |
| ksCVAlignPoints | 10 | Выравнивать две точки по вертикали |
| ksCMergePoints | 11 | Совпадение двух точек |
| ksCAssociation | 12 | Ассоциативная связь |
| ksCDimWithVariable | 13 | Размер с переменной |
| ksCFixedDim | 14 | Фиксированный размер |
| ksCTangentTwoCurves | 15 | Касание двух кривых |
| ksCSymmetryTwoPoints | 16 | Симметрия двух точек относительно отрезка |
| ksCCollinear | 17 | Коллинеарность двух отрезков |
| ksCFixedAngle | 18 | Фиксированный угол |
| ksCFixedLenght | 19 | Фиксированная длина |
| ksCPointOnCurveMiddle | 20 | Точка на середине кривой |
| ksCBisector | 21 | Биссектриса |
| ksCConcentricity | 22 | Cовпадение центров окружностей, дуг, эллипсов и точек |
Примечание.
При использовании API 5 частичным аналогом данного перечисления является набор типов параметрических ограничений.
@@ -1,16 +0,0 @@
---
title: "ksContentDialogNotifyEnum - События диалога с произвольным наполнением"
type: enum
api: [api7]
tags: [enum, api7, kscontentdialognotifyenum]
sources:
- kscontentdialognotifyenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCDCreateContentCallback | 1 | Создание контента |
| --- | --- | --- |
| ksCDDestroyContent | 2 | Удаление контента |
| ksCDExecuteCommand | 3 | Выполнить команду |
| ksCDButtonUpdate | 4 | Установка состояния кнопки панели |
@@ -1,16 +0,0 @@
---
title: "ksContour3DBuildingTypeTypeEnum - Способ построения Контура 3D"
type: enum
api: [api7]
domain: [3d]
tags: [enum, api7, 3d, kscontour3dbuildingtypetypeenum]
sources:
- kscontour3dbuildingtypetypeenum.html
---
*Структуры параметров и константы > Константы  > Прочие  > 3D *
| ksCBTUnknown | 0 | Не определен |
| --- | --- | --- |
| ksCBTEdges | 1 | Ребрами |
| ksCBTEquidistant | 2 | Эквидистанта |
@@ -1,17 +0,0 @@
---
title: "ksContour3DTypeEnum - Тип контура"
type: enum
api: [api7]
domain: [3d]
tags: [enum, api7, 3d, kscontour3dtypeenum]
sources:
- kscontour3dtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCTAuto | 0 | Автоопределение типа |
| --- | --- | --- |
| ksCTSpace | 1 | Произвольный контур |
| ksCTSurface | 2 | Контур на грани |
| ksCTSketch | 3 | Контур эскиза |
@@ -1,15 +0,0 @@
---
title: "ksContourFormEnum форма контура обозначения узла"
type: enum
api: [api7]
tags: [enum, api7, kscontourformenum]
sources:
- kscontourformenum.html
---
*Структуры параметров и константы > Константы  > Константы графических объектов *
| ksUFormCircle | 0 | Окружность |
| --- | --- | --- |
| ksUFormRectangle | 1 | Прямоугольник |
| ksUFormCRectangle | 2 | Прямоугольник со скругленными вершинами |
@@ -1,20 +0,0 @@
---
title: "ksContourSegmentEnum - Типы сегментов контура"
type: enum
api: [api7]
tags: [enum, api7, kscontoursegmentenum]
sources:
- kscontoursegmentenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCSUnknown | -1 | Неизвестный объект |
| --- | --- | --- |
| ksCSLineSeg | 1 | Отрезок |
| ksCSCircle | 2, | Окружность |
| ksCSArc | 3 | Дуга |
| ksCSBezier | 8 | Bezier сплайн |
| ksCSEllipse | 32 | Эллипс |
| ksCSNurbs | 33 | Nurbs сплайн |
| ksCSEllipseArc | 34 | Дуга эллипса |
-15
View File
@@ -1,15 +0,0 @@
---
title: "ksCoordLawEnum - Порядок законов"
type: enum
api: [api7]
tags: [enum, api7, kscoordlawenum]
sources:
- kscoordlawenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCLawX | 0 | Закон X |
| --- | --- | --- |
| ksCLawY | 1 | Закон Y |
| ksCLawZ | 2 | Закон Z |
@@ -1,15 +0,0 @@
---
title: "ksCopyGeometryBuildingTypeEnum - Способ построения операции копия геометрии"
type: enum
api: [api7]
domain: [feature]
tags: [enum, api7, feature, kscopygeometrybuildingtypeenum]
sources:
- kscopygeometrybuildingtypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCGBTWithoutGrouping | 0 | Без группировки. |
| --- | --- | --- |
| ksCGBTBodyFaceGrouping | 1 | Собрать грани по исходным элементам. C группировкой граней одного тела |
@@ -1,14 +0,0 @@
---
title: "ksCornerFormEnum - Способы обработки углов стыковки"
type: enum
api: [api7]
tags: [enum, api7, kscornerformenum]
sources:
- kscornerformenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCornerFormUnknown | 0 | Не срезать углы |
| --- | --- | --- |
| ksCornerFormUniform | 2 | Срезать углы |
@@ -1,15 +0,0 @@
---
title: "ksCornerTypeEnum - Тип угла объекта для прямоугольника и многоугольника"
type: enum
api: [api7]
tags: [enum, api7, kscornertypeenum]
sources:
- kscornertypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCTNoProcess | 0 | Без обработки |
| --- | --- | --- |
| ksCTChamfer | 1 | Фаска |
| ksCTFillet | 2 | Скругление |
@@ -1,15 +0,0 @@
---
title: "ksCountersinkTypeEnum - Способ определения параметров зенковки"
type: enum
api: [api7]
tags: [enum, api7, kscountersinktypeenum]
sources:
- kscountersinktypeenum.html
---
*API интерфейсов. Версия 7 > Константы API версии 7 *
| ksCTDiameterAngle | 0 | По диаметру и углу |
| --- | --- | --- |
| ksCTDepthAngle | 1 | По глубине и углу |
| ksCTDiameterDepth | 2 | По диаметру и глубине |

Some files were not shown because too many files have changed in this diff Show More