API7 и Симметрия

Автор Romiroz, 17.05.19, 00:14:44

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

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

Romiroz

Здравствуйте!

Кто-нибудь подскажет как можно сделать симметрию группы на API7? в API5 есть ksSymmetryObj , аналогов не нашёл...

Sabahs

Я делаю так, дёшево и сердито.
Air:=pDrawingContainer.Objects[0];
pSelectionManager.Select(Air);
SymmetryObj(0,-10,0,10,0,0);
pSelectionManager.UnselectAll;
pDrawingContainer:=nil;
Тут симметрия всего, Вам в первый параметр нужно записать Reference группы и свою ось симметрии.

Romiroz

Я наверное что-то не догоняю, а где метод SymmetryObj ? Откуда?

Sabahs

18.05.19, 05:21:09 #3 Последнее редактирование: 18.05.19, 07:40:14 от Sabahs
API экспортных функций.
(***************************************
   System  : КОМПАС-График API
   Module  : LibTool
   dll     : kAPI2D5.dll
****************************************)

Romiroz

25.05.19, 12:06:15 #4 Последнее редактирование: 25.05.19, 12:17:03 от Romiroz
Промаялся кучу времени, но так и не смог её подцепить. В примерах тоже нет её использования на C#. Пытался создать свою группу, потом программно добавить её в макроэлемент, а макроэлементу сделать setplacement с mirror=true, так макрообъект уходит на заданные координаты, поворачивается, но зеркалирование не делает.
Я так понимаю, я всё время забываю указать один важный нюанс - у меня отдельный exe файл

DesignЯR

Цитироватья всё время забываю указать один важный нюанс

Да тут Вы абсолютно правы. Нужно выкладывать свой код, и чтобы не было лишних вопросов желательно полностью (где бы было видно и объявление переменных, и как получены объекты Компаса)


Romiroz

Да, без вашей помощи мне некуда, сейчас процедура симметричного поворота выродилась в нечто такое, где я пытаюсь сделать симметрию, как мне кажется, единственно доступным мне способом. И то - макроэлемент включает в себя состав группы, двигается и поворачивается, но без зеркального отображения.



  public void CentrAndMirror(IKompasDocument2D doc2d, String Place, String GroupName,Boolean Mirror)
        {

            IKompasDocument2D1 doc2d1 = (IKompasDocument2D1)doc2d;

            IDrawingDocument doc = (IDrawingDocument)doc2d;
            Views Views = doc.ViewsAndLayersManager.Views;

            IDrawingContainer drawingObjects = (IDrawingContainer)Views[1];
            IMacroObjects macroObjects = drawingObjects.MacroObjects;

            Double[] coords = GetSpaceForName(doc2d, Place);

            Double[] coords1 = GetSpaceForGroup(doc2d, GroupName);

            Double X, Y, Angle;

            X = (coords[0] + coords[2]) / 2 - (coords1[2] - coords1[0]) / 2;
            Y = (coords[1] + coords[3]) / 2 - (coords1[3] - coords1[1]) / 2;
            Angle = 0;

            DrawingGroups dgr = (DrawingGroups)doc2d1.NamedGroups;

            for (int i = 0; i < dgr.Count; i++)
            {

                IDrawingGroup mydg = (IDrawingGroup)dgr[i];
                if (mydg.Name == GroupName)
                {
                    for(int j=0; j< macroObjects.Count;j++)
                    {
                        IMacroObject myMc = (IMacroObject)macroObjects[j];
                        if (myMc.Name == GroupName)
                        {

                           
                            myMc.AddObjects(mydg.Objects[0]);


                            if (myMc.SetPlacement(X - (Mirror ? -coords1[2] : coords1[0]), Y - coords1[1], Angle, Mirror, true))
                            {
                                myMc.Update();
                            }

                            break;
                        }
                    }

             
                    Views[1].Update();
                    doc2d1.RebuildDocument();



                }
            }


        }

DesignЯR

GetSpaceForName(doc2d, Place);GetSpaceForGroup(doc2d, GroupName)  - это что??

А почему бы не воспользоваться функцией  "  ksExecuteLibraryCommand "  и командами библиотеки
Library.Name=Сервисные инструменты
Library.PathName=C:\Program Files\ASCON\KOMPAS-3D v17\Libs\ServiceTools\komlib.rtw
ProceduresLibrary.Name=Сервисные инструменты
Procedure.Name=Зеркальное отражение объекта по горизонтали
Procedure.Id=66
Procedure.Name=Зеркальное отражение объекта по вертикали
Procedure.Id=65
Procedure.Name=Зеркальное отражение группы объектов по горизонтали
Procedure.Id=68
Procedure.Name=Зеркальное отражение группы объектов по вертикали
Procedure.Id=67


Romiroz

Спасибо, а перед этим выделить группу через SelectionManager?

DesignЯR

Без этого никуда, просто это уже было описано ранее.
Просто изначально в задаче не указывалось (или я не подметил), что надо отобразить зеркально относительно центральной оси. А вот по коду уже можно догадаться о такой попытке
И немного о Mirror в SetPlacement на картинке

Sprinter500

Цитата: DesignЯR от 30.05.19, 14:31:16
GetSpaceForName(doc2d, Place);GetSpaceForGroup(doc2d, GroupName)  - это что??

А почему бы не воспользоваться функцией  "  ksExecuteLibraryCommand "  и командами библиотеки
Library.Name=Сервисные инструменты
Library.PathName=C:\Program Files\ASCON\KOMPAS-3D v17\Libs\ServiceTools\komlib.rtw
ProceduresLibrary.Name=Сервисные инструменты
Procedure.Name=Зеркальное отражение объекта по горизонтали
Procedure.Id=66
Procedure.Name=Зеркальное отражение объекта по вертикали
Procedure.Id=65
Procedure.Name=Зеркальное отражение группы объектов по горизонтали
Procedure.Id=68
Procedure.Name=Зеркальное отражение группы объектов по вертикали
Procedure.Id=67


А как узнать номера остальных команд у этой библиотеки?

ТрындецЪ


DesignЯR

А как узнать номера остальных команд у этой библиотеки?
https://forum.ascon.ru/index.php/topic,31913.msg257548.html#msg257548

Облегчим человеку задачу-> см.вложение