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
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
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
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
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
775128484e
feat(drawing): ассоциативная привязка диаметрального/радиального размера к окружности вида
...
Флаг associate у drawing_add_diametral_dimension/drawing_add_radial_dimension:
- associate=false (по умолчанию) — прежний свободный размер (без изменений);
- associate=true — (xc,yc,radius) как ключ поиска спроецированной окружности
(IDrawingContainer.Circles), привязка через BaseObject; значение Ø/R читается
из геометрии и обновляется с моделью.
- CircularObjectMatch.SelectMatchIndex (чистый отбор по центру+радиусу, допуск 1 мм;
бросает при отсутствии/неоднозначности; концентрические разделяются радиусом)
- RequireViewContainers (вид → ISymbols2DContainer + IDrawingContainer), CollectCircles, FindBaseCircle
- 5 unit + 6 интеграционных тестов (всего 278 зелёных), сборка Release чистая
Спайк подтвердил: BaseObject=circle без задания Xc/Yc/Radius → Valid, NominalValue из
геометрии (Ø=20/R=10 для R10). Объём — только окружности (Circles); дуги/угловой/линейный —
далее. Ревью Codex спека учтено (оба контейнера, guard вокруг блока, доказательство
ассоциативности тестом radius=10.3→Ø20, регресс обоих свободных путей).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 21:47:17 +03:00
mikhail
5272066bef
feat(drawing): текстовые обозначения — шероховатость, текст, тех. требования
...
drawing_add_rough (знак шероховатости: ISymbols2DContainer.Roughs + IRoughParams,
SignType ksRoughSignEnum, значение Ra/Rz через RoughParamText.Str),
drawing_add_text (свободная надпись: IDrawingContainer.DrawingTexts + IText.Str),
drawing_set_technical_requirements (блок тех. требований уровня документа:
IDrawingDocument.TechnicalDemand.Text).
- DrawingService: AddRoughAsync/AddTextAsync/SetTechnicalRequirementsAsync +
ReadTechnicalRequirementsAsync + счётчики; RequireDrawingContainer/RequireTechnicalDemand
- RoughSignType (enum + Parse/ToKompas), DrawingAnnotationResult (Value read-back из COM)
- RequireNonEmptyText в DrawingValidation
- 13 unit + 13 интеграционных тестов (всего 267 зелёных), сборка Release чистая
Спайк подтвердил: значение шероховатости через IRoughParams.RoughParamText.Str (round-trip);
текст НЕ в IView.ObjectCount (счёт по DrawingTexts.Count); тех. требования IsCreated False→True
при первом Text.Str+Update, многострочно через \n. Ревью Codex спека учтено (height убран —
это высота блока, не шрифт; guards; read-back возврат). Спек — docs/superpowers/specs/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 21:13:11 +03:00
mikhail
86a5a52347
review(drawing): правки по ревью реализации Codex (угловой размер)
...
- описание (x3,y3) и сообщение об ошибке: угол выбирает angleType, не точка дуги
- тест angleType=Max (лучи 0°/45° → 135° тупой супплемент): min=45/max=135/more=315
- спек дополнен находкой о трёх типах угла
241 тест зелёный, сборка Release чистая.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 19:58:15 +03:00
mikhail
246233727c
feat(drawing): радиальный (R) и угловой размеры на виде чертежа
...
drawing_add_radial_dimension (R окружности/дуги; NominalValue = радиус) и
drawing_add_angular_dimension (угол между двумя сторонами; angleType min/max/more
выбирает измеряемый сектор) через API7 ISymbols2DContainer. Завершают базовое
семейство размеров чертежа (после линейного и диаметрального).
- DrawingService: AddRadialDimensionAsync/AddAngularDimensionAsync + счётчики
- AngleDimensionType (enum + Parse/ToKompas, по образцу DimensionOrientations)
- DrawingDimensionResult.Value — единице-нейтральный (мм / градусы)
- 9 unit + 13 интеграционных тестов (всего 240 зелёных)
Спайк подтвердил: радиальный NominalValue = РАДИУС (не диаметр, вопреки справке);
у углового измеряемый угол выбирает angleType (min=90°/more=270°), а (x3,y3) лишь
позиционирует дугу. Спек и ревью Codex — docs/superpowers/specs/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 19:51:10 +03:00
mikhail
b6ca2f7b21
feat: drawing_add_diametral_dimension — упрочнение по ревью Codex реализации
...
#2 : инвариант диаметра value>0 (value<=0||!IsFinite, не Abs<1e-6). #3 : сообщение
create_standard_views обобщено (номера видов для инструментов размеров). #4a:
ToRadians проверяет конечность результата (переполнение). #5d: тест viewNumber:999
(вид не найден). #6 : комментарий DimensionType переформулирован (COM-дефолт).
Тесты: DrawingDiametralTests 4→5. Итого 141 unit + 77 integration = 218.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 18:38:33 +03:00
mikhail
910d120c8a
feat: drawing_add_diametral_dimension — диаметральный размер на виде (API7)
...
Веха 2D-ЧЕРТЁЖ, инкремент 4. DrawingService.AddDiametralDimensionAsync:
(ISymbols2DContainer)view.DiametralDimensions.Add → Xc/Yc/Radius/Angle(рад) +
AutoNominalValue → Update → Valid → NominalValue (= диаметр 2R). angle в градусах
(DimensionAngles.ToRadians). Новый инструмент drawing_add_diametral_dimension.
Рефактор по ревью Codex: извлечён RequireSymbols2DContainer(viewNumber) (общий для
линейных/диаметральных размеров); AutoNominalValue выставляется явно (как у линейного);
DimensionType — COM-дефолт; ToRadians — чистый helper с unit-тестом.
Валидаторы: RequirePositiveRadius (новый). Тесты: +10 unit (ToRadians,
RequirePositiveRadius), +4 integration (DrawingDiametralTests: диаметр=2R, адресация
вида, radius<=0, нет видов). Итого 141 unit + 76 integration = 217.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 18:30:04 +03:00
mikhail
b6cd92b95c
docs: спек drawing_add_diametral_dimension — диаметральный размер (API7)
...
Веха 2D-ЧЕРТЁЖ, инкремент 4. Спайк: (ISymbols2DContainer)view.DiametralDimensions.
Add → Xc/Yc/Radius/Angle(рад) → Update; NominalValue == диаметр (2R, проверено 30).
Angle экспонируется в градусах. Та же модель, что линейный размер.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 18:17:15 +03:00
mikhail
71cafb2270
feat: drawing_add_linear_dimension — упрочнение по ревью Codex реализации
...
#4 : отклонение нулевого NominalValue после Update (ориентация несовместима с
точками, напр. horizontal на вертикали |X2-X1|=0) — откат dim.Delete + ошибка.
#3 : Parallel протестирован — работает БЕЗ явного Angle (КОМПАС авто-вычисляет угол
по точкам; (0,0)-(30,40)→50). #7 : rollback-ветка покрыта тестом нулевой проекции.
#8 : контракт «первый несистемный вид» — осознанный (задокументирован).
Тесты: DrawingDimensionTests 5→7 (+parallel, +нулевая проекция/откат). Итого
131 unit + 72 integration = 203.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 18:07:01 +03:00
mikhail
8e0ab374af
feat: drawing_add_linear_dimension — линейный размер на виде (API7)
...
Веха 2D-ЧЕРТЁЖ, инкремент 3. DrawingService.AddLinearDimensionAsync: (ISymbols2D
Container)view (QI) → LineDimensions.Add → X1..Y3 (локальная СК вида) + Orientation
+ AutoNominalValue → Update → проверка Valid → ((IDimensionText)dim).NominalValue.
Свой enum DimensionOrientation (horizontal/vertical/parallel). Новый инструмент
drawing_add_linear_dimension. DrawingViewsResult += ViewNumbers (адресация видов).
Находка: размеры НЕ в IView.ObjectCount (он про геометрию IDrawingContainer) —
проверка попадания в вид через ISymbols2DContainer.LineDimensions.Count.
Ревью Codex спека учтено: RequireDistinctPoints (нулевая длина) + Valid после
Update; контракт «первый несистемный вид»; null-check Add; AutoNominalValue явно;
ViewNumbers required + текст ответа create_standard_views; тесты адресации/негатив.
Тесты: +8 unit (DimensionOrientations, DrawingValidation), +5 integration
(DrawingDimensionTests). Итого 131 unit + 70 integration = 201.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 18:01:02 +03:00
mikhail
ca3d91ae68
docs: спек drawing_add_linear_dimension — линейный размер на виде (API7)
...
Веха 2D-ЧЕРТЁЖ, инкремент 3. Спайк подтвердил: (ISymbols2DContainer)view QI →
LineDimensions.Add → X1..Y3 (локальная СК вида) + Orientation + Update; авто-значение
((IDimensionText)dim).NominalValue == расстояние (проверено 40). Плюс: DrawingViewsResult
+= ViewNumbers (адресация видов, закрывает замечание Codex из ревью видов).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 17:49:18 +03:00
mikhail
eaa4a56708
feat: drawing_fill_title_block — упрочнение по ревью Codex реализации
...
#3/#6: доступ к графе через RequireStampCell(stamp,columnId) — null-check ячейки
+ единое место валидации (запись и чтение). #4 : проверка columnId>0 в helper
(защищает и ReadStampCellAsync). #2/#5: нетранзакционность записи зафиксирована
комментарием (откат при Update()==FALSE спекулятивен, не делаем). RCW — долг v2-2.
Тесты без изменений в числе: 123 unit + 65 integration = 188 зелёных.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 17:25:41 +03:00
mikhail
742a97177b
feat: drawing_fill_title_block — основная надпись чертежа (API7)
...
Веха 2D-ЧЕРТЁЖ, инкремент 2 (оформление). DrawingService.FillTitleBlockAsync:
LayoutSheets.ItemByNumber[1].Stamp.Text[id].Str = text → Update(). Enum StampField
→ номер графы ГОСТ (designation=2, name=1, material=3). Заполнение нескольких
граф за вызов; перезапись (Str замещает, Clear не нужен — подтверждено спайком).
Новый инструмент drawing_fill_title_block; ReadStampCellAsync для проверки.
Ревью Codex спека учтено: Update() результат проверяется; null-checks
(LayoutSheets/sheet/Stamp); RequireActiveDrawing выделен (сохраняет cast-проверку);
ColumnId switch с дефолтным throw; счётчик = непустые поля; name=графа 1 однозначно.
Валидация — чистый StampFields (ColumnId + Collect). Тесты: +7 unit (StampFields),
+4 integration (DrawingStampTests: заполнение+reread 3 граф, перезапись, пустой
ввод, не-чертёж). Итого 123 unit + 65 integration = 188.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 17:20:16 +03:00
mikhail
db23a1a748
docs: спек drawing_fill_title_block — основная надпись чертежа (API7)
...
Веха 2D-ЧЕРТЁЖ, инкремент 2. Спайк подтвердил round-trip графы: LayoutSheets.
ItemByNumber[1].Stamp.Text[id].Str + Update(). Enum StampField→номер графы ГОСТ
(designation=2, name=1, material=3). Заполнение нескольких граф за вызов.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 17:07:35 +03:00
mikhail
5aa4221a37
feat: drawing_create_standard_views — упрочнение по ревью Codex реализации
...
#1 : непустота проверяется у ВНОВЬ созданных видов (разница IView.Number), не по
всей коллекции — прежняя геометрия чертежа не маскирует пустые новые виды.
#3 : откат созданных видов (IView.Delete) при created!=3 или пустых видах.
#7 : unit-тест нормализации кириллического пути. #4 : повторный вызов (дубликаты)
отражён в описании инструмента. #5/#6/#2 — по обоснованию (release RCW отклонён v2-2).
Тесты: 116 unit + 61 integration = 177 зелёных.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 14:37:35 +03:00
mikhail
de063290f4
feat: drawing_create_standard_views — стандартные виды чертежа (API7)
...
Веха 2 (2D-ЧЕРТЁЖ), инкремент 1. Новый DrawingService (API7, namespace
Kompas.Mcp.Core.Drawings): doc2d.ViewsAndLayersManager.Views.AddStandartViews(
path, "#Спереди", {1,3,5}=front/top/left, x, y, scale, 20, 20). Новый DrawingTools
(инструмент drawing_create_standard_views), регистрация в DI.
Подтверждено спайком: object[]→SAFEARRAY VT_I4 ОК, 3 вида создаются (Count 1→4).
Ревью Codex спека учтено: File.Exists+Length>0; created==3 строго; гарантия
непустоты (сумма ObjectCount>0); опц. x,y (повторный вызов не стопкой); record
DrawingViewsResult{Created,Total}. Точечный release RCW отклонён (v2-2).
Валидация — чистый DrawingValidation (расширение .m3d/.a3d, scale>0).
Тесты: +16 unit (DrawingValidation), +3 integration (DrawingTests: создание 3 видов,
отклонение не-чертежа, несуществующий файл). Итого 114 unit + 61 integration = 175.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 14:30:25 +03:00
mikhail
46648f7635
docs: спек drawing_create_standard_views — стандартные виды чертежа (API7)
...
Веха 2 (2D-ЧЕРТЁЖ), инкремент 1. Механизм подтверждён спайком: doc2d.
ViewsAndLayersManager.Views.AddStandartViews(path, "#Спереди", {1,3,5}, ...);
object[]→SAFEARRAY VT_I4 ОК, 3 вида создаются (Count 1→4). Новый DrawingService.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 14:09:43 +03:00
mikhail
3fe06f61dc
feat: assembly_add_mate — упрочнение по ревью Codex реализации
...
#1 : Valid==false → ошибка (откат), а не «успех с valid=false»; косвенно отсекает
грани одного компонента (вырожденный мат). #6/#7: distance value строго > 0
(нулевой зазор = coincidence) + unit-кейс value=0 бросает. #8 : негативный
интеграционный тест — точка в пустоте → грань не найдена → ошибка.
#2/#3/#4 оставлены по обоснованию (best-effort откол, Add??throw, первый IFace —
консистентно с HoleService). #9 точечный release RCW отклонён (конвенция v2-2).
Тесты: 98 unit + 58 integration = 156 зелёных.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 13:45:35 +03:00
mikhail
8282716773
feat: assembly_add_mate — сопряжения компонентов сборки (API7)
...
Веха СБОРКИ, инкремент 2. AssemblyService.AddMateAsync (API7): top.MateConstraints
→ Add(MateConstraintType) → BaseObject1/2 (грани через FindObjectsByPoint
FirstLevel=false) → ParamValue → Update → RebuildModel. Свой enum MateType
(Coincidence/Distance) → MateConstraintType. MCP-инструмент assembly_add_mate.
Подтверждено спайком и тестами: coincidence сводит грани заподлицо (ширина 120→40),
distance(30) держит зазор 30 (→70); Update=True Valid=True. Решатель может двигать
любой компонент → проверка по ширине габарита.
Ревью Codex учтено: scope урезан до coincidence/distance (только геометрически
проверенные); валидация value по типу (RequireMateValue); полный откат при любой
ошибке после Add (mate.Owner.Delete); возврат AddedMate{Type,Valid}; усиленные
ассерты (Valid, размеры компонентов неизменны). Точечный release RCW отклонён
(конвенция v2-2). Прочие типы (parallel/concentric/angle/…) — будущие инкременты.
Тесты: +14 unit (Mates.Parse/RequiresValue, RequireMateValue), +2 integration
(AssemblyMateTests). Итого 97 unit + 57 integration = 154 зелёных.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 13:39:04 +03:00
mikhail
5e6d3ec8ae
docs: спек assembly_add_mate — сопряжения компонентов (API7), спайк зелёный
...
Веха СБОРКИ, инкремент 2. Механизм подтверждён спайком: mates.Add(type) +
BaseObject1/2 (грани через FindObjectsByPoint FirstLevel=false) + Update +
RebuildModel. Coincidence (ширина 120→40), Distance(30) (→70). Свой enum MateType.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 13:24:58 +03:00
mikhail
5eee7ad1af
feat: assembly_add_component — вставка детали из .m3d в сборку (API7)
...
Веха СБОРКИ, инкремент 1. Новый AssemblyService (API7, паттерн HoleService):
IParts7.AddFromFile → Placement.SetOrigin → RebuildModel. Новый AssemblyTools
(MCP-инструмент assembly_add_component), регистрация в DI.
Ключевая находка: UpdatePlacement возвращает FALSE для вручную позиционируемого
компонента (не ошибка), позицию применяет SetOrigin + RebuildModel(true).
Валидация — чистый AssemblyValidation (расширение .m3d/.a3d, нормализация пути,
конечность координат). RequireActiveAssembly — раздельные ошибки по типу документа.
Тесты: +14 unit (AssemblyValidation), +3 integration (AssemblyTests: вставка в
origin, позиционирование со сдвигом, отклонение не-сборки). Итого 83 unit + 53
integration = 136 зелёных.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 13:04:19 +03:00
mikhail
5f17884f06
docs: спек assembly_add_component — учтены 8 замечаний ревью Codex
...
Проверки COM-результатов (AddFromFile/SetOrigin/UpdatePlacement), helper
RequireActiveAssembly (раздельные ошибки, проверка типа документа до TopPart),
валидация расширения .m3d/.a3d + нормализация пути, before/after count в тесте,
фиксированная геометрия детали от нуля, проверка сохранённости файла.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 12:57:04 +03:00
mikhail
a8f7363869
docs: спек assembly_add_component — вставка детали из .m3d в сборку (API7)
...
Веха СБОРКИ, инкремент 1. Новый AssemblyService (API7, паттерн HoleService):
AddFromFile → Placement.SetOrigin → UpdatePlacement. Сигнатуры подтверждены
рефлексией interop. Валидация — чистые static. Тест — габаритом/числом компонентов.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-27 12:50:35 +03:00
mikhail
aec2f1e52f
feat: типы отверстий — цековка и зенковка (hole_counterbore, hole_countersink) через API7
...
- HoleCore отрефакторен: параметр holeType + Action<IHole3D> configure (настройка HoleParameters)
- CounterboreHoleAsync (ksHTCounterbore + ISpotfacingHoleParameters: SpotfacingDiameter/Depth)
- CountersinkHoleAsync (ksHTCountersinking + ICountersinkHoleParameters: ksCTDiameterAngle, Diameter/Angle)
- переиспользуется размещение/подбор направления/откат из базового hole
- инструменты hole_counterbore, hole_countersink; интеграционные тесты (объём ±10% / больше базы)
- 69 инструментов, 118 тестов; спек docs/superpowers/specs/2026-05-27-hole-types-design.md
2026-05-27 11:59:15 +03:00
mikhail
9237340667
docs: параметрические эскизы — решающий spike отрицательный (ksCDimWithVariable не строится)
...
API7-путь построения эскиза работает (Sketchs.Add→BeginEdit→FragmentDocument→IDrawingContainer→
LineSegments.Add), но управляющий размер недостижим: ksCDimWithVariable Create=False из внешней
автоматизации; ksCFixedLenght игнорирует Expression со ссылкой на переменную (привязан к литералу).
Вывод: переменные не драйвят геометрию эскиза через доступный COM-API. Путь признан тупиковым.
2026-05-27 11:54:10 +03:00
mikhail
67afbbfb3e
docs: разведка параметрических эскизов — findings (крупная подсистема API7, отложено)
...
Установлено эмпирически: управляющий размер (ksCDimWithVariable) есть только в API7;
API5-эскиз через API7 ISketch.Curves не аннотируется (Curves=null); правильный путь —
ISketch.BeginEdit→FragmentDocument→IDrawingContainer — отдельная подсистема построения
эскизов. Реализация выделена в отдельный труд; spike-артефакты не коммичены.
2026-05-27 11:43:29 +03:00
mikhail
bc52b5d920
feat: параметрика — переменные модели (create/set/delete_variable) через API5
...
- VariableService: CreateVariableAsync/SetVariableAsync/DeleteVariableAsync/GetVariableValueAsync
- создание ТОЛЬКО на ksFeature.VariableCollection (ksPart — только внешние); RebuildModel + re-fetch
- Expression — ведущее поле (константа/формула со ссылками); value пересчитывается
- list_variables (ModelInspectionService) исправлен: читает feature-коллекцию (все переменные)
- инструменты create_variable/set_variable/delete_variable (VariableTools) + DI
- интеграционный тест CRUD round-trip (создание, формула width*2, удаление по зависимостям)
- ОГРАНИЧЕНИЕ: переменные драйвят геометрию лишь в параметрической модели (эскизы на литералах — нет)
- 116 тестов; спек docs/superpowers/specs/2026-05-27-parametrics-design.md
2026-05-27 11:14:28 +03:00
mikhail
205a4b02de
feat: уклон граней (draft) через API5 — ksInclineDefinition o3d_incline=42
...
- ВОПРЕКИ прежнему предположению: уклон ЕСТЬ в API5 (операция Incline, не Draft) →
стандартный паттерн PartModeler, регистрируется в _features (массивы/зеркало применимы)
- DraftAsync: FaceArray().Add(грани) + SetPlane(нейтральная коорд. плоскость) + angle + direction
- ЭМПИРИЧЕСКИ: direction=false=расширение, true=сужение (обратно справке) → маппинг !outward
- инструмент draft (faceIndices, neutralPlane, angle 0..90, outward); валидация угла и индексов
- интеграционный тест: 4 боковые грани коробки → усечённая пирамида (объём ±10%)
- 105 тестов; спек docs/superpowers/specs/2026-05-27-draft-design.md
2026-05-27 10:23:16 +03:00
mikhail
d3dd78ec0b
fix: правки hole по ревью Codex
...
- направление сверления — по факту убыли объёма (Update=TRUE даже при сверлении в воздух
на сквозном отверстии); TryDirection + CurrentVolume (API5 МЦХ) — P2-баг, вскрыт тестом
- валидация double.IsFinite для координат/диаметра/глубины (Infinity проходил мимо >0) — P2
- откат точки-сироты и объекта отверстия при неуспехе (IFeature7.Delete) + RebuildDocument — P2
- тест Hole_through_bottom_face_uses_direction_fallback (нижняя грань) — P3
- 104 теста зелёных
2026-05-27 10:04:22 +03:00
mikhail
13ab0f6581
feat: отверстие (hole) через API7 — IHoles3D/IHole3D + IHoleDisposal
...
- 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
2026-05-27 09:53:54 +03:00
mikhail
8cc0f49f99
docs: правки спека пакета C по дизайн-ревью Codex (circular свойствами, multi-feature тест, эмпирические тонкости)
2026-05-27 00:03:47 +03:00
mikhail
d6ab16fd6a
docs: спек пакета C — массивы и зеркало (linear/circular pattern, mirror)
2026-05-26 23:45:40 +03:00
mikhail
b2aac016af
feat: смещённая плоскость (sketch_create_on_offset_plane) + операция по сечениям (loft)
...
OpenSketchOnOffsetPlaneAsync (o3d_planeOffset=14, ksPlaneOffsetDefinition) —
эскиз на смещённой плоскости. LoftAsync (o3d_baseLoft=30, ksBaseLoftDefinition):
Sketchs().Add сечений + SetLoftParam + SetThinParam(false). Смещённая плоскость
разблокировала loft (параллельные сечения). Integration: цилиндр на высоте 20;
loft 2 квадратов → призма 16000 мм³.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 23:17:00 +03:00
mikhail
6e3c7c6fd5
feat(feature): кинематическая операция (sweep)
...
SweepAsync (o3d_baseEvolution): SetSketch(профиль) + PathPartArray(траектория)
+ sketchShiftType=0 + SetThinParam(false). Инструмент sweep в FeatureTools.
Integration: окружность R5 по вертикали 50 → цилиндр ~3927 мм³.
loft отложен — требует offset-плоскости (пакет E) для параллельных сечений.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 23:04:42 +03:00
mikhail
fc99739e1e
feat(feature): операция Ребро жёсткости (rib)
...
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 >
2026-05-26 22:51:58 +03:00
mikhail
115fcb8759
feat(feature): операция Оболочка (shell)
...
ShellAsync (o3d_shellOperation): удаление граней по индексам + толщина стенки,
thinType=!outward. SelectFaceByIndex в ядре, инструмент shell в FeatureTools.
Валидация: thickness>0, дедупликация индексов, проверка диапазона до мутации.
Integration-тест: коробка 40x30x20 → оболочка 2мм → 7152 мм³ (±5%).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 22:28:03 +03:00
mikhail
b6ee39a914
docs(spec): дизайн операции Оболочка (shell) — пакет B шаг 1
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 22:20:02 +03:00
mikhail
2eab169e28
docs(plan,spec): правки по ревью Codex — примитивы эскиза
...
- NURBS: порядок 4 (кубический), не degree=3; константа SplineOrder
- NewParam<T>: освобождать сырой RCW при неудачном cast
- сплайн: ksEndObj гарантированно через try/finally
- валидация вынесена в SketchGeometry (RequirePositive/RequireVertexCount/
RequirePoints с null+finite) — unit-тестируема
- closed polyline требует >=3 точек
- SketchPoint: [JsonPropertyName] x/y; Map с null-guard
- точка: убран неверный термin «вспомогательная»; нейтральный стиль
- зафиксированы источники сигнатур (Automation=docs, типы=interop A/B)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 21:43:23 +03:00
mikhail
362fea4d54
docs(spec): дизайн пакета A — богаче эскизы (примитивы 2D)
...
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 >
2026-05-26 21:06:34 +03:00