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

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

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

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

Михаил88

Мы все со своими особенностями.
Поэтому я написал.
Цитата: Михаил88 от 08.11.24, 12:34:11А на счет того, что он код не выложил, то это его личное дело, его труд.

UU

Цитата: Lemieux от 08.11.24, 14:02:12Не надо никуда двигаться, просто надо нормально общаться. Когда автор создал тему и пытался описать проблему, я не понимал, что он хочет. Когда UU выложил видео, но при этом не выложил хотя бы рекомендаций куда копать, и автор подтвердил свои намерения, то я решил указать направление.
Просто мне непонятно зачем UU себя так ведёт, показывая, что можно решить проблему, но, при этом не давая решения. Я сначала думал, что он со мной так себя ведёт, а оказалось, что нет.
Цитата: Lemieux от 08.11.24, 09:06:18            IApplication application = Marshal.GetActiveObject("KOMPAS.Application.7") as IApplication;
            IKompasDocument3D activeDocument = application.ActiveDocument as IKompasDocument3D;
            IPart7 part7 = activeDocument.TopPart;
            IModelContainer modelContainer = part7 as IModelContainer;
            BodyRepositions bodyRepositions = modelContainer.BodyRepositions;
            BodyReposition bodyReposition = bodyRepositions.Add();
            IBody7 body = part7.Owner.ResultBodies;
            bodyReposition.RepositionBody = body;
            ILocalCoordinateSystem position = bodyReposition.Position;
            ILocalCSAxesDirectionParam localCSAxesDirectionParam = position.LocalCSParameters as ILocalCSAxesDirectionParam;
            localCSAxesDirectionParam.AngleByOwnAxis[ksObj3dTypeEnum.o3d_axisOY] = 45;
            position.Update();
            bodyReposition.Update();
            body.Update();
Автор, поэкспериментируйте вот с этим кодом. Я думаю будет понятно, что к чему.
Мне лично понятно, ну от Вас я ничего и не ожидал, т.к. только Вы пишите всё правильно, а остальные какое то...ПО.
Тут раздел по C#, поэтому код на Delphi тут не уместен, картинку кину, если нужно четче на первом видео есть, дерево построения есть, понятно всё делается с нуля с помощью API.

Lemieux

Цитата: UU от 08.11.24, 15:12:57т.к. только Вы пишите всё правильно
Что интересно, лично я такого никогда не заявлял.

Цитата: UU от 08.11.24, 15:12:57понятно всё делается с нуля с помощью API
Ага, с помощью рук. Как Вы мне советовали раньше, когда я в архитектуре КОМПАС плохо разбирался https://forum.ascon.ru/index.php?msg=330418

feron

Ну вот в чем проблема оплатить стоимость 4 тушенки ?

И сэкономить свое драгоценное время ?

Сталина на Вас не хватает  :o:

UU

Цитата: feron от 08.11.24, 16:27:42Ну вот в чем проблема оплатить стоимость 4 тушенки ?

И сэкономить свое драгоценное время ?

Сталина на Вас не хватает  :o:
Тушёнку сели, которую я Вам отправил, а кода нет.
Не всё там так и просто, как Вам кажется.
Как говориться первый блин комом, но ничего есть о чём подумать.

SAVe

"И все таки она вертится!"

Цитата: Lemieux от 08.11.24, 09:06:18            IApplication application = Marshal.GetActiveObject("KOMPAS.Application.7") as IApplication;
            IKompasDocument3D activeDocument = application.ActiveDocument as IKompasDocument3D;
            IPart7 part7 = activeDocument.TopPart;
            IModelContainer modelContainer = part7 as IModelContainer;
            BodyRepositions bodyRepositions = modelContainer.BodyRepositions;
            BodyReposition bodyReposition = bodyRepositions.Add();
            IBody7 body = part7.Owner.ResultBodies;
            bodyReposition.RepositionBody = body;
            ILocalCoordinateSystem position = bodyReposition.Position;
            ILocalCSAxesDirectionParam localCSAxesDirectionParam = position.LocalCSParameters as ILocalCSAxesDirectionParam;
            localCSAxesDirectionParam.AngleByOwnAxis[ksObj3dTypeEnum.o3d_axisOY] = 45;
            position.Update();
            bodyReposition.Update();
            body.Update();
Автор, поэкспериментируйте вот с этим кодом. Я думаю будет понятно, что к чему.

Спасибо большое за подсказку!

Поработал с кодом, поискал кое что по API и удалось сделать поворот.

Код на данный момент такой:

using Kompas6API5;
using Kompas6Constants;
using Kompas6Constants3D;
using KompasAPI7;
using System;
using System.Runtime.InteropServices;

