Files
kompas3d-mcp/docs/presentation.html
T
mikhail 28d2ae3868 feat(inspection): структурное «зрение» модели — осмотр без снимка
Новый слой «модель как данные» (приоритетный над model_snapshot):
- describe_model — структурный «паспорт» детали одним вызовом (габарит,
  МЦХ, тела, сводка топологии, дерево построения с параметрами, переменные)
- list_features / list_bodies / list_variables
- describe_face / describe_edge (drill-down по индексу)
- measure (расстояние/угол между гранями/рёбрами/вершинами)
- model_snapshot понижен до fallback для визуально-пространственных вопросов

Реализация: ModelInspectionService (COM) + чистый InspectionText (рендер,
группировка, детект «импорт без истории») + record-модели; InspectionTools.
Дерево читается через ksPart.GetFeature()->SubFeatureCollection; точный тип
и параметры операций берутся из GetObject()->GetDefinition() (ksFeature.type
отдаёт лишь coarse o3d_entity).

Снимок дерева также включает слои conversion (STEP), editing (move_face/solid)
и validation, развивавшиеся параллельно. Полный прогон: 61 тест зелёный,
43 MCP-инструмента. Документация (README, ARCHITECTURE, OPEN_QUESTIONS,
CLAUDE.md, presentation.html) синхронизирована.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 18:44:38 +03:00

