SubEntity

Автор Тема: SubEntity  (Прочитано 22455 раз)

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

Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
SubEntity
« : 06-02-2017, 16:32:23 »
Добрый день.
Столкнулся с такой проблемой при разработке CustomEntity:

Есть собственный примитив MyEntity, который представляет собой контейнер примитивов MySubEntity AcDbVoidPtrArray entArr;
Мне нужно при выделении SubEntity получить его ручки чтобы изменять MySubEntity в соответствии с переопределенным в нем subMoveGripPointsAt.

Получаю ручки так

Код - C++ [Выбрать]
  1. Acad::ErrorStatus MyEntity::subGetGripPointsAtSubentPath(const AcDbFullSubentPath & path, AcDbGripDataPtrArray & grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d & curViewDir, const int bitflags) const
  2. {
  3.         assertReadEnabled();
  4.         grips.setLogicalLength(0);
  5.  
  6.         long ind = path.subentId().index();
  7.         ((MySubEntity*)entArr[ind - 1])->getGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitflags);
  8.         AcGeMatrix3d mat = getMatrix();
  9.  
  10.         for (int i = 0; i < grips.length(); i++)
  11.         {
  12.                 AcDbGripData* gr = grips.at(i);
  13.                 gr->setGripPoint(AcGePoint3d(gr->gripPoint()).transformBy(mat));
  14.         }
  15.  
  16.         return (Acad::eOk);
  17. }

Метод работает нормально, ручки появляются.

Проблема в методе subMoveGripPointsAtSubentPaths, где gripAppData при перемещении одной ручки должен содержать только один элемент, а у меня там
появляется коллекция сразу всех ручек MySubEntity, и соответственно я не могу определить какая ручка перемещается.

Код - C++ [Выбрать]
  1. Acad::ErrorStatus MyEntity::subMoveGripPointsAtSubentPaths(const AcDbFullSubentPathArray & paths, const AcDbVoidPtrArray & gripAppData, const AcGeVector3d & offset, const int bitflags)
  2. {
  3.         assertWriteEnabled();
  4.  
  5.         if (1 > paths.length()) return Acad::eOk;
  6.  
  7.         long ind = paths.at(0).subentId().index();
  8.         ((MySubEntity*)entArr[ind - 1])->moveGripPointsAt(gripAppData, offset, bitflags);
  9.  
  10.         return (Acad::eOk);
  11.  
  12. }

Похожих примеров в сети я нигде не нашел, поэтому прошу помощи.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #1 : 06-02-2017, 17:37:28 »
и соответственно я не могу определить какая ручка перемещается.
Можешь. Если переопределишь метод AcDbGripData::setHotGripFunc(GripOperationPtr pFunc), то сможешь выяснить какая именно ручка выбрана.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #2 : 06-02-2017, 17:53:20 »
Кстати, можешь почитать еще и эту тему: http://adn-cis.org/forum/index.php?topic=2660.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: SubEntity
« Ответ #3 : 07-02-2017, 10:18:49 »
Можешь. Если переопределишь метод AcDbGripData::setHotGripFunc(GripOperationPtr pFunc), то сможешь выяснить какая именно ручка выбрана.

