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>
This commit is contained in:
2026-05-26 23:04:42 +03:00
parent f284653189
commit 6e3c7c6fd5
4 changed files with 124 additions and 0 deletions
@@ -266,6 +266,39 @@ public sealed partial class PartModeler
return id;
}, ct);
/// <summary>Кинематическая операция (sweep): переместить профиль (эскиз profileSketchId)
/// вдоль траектории (эскиз pathSketchId), образуя сплошное тело. Возвращает id операции.</summary>
public Task<int> SweepAsync(int profileSketchId, int pathSketchId, CancellationToken ct = default)
=> _dispatcher.InvokeAsync(() =>
{
if (profileSketchId == pathSketchId)
throw new ArgumentException("Профиль и траектория должны быть разными эскизами.", nameof(pathSketchId));
var profile = RequireSketch(profileSketchId);
var path = RequireSketch(pathSketchId);
CloseSketchCore(profile); // оба эскиза должны быть закрыты перед операцией
CloseSketchCore(path);
var part = GetTopPart();
var entity = part.NewEntity((short)Obj3dType.o3d_baseEvolution) as ksEntity
?? throw new InvalidOperationException("NewEntity(o3d_baseEvolution) вернул null.");
var def = entity.GetDefinition() as ksBaseEvolutionDefinition
?? throw new InvalidOperationException("GetDefinition() кинематической операции вернул не ksBaseEvolutionDefinition.");
def.SetSketch(profile.Entity);
var pathArr = def.PathPartArray() as ksEntityCollection
?? throw new InvalidOperationException("PathPartArray() вернул не ksEntityCollection.");
pathArr.Add(path.Entity);
def.sketchShiftType = 0; // перенос сечения с сохранением угла
def.SetThinParam(false, 0, 0, 0); // сплошное тело
if (!entity.Create())
throw new InvalidOperationException(
"Create() кинематической операции вернул FALSE (начало траектории не на плоскости профиля или несовместимая геометрия?).");
var id = _nextId++;
_features[id] = entity;
return id;
}, ct);
/// <summary>Перестроить документ.</summary>
public Task RebuildAsync(CancellationToken ct = default)
=> _dispatcher.InvokeAsync(() =>