Тема: Когда можно использовать acedCommand?
Скажем, есть такой нехитрый код:
acedCommand(RTSTR, "_regenall", 0);
Встречается в двух разных местах программы: в одном месте работает правильно, а в другом вообще ничего не происходит, почему?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Когда можно использовать acedCommand?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Скажем, есть такой нехитрый код:
acedCommand(RTSTR, "_regenall", 0);
Встречается в двух разных местах программы: в одном месте работает правильно, а в другом вообще ничего не происходит, почему?
Суть проблемы в следующем: когда я вызываю acedCommand из своей команды (зарегестрированной вызовом AddCommand) всё нормально. Но, у меня есть немодальное диалоговое окно, в котором пользователь может выбрать объект для вставки. Когда я пытаюсь вызвать acedCommand при обработке событий этого окна ничего не происходит. Т.е. налицо различия в контексте выполнения, ведь при обработке события моего окна вызов идёт, по существу, из основного потока автокада. Может кто-нибудь всё таки подскажет, как мне добиться необходимого поведения?
По-моему, для того, чтобы все работало правильно, надо найти текущий документ, блокировать его и только потом вызывать acedCommand. А чтобы посылать команды из основного потока и не возиться с блокировкой, удобно использовать COM.
CComPtr<IAcadApplication> pAcadApp;
if (!getApplication(&pAcadApp))
return E_NOINTERFACE;
IAcadDocument* pActiveDoc;
HRESULT hr=pAcadApp->get_ActiveDocument(&pActiveDoc);
pAcadApp.Release();
if (FAILED(hr)) return hr;
hr=pActiveDoc->SendCommand(pszCmdName);
pActiveDoc->Release();
return hr;
> DiKey
Блокировка документа не помогает, увы
SendCommand насколько я понимаю эквивалентно sendStringToExecute (это, в принципе, тоже подойдёт, но всё таки немного не то) или нет?
> SendCommand,
насколько я понимаю, эквивалентно
> sendStringToExecute
Угу.
Разница в том что для того чтобы вызвать "sendStringToExecute" нужно указать документ для которого эта команда будет выполнена.
Например:
acDocManager->sendStringToExecute(acDocManager->curDocument(), "CMD ", false, true);
> Roman
Ну да это не проблема, я использую эту функцию так:
std::stringstream out;
out << "_rotate\n_Last\n\n" << point[X] << ',' << point[Y] << std::endl;
acDocManager->sendStringToExecute(document_, out.str().c_str(), true, false, false);
acedCommand() допускается использовать только в контексте документа (не в контексте приложения)
Вот, по-моему, и все.
> Michael
Общий смысл понятен, только что такое контекст документа (приложения) - какое он имеет материальное воплощение?
> archimag
если кратко, то
когда "внутри" команды, тогда контекст документа
когда "управление" из немодального окна, или по DDE, или через COM, или еще как (другого не использовал), то контекст приложения.
Вообще этот вопрос достаточно широко освещен в доках.
(помню, для меня это тоже была "больная" тема)
Что касается регенерации чертежа, то вопрос этот "бородатый" и решается не всегда однозначно.
Если не смущает использование ActiveX, то можно использовать следующий путь.
bool gswrActxUpdateView() { bGswrIsUpdate = true; AutoCAD::IAcadApplication *pAcad; gswrAutomationGetApplication(pAcad); HRESULT hr; hr = pAcad->Update(); pAcad->Release(); bGswrIsUpdate = false; if (SUCCEEDED(hr)) return (true); else return (false); } bool gswrActxRegenModel() { AutoCAD::IAcadApplication *pAcad; gswrAutomationGetApplication(pAcad); AutoCAD::IAcadDocument *pDocument; pAcad->get_ActiveDocument(&pDocument); pAcad->Release(); HRESULT hr; hr = pDocument->Regen(AutoCAD::acActiveViewport); pDocument->Release(); if (SUCCEEDED(hr)) return (true); else return (false); }
Реализацию gswrAutomationGetApplication() оставляю в качестве приятной головоломи. :)
> Michael
Сам по себе, ActiveX не смущает - раньше довольно много с COM. Только, сдаёться мне, что ARX должен предоставлять больше возможностей
Проблемы регенерации привёл для пример, на самом деле, мне нужно было объект вращать
А что, с таким кодом
acDocManager->sendStringToExecute("_regenall\n");
могут быть какие-то проблемы? У меня сначала толком не получалось, потому, что я символ новой строки в конец не добалял - выводилось имя команды и нужно было жать enter для её запуска
Не знаю, может быть это "перегибы на местах", но я любыми путями стараюсь обходиться без использования acedCommand() и sendStringToExecute(). Хотя, может быть и зря.
Но как говориться "обжегшись на молоке на воду дуем"
Разница между sendString.. и acedCommand
практически та же что и между
PostMessage и SendMassage для widows
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Когда можно использовать acedCommand?
Форум работает на PunBB, при поддержке Informer Technologies, Inc