Вращение твердого тела в многотельной детали

Автор SAVe, 05.11.24, 10:26:10

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

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

SAVe

Здравствуйте.
Новичок в Kompas3D. Пытаюсь сделать следующее: есть многотельная деталь в которой создано два твердых тела - "Тело 1" и "Тело 2". Есть ось "RotationAxis" вокруг которой должно повернуться "Тело 1"
Мне нужно в цикле несколько раз вычесть одно твердое тело из другого поворачивая их. Т.е. нужно выполнить такие шаги:
1. Найти тело с именем "Тело 1"
2. Повернуть "Тело 1" на некоторый градус вокруг оси "RotationAxis"
3. Найти тело "Тело x" ("Тело 2" на первой итерации - после вычитаний имя изменится на "Тело 3","Тело 4",...)
4. Повернуть "Тело x" на некоторый градус
5. Вычесть "Тело 1" из "Тело x"

Застопорился уже на 2 шаге. Для поиска имени тела я использовал интерфейс IBody7. Но не понятно как из объекта IBody7 получить IPart7 для поворота тела и как применить вращение к заданному телу ?
Код такой (пока даже без цикла):

public void Run()
{
   
    try
    {
        kompas = (KompasObject)Marshal.GetActiveObject("KOMPAS.Application.5");
    }
    catch { }

    if (kompas == null)
    {
        Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
        kompas = (KompasObject)Activator.CreateInstance(t);
        kompas.Visible = true;
        kompas.ActivateControllerAPI();
        ksDocument3D ksd = (ksDocument3D)kompas.Document3D();

        ksd.Open("D:\\Деталь.m3d", false);
    }

    // Получаем интерфейс приложения
    application = (IApplication)kompas.ksGetApplication7();

    if (application == null)
        return;

    // Получаем интерфейс активного документа 3D в API7
    activeDocument = (IKompasDocument3D)application.ActiveDocument;

    Part7 topPart = activeDocument.TopPart;

    IBody7 cutterBody = FindBody(topPart, "Тело 1");

    IBody7 baseBody = FindBody(topPart, "Тело 2");

    IModelContainer modelContainer = topPart as IModelContainer;

    IRotated rotation = modelContainer.Rotateds.Add(ksObj3dTypeEnum.o3d_bossRotated);           

    var rotationAxis = FindAxis(topPart, "RotationAxis");

    rotation.Axis = rotationAxis;

   
    rotation.Angle[true] = Math.PI;
   
   // Как применить вращение к cutterBody ?

    rotation.Update();
}       

private static IBody7 FindBody(Part7 part7, string bodyName)
{
    IFeature7 feature7 = part7 as IFeature7;

    foreach (var body in feature7.ResultBodies)
    {
        if (body.Name.Equals(bodyName))
            return body;
    }
    return null;
}

private static IModelObject FindAxis(Part7 part7, string axisName)
{
    IFeature7 feature7 = part7 as IFeature7;

    foreach (var entity in feature7.ModelObjects[KompasAPIObjectTypeEnum.ksObjectAxis3DBy2Planes])
    {               
        if (entity.Name.Equals(axisName))
            return entity;
    }
    return null;
}

UU

У Вас не вращение, а операция приклеить вращением.
В сборке можно детали крутить, двигать.
В детали наверно нужно будет менять положение конкретного тела командой "изменить положение".
Вообще правильно сначала сделать в ручную, что Вы хотите сделать программно.

p3452

Цитата: UU от 05.11.24, 12:29:34Вообще правильно сначала сделать в ручную, что Вы хотите сделать программно.
+100500

SAVe

В ручную это без проблем делается. Кроме вращения вокруг оси. В UI я это делал вращением относительно локальной системы координат т.к. как повернуть именно вокруг оси не нашел. Хотя в API вроде бы можно и ось задать. Это не особо важный момент. Компас не записывает макросы для 3D моделей (деталей). Поэтому записать макрос и посмотреть как именно он это делает через API не получилось.

IgorT

Цитата: SAVe от 05.11.24, 13:46:53В ручную это без проблем делается. ...
Класс!
Модельку свою можете показать? Желательно для К21. :angel:

IgorT

