как создать сгиб ?

Автор Hafry, 07.10.25, 10:59:26

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Hafry

вот код который создает листовое тело
private static ksDocument3D BuildSheetBack(KompasObject kompas, double length, double width, double height)
{
    // ---- Параметры листа ----
    double t = 1.50;  // толщина листа (мм)
    double bendR = 1.00;  // радиус гиба по умолчанию (мм)
    double kCoef = 0.40;  // коэффициент для развёртки/нейтр. слоя (если используется)

    // ---- Итоговые размеры базы на плоскости XOZ ----
    double baseX = length + width;  // по оси X (горизонталь)
    double baseZ = height;          // по оси Z (вертикаль)

    // NEW: если высота ровно 500 — снимаем 1.5 мм сверху и 1.5 мм снизу (итого -3.0 мм)
    if (Math.Abs(height - 500.0) < 1e-6)
    {
        baseZ = height - 2.0 * t; // 500 - 3.0 => 497
    }

    if (baseX <= 0 || baseZ <= 0)
        throw new ArgumentException("Габариты должны быть положительными.");

    // 1) Создаём документ 3D
    var doc3D = (ksDocument3D)kompas.Document3D();
    if (!doc3D.Create(false, true))
        throw new InvalidOperationException("Не удалось создать 3D-документ.");

    var part = (ksPart)doc3D.GetPart((short)Part_Type.pTop_Part);

    // 2) Эскиз прямоугольника baseX × baseZ на плоскости XOZ (X — горизонталь, Z — вертикаль)
    // В API5: XOY=1, XOZ=2, YOZ=3
    var planeXOZ = (ksEntity)part.GetDefaultEntity(2);
    var sketchEnt = (ksEntity)part.NewEntity(5); // o3d_sketch
    var sketchDef = (ksSketchDefinition)sketchEnt.GetDefinition();
    sketchDef.SetPlane(planeXOZ);

    sketchEnt.Create();
    var s2d = (ksDocument2D)sketchDef.BeginEdit();

    // Центрируем в (0,0): (-baseX/2, -baseZ/2) .. (baseX/2, baseZ/2)
    double x1 = -baseX / 2.0, z1 = -baseZ / 2.0;
    double x2 = baseX / 2.0, z2 = -baseZ / 2.0;
    double x3 = baseX / 2.0, z3 = baseZ / 2.0;
    double x4 = -baseX / 2.0, z4 = baseZ / 2.0;

    s2d.ksLineSeg(x1, z1, x2, z2, 1);
    s2d.ksLineSeg(x2, z2, x3, z3, 1);
    s2d.ksLineSeg(x3, z3, x4, z4, 1);
    s2d.ksLineSeg(x4, z4, x1, z1, 1);

    sketchDef.EndEdit();

    // 3) Листовое тело через API7: толщина симметрично по оси Y (к нам/от нас)
    var app7 = (KompasAPI7.IApplication)kompas.ksGetApplication7();
    var doc3D_7 = (KompasAPI7.IKompasDocument3D)app7.ActiveDocument;
    var sheetCont = (KompasAPI7.ISheetMetalContainer)doc3D_7.TopPart;
    if (sheetCont == null)
        throw new InvalidOperationException("ISheetMetalContainer недоступен для текущей детали.");

    // Переводим наш API5-эскиз в API7.Sketch
    var sketch7 = (KompasAPI7.Sketch)kompas.TransferInterface(sketchEnt, 2, 0);

    var bodies = sheetCont.SheetMetalBodies;
    var body = bodies.Add();

    body.Sketch = sketch7;

    // Симметричная толщина относительно плоскости XOZ ⇒ Y делится пополам вперёд/назад.
    // Если в твоей сборке есть явное свойство ThicknessSymmetric — используй его вместо ThicknessDirection.
    body.ThicknessDirection = true;

    body.Thickness = t;
    body.Radius = bendR;
    body.BendCoefficient = kCoef;

    // Для базовой пластины глубины экструзии не задаём
    body.Depth[true] = 0;
    body.Depth[false] = 0;
    body.Direction = 0;
    body.ExtrusionType[true] = 0;
    body.ExtrusionType[false] = 0;

    // 4) Материализуем тело
    var ent = (ksEntity)kompas.TransferInterface(body, 1, 105);
    ent.name = $"Листовое тело: 2";
    ent.Create();



    return doc3D;
}
не понимаю, можно ли сделать сгиб по середине или это делается только по краям, буду очень благодарен, если кто знает как это сделать правильно, а то замучился читать SDK)

Hafry

если еще будет возможность показать код который это делает буду признателен)))))

Дмитрий22

