Тема: Почему функция "drag()" возращает "kCancel"?

Здравствуйте все! Всех с прошедшими празниками!
Захотел потаскать существующий объект, посмотрел sample elipsjig_dg и сильно обрадовался тому, что на первый взглд ничего сложного нет. Но хорошее настроение было изрядно подпорчено функцией drag(), возращающей в примере kNormal, а в моём коде kCancel.
Указатель на полилинию получаю через acdbOpenObject(pEnt, eId, AcDb::kForWrite), передаю его в StartJig((AcDbPolyline*)pEnt), далее вызываю drag() которая возращает kCancel. Подскажите в чём ошибка, плиз.
Спасибо!

Re: Почему функция "drag()" возращает "kCancel"?

Для примитива, который уже содержится в чертеже, механизм нужен другой. Опубликуй свой код. Посмотрю. Может чего и посоветую.

Re: Почему функция "drag()" возращает "kCancel"?

А если на уровне идеи, которую придется тебе воплотить, то вот она.
1) Создать собственный примитив (с минимальными возможностями), который не регистрируется (т.е. не выполняется его метод rxInit()), не содержит ACRX_DXF_DEFINE_MEMBERS и ACRX_DECLARE_MEMBERS и кроме конструктора и деструктора есть только метод worldDraw()
2) В методе worldrawDraw() этого примитива и происходит изменение полилинии.
3) Метод update() для jig-класса ничего не делает и всегда возвращает true
В общих чертах это все.
Еще немного можно почитать здесь: https://www.caduser.ru/forum/topic20171.html
Исходный код будет опубликован в книге: Н.Н.Полещук. "AutoCAD: разработка приложений, настройка и адаптация" (серия "В подлиннике"). БХВ-Петербург, 2006, 992 с.+CD

Re: Почему функция "drag()" возращает "kCancel"?

Спасибо Александр!
Что-то мне подсказывает, что drag() применима только к вновь создаваемым объектам (с объектом уже добавленным в базу не работает). Могу ошибаться, но если это так, то это несколько усложнит мою задачу, а вот с custom entity придётся туго. Когда проверю сообщу результат.

Re: Почему функция "drag()" возращает "kCancel"?

Сергей пишет:

Что-то мне подсказывает, что drag() применима только к вновь создаваемым объектам (с объектом уже добавленным в базу не работает).

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

Re: Почему функция "drag()" возращает "kCancel"?

Привет всем!
Оказывается можно работать и с объектами уже находящимися в базе ... Уже таскаю полилинию (эмулировал комманду move) всё нормально работает, только при активизации процесса, полилиния на время замыкается :) Надо разобраться ещё каким образом сделать пунктирное отображение перетаскиваемого примитива (как в стандартном автокадовском режиме). Буду признателен за подсказку.
P.S. При перетаскивании LDD объектов стандартным автокадовским move динамические ссылки "отрываются" от объектов на которые они завязаны (по всей вилимости move таскает клон или вновь созданную копию), а в моём случае label следует за обектом в момент обновления.

Re: Почему функция "drag()" возращает "kCancel"?

> Сергей
Немного не по теме. А почему бы тебе не использовать функцию acedDragGen?

Re: Почему функция "drag()" возращает "kCancel"?

Потому, что собираюсь таскать одновременно 9 объектов с одной стороны, а с другой с опаской отношусь к глобальным функциям Autodesk. Чем-то она меня не привлекла, не помню чем (давно пробовал, надо будет освежить в памяти).

Re: Почему функция "drag()" возращает "kCancel"?

Именно для одновременного таскания набора примитивов эта функция и предназначена. Причем именно для прримитивов, которые уже добавлены в базу чертежа. Посмотри например здесь: https://www.caduser.ru/forum/topic21496.html

Re: Почему функция "drag()" возращает "kCancel"?

Здравствуйте, Александр и другие участники конференции.
Функция  acedDragGen() неплохая, была бы незаменимой в моём случае, если можно было бы для каждого примитива передать уникальную матрицу. Я не маньяк переписывать автокадовские функции (move, rotate и т.п.) , просто на элементарных действиях проще обкатывать части более сложных.
Спасибо за ссылку, оказалась очень полезной.
Может кто-нибудь знает, что именно делает AcEdJig::drag() (может она просто использует acedDragGen())?

Re: Почему функция "drag()" возращает "kCancel"?

Может кто-нибудь знает, что именно делает AcEdJig::drag() (может она просто использует acedDragGen())?

IMHO и та и другая использует некий "низкоуровневый" неописанный интерфейс, который нигде не описан.