Цитата: UU от 05.11.24, 12:29:34У Вас не вращение, а операция приклеить вращением.
...
В детали наверно нужно будет менять положение конкретного тела командой "изменить положение".
...
И по всей видимости только потом  булеву операцию к телам применять. Не?

Lemieux

Цитата: IgorT от 05.11.24, 14:05:19Класс!
Модельку свою можете показать? Желательно для К21. :angel:
Что показать, как деталь вращать в документе?

IgorT

Цитата: Lemieux от 05.11.24, 14:37:16Что показать, как деталь вращать в документе?
Не. Как вращая тело сделать вырез в детали.
Ну собственно что ТС хочет закодить.
Как он это руками сделает интересно мне. Для К21, например...

Lemieux

Цитата: IgorT от 05.11.24, 14:41:53Не. Как вращая тело сделать вырез в детали.
Ну собственно что ТС хочет закодить.
Как он это руками сделает интересно мне. Для К21, например...
Автор вообще дичь какуе-то написал

SAVe

Не внимательно прочитали...
Мне нужно не вырез вращением, а последовательность вырезов (булевских операций в цикле) полученных от перемещения (вращения) деталей.
Смещаем детали (поворачиваем каждую на свой градус), делаем вычитание деталей, снова поворачиваем и вычитаем и т.д.
Моделька у меня элементарная. Эта задача была сделана на SolidWorks (для реальных деталей конечно - тут просто тест). Но он позволяет писать макросы для 3D моделей. А как то же самое сделать на Компасе  - не вполне понятно.

UU

По картинкам сами тестировать будете, я пас.

IgorT

Модели ТС так и не представит?
Но я бы сделал эту модель по деревенски. Вот так:
2024-11-05_19-46-11.png

Деталь.m3d
К21

А потом уже код сочинял. 

p3452

Цитата: IgorT от 05.11.24, 19:49:12Но я бы сделал эту модель по деревенски...
А потом уже код сочинял. 
+100500

SAVe, обратите внимание, что, как-то ;), обошлись и без "вращения детали" и без "цикла" с "итерациями".


p3452

Абсурдный "алгоритм" действий ТС отвлек от второго вопроса:
Цитата: SAVe от 05.11.24, 10:26:10Но не понятно как из объекта IBody7 получить IPart7
В API Компас есть три ключевых взаимосвязанных интерфейса,  которые можно использовать как "посредников" для получения нужных интерфейсов.
На примере API7:
IModelObject <-> IPart7, IFeature7
IPart7 <-> IModelObject, IFeature7
IFeature7 <-> IModelObject, IPart7

Если нужно для IBody7 получить IPart7, можно воспользоваться "посредником" IFeature7, т.е: IBody7 -> IFeature7 -> IPart7


SAVe

Так как версия у меня "Учебная (v23)" - мой файл детали у многих не откроется (у нее свой формат сохранения файлов). Поэтому вставил просто картинку. Ну попробую приложить сам файл детали. Сделать мне в итоге надо шестерню определенной не круглой формы. Сделать её массивом не получится т.к. каждая эвольвентная поверхность у неё имеет собственную кривизну. По этой же причине не получится использовать эскиз - для его создания нужно рассчитать и прорисовать буквально каждый "пиксель". Но в моем случае будет все еще хуже - контактная шестерня будет овальной, а зуб на ней попытаюсь сделать конусный. Поэтому наиболее простой (хоть и выглядит "абсурдным") алгоритм действий - "нарезать" такую шестерню вычитанием деталей (что и было сделано на SolidWorks). Теперь пытаюсь повторить это на Компасе. Попробую использовать переход через IFeature7.
+ Благодарностей: 3

UU

#15
Так берёте и делаете.
+ Благодарностей: 2

UU

Можно и эллипсом катнуть, принцип не меняется.
+ Благодарностей: 2

UU

#17
Кстати поменял исходные условия, получил такую картинку.
изображение_2024-11-07_204041854.png
+ Благодарностей: 2

IgorT

Наконец до меня дошло что же хочет сделать ТС.
Тут без макроса замучаешься подобное моделить...

UU

Цитата: IgorT от 07.11.24, 20:31:45Наконец до меня дошло что же хочет сделать ТС.
Тут без макроса замучаешься подобное моделить...
Как говорится все карты в руки.