Операция "Выдавливание" с опцией создания нового тела

Автор Sprinter500, 26.08.19, 07:59:57

« предыдущая - следующая »

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

Sprinter500

Добрый день! Не могу понять как при новой операции "выдавливания" не добавлять к прошлому телу, а создавать новое тело, чтобы было 2 тела, а не одно объединенное. Вот пример операции "выдавливание" из примеров API:

      void CreateExtrusion()
      {
      ksPart part = (ksPart)doc.GetPart((short)Part_Type.pTop_Part);   // новый компонент
         if (part != null)
         {
            ksEntity entitySketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
            if (entitySketch != null)
            {
               // интерфейс свойств эскиза
               ksSketchDefinition sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
               if (sketchDef != null)
               {
                  // получим интерфейс базовой плоскости XOY
                  ksEntity basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);
                  sketchDef.SetPlane(basePlane);   // установим плоскость XOY базовой для эскиза
                  sketchDef.angle = 45;         // угол поворота эскиза
                  entitySketch.Create();         // создадим эскиз

                  // интерфейс редактора эскиза
                  ksDocument2D sketchEdit = (ksDocument2D)sketchDef.BeginEdit();
                  // введем новый эскиз - квадрат
                  sketchEdit.ksLineSeg(50,  50, -50,  50, 1);
                  sketchEdit.ksLineSeg(50, -50, -50, -50, 1);

                  sketchEdit.ksLineSeg(50, -50,  50,  50, 1);
                  sketchEdit.ksLineSeg(-50, -50, -50,  50, 1);
                  sketchDef.EndEdit();   // завершение редактирования эскиза

                  ksEntity entityExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_baseExtrusion);
                  if (entityExtr != null)
                  {
                     // интерфейс свойств базовой операции выдавливания
                     ksBaseExtrusionDefinition extrusionDef = (ksBaseExtrusionDefinition)entityExtr.GetDefinition(); // интерфейс базовой операции выдавливания
                     if (extrusionDef != null)
                     {
                        extrusionDef.directionType = (short)Direction_Type.dtNormal;         // направление выдавливания
                        extrusionDef.SetSideParam(true,   // прямое направление
                           (short)End_Type.etBlind,   // строго на глубину
                           200, 0, false);
                        extrusionDef.SetThinParam(true, (short)Direction_Type.dtBoth, 10, 10); // тонкая стенка в два направления
                        extrusionDef.SetSketch(entitySketch);   // эскиз операции выдавливания
                        entityExtr.Create();               // создать операцию
                     }
                  }
               }
            }
         }
      }


Что тут нужно поменять чтобы создавалось новое тело, а не объединялось с предыдущим?

DesignЯR

В поиске SDK нужно забить  "IExtrusion1 " "ksOperationResultEnum"

Sprinter500

Цитата: DesignЯR от 26.08.19, 08:45:34
В поиске SDK нужно забить  "IExtrusion1 " "ksOperationResultEnum"


Не получилось найти. Где конкретно искать?

Slaviation

Добрый день.
Гляньте этот пример во вложении. Строчку 90

Sprinter500

Цитата: Slaviation от 26.08.19, 13:33:27
Добрый день.
Гляньте этот пример во вложении. Строчку 90




Сделал так:
                        ksEntity entityExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                        if (entityExtr != null)
                        {
                            // интерфейс свойств базовой операции выдавливания


                            IExtrusion1 extrusion1 = (IExtrusion1)entityExtr.GetDefinition();
                            extrusion1.OperationResult = ksOperationResultEnum.ksOperationNewBody;



                            ksBossExtrusionDefinition extrusionDef = (ksBossExtrusionDefinition)entityExtr.GetDefinition(); // интерфейс базовой операции выдавливания
                            if (extrusionDef != null)
                            {
                                extrusionDef.directionType = (short)Direction_Type.dtNormal;         // направление выдавливания
                                extrusionDef.SetSideParam(true, // прямое направление
                                    (short)End_Type.etBlind,    // строго на глубину
                                    200, 0, false);
                                //extrusionDef.SetThinParam(true, (short)Direction_Type.dtBoth, 10, 10); // тонкая стенка в два направления
                                extrusionDef.SetSketch(entitySketch);   // эскиз операции выдавливания
                                entityExtr.Create();                    // создать операцию
                            }
                        }


В результате выдает вот это:
System.InvalidCastException
  HResult=0x80004002
  Сообщение = Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "KompasAPI7.IExtrusion1". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{58B4011D-3C0B-499A-A441-7870B663E8CF}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).
  Источник = <Не удается определить источник исключения>
  Трассировка стека:
<Не удается определить трассировку стека исключения>

DesignЯR

Сейчас покодить нет возможности. Рекомендую записать макрос создания операции "ручками" и посмотреть его в блокноте...

Sprinter500

Цитата: DesignЯR от 26.08.19, 18:10:24
Сейчас покодить нет возможности. Рекомендую записать макрос создания операции "ручками" и посмотреть его в блокноте...



Так пробовал уже, но в Макросе не заметна разница между операциями с объединением с предыдущим телом и с созданием нового тела. Да и потом результат Макроса - "объединение" тел дает. В общем в Макрос выбор опции "Новое тело" не передается почему-то.  Хотя у Slaviation код в Питоне - с созданием нового тела, но попытка переноса на рельсы C# не получается.

Vi2

Цитата: Sprinter500 от 26.08.19, 16:48:06
Сделал так:
                        ksEntity entityExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                        if (entityExtr != null)
                        {
                            // интерфейс свойств базовой операции выдавливания


                            IExtrusion1 extrusion1 = (IExtrusion1)entityExtr.GetDefinition();
                            extrusion1.OperationResult = ksOperationResultEnum.ksOperationNewBody;
...
В результате выдает вот это:
System.InvalidCastException
  HResult=0x80004002
  Сообщение = Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "KompasAPI7.IExtrusion1".

Ну так интерфейсы разные: ksEntity - это из Kompas6API5, а IExtrusion1 - из KompasAPI7. Нужно привести к 7 версии.

Sprinter500

Цитата: Vi2 от 26.08.19, 19:16:34
Ну так интерфейсы разные: ksEntity - это из Kompas6API5, а IExtrusion1 - из KompasAPI7. Нужно привести к 7 версии.



Как привести ksEntity к 7-й версии? Или в API5 есть аналог IExtrusion1 ?  Сильно не пинайте ))) я всего лишь инженер-конструктор с небольшим программистским опытом.

DesignЯR

Как-то так( за основу взят Step3d1)

public KompasObject kompas;
        public ksDocument2D doc;
        private IApplication appl;         // Интерфейс приложения
        private IKompasDocument3D doc3D7;          // Интерфейс документа 3D в API7
        private ksDocument3D doc3D;        // Интерфейс документа 3D в API5
       ......