Не понял каким образом это сделать. Может быть я не верно сформулировал вопрос.
Индексы ручек MySubEntity у меня заданы, различить какая к чему относится я могу,
проблема в том что когда я перемещаю определенную ручку MySubEntity, в методе MyEntity::subMoveGripPointsAtSubentPaths(...
в коллекции AcDbVoidPtrArray & gripAppData находятся сразу все ручки, а не одна выбранная, как это происходит в методе основного примитива MyEntity::subMoveGripPointsAt(...


Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: SubEntity
« Ответ #4 : 07-02-2017, 12:27:12 »
Пробовал добавить в метод MyEntity::subGetGripPointsAtSubentPath
Код - C++ [Выбрать]
  1. pGripData->setHotGripFunc(HotEditModGripfunc);

Функция HotEditModGripfunc срабатывает только в момент выбора SubEntity (через Ctrl + клик мышкой)
Когда выбираю конкретную ручку для перемещения SubEntity функция не срабатывает.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #5 : 07-02-2017, 12:32:33 »
Мне кажется что ты перемудрил с subGetGripPointsAtSubentPath/subMoveGripPointsAtSubentPaths. Мне вообще непонятно зачем они тебе понадобились.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: SubEntity
« Ответ #6 : 07-02-2017, 12:41:30 »
Мне кажется что ты перемудрил с subGetGripPointsAtSubentPath/subMoveGripPointsAtSubentPaths. Мне вообще непонятно зачем они тебе понадобились.

Идея такая: есть контейнер объектов (типа BlockReference), в него входит заранее не определенное кол-во объектов (Custom). Мне нужно чтобы я мог выбирать из контейнера нужный объект
(через Ctrl + клик мышкой) получать его ручки и редактировать ими этот объект. При этом основной объект имеет свою графику, которая тоже меняется при перемещении вложенного объекта.
Или, проще говоря, это должно выглядеть как если бы у BlockReference можно было бы выбирать ручки входящих в него примитивов, и редактировать их отдельно.

Главное, что выбрать вложенные примитивы у меня получается, и ручки у них появляются как положено, а вот редактировать отдельную ручку не получается, и Google не помогает в этом.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #7 : 07-02-2017, 12:51:14 »
Я думаю, что и в этом случае можно было бы ограничится subGetGripPoints/subMoveGripPoints.
Впрочем рекомендую посмотреть пример samples\entity\SubEntity из ObjectARX SDK 2009.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #8 : 07-02-2017, 12:55:46 »
Пробовал добавить в метод MyEntity::subGetGripPointsAtSubentPath
Код - C++ [Выбрать]

    pGripData->setHotGripFunc(HotEditModGripfunc);


Функция HotEditModGripfunc срабатывает только в момент выбора SubEntity (через Ctrl + клик мышкой)
Когда выбираю конкретную ручку для перемещения SubEntity функция не срабатывает.
А почему ты её добавлял в subGetGripPointsAtSubentPath, а не в subGetGripPoints ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: SubEntity
« Ответ #9 : 07-02-2017, 13:33:33 »
Я думаю, что и в этом случае можно было бы ограничится subGetGripPoints/subMoveGripPoints.
А как тогда получить ручки вложенного примитива? Ведь subGetGripPoints получает ручки только основного примитива.

Впрочем рекомендую посмотреть пример samples\entity\SubEntity из ObjectARX SDK 2009
Этот пример я и брал за основу, там тоже используется getGripPointsAtSubentPath/moveGripPointsAtSubentPaths
Только у меня VS2012 и VS2015, под них мне не удалось собрать проект чтобы пощупать как работает при отладке.

А почему ты её добавлял в subGetGripPointsAtSubentPath, а не в subGetGripPoints ?
Именно потому что subGetGripPoints дает только ручки основного примитива. (Пробовал pGripData->setHotGripFunc(HotEditModGripfunc) вставить в метод subGetGripPoints вложенного
MySubEntity - тоже не срабатывает)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #10 : 07-02-2017, 14:11:48 »
Этот пример я и брал за основу, там тоже используется getGripPointsAtSubentPath/moveGripPointsAtSubentPaths
Только ты не обратил внимание, что используется совсем не так, как у тебя. Разберись как следует с этим примером.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #11 : 07-02-2017, 14:19:51 »
Кстати, эта тема тоже может быть полезной: http://adn-cis.org/forum/index.php?topic=2660.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #12 : 07-02-2017, 14:27:12 »
А как тогда получить ручки вложенного примитива? Ведь subGetGripPoints получает ручки только основного примитива.
Может получать и ручки вложенного примитива. Тем более, что это твой же примитив. при вызове subGetGripPoints возвращаешь ручки основного примитива и проходишься по всем подпримитивам и добавляешь их ручки к общему массиву.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: SubEntity
« Ответ #13 : 07-02-2017, 14:39:50 »
Может получать и ручки вложенного примитива. Тем более, что это твой же примитив. при вызове subGetGripPoints возвращаешь ручки основного примитива и проходишься по всем подпримитивам и добавляешь их ручки к общему массиву.

Тогда при выборе объекта у меня будет каша из всех ручек (возможно с одинаковыми индексами). Это очень усложнит работу.

Только ты не обратил внимание, что используется совсем не так, как у тебя

Буду пока разбираться с этим примером. (Хорошо если смогу скомпилировать под VS2015)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SubEntity
« Ответ #14 : 07-02-2017, 15:27:11 »
Я подготовил этот пример, адаптированный под AutoCAD 2017 и VS 2015. Проверил что он нормально загружается и вроде даже работает в AutoCAD 2017. Пробуй.
« Последнее редактирование: 07-02-2017, 16:13:21 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение