Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Ura от 30-11-2016, 16:46:26

Название: AcEdJig::drag - видимость базового объекта при перемещении
Отправлено: Ura от 30-11-2016, 16:46:26
Здравствуйте
Создал класс для перемещения и поворота объекта с использованием AcEdJig::drag    (AutoCAD2015-2016)
Класс отрабатывает корректно, но при перемещении виден и базовый объект и тот который перемещается.

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

Сделал как указано ниже, не помогает. Базовый объект все равно отображается.

Код - C++ [Выбрать]
  1. AcEdDragStyle  dragStyleNew;
  2.  
  3. dragStyleNew.setStyleTypeForDragged(AcEdDragStyle::kNone);  //стиль отображения перемещаемого объекта (можно закоментировать, это значение по умолчанию)
  4. dragStyleNew.setStyleTypeForOriginal(AcEdDragStyle::kHide);   //стиль отображения базового объекта
  5.  
  6. AcEdJig::DragStatus stat = drag(dragStyleNew);  //перемещение объекта
  7.  

Если установить стиль перемещаемого объекта AcEdDragStyle::kHide, перемещаемый объект не отображается
Этот же стиль для базового объекта не работает.
Название: Re: AcEdJig::drag - видимость базового объекта при перемещении
Отправлено: Александр Ривилис от 30-11-2016, 17:02:26
Установить базовому объекту setVisibility в false. Пишу по памяти и проверить нет возможности.
Название: Re: AcEdJig::drag - видимость базового объекта при перемещении
Отправлено: Ura от 30-11-2016, 17:36:51
Попробовал добавить  pEntity->setVisibility(AcDb::Visibility::kInvisible), как показано ниже
Не помогло

Код - C++ [Выбрать]
  1. AcEdDragStyle  dragStyleNew;
  2.  
  3. dragStyleNew.setStyleTypeForDragged(AcEdDragStyle::kNone);  //стиль отображения перемещаемого объекта (можно закоментировать, это значение по умолчанию)
  4. dragStyleNew.setStyleTypeForOriginal(AcEdDragStyle::kHide);   //стиль отображения базового объекта
  5.  
  6. pEntity->setVisibility(AcDb::Visibility::kInvisible);
  7.  
  8. AcEdJig::DragStatus stat = drag(dragStyleNew);  //перемещение объекта
  9.  

Базовый объект остается видимым, перемещаемый не отображается. А нужно наоборот - чтобы не отображался базовый.

После перемещения базовый тоже не отображается. Для отображения объекта, в конце функции добавил pEntity->setVisibility(AcDb::Visibility::kVisible);
Название: Re: AcEdJig::drag - видимость базового объекта при перемещении
Отправлено: Александр Ривилис от 30-11-2016, 18:13:16
Все игры с AcEdDragStyle я считаю совершенно лишними.
1. Создаёшь клон базового объекта:
Код - C++ [Выбрать]
  1. AcDbEntity *pCloneEnt = (AcDbEntity *) pEntity->clone();
2. После этого самому базовому объекту pEntity->setVisibility(AcDb::Visibility::kInvisible).
3. Таскаешь в AcEdJig клон, а не базовый объект.
P.S.: Конечно неплохо бы увидеть весь код, чтобы понять что у тебя не так.

Название: Re: AcEdJig::drag - видимость базового объекта при перемещении
Отправлено: Ura от 01-12-2016, 15:19:37
Все оказалось проще, чем я думал
Никаких клонов создавать ненужно.

В функции перемещения оставил только drag без параметров

Код - C++ [Выбрать]
  1. AcEdJig::DragStatus stat = drag();

Самое главное - в начале функции ::sampler() добавил перерисовку объекта, в этом случае видно как объект перемещается, базового объекта не остается.

Код - C++ [Выбрать]
  1. pEntity->draw();
Название: Re: AcEdJig::drag - видимость базового объекта при перемещении
Отправлено: Ura от 14-12-2016, 10:11:02
Уточнение по прошлому ответу

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

Код - C++ [Выбрать]
  1. AcEdJig::DragStatus stat = drag(AcEdDragStyle(AcEdDragStyle::kNone, AcEdDragStyle::kHide));

2) в функции sampler() получаем новое положение объекта
3) чтобы было видно, как объект перемещается, в функции update(), обновляю положение базового элемента
Например для блока
pBlockEntity->setPosition(PointBlock);

Теперь работает корректно.