public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
        {
            kompas = (KompasObject)kompas_;
            if (kompas == null)   return;
            // Получаем интерфейс приложения
            appl = (IApplication)kompas.ksGetApplication7();
            if (appl == null) return;
            // Получаем интерфейс активного документа 3D в API7
            doc3D7 = (IKompasDocument3D)appl.ActiveDocument;
            if (doc3D7 == null) return;
            // Получаем интерфейс активного документа 3D в API5
            doc3D = (ksDocument3D)kompas.ActiveDocument3D();
            if (doc3D == null) return;

            switch (command)
            {
                case 1: Procedure1(); break;
               
            }

            kompas.ksMessageBoxResult();
        }
        public void Procedure1()
        {
            Baloon("Операция выдавливания");
            ksPart part = (ksPart)doc3D.GetPart((short)Part_Type.pTop_Part);  // новый компонент
            if (part != null)
            {
                ksEntity entitySketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
                if (entitySketch != null)
                {
                    // интерфейс свойств эскиза
                    ksSketchDefinition sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        // получим интерфейс базовой плоскости XOY
                        ksEntity basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);
                        sketchDef.SetPlane(basePlane);  // установим плоскость XOY базовой для эскиза
                        sketchDef.angle = 45;           // угол поворота эскиза
                        entitySketch.Create();          // создадим эскиз

                        // интерфейс редактора эскиза
                        ksDocument2D sketchEdit = (ksDocument2D)sketchDef.BeginEdit();
                        // введем новый эскиз - квадрат
                        sketchEdit.ksLineSeg(50, 50, -50, 50, 1);
                        sketchEdit.ksLineSeg(50, -50, -50, -50, 1);

                        sketchEdit.ksLineSeg(50, -50, 50, 50, 1);
                        sketchEdit.ksLineSeg(-50, -50, -50, 50, 1);
                        sketchDef.EndEdit();    // завершение редактирования эскиза

                        ksEntity entityExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                        if (entityExtr != null)
                        {
                            // интерфейс свойств базовой операции выдавливания
                            ksBossExtrusionDefinition extrusionDef = (ksBossExtrusionDefinition)entityExtr.GetDefinition(); // интерфейс базовой операции выдавливания
                            if (extrusionDef != null)
                            {
                                extrusionDef.directionType = (short)Direction_Type.dtNormal;         // направление выдавливания
                                extrusionDef.SetSideParam(true, // прямое направление
                                    (short)End_Type.etBlind,    // строго на глубину
                                    200, 0, false);
                                extrusionDef.SetThinParam(true, (short)Direction_Type.dtBoth, 10, 10); // тонкая стенка в два направления
                                extrusionDef.SetSketch(entitySketch);   // эскиз операции выдавливания
                                entityExtr.Create();                    // создать операцию

                                kompas.ksMessage("Приклеем выдавливанием");

                                // создадим новый эскиз
                                ksEntity entitySketch2 = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
                                if (entitySketch2 != null)
                                {
                                    // интерфейс свойств эскиза
                                    ksSketchDefinition sketchDef2 = (ksSketchDefinition)entitySketch2.GetDefinition();
                                    if (sketchDef2 != null)
                                    {
                                        sketchDef2.SetPlane(basePlane); // установим плоскость
                                        sketchDef2.angle = 45;          // повернем эскиз на 45 град.
                                        entitySketch2.Create();         // создадим эскиз

                                        // интерфейс редактора эскиза
                                        ksDocument2D sketchEdit2 = (ksDocument2D)sketchDef2.BeginEdit();
                                        sketchEdit2.ksCircle(0, 0, 150, 1);
                                        sketchDef2.EndEdit();   // завершение редактирования эскиза


                                        // приклеим выдавливанием
                                        ksEntity entityBossExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                                        if (entityBossExtr != null)
                                        {
                                            // Преобразовать интерфейс объекта из API5 в API7
                                            IExtrusion extrusion = (IExtrusion)kompas.TransferInterface(entityBossExtr, (int)Kompas6Constants.ksAPITypeEnum.ksAPI7Dual, 0);
                                            IExtrusion1 extrusion1 = (IExtrusion1)extrusion;
                                            extrusion1.OperationResult = ksOperationResultEnum.ksOperationNewBody;

                                            ksBossExtrusionDefinition bossExtrDef = (ksBossExtrusionDefinition)entityBossExtr.GetDefinition();
                                            if (bossExtrDef != null)
                                            {
                                                ksExtrusionParam extrProp = (ksExtrusionParam)bossExtrDef.ExtrusionParam(); // интерфейс структуры параметров выдавливания
                                                ksThinParam thinProp = (ksThinParam)bossExtrDef.ThinParam();      // интерфейс структуры параметров тонкой стенки
                                                if (extrProp != null && thinProp != null)
                                                {
                                                    bossExtrDef.SetSketch(entitySketch2); // эскиз операции выдавливания
                                                    extrProp.direction = (short)Direction_Type.dtNormal;      // направление выдавливания (прямое)
                                                    extrProp.typeNormal = (short)End_Type.etBlind;      // тип выдавливания (строго на глубину)
                                                    extrProp.depthNormal = 100;         // глубина выдавливания
                                                    thinProp.thin = false;              // без тонкой стенки
                                                    entityBossExtr.Create();                // создадим операцию
                                                }
                                            }
                                        }


                                    }
                                }
                            }
                        }
                    }
                }
            }

        }

Sprinter500

Цитата: DesignЯR от 27.08.19, 04:59:54
Как-то так( за основу взят Step3d1)

public KompasObject kompas;
        public ksDocument2D doc;
        private IApplication appl;         // Интерфейс приложения
        private IKompasDocument3D doc3D7;          // Интерфейс документа 3D в API7
        private ksDocument3D doc3D;        // Интерфейс документа 3D в API5
       ......

public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
        {
            kompas = (KompasObject)kompas_;
            if (kompas == null)   return;
            // Получаем интерфейс приложения
            appl = (IApplication)kompas.ksGetApplication7();
            if (appl == null) return;
            // Получаем интерфейс активного документа 3D в API7
            doc3D7 = (IKompasDocument3D)appl.ActiveDocument;
            if (doc3D7 == null) return;
            // Получаем интерфейс активного документа 3D в API5
            doc3D = (ksDocument3D)kompas.ActiveDocument3D();
            if (doc3D == null) return;

            switch (command)
            {
                case 1: Procedure1(); break;
               
            }

            kompas.ksMessageBoxResult();
        }
        public void Procedure1()
        {
            Baloon("Операция выдавливания");
            ksPart part = (ksPart)doc3D.GetPart((short)Part_Type.pTop_Part);  // новый компонент
            if (part != null)
            {
                ksEntity entitySketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
                if (entitySketch != null)
                {
                    // интерфейс свойств эскиза
                    ksSketchDefinition sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        // получим интерфейс базовой плоскости XOY
                        ksEntity basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);
                        sketchDef.SetPlane(basePlane);  // установим плоскость XOY базовой для эскиза
                        sketchDef.angle = 45;           // угол поворота эскиза
                        entitySketch.Create();          // создадим эскиз

                        // интерфейс редактора эскиза
                        ksDocument2D sketchEdit = (ksDocument2D)sketchDef.BeginEdit();
                        // введем новый эскиз - квадрат
                        sketchEdit.ksLineSeg(50, 50, -50, 50, 1);
                        sketchEdit.ksLineSeg(50, -50, -50, -50, 1);

                        sketchEdit.ksLineSeg(50, -50, 50, 50, 1);
                        sketchEdit.ksLineSeg(-50, -50, -50, 50, 1);
                        sketchDef.EndEdit();    // завершение редактирования эскиза

                        ksEntity entityExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                        if (entityExtr != null)
                        {
                            // интерфейс свойств базовой операции выдавливания
                            ksBossExtrusionDefinition extrusionDef = (ksBossExtrusionDefinition)entityExtr.GetDefinition(); // интерфейс базовой операции выдавливания
                            if (extrusionDef != null)
                            {
                                extrusionDef.directionType = (short)Direction_Type.dtNormal;         // направление выдавливания
                                extrusionDef.SetSideParam(true, // прямое направление
                                    (short)End_Type.etBlind,    // строго на глубину
                                    200, 0, false);
                                extrusionDef.SetThinParam(true, (short)Direction_Type.dtBoth, 10, 10); // тонкая стенка в два направления
                                extrusionDef.SetSketch(entitySketch);   // эскиз операции выдавливания
                                entityExtr.Create();                    // создать операцию

                                kompas.ksMessage("Приклеем выдавливанием");

                                // создадим новый эскиз
                                ksEntity entitySketch2 = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
                                if (entitySketch2 != null)
                                {
                                    // интерфейс свойств эскиза
                                    ksSketchDefinition sketchDef2 = (ksSketchDefinition)entitySketch2.GetDefinition();
                                    if (sketchDef2 != null)
                                    {
                                        sketchDef2.SetPlane(basePlane); // установим плоскость
                                        sketchDef2.angle = 45;          // повернем эскиз на 45 град.
                                        entitySketch2.Create();         // создадим эскиз

                                        // интерфейс редактора эскиза
                                        ksDocument2D sketchEdit2 = (ksDocument2D)sketchDef2.BeginEdit();
                                        sketchEdit2.ksCircle(0, 0, 150, 1);
                                        sketchDef2.EndEdit();   // завершение редактирования эскиза


                                        // приклеим выдавливанием
                                        ksEntity entityBossExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);
                                        if (entityBossExtr != null)
                                        {
                                            // Преобразовать интерфейс объекта из API5 в API7
                                            IExtrusion extrusion = (IExtrusion)kompas.TransferInterface(entityBossExtr, (int)Kompas6Constants.ksAPITypeEnum.ksAPI7Dual, 0);
                                            IExtrusion1 extrusion1 = (IExtrusion1)extrusion;
                                            extrusion1.OperationResult = ksOperationResultEnum.ksOperationNewBody;

                                            ksBossExtrusionDefinition bossExtrDef = (ksBossExtrusionDefinition)entityBossExtr.GetDefinition();
                                            if (bossExtrDef != null)
                                            {
                                                ksExtrusionParam extrProp = (ksExtrusionParam)bossExtrDef.ExtrusionParam(); // интерфейс структуры параметров выдавливания
                                                ksThinParam thinProp = (ksThinParam)bossExtrDef.ThinParam();      // интерфейс структуры параметров тонкой стенки
                                                if (extrProp != null && thinProp != null)
                                                {
                                                    bossExtrDef.SetSketch(entitySketch2); // эскиз операции выдавливания
                                                    extrProp.direction = (short)Direction_Type.dtNormal;      // направление выдавливания (прямое)
                                                    extrProp.typeNormal = (short)End_Type.etBlind;      // тип выдавливания (строго на глубину)
                                                    extrProp.depthNormal = 100;         // глубина выдавливания
                                                    thinProp.thin = false;              // без тонкой стенки
                                                    entityBossExtr.Create();                // создадим операцию
                                                }
                                            }
                                        }


                                    }
                                }
                            }
                        }
                    }
                }
            }

        }





Спасибо большое! То что нужно. Все замечательно работает.

Sprinter500

В 18-м Компасе все замечательно работает, а в 15-м (не везде новый Компас) вылазит ошибка на строчке:

extrusion1.OperationResult = ksOperationResultEnum.ksOperationNewBody;

Я так понял в 15-м Компасе нет перечисления ksOperationResultEnum.  Как быть?

Sprinter500

Цитата: Sprinter500 от 24.09.19, 13:09:37
В 18-м Компасе все замечательно работает, а в 15-м (не везде новый Компас) вылазит ошибка на строчке:

extrusion1.OperationResult = ksOperationResultEnum.ksOperationNewBody;

Я так понял в 15-м Компасе нет перечисления ksOperationResultEnum.  Как быть?



Проблему решил сам. Может кому пригодится:

                            IExtrusion extrusion = (IExtrusion)kompas.TransferInterface(entityExtr, (int)ksAPITypeEnum.ksAPI7Dual, 0);
                            IChooseBodies7 chooseBodies = (IChooseBodies7)extrusion;
                            chooseBodies.ChooseBodiesType = ksChooseBodiesType.ksNewBody;

А для 18-го Компаса и прежний код сгодится