Не могу разобраться с subMoveGripPointsAt

Автор Тема: Не могу разобраться с subMoveGripPointsAt  (Прочитано 7930 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Подскажите пожалуйста.

MSVS 2015. AutoCAD 2017. Platform x64
Продолжаю изучать ObjectARX и играюсь с тестовым проектом.
Проект прикрепил к посту

Не могу понять следующее:

Для subMoveGripPointsAt Хотел задать такую логику:
те Грипы, что на конце ножки будут увеличивать ножку в длину
Грипы на концах шляпки будет увеличивать весь болт синхронно
Грипы на соединяющей ножку и шляпку прямой будут просто передвигать объект в место передвижения мышки

С тем кодом, что встроил отрабатывает не так, и никак не пойму, как написать это правильно.
Посмотрел примеры из SDK, но даже после них довольно сложно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #1 : 03-07-2018, 14:43:45 »
Запиши видео как у тебя работает и подробнее объясни чего ты добиваешься. Картинки тоже не помешают. Я пока ничего не понял. А код выглядит ужасающе когда смотришь метод Bolt::subMoveGripPointsAt, в котором и происходит обработка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #2 : 03-07-2018, 15:21:16 »
Извиняюсь что сейчас не могу записать видео рекомендованной программой ,вот что нужно


при зажимании данных точек (увеличение всей детали и ее ножки)

а вот что есть 


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #3 : 03-07-2018, 15:24:33 »
Извиняюсь что сейчас не могу записать видео рекомендованной программой
Извинения принимаются только временно. Теперь более-менее понятно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #4 : 03-07-2018, 16:11:07 »
Попробуй такой вариант. Он далеко не идеален и должен учитывать направление перемещения ручек:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus Bolt::subMoveGripPointsAt(const AcDbIntArray &indices, const AcGeVector3d &offset)
  2. {
  3.   assertWriteEnabled();
  4.   AcGeVector3d normal = AcGeVector3d(0.0, 0.0, 1.0);
  5.   AcGeVector3d trans = m_vecU;
  6.   trans.rotateBy(HALFPI, normal);
  7.  
  8.   //this->setOrient(m_vecU.mirror(AcGeVector3d(0.0, 0.0, 1.0)) - offset);
  9.  
  10.   const int koeff = 10;
  11.   for (int i = 0; i < indices.length(); i++)
  12.   {
  13.     // Если хотим настроить что будет происходить
  14.     // когда будем тянуть за кокнретную грп-точку
  15.     // 0 - первую по счёту, 1 - вторую, 2 - третью и т.д.
  16.     // наша фигура это  // subGetGripPoints Map:
  17.     //
  18.     //    ------- 4
  19.     //   /              |
  20.     //  |               |0_______________ 1
  21.     //  |                                                |
  22.     //  |                ________________|
  23.     //   \              |3                                2
  24.     //    ------|
  25.     //                   5
  26.     AcGeMatrix3d mat;
  27.     switch (indices[i])
  28.     {
  29.       case 0:
  30.       case 3:
  31.         m_diametrRezba += offset.length();
  32.         storePoints();
  33.         return Acad::eOk;
  34.  
  35.       case 1:
  36.       case 2:
  37.         m_lengthRezba += offset.length();
  38.         storePoints();
  39.         return Acad::eOk;
  40.         break;
  41.  
  42.       case 4:
  43.       case 5:
  44.         m_diametrHat += offset.length();
  45.         storePoints();
  46.         return Acad::eOk;
  47.  
  48.     }
  49.   }
  50.  
  51.   return (AcDbEntity::subMoveGripPointsAt(indices, offset));
  52. }
  53.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #5 : 03-07-2018, 16:12:25 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #6 : 03-07-2018, 17:01:15 »
спасибо, а нельзя сделать чтобы оно могло и увеличиваться и уменьшаться, что-то я не пойму как  ???

Отмечено как Решение knightrocker 04-07-2018, 03:13:34

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу разобраться с subMoveGripPointsAt
« Ответ #7 : 03-07-2018, 17:28:38 »
спасибо, а нельзя сделать чтобы оно могло и увеличиваться и уменьшаться, что-то я не пойму как  ???
Можно всё (или почти).
Код - C++ [Выбрать]
  1. inline double GetSignedOffset(AcGeVector3d offset, AcGePoint3d p1, AcGePoint3d p2)
  2. {
  3.   AcGeLine3d  l(p1, p2);
  4.   AcGePoint3d p = p1 + offset;
  5.   AcGePoint3d pp = l.closestPointTo(p);
  6.   if (p1.distanceTo(pp) + p2.distanceTo(pp) > p1.distanceTo(p2))
  7.     return p1.distanceTo(pp);
  8.   else
  9.     return -p1.distanceTo(pp);
  10. }
  11.  
  12. Acad::ErrorStatus Bolt::subMoveGripPointsAt(const AcDbIntArray &indices, const AcGeVector3d &offset)
  13. {
  14.   assertWriteEnabled();
  15.  
  16.   for (int i = 0; i < indices.length(); i++)
  17.   {
  18.     // Если хотим настроить что будет происходить
  19.     // когда будем тянуть за кокнретную грп-точку
  20.     // 0 - первую по счёту, 1 - вторую, 2 - третью и т.д.
  21.     // наша фигура это  // subGetGripPoints Map:
  22.     //
  23.     //    ------- 4
  24.     //   /              |
  25.     //  |               |0_______________ 1
  26.     //  |                                                |
  27.     //  |                ________________|
  28.     //   \              |3                                2
  29.     //    ------|
  30.     //                   5
  31.     AcGeMatrix3d mat;
  32.     switch (indices[i])
  33.     {
  34.       case 0:
  35.         m_diametrRezba += GetSignedOffset(offset, m_arRezbaline[0], m_arRezbaline[3]) * 2;
  36.         storePoints();
  37.         return Acad::eOk;
  38.       case 3:
  39.         m_diametrRezba += GetSignedOffset(offset, m_arRezbaline[3], m_arRezbaline[0]) * 2;
  40.         storePoints();
  41.         return Acad::eOk;
  42.  
  43.       case 1:
  44.         m_lengthRezba += GetSignedOffset(offset, m_arRezbaline[1], m_arRezbaline[0]);
  45.         storePoints();
  46.         return Acad::eOk;
  47.  
  48.       case 2:
  49.         m_lengthRezba += GetSignedOffset(offset, m_arRezbaline[2], m_arRezbaline[3]);
  50.         storePoints();
  51.         return Acad::eOk;
  52.  
  53.       case 4:
  54.         m_diametrHat += GetSignedOffset(offset, m_arHatline[0], m_arHatline[2]) * 2;
  55.         storePoints();
  56.         return Acad::eOk;
  57.  
  58.       case 5:
  59.         m_diametrHat += GetSignedOffset(offset, m_arHatline[2], m_arHatline[0]) * 2;
  60.         storePoints();
  61.         return Acad::eOk;
  62.  
  63.     }
  64.   }
  65.  
  66.   return (AcDbEntity::subMoveGripPointsAt(indices, offset));
  67. }


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение