feat(query): инструмент get_part_info (МЦХ детали)

QueryService через IMassInertiaParam7: объём, масса, площадь, центр масс.
Единицы выставляются детерминированно (мм/кг) через LengthUnits/MassUnits —
иначе КОМПАС отдаёт значения в единицах отображения МЦХ (по умолчанию см/г).
Calculate() возвращает FALSE даже при успехе → опираемся на свойство Actual.

Интеграционный тест: цилиндр R10×H20 → V≈6283 мм³, S≈1885 мм², m≈0.049 кг, Zc=10 мм.
Находка задокументирована в OPEN_QUESTIONS; презентация обновлена (19 инструментов, 14 тестов).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@
This commit is contained in:
2026-05-26 09:35:57 +03:00
parent 60cf26f739
commit b73748f84b
7 changed files with 172 additions and 5 deletions
+10
View File
@@ -69,6 +69,16 @@ stateful-сессии? Пока полагаемся на последовате
передавать через `ImageContentBlock.FromBytes(bytes, mimeType)` — он сам кодирует. Прямое
присваивание `Data = rawBytes` портит изображение на проводе. Исправлено в VisionTools.
### ✅ МЦХ (get_part_info): единицы измерения и поведение Calculate()
`IMassInertiaParam7` по умолчанию возвращает значения в **единицах отображения МЦХ** документа
(по умолчанию см³/см²/г, плотность г/см³) — то есть зависит от настроек, а не фиксированные СИ.
Поэтому `QueryService` принудительно выставляет `LengthUnits = ksLUnMM` и `MassUnits = ksMUnKG`
перед чтением → детерминированные **мм³, мм², кг, мм**. Проверено тестом (цилиндр R10×H20:
V≈6283 мм³, S≈1885 мм², m≈0.0494 кг, Zc=10 мм).
Тонкость: `Calculate()` возвращает **FALSE даже при успехе** (когда расчёт уже актуален после
`RebuildDocument`), поэтому опираемся на свойство `Actual`, а не на возвращаемое значение.
Материал по умолчанию — сталь (ρ≈7.856 г/см³); масса зависит от назначенного материала.
### ✅ Снимок 3D: рендер через файл, а не resultArrayBytes
`ksDocument3D.SaveAsToRasterFormat(fileName, param)` при **непустом** `fileName` возвращает TRUE,
пишет корректный PNG на диск, но `param.resultArrayBytes` остаётся **пустым**. Поэтому