- 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>
Методы 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>
Новый слой «модель как данные» (приоритетный над 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(query): перечисление граней + выбор грани по индексу
QueryService.ListFacesAsync: обход EntityCollection(o3d_face), для каждой грани —
индекс, тип поверхности (plane/cylinder/cone/sphere/torus/nurbs через ksFaceDefinition.Is*)
и площадь (GetArea, мм²). Запись FaceInfo.
PartModeler.OpenSketchOnFaceIndexAsync: эскиз на грани по индексу из list_faces —
надёжнее выбора по точке (агенту не нужно угадывать координаты).
Новые инструменты: list_faces, sketch_create_on_face_index.
Тест List_faces_and_sketch_by_index: цилиндр → 3 грани (2 plane + 1 cylinder),
площади торца ≈314 мм² и бока ≈1257 мм²; эскиз на торце по индексу → бобышка.
Презентация: 28 инструментов, 18 тестов.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
feat(query): габариты детали (get_bounding_box)
QueryService.GetBoundingBoxAsync через API5 ksPart.GetGabarit(full=false) →
габаритный параллелепипед (мм) + размеры по осям. Помогает агенту оценить
протяжённость модели и подбирать точки для select-by-point (грани/рёбра).
Новый инструмент get_bounding_box; запись BoundingBox.
Тест: цилиндр R10×H20 → X,Y ∈ [-10;10], Z ∈ [0;20] (расширен QueryTests).
Презентация: 26 инструментов.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
feat(features): операция вращения (revolve_boss / revolve_cut)
PartModeler.RevolveAsync через API5 o3d_bossRotated/o3d_cutRotated:
directionType=dtNormal, toroidShapeType=сфероид, SetThinParam(false), SetSideParam(forward, angle).
Ось вращения — осевая линия в эскизе (системный стиль 3); добавляется sketch_add_axis.
Новые MCP-инструменты: sketch_add_axis, revolve_boss, revolve_cut (угол в градусах, по умолчанию 360).
Тест Revolve_rectangle_makes_tube: профиль [10..15]×[0..20] вокруг оси Y → труба
(внеш. R15, внутр. R10, H20), объём π·2500 ≈ 7854 мм³ — проверено через get_part_info.
Презентация: 23 инструмента, 16 тестов.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
feat(sketch): эскиз на выбранной грани + МЦХ через API5
sketch_create_on_face: OpenSketchOnFaceAsync выбирает плоскую грань по точке
(ksPart.EntityCollection(o3d_face).SelectByPoint) и создаёт на ней эскиз —
ключевой шаг итеративного цикла «построил → выбрал грань → новый эскиз».
Общее ядро создания эскиза вынесено в CreateSketchOn.
QueryService переписан на API5 ksPart.CalcMassInertiaProperties(ST_MIX_MM|ST_MIX_KG):
- API7 IMassInertiaParam7.Calculate() непригоден — флаг Actual «залипает» после
первого расчёта, повторный запрос отдавал устаревший объём (баг кэша);
- API5-маршрут считает по запросу и согласован с построением через ksPart;
- единицы (мм³/мм²/кг/мм) задаются битовым вектором.
Тест Sketch_on_face_adds_boss_on_top: запрос → штифт R5×H10 на верхней грани
цилиндра → повторный запрос видит прирост ≈785 мм³ (проверяет и грань, и кэш МЦХ).
Презентация: 20 инструментов, 15 тестов; OPEN_QUESTIONS обновлён.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@