Тема: Regen объектов при активном Jig-е

1) Запускаю AcEdJig для своего объекта.
2) Если во время Jig-инга взять и в MODAL_SPACE сделать для некоторых invisible объектов setVisibke(kTrue), то эти объекты не видны на экране даже опосля завершения Jig-а и !команды! в целом. Надо сделать RegenALL руками - чтоб они появились.
3) Если делать то же самое при всяких acedGetPoint и etc, то все ОК - как только объекту сказали setVisibke(kTrue) - он сразу же отображается и начинает выдавать свои osnappoint-ы и... вобщем все нормально.
Пробую сделать acedEntUpd(ads_name) - объекты начинают отображаться на экране. !НО! они не могут быть выделены, не выдают оснап поинты и т.п. - т.е. все равно надо сделать regen.
------
updateGraphicыModified не помогает. Результат тот же.
------
------
actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
результат тот же - не помогает
------
acedUpdateDisplay();
результат тот же.
------
ЧТО ЕЩЕ МОЖНО ПОДЕРГАТЬ ЧТОБ ИЗМЕНЕНИЯ СТАЛИ ВИДНЫ НА ЭКРАНЕ СРАЗУ ПРЯМО В ПРОЦЕССЕ JIG-а?

Re: Regen объектов при активном Jig-е

Блин и та же фигня - если во время операции drag-ginga - пытатьс делать объекты видимыми.
Делаем оъект. "Лицо человечка"
Делаем у него custom osnap mode
Как только над объектом что-то таскают, то надо сделать какой-нибудь приметив видимым - например чтоб "человечек" заулыбался... ну или хотябы просто изменить графику текущего объекта.

Re: Regen объектов при активном Jig-е

> KonstantinM
Попробуй:

actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();

перед любым вызовом вызовом метода drag(). Но вообще-то это известный дефект AutoCAD всех версий, начиная как минимум с 2002.

Re: Regen объектов при активном Jig-е

Так блин говорю же - что
actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
срабатывает как то странно. Т.е. объекты на экране рисуются, но не оснапы, не грипы не выдают, не селектятся и т.п. - т.е. грубо говоря они отсутствуют "как объекты" в некоторой подложке на основе которой в Автокаде вычисляют какой объект ткнули и т.п. А дисплей - это дисплей. Т.е. видать когда у объекта стоит visible = false, то он вообще исключается из какой либо обработки (input point processing). Если в процессе drag-а объект сделать видимым, то он все равно (хоть и отобразившись) отсутствует в (input point processing-е). До вызова команды Regen...
Такое вот неприятное поведение - придется блин как всегда искать обходные пути...

Re: Regen объектов при активном Jig-е

> KonstantinM
Еще одна мысль, которую я реализовал здесь: https://www.caduser.ru/forum/topic20171.html
Нужно поместить все операции по модификации "неосновных" примитивов в метод worldDraw (или viewportDraw) основного примитива, который передается в jig. Можешь попробовать вообще сделать отдельный примитив, который не добавляется в базу чертежа, а в его методе worldDraw выполняются все необходимые операции.

Re: Regen объектов при активном Jig-е

Расскажу чего хотел добиться - но не получилось.
1) У меня есть мой объект (custom), который ссылается на набор других entity. Этот набор инвизибл т.е. не рисуется.
2) Делаю custom osnap protocol для моего объекта.
3) Когда над объектам что-то таскают, то вызывается getOsnapInfo - в этом методе я хотел сам объект сделать инвизибл, а набор других объектов видимым, чтоб они участвовали в snappinge.
4) Когда команда завершалась - я просто опять объект делал видимым, а его набор объектов невидимым.
Объясню еще зачем такой "финт" ушами. Дело в том, что в этом наборе могут быть любые объекты, автокада, сторонних производителей и мои в том числе. Для ряда объектов реализован свой osnap protocol, поэтому тупо повызывать у всех getOsnapPoints(...) - не достаточно. А вот такой "финт ушами" был бы просто идеален. Т.е. когда объект дилигирует обработку событий своим подобъектам скрываясь и отображая их вместо себя...

Re: Regen объектов при активном Jig-е

Еще нашел: known bugs and limitations
Hot Grips and Flushing Queued GraphicsWhenever queued graphics are flushed out to the graphics system (via AcTransactionManager::flushGraphics() or AcDbEntity::draw()), grips that are currently hot will become normal "non-hot" grips. If this occurs while a grip operation is underway, the edit operation will be ended, but the command involved (stretch, move, and so on) will still be active and a rubberband line will be present from one of the formerly hot grips to the cursor.
Посему - любая попытка помянять графику объекта над которым что-либо такают за грип точку - оканчивается безрезультатно.
Бля! такую важную фичу на корню зарубили... не сделать "улыбающегося человечка" когда над ним что-то протаскивают...