@
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> @
This commit is contained in:
@@ -60,4 +60,32 @@ public sealed class QueryService
|
||||
if (Marshal.IsComObject(part)) Marshal.ReleaseComObject(part);
|
||||
}
|
||||
}, ct);
|
||||
|
||||
/// <summary>Габаритный параллелепипед активной детали (по телам), мм.</summary>
|
||||
public Task<BoundingBox> GetBoundingBoxAsync(CancellationToken ct = default)
|
||||
=> _dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
var doc3d = _session.Kompas.ActiveDocument3D() as ksDocument3D
|
||||
?? throw new InvalidOperationException("Нет активного 3D-документа.");
|
||||
var part = doc3d.GetPart((short)Part_Type.pTop_Part) as ksPart
|
||||
?? throw new InvalidOperationException("Не удалось получить вершинный компонент (ksPart).");
|
||||
try
|
||||
{
|
||||
// full=false → только тела (без вспомогательной геометрии); customizable игнорируется.
|
||||
if (!part.GetGabarit(false, false,
|
||||
out double x1, out double y1, out double z1,
|
||||
out double x2, out double y2, out double z2))
|
||||
throw new InvalidOperationException("GetGabarit вернул FALSE (модель пуста?).");
|
||||
|
||||
return new BoundingBox
|
||||
{
|
||||
MinX = Math.Min(x1, x2), MinY = Math.Min(y1, y2), MinZ = Math.Min(z1, z2),
|
||||
MaxX = Math.Max(x1, x2), MaxY = Math.Max(y1, y2), MaxZ = Math.Max(z1, z2),
|
||||
};
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (Marshal.IsComObject(part)) Marshal.ReleaseComObject(part);
|
||||
}
|
||||
}, ct);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user