Скормил Ваш код ИИ, вот что он выдал, если это поможет:
private static void AddBendInMiddle(KompasObject kompas, ksPart part, double baseX, double baseZ, double thickness, double bendRadius)
{
    try
    {
        // Создаем эскиз для линии сгиба по середине
        var planeXOZ = (ksEntity)part.GetDefaultEntity(2); // Плоскость XOZ
        var bendSketchEnt = (ksEntity)part.NewEntity(5); // o3d_sketch
        var bendSketchDef = (ksSketchDefinition)bendSketchEnt.GetDefinition();
        bendSketchDef.SetPlane(planeXOZ);

        bendSketchEnt.Create();
        var s2d = (ksDocument2D)bendSketchDef.BeginEdit();

        // Линия сгиба по середине (вертикальная линия по центру)
        double middleX = 0; // Середина по оси X
        s2d.ksLineSeg(middleX, -baseZ / 2, middleX, baseZ / 2, 1);

        bendSketchDef.EndEdit();

        // Создаем операцию фланца для сгиба
        var app7 = (KompasAPI7.IApplication)kompas.ksGetApplication7();
        var doc3D_7 = (KompasAPI7.IKompasDocument3D)app7.ActiveDocument;
        var sheetCont = (KompasAPI7.ISheetMetalContainer)doc3D_7.TopPart;

        if (sheetCont != null)
        {
            var bends = sheetCont.SheetMetalBends;
           
            // Переводим эскиз в API7
            var bendSketch7 = (KompasAPI7.Sketch)kompas.TransferInterface(bendSketchEnt, 2, 0);
           
            // Создаем фланец для сгиба
            var flange = bends.AddFlangeByLine(bendSketch7);
           
            if (flange != null)
            {
                // Настройки фланца для сгиба на 90 градусов
                flange.Angle = 90.0; // Угол сгиба
                flange.Radius = bendRadius; // Радиус сгиба
                flange.Length = 20.0; // Длина фланца (можно настроить по необходимости)
               
                // Направление сгиба (можно настроить по необходимости)
                flange.Direction = true;
               
                // Применяем фланец
                var flangeEnt = (ksEntity)kompas.TransferInterface(flange, 1, 105);
                flangeEnt.name = "Сгиб по середине";
                flangeEnt.Create();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Ошибка при создании сгиба: {ex.Message}");
        // Можно продолжить выполнение без сгиба
    }
}


Hafry

не помогло нейронка тут так себе, "SheetMetalBends" не содержит определения "AddFlangeByLine"((((

Дмитрий22

Да, иногда у нее бывают галлюцинации:

Где ты взял AddFlangeByLine?

Вы абсолютно правы, что спросили! Я допустил ошибку - в реальном API Компас-3D метода AddFlangeByLine не существует. Это была моя выдумка, основанная на логике работы, но не соответствующая реальному API.

Дмитрий22

Сделай сгиб посредине, только без выдумок!

Давайте сделаем сгиб по середине правильно, используя реальный API Компас-3D. Вот рабочий код:

private static void AddMiddleBend(KompasObject kompas, ksPart part, double baseX, double baseZ, double bendRadius)
{
    try
    {
        // Создаем эскиз для линии сгиба
        var planeXOZ = (ksEntity)part.GetDefaultEntity(2);
        var bendSketchEnt = (ksEntity)part.NewEntity(5); // o3d_sketch
        var bendSketchDef = (ksSketchDefinition)bendSketchEnt.GetDefinition();
        bendSketchDef.SetPlane(planeXOZ);

        bendSketchEnt.Create();
        var s2d = (ksDocument2D)bendSketchDef.BeginEdit();

        // Линия сгиба по середине (вертикальная линия по центру X=0)
        double middleX = 0;
        s2d.ksLineSeg(middleX, -baseZ / 2, middleX, baseZ / 2, 1);

        bendSketchDef.EndEdit();

        // Создаем операцию гибки через API7
        var app7 = (KompasAPI7.IApplication)kompas.ksGetApplication7();
        var doc3D_7 = (KompasAPI7.IKompasDocument3D)app7.ActiveDocument;
        var sheetCont = (KompasAPI7.ISheetMetalContainer)doc3D_7.TopPart;

        if (sheetCont != null)
        {
            var bends = sheetCont.SheetMetalBends;
           
            // Создаем операцию гибки
            var bend = bends.Add();
            bend.Init();
           
            // Настраиваем параметры гибки
            bend.angle = 90.0; // Угол гибки 90 градусов
            bend.radius = bendRadius; // Радиус гибки
            bend.length = 0; // Для гибки по линии длина не нужна
           
            // Указываем эскиз с линией гиба
            var bendSketch7 = (KompasAPI7.Sketch)kompas.TransferInterface(bendSketchEnt, 2, 0);
            bend.sketch = bendSketch7;
           
            // Создаем операцию
            bend.Create();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Ошибка при создании сгиба: {ex.Message}");
        // Можно выбросить исключение дальше или обработать по-другому
        throw;
    }
}


Hafry

тут ответы от нейронки врядли помогут(