acDocManager()->curDocument()->cDoc()->GetIDispatch( BOOL bAddRef);

§  Все ObjectARX функции ввода пользователя может быть вызван с текущим активным документом, неявно используемым. Как отмечено выше, переключение документа будет заблокировано, когда ввод пользователя получен в этом контексте.

§  Прикладной код, выполняющийся от прикладного контекста может использовать следующую функцию члена, чтобы переключить или текущий и активный документ, вместе или индивидуально, как желательно.

virtual Acad::ErrorStatus

setCurDocument(

AcApDocument* pDoc,

AcAp::DocLockMode = AcAp::kNone,

bool activate = false) = 0;

§  чередуясь между запросом ввода пользователя и изменения или формирования текущего документа, можно запрашивать относительно ввода от множественных документов от единственного контекста выполнения и единственной последовательности кода. Недостаток{*препятствие*} - то переключение документа пользователем, заблокирован при запросе ввода, так что код должен знать, к которому документу требуется переключить.

§  когда активные и текущие документы отличаются, знать что ActiveX и ObjectARX ввод пользователя функции не будет работать должным образом. Используйте curDocument () и mdiActiveDocument () функции, чтобы проверить текущие и активные документы.

§  если приложение выгружается с текущим документом и активным отличным документом, следующее входное событие восстановит текущий документ назад к активному документу.

§  когда код, выполняющийся от прикладного контекста запрашивает ввод пользователя, используя ActiveX функции ввода пользователя, автоматическое интерактивное переключение документа заблокирован, хотя текущее переключение документа может быть выполнено.

НЕ нашли? Не то? Что вы ищете?

Undo базы данных и средства управления транзакции

Большинство ObjectARX-приложений не будет должно иметь дело с отменой и операционным управлением, но они должны знать некоторые важные точки:

§  Отмена и операционное управление выполнен на основании "в документ ". В AutoCAD, это управляется через (или в конъюнкции с) блокировкой документа.

§  Всякий раз, когда документы блокированы для kWrite или kXWrite, “начинают команда” скобка отмены написана к файлу, и затем база данных и другие модификации выполнена. Когда документы разблокированы от kWrite или kXWrite состояния, передача “конечная команда” скобка отмены будет написана. (Обратите внимание, что они могут быть вложены.) К времени приложение закончено, работая на документе, это должно было сбалансировать, его документ блокирует и разблокирует запросы. Если запросы не сбалансированы, файл отмены будет работать неправильно, оставляя действия из sync от после первой блокировки записи, и через первую блокировку, сбалансированную разблокирующимся. Последующий запрос отмены должен отложить это в sync.

§  параметр для установления имени команды обеспечивается, который отображен, когда команда UNDO выполнена. Созданные маркеры отмены - тот же самый что касается встроенного AutoCAD и команд ObjectARX, и могут поэтому управляться через ГРУППУ ОТМЕН.

§  Документы может иметь отмену, выполненную независимо от друг друга.

§  По умолчанию, когда образец AcDbDatabase создан, его отмена и операционное управление связана с текущим документом.

§  Обращают внимание, что имеются два метода AcEditorReactor, которые используются, чтобы соединить базы данных со средствами отмены документа и операционным менеджером: databaseConstructed() и databaseToBeDestroyed(). Если Вы получаете такое уведомление, знаете, что ассоциация между базой данных и любыми документами неопределена в ту временами, так документ, блокировка может или не может треб в databaseConstructed () повторный вызов. Конечно, любое действие, которое отменяет любые модификации, сделанные в то время, также отменит создание базы данных.

§  по умолчанию AcDbDatabase конструкторы сделает запрос объекта AcDbHostApplicationServices для контроллера отмены.

Документо-независимые базы данных

Чтобы участвовать в отмене в AutoCAD, базы данных должны быть связаны с документом, потому что каждый документ имеет независимый стек отмены. Однако, эта особенность находится в прямом конфликте с потребностью загрузить базы данных, чей содержание предназначено, чтобы быть разделенным поперек документа сеансы редактирования. Другими словами, Вы должны решить между следующим два сценария для ваших побочных баз данных:

§  Связывают базу данных с определенным документом, и не позволяют редактирования этому с других сеансов редактирования, и возможно загружают DWG или DXF файл в множественные базы данных в течение каждого сеанса редактирования, который нуждается в этом.

§  Загружают DWG или DXF файл, чтобы совместно использовать это поперек сеансов редактирования, и не имеют никакой автоматической отмены для этого. Или не поддержите отмену для них во всем (прекрасно, если они только для чтения, или только модифицированный для фактического сохраняет, или находятся под контролем пересмотра), или быть очень осторожным при использовании отмены.

В ObjectARX, прежний сценарий - значение по умолчанию. Всякий раз, когда инициирован новый образец AcDbDatabase, это связано с текущим документом.

