Тема: Доступ к базе рисунка с класса диалога CAcUiDialog

Нужна помощь, подскажите пожалуйста!
ARX приложение содержит:
1) Точку входа EntryPoint
2) Диалоговое немодальное окно от CAcUiDialog
В точке входа на определенную команду описан метод который поднимает немодальное окно

static void AsdkArxProject1_My(void)
{
 if (!m_Workdialog)
 {
    CAcModuleResourceOverride resOverride;
    m_Workdialog = new WorkDialog;
    m_Workdialog->Create(IDD_WORKDIALOG);
    m_Workdialog->ShowWindow(SW_SHOWNORMAL);
 }
 else
 {
   if (!m_Workdialog->IsWindowVisible() || m_Workdialog->     IsIconic())
   {
    m_Workdialog->ShowWindow(SW_SHOWNORMAL);
   }
 }
}
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, AsdkArxProject1, _My, My, ACRX_CMD_TRANSPARENT, NULL);

Нужно доступится к базе чертежа из этого диалогового класа с возможностью нарисовать, к примеру, примитив(линию). Вот как я реализовал но оно не работает

int WorkDialog::OnBnClickedButton1()
{
// Доступ к базе рисунка
 AcDbDatabase *pDb = new AcDbDatabase();
 AcDbBlockTable *pBtbl;
 pDb->getSymbolTable(pBtbl, AcDb::kForRead);
 AcDbBlockTableRecord *pBtblRcd;
 pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd, AcDb::kForWrite);
// Построение отрезка
 AcGePoint3d startPt(32,112.5,0); // 1-я точка в МСК
 AcGePoint3d endPt(161.2,140.8,0); // 2-я точка в МСК
// Создание нового объекта класса AcDbLine
// с динамическим выделением для него памяти
 AcDbLine* pLine = new AcDbLine(startPt,endPt);
// Добавление к БД рисунка отрезка
 if ((es = pMS->appendAcDbEntity(pLine)) != Acad::eOk)
 {
    acutPrintf ("\nОшибка добавления к БД отрезка. ") ;
        return (RSRSLT);
 };
// Закрытие доступа к объекту
 pLine->close();
// Закрытие блока *Model_Space
 pMS->close();
// Закрытие таблицы блоков
 pBlockTbl->close();
}

Суть проблемы :
при попытке получить
AcDbBlockTableRecord *pBtblRcd;
pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd, AcDb::kForWrite);
ПОЛУЧАЮ  pBtblRcd = NULL (0x0000000)
Если это сделать в точке входа все работает
В чем разница. И как добится выполнения такого кода в собственном диалоге????
Зарание благодарен!

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

Странный у тебя код:
1) Ты создал базу данных:

AcDbDatabase *pDb = new AcDbDatabase();

но нигде ее не сохраняешь в файл (pDb->saveAs(...);) и не удаляешь (delete pDb;)
2) Проанализируй код возврата pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd, AcDb::kForWrite);
Может он тебе подскажет в чем проблема.

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

Аналогичная ситуация возникает если
сделать так

// Признак ошибки (целое число)
 Acad::ErrorStatus es;
if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable
        (pBlockTbl, AcDb::kForRead)) != Acad::eOk )
{
 acutPrintf ("\nНе открыть таблицу блоков! ") ;
        return (RSRSLT);
}
// Получаем указатель на пространство модели как блок ACDB_MODEL_SPACE
//и открываем его для записи
 pBlockTbl->getAt(ACDB_MODEL_SPACE, pBtblRcd, AcDb::kForWrite);
 if (pBtblRcd == NULL)
 {
    acutPrintf ("\nНет доступа к блоку *Model_Space. ") ;
 return (RSRSLT);
 }

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

> Gidralisk
А тут совсем другое дело! Вставь перед этим кодом:

AcAxDocLock lock(acdbHostApplicationServices()->workingDatabase());

И сравни.

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

Большое спасибо за помощь, Александр!!!
Догадывался что перед апдейтом нужно
UpdateData(true);
:)
UpdateData(false);
К сожалению сейчас немогу проверить, вот домой вернусь, и поблагодарю ВАС еще раз!

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

> Gidralisk
Ну и при чем здесь UpdateData(...)?
AcAxDocLock lock(...) устанавливает блокировку базы. Это очень существенно для приложения, которое не работает в контексте данного документа (а немодальный диалог именно так и работает). Еще не плохо бы проверить lock.lockStatus(), т.е. удалось ли получить управление базой.

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

Спасибо за уточнения

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

Все работает, Александр спасибо, но проявился один маленький проблем (знаю что это всего навсего мои скудные знания мат части):
при нажатии на кнопку диалога в базу рисунка заносится примитив, но отрисовка происходит после перевода фокуса на главное окно када(нажатие на окне автокада). Как обновить с диалога viewport или world?

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

А поиском по форуму не пробовал? :)
https://www.caduser.ru/forum/topic26279.html

Re: Доступ к базе рисунка с класса диалога CAcUiDialog

Мда иногда стоит :)
Смотрю ARX - это сплошной танец с бубном
Александр - ВЫ главный шаман!
Но то что нас не убивает - делает нас сильнее!!!
Поэтому останавливаться поздно