namespace Cutter
{
    public class Launcher
    {
        private KompasObject kompas;
        private IApplication application;        // Интерфейс приложения
        private IKompasDocument3D activeDocument; // Интерфейс документа 3D в API7
        private ksDocument3D doc3D;              // Интерфейс документа 3D в API5
        public void Run()
        {
           
            try
            {
                // Подключается только к экземпляру Компаса запущенному программой.
                // Компас запущенный вручную этот код не находит.
                kompas = (KompasObject)Marshal.GetActiveObject("KOMPAS.Application.5");
            }
            catch { }

            if (kompas == null)
            {
                // Запуск экземпляра Компаса
                Type kompasType = Type.GetTypeFromProgID("KOMPAS.Application.5");
                kompas = (KompasObject)Activator.CreateInstance(kompasType);
               
                kompas.Visible = true;
                kompas.ActivateControllerAPI();
                ksDocument3D ksd = (ksDocument3D)kompas.Document3D();

                ksd.Open("D:\\Temp\\Makro\\Деталь.m3d", false); // открываем файл детали
            }

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

            if (application == null)
                return;

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

            Part7 topPart = activeDocument.TopPart;

            IBody7 toolBody = FindBody(topPart, "Тело 2"); // тело которое будем вращать

            IModelContainer modelContainer = topPart as IModelContainer;
           
            BodyRepositions bodyRepositions = modelContainer.BodyRepositions;
            BodyReposition bodyReposition = bodyRepositions.Add(); // создаем новую операцию "Изменить положение"

            IModelObject toolPlane = FindPlane(topPart, "ToolPlane"); // плоскость которая будет установлена как Локальная Система Координат (ЛСК) и будет определять центр
                                                                      // врещения тела. Как вращать именно вокруг оси не нешел.
            bodyReposition.RepositionBody = toolBody; // определяем тело для операции
            ILocalCoordinateSystem position = bodyReposition.Position;
            position.OrientationType = ksOrientationTypeEnum.ksEulerCorners; // ставим тип оперции перемещения "Углы Эйлера"
            bodyReposition.RepositionCentre = toolPlane; // устанавливаем плоскость как ЛСК для вращения
            // Получаем параметры операции вращения по Углам Эйлера
            ILocalCSEulerParam localCSEulerParam = position.LocalCSParameters as ILocalCSEulerParam;
            // задаем угол поворота
            localCSEulerParam.NutationAngle = 45;

            position.Update();
            bodyReposition.Update();
            toolBody.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 FindPlane(Part7 part7, string planeName)
        {
            IFeature7 feature7 = part7 as IFeature7;

            foreach (var entity in feature7.ModelObjects[KompasAPIObjectTypeEnum.ksObjectPlane3DByOffset])
            {
                if (entity.Name.Equals(planeName))
                    return entity;
            }
            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;
        }
    }
}


На этом первая часть "Мерлезонского балета" закончена. Спасибо всем кто поучаствовал в теме. Дальше - вычитание деталей. Но это отдельной темой если не получится разобраться самому. Приложил архив с программой и деталькой. Вдруг кому то пригодится.

feron

А как решили вопрос с подрезанием зубов на углах ?

UU

#47
Цитата: feron от 10.11.24, 18:49:29А как решили вопрос с подрезанием зубов на углах ?
Как-то так.
Сделал оптимизацию кода, чтобы можно было смотреть, но печаль конечно.

Тушёнку сели, которую я Вам отправил, а подрезание есть.
Немного оптимизировал код, чтобы быстрее рисовало.

feron


feron


p3452

Кто-нибудь, сделайте доброе дело, выложите модельки (первую и итоговую) ТС в рабочей версии Компас (не v23).
А то, ни модельки глянуть, ни видео посмотреть...

UU

Цитата: p3452 от 11.11.24, 12:23:14Кто-нибудь, сделайте доброе дело, выложите модельки (первую и итоговую) ТС в рабочей версии Компас (не v23).
А то, ни модельки глянуть, ни видео посмотреть...
А с видео в чём проблема?

p3452

Цитата: UU от 11.11.24, 12:41:13А с видео в чём проблема?
Провайдер + Youtube = Проблема...

UU

Цитата: p3452 от 11.11.24, 13:38:11Провайдер + Youtube = Проблема...
С Youtube проблем не вижу, меняйте провайдера.

feron

#54
Цитата: p3452 от 11.11.24, 13:38:11Провайдер + Youtube = Проблема...

Вижу цель - не вижу преград !

Мамка перед тем как влупить подзатыльник - не знаешь ? -> научим, не умеешь ? -> заставим!

UU

Цитата: feron от 11.11.24, 14:09:13Вижу цель - не вижу преград !

Мамка перед тем как влупить подзатыльник - не знаешь ? -> научим, не умеешь ? -> заставим!
Тушёнку сели, которую я Вам отправил, а кода нет.
+ Благодарностей: 1

Михаил88