Тема: Обновление экрана программно при масштабировании

Хочу затронуть до боли заюзанную тему по обновлению экрана программно.
Мне необходимо провести мастабирование экрана из модального диалога...выглядит это так:

acDocManager->sendStringToExecute(acDocManager->curDocument(), "_.zoom _all\n");
regenScreen();

где regenScreen:

void regenScreen()
{
    actrTransactionManager->queueForGraphicsFlush();
    actrTransactionManager->flushGraphics();
    acedUpdateDisplay();
}

Но обновления экрана не происходит...
Происходит только после наведения курсора на экран, после закрытия модалльного окна..
Подскажите, плиз, как сделать обновление экрана без закрытия диалога?
С уважением, Sergey

(изменено: Александр Ривилис, 10 марта 2009г. 08:02:42)

Re: Обновление экрана программно при масштабировании

Здесь дело не в модальном диалоге, а в том, что _ZOOM _All выполнится только после завершения твоей команды (т.к. sendStringToExecute выполняется в асинхронном режиме). Так что можешь попробовать:

acedCommand(RTSTR,"_.zoom",RTSTR,"_all",RTNONE); 
ads_regen();  

Re: Обновление экрана программно при масштабировании

А что за функция такая ads_regen()??? чет даже в справке такую не нашел...

Re: Обновление экрана программно при масштабировании

void ads_regen(void);

Это недокументированная функция, которая выполняет регенерацию всего чертежа.

Re: Обновление экрана программно при масштабировании

Усе откомпилил, правда

acedCommand(RTSTR,"_.zoom",RTSTR,"_all",RTNONE);

чет не робит :(
Вообще не масштабирует

Re: Обновление экрана программно при масштабировании

Тогда начнем с начала:
1) В каком контексте (приложения или документа) работает программа?
2) Как работает диалоговое окно?
Самым правильным способом было бы вызывать диалог в цикле. По нажатию кнопки, при которой идет обращение к AutoCAD (отрисовка примитивов, выполнение команд AutoCAD, регенерация и т.д.) диалог завершается с сохранением информации из диалогового окна, выполняется обращение к AutoCAD, а только затем диалог запускается повторно с восстановлением сохраненной информации. Самый универсальный и самый надежный способ.

Re: Обновление экрана программно при масштабировании

1) Программа работает под Acad'ом, ч/з Arx-приложения;
2) Диалог вызывается след образом

extern "C" __declspec(dllexport)
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* p)
{
  switch( msg ) 
  {
  case AcRx::kInitAppMsg: 
    acrxDynamicLinker->unlockApplication(p);
    acrxDynamicLinker->registerAppMDIAware(p);
    acedRegCmds->addCommand("RX_TEST", "leditor", "linesEditor", ACRX_CMD_MODAL, &[color=red]_linesEditorWindow[/color]);
    acutPrintf("\nРедактор линий успешно загружен...\n");
    break;
  case AcRx::kUnloadAppMsg: 
    acedRegCmds->removeGroup("RX_TEST" );
    break;
  default:
    break;
  }
  return AcRx::kRetOK;
}

void _linesEditorWindow()
{
    CAcModuleResourceOverride resOverride;
    CMainWindow dlg(CWnd::FromHandle(adsw_acadMainWnd()));
    dlg.DoModal(); 
}

В диалоге создаю соответственно Баттоны, для масштабирования и на клик прописываю:

void CMainWindowDlg::OnBnClickedButton1()
{
    acedCommand(RTSTR,"_.zoom",RTSTR,"_all",RTNONE); 
    ads_regen();
}

Re: Обновление экрана программно при масштабировании

У меня в таком контексте работает (проверял в AutoCAD 2006 SP1, ObjectARX SDK 2006). Проверяй у себя где нахимичил.

Re: Обновление экрана программно при масштабировании

У мя CAD 2004 SP0 :), ObjectARX 2005... попробую OA 2004 SDK поставить..буду химичить дальше...
Спасибо, Александр, за Вашу неоценимую помощь.
С уважением, Sergey

Re: Обновление экрана программно при масштабировании

Вообще-то от версии AutoCAD и ObjectARX зависеть IMHO не должно. А класс диалога у тебя производный от CDialog или от CAcUiDialog? Я проверял с производным от CDialog. С производным от CAcUiDialog следует в обработчике кнопки делать:

BeginEditorCommand();
acedCommand(RTSTR,"_.zoom",RTSTR,"_all",RTNONE);
ads_regen(); 
CompleteEditorCommand();

Ну и не забывать о переключении ресурсов перед обращением к командам AutoCAD:

HINSTANCE hAcad = acedGetAcadResourceInstance();
HINSTANCE hCur  = AfxGetResourceHandle();
AfxSetResourceHandle(hAcad); // Устанавливаем ресурсы acad.exe
//
// Здесь можно выполнять команды AutoCAD
//
AfxSetResourceHandle(hCur); // Устанавливаем собственные ресурсы

(изменено: Sergey SH, 11 марта 2009г. 08:16:19)

Re: Обновление экрана программно при масштабировании

Все разобрался, у мя почему то значения RTSTR и RTNONE принимали значение 0.
Пришлось прописывать вручную...т.е.

acedCommand(5005,"_.zoom",5005,"_all",5000); 
ads_regen();

Теперь все работает!

Re: Обновление экрана программно при масштабировании

И что же нужно было сделать, чтобы RTSTR и RTNONE принимали значение 0  :?:

Re: Обновление экрана программно при масштабировании

Не знаю как, но в заголовке adscodes.h, была такая тема

#define RTNONE    e0 /*  */
#define RTREAL    1 /*Real r */
#define RTPOINT   0 /*  Y only */
#define RTSHORT   0 /* rt integer */
#define RTANG     0 /* Angle */
#define RTSTR     0 /* String */
#define RTENAME   0 /* ity name */
#define RTPICKS   0 /*

Скачал и переставил ObjectARX 2005, в оригинале, нормальные значения(adscodes.h):

#define RTNONE    5000 /* No result */
#define RTREAL    5001 /*Real number */
#define RTPOINT   5002 /* 2D point X and Y only */
#define RTSHORT   5003 /* Short integer */
#define RTANG     5004 /* Angle */
#define RTSTR     5005 /* String */
#define RTENAME   5006 /* Entity name */
#define RTPICKS   5007 /* Pick set */

Теперь усе работает.
Спасибо, Александр, еще раз за подсказку.
С уважением, Sergey

Re: Обновление экрана программно при масштабировании

Да уж. Это как надо было поиграться с ним, чтобы удалить пол файла.