363 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>КОМПАС-3D MCP — управление CAD через LLM</title>
<style>
:root{
--bg:#0b1020; --bg2:#121a33; --card:#161f3d; --card2:#1b264a;
--txt:#e8edf7; --muted:#9aa7c7; --line:#26335c;
--accent:#4da3ff; --accent2:#7c5cff; --green:#36d399; --amber:#fbbd23;
--grad:linear-gradient(135deg,#4da3ff 0%,#7c5cff 100%);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{
font-family:"Segoe UI",system-ui,-apple-system,Roboto,Arial,sans-serif;
background:radial-gradient(1200px 600px at 80% -10%,#1c2750 0%,var(--bg) 55%) no-repeat,var(--bg);
color:var(--txt);line-height:1.6;-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1120px;margin:0 auto;padding:0 24px}
section{padding:64px 0}
h2{font-size:30px;margin-bottom:8px;letter-spacing:-.5px}
.sub{color:var(--muted);margin-bottom:36px;max-width:640px}
.eyebrow{color:var(--accent);font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase}
/* HERO */
.hero{padding:96px 0 72px;position:relative;overflow:hidden}
.hero::after{content:"";position:absolute;inset:0;background:
radial-gradient(600px 300px at 15% 20%,rgba(124,92,255,.18),transparent 60%);
pointer-events:none}
.badge{display:inline-flex;align-items:center;gap:8px;background:rgba(77,163,255,.1);
border:1px solid var(--line);color:var(--accent);padding:6px 14px;border-radius:999px;
font-size:13px;font-weight:600;margin-bottom:22px}
.dot{width:8px;height:8px;border-radius:50%;background:var(--amber);box-shadow:0 0 10px var(--amber)}
.hero h1{font-size:54px;line-height:1.05;letter-spacing:-1.5px;margin-bottom:18px;font-weight:800}
.hero h1 .g{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
.hero p.lead{font-size:19px;color:var(--muted);max-width:680px;margin-bottom:30px}
.chips{display:flex;flex-wrap:wrap;gap:10px}
.chip{background:var(--card);border:1px solid var(--line);border-radius:10px;
padding:8px 14px;font-size:13px;font-weight:600;color:#cdd7f2}
.chip b{color:var(--accent)}
/* GRID CARDS */
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.card{background:linear-gradient(180deg,var(--card),var(--card2));border:1px solid var(--line);
border-radius:16px;padding:24px;transition:transform .2s,border-color .2s}
.card:hover{transform:translateY(-4px);border-color:var(--accent)}
.card .ic{width:44px;height:44px;border-radius:12px;background:var(--grad);
display:flex;align-items:center;justify-content:center;font-size:22px;margin-bottom:14px}
.card h3{font-size:17px;margin-bottom:6px}
.card p{color:var(--muted);font-size:14px}
.card code{background:rgba(255,255,255,.06);padding:1px 6px;border-radius:5px;font-size:12px;color:#cdd7f2}
/* WORKFLOW */
.flow{display:flex;align-items:stretch;gap:0;flex-wrap:wrap;margin-top:8px}
.step{flex:1;min-width:150px;background:var(--card);border:1px solid var(--line);
border-radius:14px;padding:18px 16px;position:relative;text-align:center}
.step .n{font-size:12px;color:var(--accent);font-weight:700}
.step h4{font-size:15px;margin:6px 0 4px}
.step p{font-size:12.5px;color:var(--muted)}
.arrow{display:flex;align-items:center;justify-content:center;color:var(--accent2);
font-size:24px;padding:0 8px}
.loopnote{margin-top:14px;color:var(--muted);font-size:14px;text-align:center}
.loopnote b{color:var(--green)}
/* STACK */
.stack{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.scard{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:18px;text-align:center}
.scard .k{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:1px}
.scard .v{font-size:18px;font-weight:700;margin-top:6px;color:#dfe7fb}
.scard .v small{display:block;font-size:12px;color:var(--muted);font-weight:500;margin-top:3px}
/* TODO */
.todo-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px}
.panel{background:linear-gradient(180deg,var(--card),var(--card2));border:1px solid var(--line);
border-radius:16px;padding:26px}
.panel h3{font-size:18px;margin-bottom:4px;display:flex;align-items:center;gap:10px}
.tag{font-size:11px;font-weight:700;padding:3px 9px;border-radius:999px;letter-spacing:.5px}
.tag.done{background:rgba(54,211,153,.15);color:var(--green);border:1px solid rgba(54,211,153,.3)}
.tag.now{background:rgba(251,189,35,.15);color:var(--amber);border:1px solid rgba(251,189,35,.3)}
.tag.next{background:rgba(124,92,255,.15);color:#b9a6ff;border:1px solid rgba(124,92,255,.3)}
.panel .meta{color:var(--muted);font-size:13px;margin-bottom:16px}
ul.list{list-style:none}
ul.list li{display:flex;gap:11px;padding:8px 0;border-bottom:1px dashed var(--line);font-size:14.5px}
ul.list li:last-child{border-bottom:0}
.mark{flex:0 0 20px;width:20px;height:20px;border-radius:6px;display:flex;align-items:center;
justify-content:center;font-size:12px;font-weight:700;margin-top:2px}
.mark.ok{background:var(--green);color:#04231a}
.mark.todo{background:transparent;border:1.5px solid var(--line)}
.mark.wip{background:var(--amber);color:#3a2c00}
li.muted span.t{color:var(--muted)}
/* progress */
.prog{margin:18px 0 4px}
.bar{height:10px;border-radius:999px;background:#0e1530;overflow:hidden;border:1px solid var(--line)}
.bar > i{display:block;height:100%;background:var(--grad);border-radius:999px}
.progrow{display:flex;justify-content:space-between;font-size:13px;color:var(--muted);margin-bottom:8px}
/* roadmap timeline */
.timeline{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin-top:8px}
.tl{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:18px 16px;position:relative}
.tl .ph{font-size:12px;font-weight:700;color:var(--accent)}
.tl h4{font-size:15px;margin:8px 0 6px}
.tl p{font-size:12.5px;color:var(--muted)}
.tl.cur{border-color:var(--amber);box-shadow:0 0 0 1px rgba(251,189,35,.25)}
footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:14px}
footer a{color:var(--accent);text-decoration:none}
footer a:hover{text-decoration:underline}
.links{display:flex;gap:20px;flex-wrap:wrap;margin-top:10px}
@media(max-width:880px){
.grid,.stack{grid-template-columns:1fr 1fr}
.todo-grid{grid-template-columns:1fr}
.timeline{grid-template-columns:1fr 1fr}
.hero h1{font-size:40px}
.arrow{transform:rotate(90deg)}
}
@media(max-width:520px){.grid,.stack,.timeline{grid-template-columns:1fr}}
</style>
</head>
<body>
<!-- HERO -->
<header class="hero">
<div class="wrap">
<span class="badge"><span class="dot" style="background:var(--green);box-shadow:0 0 10px var(--green)"></span> Статус: v3 работает — эскиз→операции→STEP→сборка→move_face→структурный осмотр (43 инструмента)</span>
<h1>КОМПАС-3D <span class="g">MCP-сервер</span><br>управление CAD языком LLM</h1>
<p class="lead">MCP-сервер, который превращает операции КОМПАС-3D — создание документов,
эскизы, 3D-операции, параметры — в инструменты для языковой модели. Под капотом —
COM Automation API АСКОН.</p>
<div class="chips">
<span class="chip"><b>.NET 8</b> · C#</span>
<span class="chip">транспорт <b>stdio</b></span>
<span class="chip"><b>COM</b> Automation · API7 / API5</span>
<span class="chip">Windows <b>x64</b></span>
<span class="chip">КОМПАС-3D <b>v24 Home</b></span>
<span class="chip">👁 <b>зрение агента</b></span>
</div>
</div>
</header>
<!-- KEY FEATURES -->
<section id="features">
<div class="wrap">
<div class="eyebrow">Возможности</div>
<h2>Что умеет MCP-сервер</h2>
<p class="sub">Инструменты сгруппированы вокруг живого инженерного цикла моделирования —
от подключения к КОМПАС до построения и опроса детали.</p>
<div class="grid">
<div class="card">
<div class="ic">🔌</div>
<h3>Подключение к КОМПАС</h3>
<p>Attach к запущенному или launch нового экземпляра по ProgID, переход на API7
через <code>ksGetApplication7()</code>, управление видимостью окна.</p>
</div>
<div class="card">
<div class="ic">📄</div>
<h3>Документы</h3>
<p>Создание, открытие, сохранение и закрытие деталей, сборок, чертежей и фрагментов
через <code>IDocuments</code>.</p>
</div>
<div class="card">
<div class="ic">✏️</div>
<h3>Эскизы</h3>
<p>Эскиз на плоскости или грани, примитивы (линия, окружность, дуга,
прямоугольник), безопасный цикл <code>BeginEdit → EndEdit</code>.</p>
</div>
<div class="card">
<div class="ic">🧊</div>
<h3>3D-операции</h3>
<p>Выдавливание и вырез, вращение, перестроение. Управление направлением, глубиной и
типом окончания (<code>ksEndTypeEnum</code>).</p>
</div>
<div class="card">
<div class="ic">🔍</div>
<h3>Структурный осмотр</h3>
<p><code>describe_model</code> — паспорт детали (МЦХ, тела, дерево, переменные) одним вызовом.
<code>describe_face</code> · <code>describe_edge</code> · <code>measure</code>.
Предпочтительнее снимка — без расхода токенов изображения.</p>
</div>
<div class="card">
<div class="ic">🎯</div>
<h3>Выборка и запросы</h3>
<p>Перечисление граней, рёбер и компонентов сборки с классификацией; МЦХ, габарит.
<code>list_faces</code> · <code>list_edges</code> · <code>list_components</code>.</p>
</div>
<div class="card">
<div class="ic">📦</div>
<h3>STEP импорт / экспорт</h3>
<p>Импорт .step/.stp в новый документ (деталь или сборка, создание файлов компонентов);
экспорт в AP203/AP214/AP242 через встроенный конвертер КОМПАС.</p>
</div>
<div class="card">
<div class="ic">✂️</div>
<h3>Прямое редактирование</h3>
<p><code>move_face</code>: сдвинуть грань на N мм вдоль нормали (наружу или внутрь).
Работает на импортированной B-rep через <code>FaceMover</code> API7.</p>
</div>
<div class="card">
<div class="ic">👁️</div>
<h3>Зрение агента</h3>
<p>Рендер модели в PNG через временный файл и возврат как image-контент MCP — агент <b>видит</b>
результат. Fallback после <code>describe_model</code> для визуально-пространственных вопросов.</p>
</div>
</div>
</div>
</section>
<!-- WORKFLOW -->
<section id="workflow" style="background:linear-gradient(180deg,transparent,rgba(124,92,255,.05))">
<div class="wrap">
<div class="eyebrow">Ядро сценария</div>
<h2>Цикл «эскиз → операция → эскиз»</h2>
<p class="sub">Главный пользовательский поток v1 — итеративное параметрическое моделирование
с визуальной проверкой: рисуем профиль, превращаем в объём, <b>смотрим на результат</b>,
выбираем грань, рисуем следующий профиль.</p>
<div class="flow">
<div class="step"><div class="n">01</div><h4>Документ</h4><p>создать деталь (part)</p></div>
<div class="arrow"></div>
<div class="step"><div class="n">02</div><h4>Эскиз</h4><p>на плоскости XOY, профиль</p></div>
<div class="arrow"></div>
<div class="step"><div class="n">03</div><h4>Выдавить</h4><p>boss-операция → тело</p></div>
<div class="arrow"></div>
<div class="step" style="border-color:var(--accent2)"><div class="n" style="color:var(--accent2)">04 👁</div><h4>Снимок</h4><p>агент видит результат</p></div>
<div class="arrow"></div>
<div class="step"><div class="n">05</div><h4>Выбрать грань</h4><p>по точке на теле</p></div>
<div class="arrow"></div>
<div class="step"><div class="n">06</div><h4>Вырез</h4><p>новый эскиз → cut</p></div>
</div>
<p class="loopnote"><b>Повторять со зрением</b> — снимок → новая грань → новый эскиз → новая операция → снова снимок, пока деталь не готова</p>
</div>
</section>
<!-- STACK -->
<section id="stack">
<div class="wrap">
<div class="eyebrow">Технологии</div>
<h2>Стек решения</h2>
<p class="sub">Выбор обоснован первоклассным COM-интеропом .NET и официальным C# MCP SDK —
подробности в документе архитектуры.</p>
<div class="stack">
<div class="scard"><div class="k">Платформа</div><div class="v">.NET 8<small>C# · win-x64</small></div></div>
<div class="scard"><div class="k">MCP SDK</div><div class="v">ModelContextProtocol<small>транспорт stdio</small></div></div>
<div class="scard"><div class="k">Интероп</div><div class="v">COM Automation<small>API7 + API5 (.tlb)</small></div></div>
<div class="scard"><div class="k">Потоки</div><div class="v">STA-поток<small>насос сообщений</small></div></div>
</div>
</div>
</section>
<!-- TODO -->
<section id="todo" style="background:linear-gradient(180deg,transparent,rgba(77,163,255,.05))">
<div class="wrap">
<div class="eyebrow">Прогресс</div>
<h2>TODO проекта</h2>
<p class="sub">Честный срез состояния: фундамент подготовки готов, реализация сервера —
впереди.</p>
<div class="prog">
<div class="progrow"><span>Общий прогресс</span><span>v3: STEP · list_components · move_face · структурный осмотр · навык kompas-3d · 43 инструмента · 60 тестов</span></div>
<div class="bar"><i style="width:93%"></i></div>
</div>
<div class="todo-grid" style="margin-top:26px">
<!-- DONE -->
<div class="panel">
<h3>Подготовка <span class="tag done">ГОТОВО</span></h3>
<p class="meta">Исследование, документация и инструменты разработчика</p>
<ul class="list">
<li class="muted"><span class="mark ok"></span><span class="t">Исследование SDK и COM API (API5/API7, паттерны подключения)</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">CLAUDE.md — гайд по репозиторию и API</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Навигатор по справке: <code>kdoc.py</code> (навык kompas-sdk-research) + индекс на 26k стр.</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Документ архитектуры <code>docs/ARCHITECTURE.md</code></span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Выбор стека: .NET/C#, stdio, цикл «эскиз↔операция»</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Решение о визуальной обратной связи (зрение агента, рендер в растр)</span></li>
</ul>
</div>
<!-- NOW -->
<div class="panel">
<h3>Фундамент v1 <span class="tag done">ГОТОВО</span></h3>
<p class="meta">Скелет сервера и связь с КОМПАС</p>
<ul class="list">
<li class="muted"><span class="mark ok"></span><span class="t">Спайки S1–S4: interop, подключение, STA, рендер</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Решение Core/Host/Tests, Directory.Build.props, git</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Маппинг перечислений (enum ↔ строка)</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">STA-диспетчер (выделенный поток, очередь задач)</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">MCP-хост на stdio, логи в stderr</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Подключение по ProgID (attach/launch)</span></li>
</ul>
</div>
<!-- TOOLS -->
<div class="panel">
<h3>Инструменты v3 <span class="tag done">ГОТОВО</span></h3>
<p class="meta">43 инструмента, отдаются по MCP-протоколу</p>
<ul class="list">
<li class="muted"><span class="mark ok"></span><span class="t"><code>System</code>: connect · status · set_visible</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Documents</code>: create · open · save · save_as · close · active</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Sketch</code>: create · on_face (точка/индекс) · add line/circle/rectangle/axis · close</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Features</code>: extrude · revolve · fillet_edge/chamfer_edge (точка + индекс) · rebuild</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Edit</code>: move_face (прямое редактирование B-rep)</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Inspection</code>: describe_model · list_features · list_bodies · list_variables · describe_face · describe_edge · measure 🆕</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Vision</code>: model_snapshot 👁️ (fallback)</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Query</code>: get_part_info · get_bounding_box · list_faces · list_edges · list_components</span></li>
<li class="muted"><span class="mark ok"></span><span class="t"><code>Conversion</code>: import_step · export_step</span></li>
<li><span class="mark todo"></span><span>Массивы/паттерны · рассечение/перемещение тела (далее)</span></li>
</ul>
</div>
<!-- QUALITY -->
<div class="panel">
<h3>Качество и поставка <span class="tag now">В РАБОТЕ</span></h3>
<p class="meta">Тесты, сборка, интеграция с клиентом</p>
<ul class="list">
<li class="muted"><span class="mark ok"></span><span class="t">Unit-тесты — без COM: диспетчер, enum-маппинг, StepFormat, InspectionText</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Интеграционные тесты с КОМПАС: подключение, документы, снимок, цикл, STEP round-trip, сборка, move_face, инспекция</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Итого 60 тестов зелёных</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Сборка <code>kompas-mcp.exe</code>, README с конфигом клиента</span></li>
<li class="muted"><span class="mark ok"></span><span class="t">Навык <code>kompas-3d</code> (методика) + полигон <code>usecases/</code></span></li>
<li><span class="mark todo"></span><span>In-process тест MCP-клиента, релизный publish</span></li>
</ul>
</div>
</div>
</div>
</section>
<!-- ROADMAP -->
<section id="roadmap">
<div class="wrap">
<div class="eyebrow">Дорожная карта</div>
<h2>После v1</h2>
<p class="sub">Наращиваем покрытие API волнами — от простых операций к параметрике,
черчению и сборкам.</p>
<div class="timeline">
<div class="tl" style="border-color:var(--green)"><div class="ph" style="color:var(--green)">v1 · готово ✓</div><h4>Цикл моделирования</h4><p>Документы, эскизы, выдавливание/вырез, снимок модели</p></div>
<div class="tl" style="border-color:var(--green)"><div class="ph" style="color:var(--green)">v2 · готово ✓</div><h4>Операции, выборка, STEP</h4><p>Эскиз на грани · вращение · скругление/фаска · list_faces/edges · import_step · export_step · list_components · навык kompas-3d</p></div>
<div class="tl" style="border-color:var(--green)"><div class="ph" style="color:var(--green)">v3 · готово ✓</div><h4>B-rep + структурный осмотр</h4><p><b>move_face</b> (сдвиг грани на N мм) · <b>describe_model</b> · list_features · list_bodies · list_variables · describe_face · describe_edge · measure</p></div>
<div class="tl cur"><div class="ph">v4 · в работе</div><h4>Массивы + 2D</h4><p>Массивы/паттерны · рассечение тела · виды, размеры, штриховки; свойства документа</p></div>
<div class="tl"><div class="ph">v5</div><h4>Сборки и транспорт</h4><p>Построение сборок, сопряжения; HTTP/SSE-транспорт</p></div>
</div>
</div>
</section>
<footer>
<div class="wrap">
<div>КОМПАС-3D MCP · документация проекта</div>
<div class="links">
<a href="../README.md">📦 README</a>
<a href="ARCHITECTURE.md">📐 Документ архитектуры</a>
<a href="IMPLEMENTATION_PLAN.md">🛠️ План реализации</a>
<a href="OPEN_QUESTIONS.md">❓ Открытые вопросы</a>
<a href="../CLAUDE.md">📘 CLAUDE.md</a>
<a href="KOMPAS_SDK_ru-RU/index.html">📚 Справка SDK КОМПАС-3D</a>
<a href="https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/index.html">🌐 Онлайн-справка АСКОН</a>
</div>
</div>
</footer>
</body>
</html>