Это - одна из причин, приложение должно изменить{*заменить*} текущий документ без того, чтобы активизировать новый документ.

AcDbDatabase класс обеспечивает следующую функцию, которая отключает отмену базы данных и разрушает связь базы данных с документом:

void disableUndoRecording(Adesk::Boolean disable);

Любая AcDb уверенность относительно любых документо-определенных переменных системы примет встроенные значения по умолчанию для документо-независимых баз данных. Также, не имеется никакой потребности блокировать любые документы, чтобы обратиться к докумено-независимым базам данных.

ОБРАТИТЕ ВНИМАНИЕ На разработчиков, кто думают относительно вызова независимого контроллера отмены от контроллеров отмены множественного документа, должен остаться знающий, что выполняющий отмену в данном документе может вести к несогласованности и коррупции. Например: База данных X имеет контроллер отмены, не связанный с любым документом. Модификации от Документируют, сделаны к Базе данных X, тогда модификациями из Документа B, которые полагаются на объекты, созданные или изменяемые от Документа модификации. Теперь, отмена применяется в Документе A. Изменения{*замены*}, сделанные к Документу B будут разрушены.

Пример MDI-ЗНАЮЩЕГО приложения

Следующий пример показывает простое ObjectARX-приложение, которое MDI-ЗНАЕТ.

Это - код примера от “ Использование Реактора Базы данных ” на странице 399, с кодом, добавленным, чтобы делать приложение MDI-Aware. Новый код показывается в жирном начертании.

class AsdkDbReactor;

class AsdkDocReactor: public AcApDocManagerReactor

{

public:

virtual void documentToBeActivated(AcApDocument* pDoc);

virtual void documentCreated(AcApDocument* pDoc);

virtual void documentToBeDestroyed(AcApDocument* pDoc);

};

class AsdkPerDocData

{

friend class AsdkAppDocGlobals;

public:

AsdkPerDocData(AcApDocument* pDoc);

private:

AcApDocument* m_pDoc;

AsdkPerDocData* m_pNext;

long m_EntAcc; // Entity count

AsdkDbReactor* m_pDbr;// Pointer to database reactor

};

class AsdkAppDocGlobals

{

public:

AsdkAppDocGlobals(AcApDocument* pDoc);

void setGlobals(AcApDocument* pDoc);

void removeDocGlobals(AcApDocument *pDoc);

void removeAllDocGlobals(AsdkPerDocData* pTarget);

void unload();

long &entityCount();

void incrementEntityCount();

void decrementEntityCount();

AsdkDbReactor *dbReactor();

void setDbReactor(AsdkDbReactor *pDb);

private:

AsdkPerDocData *m_pHead;

AsdkPerDocData *m_pData;

AsdkDocReactor *m_pDocReactor;

};

AsdkAppDocGlobals *gpAsdkAppDocGlobals;

// Custom AcDbDatabaseReactor class for Database

// event notification.

//

class AsdkDbReactor : public AcDbDatabaseReactor

{

public:

virtual void objectAppended(const AcDbDatabase* dwg,

const AcDbObject* dbObj);

virtual void objectModified(const AcDbDatabase* dwg,

const AcDbObject* dbObj);

virtual void objectErased(const AcDbDatabase* dwg,

const AcDbObject* dbObj, Adesk::Boolean pErased);

};

// This is called whenever an object is added to the database.

//

void

AsdkDbReactor::objectAppended(const AcDbDatabase* db,

const AcDbObject* pObj)

{

printDbEvent(pObj, "objectAppended");

acutPrintf(" Db==%lx\n", (long) db);

gpAsdkAppDocGlobals->incrementEntityCount();

acutPrintf("Entity Count = %d\n",

gpAsdkAppDocGlobals->entityCount());

}

// This is called whenever an object in the database is modified.

//

void

AsdkDbReactor::objectModified(const AcDbDatabase* db, const AcDbObject* pObj)

{

printDbEvent(pObj, "objectModified");

acutPrintf(" Db==%lx\n", (long) db);

}

// This is called whenever an object is erased from the database.

//

void

AsdkDbReactor::objectErased(const AcDbDatabase* db, const AcDbObject* pObj, Adesk::Boolean pErased)

{

if (pErased)

{

printDbEvent(pObj, "objectErased");

gpAsdkAppDocGlobals->decrementEntityCount();

}

else

{

printDbEvent(pObj, "object(Un)erased");

gpAsdkAppDocGlobals->incrementEntityCount();

}

acutPrintf(" Db==%lx\n", (long) db);

acutPrintf("Entity Count = %d\n",

gpAsdkAppDocGlobals->entityCount());

}

// Prints the message passed in by pEvent; then

// proceeds to call printObj() to print the information about

// the object that triggered the notification.

//

void

printDbEvent(const AcDbObject* pObj, const char* pEvent)

{

acutPrintf(" Event: AcDbDatabaseReactor::%s ", pEvent);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132