- HoleService (Core/Modeling): простое цилиндрическое отверстие (ksHTBase), сквозное/глухое
- размещение: BaseSurface=грань (FindObjectsByPoint) + AssociationVertex=Points3D.Add()
(точка по мировым координатам ksPParamCoord+X/Y/Z); эскиз размещения не нужен
- в API5 определения отверстия НЕТ (как draft) — реализовано на API7 (прецедент: move_face)
- авто-направление в тело с повтором; DI-регистрация; инструмент hole в FeatureTools
- интеграционные тесты: сквозное (Ø10 удаляет π·25·20) + глухое (Ø8×10); spike зелёный с первого раза
- 103 теста зелёных; спек docs/superpowers/specs/2026-05-27-hole-design.md
- mirror_body: ChooseBodies() в interop не приводится к ksChooseBodies (null) и не нужен —
o3d_mirrorAllOperation по умолчанию отражает все тела, сохраняя оригинал (проверено тестом);
убран нерабочий вызов (P2 fail-fast вскрыл, что приведение всегда падает)
- добавлен тест CircularPattern_reverse_flips_rotation_direction (проводка inverce) — P2
- комментарий класса FeatureOpsTests: пакеты B и C — P3
- 101 тест (60 unit + 41 integration)
- CreateSketchOn проверяет entity.Create() (улучшает все пути создания эскиза)
- loft-сообщение считает сечения после дедупликации
- тест loft: проверка габарита 20x20x40
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- thickness через RequirePositive (NaN-safe) + проверка angle на IsFinite
- описание side нейтральное (ksRibSideEnum), без 'ортогонально'
- тест: проверка объёма L-уголка (before), комментарий side=left
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
RibAsync (o3d_ribOperation): SetSketch + index/angle/side + SetThinParam.
SketchGeometry.RibSide маппинг (left/right/up/down). Инструмент rib в FeatureTools.
Эмпирически: контур ребра висит в зазоре (не касается тела), side=left для косынки.
Integration: L-уголок + ребро в углу → объём растёт.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- сообщение shell считает грани после дедупликации (Distinct)
- тест переименован (open_cap) + комментарий о симметрии торцов
- RCW-долг транзитов shell задокументирован в OPEN_QUESTIONS v2-2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
50 инструментов, 78 тестов (47 unit + 31 integration). Пакет A «богаче
эскизы» отмечен выполненным; следующие — B (формообразующие) / C (массивы).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Методы PartModeler + MCP-инструменты sketch_add_arc_3points/arc/ellipse/
polyline/polygon/spline/point. NURBS порядок 4, ksEndObj через try/finally,
param-структуры через NewParam с освобождением RCW. 7 интеграционных
тестов (профиль → выдавливание → объём) зелёные.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Разбит на PartModeler.cs (ядро: реестр, helpers, NewParam, reset/dispose),
PartModeler.Sketch.cs (эскизы и 2D-примитивы), PartModeler.Features.cs
(выдавливание/вращение/скругление/фаска). Поведение не изменено,
регрессия ModelingTests 7/7 зелёная.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
10 задач TDD: рефакторинг PartModeler в partial, SketchGeometry+SketchPoint,
по одному примитиву на задачу (дуга x2, эллипс, ломаная, многоугольник,
сплайн, точка), финальный прогон и документация. Сигнатуры COM и коды
param-структур сверены рефлексией по libs/kompas-interop/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7 новых MCP-инструментов эскиза: дуга (3 точки / центр+углы), эллипс,
ломаная, правильный многоугольник, сплайн (NURBS), точка. Тонкие обёртки
над ksDocument2D; param-структуры через GetParamStruct. Рефакторинг
PartModeler в partial class (Sketch/Features). Сигнатуры COM сверены по
docs/Kompas3D_SDK/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Вынесены общие ComHelper (Release + Safe-геттеры) и GeomClassifiers
(FaceType/EdgeType), устранены дубли в 5+ сервисах. Освобождение doc3d RCW
в GetTopPart, void-возвраты вместо фиктивных bool, HashSet для OpKinds,
DocumentTypeName в паспорте модели, FileExtension без аллокаций.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1) «Зрение» структурное: describe_model/describe_face/describe_edge/measure —
предпочесть снимку (точнее и дешевле по контексту); model_snapshot только для
визуально-пространственных вопросов, не гонять картинку зря.
2) validate_part после КАЖДОЙ операции: Update()==true ≠ успех; непустой результат
(напр. et3dError54) = брак, в STEP/печать не брать.
Базовый и импортный циклы + эвристики переориентированы на структурный осмотр и
обязательную проверку построения.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Новый слой «модель как данные» (приоритетный над 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>
feat(query): перечисление рёбер + скругление/фаска по индексу
QueryService.ListEdgesAsync: обход EntityCollection(o3d_edge), для каждого ребра —
индекс, тип кривой (line/circle/arc/ellipse/nurbs через ksEdgeDefinition.Is*) и длина
(GetLength, мм). Запись EdgeInfo. Новый инструмент list_edges.
PartModeler: выделены ядра CreateFillet/CreateChamfer и хелпер SelectEdgeByIndex;
добавлены FilletEdgeIndexAsync/ChamferEdgeIndexAsync. Новые инструменты
fillet_edge_index, chamfer_edge_index — выбор ребра по индексу (надёжнее точки).
Тест List_edges_and_fillet_by_index: цилиндр → 2 круговых ребра ≈62.83 мм →
скругление ребра по индексу → объём уменьшается. Итого 31 инструмент, 19 тестов.
Документация синхронизирована через навык docs-delegate (Sonnet).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
feat(skills): навык kompas-sdk-research + перенос kdoc.py в навык
Новый навык kompas-sdk-research делегирует поиск/чтение офлайн-справки КОМПАС SDK
субагенту Sonnet (экономит контекст Opus на 26k страниц WebHelp).
Навигатор kdoc.py перенесён tools/ → .claude/skills/kompas-sdk-research/ как часть навыка;
добавлен автопоиск каталога справки (вверх от CWD/скрипта или через KDOC_DIR),
чтобы скрипт работал из любой точки. Индекс остаётся в docs/kompas_sdk_index.tsv.
Ссылки обновлены в CLAUDE.md, README, ARCHITECTURE, presentation, .gitignore.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
chore: добавить навык docs-delegate в репозиторий
Навык делегирует обновление документации субагенту Sonnet. В таблицу файлов
добавлены docs/presentation.html (синхронизировать всегда) и CLAUDE.md —
закрыт пробел: ранее навык не упоминал презентацию, которую нужно держать актуальной.
.claude/settings.local.json остаётся в .gitignore.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
docs: актуализация CLAUDE.md под состояние v2
Current state → v1+v2 (28 инструментов, 18 тестов). Добавлены ключевые факты:
выбор граней/рёбер (SelectByPoint/индекс, классификация ksFaceDefinition),
МЦХ через API5 CalcMassInertiaProperties (почему не API7), габариты, ось вращения (стиль 3).
Обновлён список «не сделано» и каверза направления операций на грани.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@