Тема: Когда можно использовать acedCommand?

Скажем, есть такой нехитрый код:
acedCommand(RTSTR, "_regenall", 0);
Встречается в двух разных местах программы: в одном месте работает правильно, а в другом вообще ничего не происходит, почему?

Re: Когда можно использовать acedCommand?

Суть проблемы в следующем: когда я вызываю acedCommand из своей команды (зарегестрированной вызовом AddCommand) всё нормально. Но, у меня есть немодальное диалоговое окно, в котором пользователь может выбрать объект для вставки. Когда я пытаюсь вызвать acedCommand при обработке событий этого окна ничего не происходит. Т.е. налицо различия в контексте выполнения, ведь при обработке события моего окна вызов идёт, по существу, из основного потока автокада. Может кто-нибудь всё таки подскажет, как мне добиться необходимого поведения?

Re: Когда можно использовать 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;

Re: Когда можно использовать acedCommand?

> DiKey
Блокировка документа не помогает, увы sad
SendCommand насколько я понимаю эквивалентно sendStringToExecute (это, в принципе, тоже подойдёт, но всё таки немного не то) или нет?

Re: Когда можно использовать acedCommand?

> SendCommand,
насколько я понимаю, эквивалентно
> sendStringToExecute
Угу.

Re: Когда можно использовать acedCommand?

Разница в том что для того чтобы вызвать "sendStringToExecute" нужно указать документ для которого эта команда будет выполнена.
Например:

acDocManager->sendStringToExecute(acDocManager->curDocument(), "CMD ", false, true);

Re: Когда можно использовать acedCommand?

> 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);

Re: Когда можно использовать acedCommand?

acedCommand() допускается использовать только в контексте документа (не в контексте приложения)
Вот, по-моему, и все.

Re: Когда можно использовать acedCommand?

> Michael
Общий смысл понятен, только что такое контекст документа (приложения) - какое он имеет материальное воплощение?

Re: Когда можно использовать acedCommand?

> archimag
если кратко, то
когда "внутри" команды, тогда контекст документа
когда "управление" из немодального окна, или по DDE, или через COM, или еще как (другого не использовал), то контекст приложения.
Вообще этот вопрос достаточно широко освещен в доках.

Re: Когда можно использовать acedCommand?

(помню, для меня это тоже была "больная" тема)
Что касается регенерации чертежа, то вопрос этот "бородатый" и решается не всегда однозначно.
Если не смущает использование 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() оставляю в качестве приятной головоломи. :)

Re: Когда можно использовать acedCommand?

> Michael
Сам по себе, ActiveX не смущает smile - раньше довольно много с COM. Только, сдаёться мне, что ARX должен предоставлять больше возможностей smile
Проблемы регенерации привёл для пример, на самом деле, мне нужно было объект вращать smile
А что, с таким кодом
acDocManager->sendStringToExecute("_regenall\n");
могут быть какие-то проблемы? У меня сначала толком не получалось, потому, что я символ новой строки в конец не добалял - выводилось имя команды и нужно было жать enter для её запуска smile

Re: Когда можно использовать acedCommand?

Не знаю, может быть это "перегибы на местах", но я любыми путями стараюсь обходиться без использования acedCommand() и sendStringToExecute(). Хотя, может быть и зря.
Но как говориться "обжегшись на молоке на воду дуем"

Re: Когда можно использовать acedCommand?

Разница между sendString.. и acedCommand
практически та же что и между
PostMessage и SendMassage для widows