Files
kompas3d-mcp/tests/Kompas.Mcp.Tests/Integration/FeatureNamingTests.cs
T
mikhail 461e731857 Дерево построения: имя у каждой операции, скругление пакетом по точкам
Имя (name) прокидывается до создания объекта: API5 — ksEntity.name перед Create(),
API7-пути (примитив, отверстие, булева, рез, перенос грани) — IModelObject.Name перед
Update(). Читается назад через ksFeature.name, который только на чтение. Без имени
дерево состоит из «Эскиз:1» и «Элемент выдавливания:3».

fillet_edge/chamfer_edge принимают список точек: на теле с сотнями рёбер list_edges
неподъёмен, а выбор по точке брал одно ребро — четыре угла давали четыре операции.
Ненайденные рёбра перечисляются ВСЕ сразу, модель при этом не мутируется.
2026-07-31 16:35:44 +03:00

87 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Kompas.Mcp.Core.Documents;
using Kompas.Mcp.Core.Modeling;
using Kompas.Mcp.Core.Query;
namespace Kompas.Mcp.Tests.Integration;
/// <summary>
/// Интеграция: имя операции в дереве построения. Без имени дерево — «Эскиз:1», «Элемент
/// выдавливания:1», и вернувшийся к модели агент (или человек) не знает, что чем построено.
/// Имя ставится ДО Create()/Update() и должно читаться обратно через дерево (list_features).
/// </summary>
[Trait("Category", "Integration")]
[Collection(KompasCollection.Name)]
public sealed class FeatureNamingTests : IntegrationTestBase
{
private readonly DocumentService _docs;
private readonly PartModeler _modeler;
private readonly PrimitiveService _primitives;
private readonly ModelInspectionService _inspection;
public FeatureNamingTests(KompasFixture fx) : base(fx)
{
_docs = new DocumentService(fx.Session, fx.Dispatcher);
_modeler = new PartModeler(fx.Session, fx.Dispatcher);
_primitives = new PrimitiveService(fx.Session, fx.Dispatcher);
_inspection = new ModelInspectionService(fx.Session, fx.Dispatcher);
}
private async Task<IReadOnlyList<string>> TreeNamesAsync()
=> (await _inspection.DescribeModelAsync(InspectionText.ModelSections.Tree))
.Features.Select(f => f.Name).ToList();
[Fact]
public async Task Sketch_and_extrusion_carry_their_names_into_the_tree()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
{
var s = await _modeler.OpenSketchAsync(BasePlane.XOY, name: "Контур плашки");
await _modeler.AddRectangleAsync(s, 0, 0, 20, 10);
await _modeler.CloseSketchAsync(s);
await _modeler.ExtrudeAsync(s, depth: 3, name: "Плашка 20×10×3");
await _modeler.RebuildAsync();
var names = await TreeNamesAsync();
Assert.Contains("Контур плашки", names);
Assert.Contains("Плашка 20×10×3", names);
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Primitive_carries_its_name_into_the_tree()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
{
await _primitives.PrimitiveAsync(PrimitiveKind.Block, 0, 0, 0,
length: 20, width: 10, height: 3, name: "Основание корпуса");
var names = await TreeNamesAsync();
Assert.Contains("Основание корпуса", names);
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Without_a_name_kompas_keeps_its_own()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
{
var s = await _modeler.OpenSketchAsync(BasePlane.XOY);
await _modeler.AddRectangleAsync(s, 0, 0, 20, 10);
await _modeler.CloseSketchAsync(s);
await _modeler.ExtrudeAsync(s, depth: 3);
await _modeler.RebuildAsync();
// Имя не задано — дерево остаётся с системными именами, но узлы на месте.
var names = await TreeNamesAsync();
Assert.NotEmpty(names);
Assert.All(names, n => Assert.False(string.IsNullOrWhiteSpace(n)));
}
finally { await _docs.CloseAsync(save: false); }
}
}