ObjectARX, AutoCAD. Среда программирования библиотеки C++

         

ACAD_OBJID_INLINE_INTERNAL


Файлы заголовка acdb.h и dbidar.h содержат #ifdef Секцию, которая выбирает заголовок к #include Основанный на макрокоманде ACAD_OBJID_INLINE_INTERNAL.

Приложения должны никогда #define Это значение. Этот #define Предназначен для Autodesk внутреннее использование только. Приложения, которые включают #define Макрокоманду ACAD_OBJID_INLINE_INTERNAL, не будут компилировать успешно.



AcApDocManager


Объект AcApDocumentManager содержит все объекты документа в приложении (имеется один объект документа для каждого рисунка, который является открытым и отредактируемым). Имеется только один образец, который может быть получен, используя макрокоманду acDocManager ().



AcApDocManagerReactor


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

Для подробной информации относительно классов управления документа, см. ObjectARX Ссылку. Пример использования этих классов дается позже в этой главе.



AcApDocument


Объект AcApDocument содержит информацию типа имени файла, объекта MFC CDocument, текущей базы данных, и сохранять формат текущего рисунка.

Дополнительно, объект AcApDocument содержит функции, которые сделают запрос состояния документа блокировка.



AcApDocumentIterator


AcApDocumentIterator класс обеспечивает способность выполнить итерации по набору в настоящее время открытых объектов AcApDocument.





AcApLongTransactionManager Класс


AcApLongTransactionManager - менеджер для старта и управления длинными трудами. Имеется только один для каждого сеанса AutoCAD, и к этому обращаются через указатель, возвращенный объектом acapLongTransactionManager.



AcApLongTransactionReactor Класс


AcApLongTransactionReactor обеспечивает уведомление определенным к длинным операционным операциям. Это разработано{*предназначено*}, чтобы использоваться вместе с глубокими уведомлениями аналога, которые будут также посланы, но изменятся, в зависимости от которого тип контроля / в выполняется. Чтобы подключить эти уведомления с глубокими уведомлениями аналога, объект AcDbIdMapping, используемый для имитации может быть восстановлен{*отыскан*},  вызывая AcDbLongTransaction:: activeIdMap () функция. 



AcApProfileManager Класс


Имеется только один объект Profile Manager в сессию AutoCAD. ObjectARX обеспечивает глобальную функцию, чтобы получить доступ к этому объекту Profile Manager, названному acProfileManagerPtr(). Эта функция возвращает указатель на объект AcApProfileManager, который методы могут тогда быть вызваны.

AcApProfileManager класс обеспечивает контейнер для операций, обеспеченных окном Profiles. Не имеется никакого метода, обеспеченного, чтобы получить текущее имя профиля, так как это сохранено в переменной системы по имени CPROFILE и может быть получено, используя запрос к acutGetVar ().

AcApProfileManager класс обеспечивает следующие возможности

Возможности

Связанный Метод

Отыщите путь системного реестра для указанного профили

AcApProfileManager:: ProfileRegistryKey

Отыщите названия профилей которые в настоящее время существуют для конфигурации пользователя

AcApProfileManager:: ProfileListNames

Экспортируйте данный профиль в файл профили системного реестра AutoCAD (.arg) в формате REGEDIT4

AcApProfileManager:: ProfileExport

Импортируйте файл профили системного реестра AutoCAD (.arg) в данный профиль

AcApProfileManager:: ProfileImport

Удалите указанный профиль из системного реестра

AcApProfileManager:: ProfileDelete

Сбросьте указанный профиль к настройкам по умолчанию AutoCAD

AcApProfileManager:: ProfileReset

Делайте указанный профиль активным или текущим для сессии AutoCAD

AcApProfileManager:: ProfileSetCurrent

Копируйте существующий профиль к новому профилю

AcApProfileManager:: ProfileCopy

Переименуйте существующий профиль

AcApProfileManager:: ProfileRename

Добавьте новый объект реактора профиля

AcApProfileManager:: addReactor

Удалите существующий объект реактора профиля

AcApProfileManager:: removeReactor



AcApProfileManagerReactor Класс


AcApProfileManagerReactor класс обеспечивает контейнер для различных  события уведомлений, основанных на изменении параметров пользователем.

AcApProfileManagerReactor уведомления класса

Уведомление

Связанный Метод

Текущий профиль собирается быть измененным

 AcApProfileManagerReactor::currentProfileWillChange

Текущий профиль был изменен

 AcApProfileManagerReactor::currentProfileChanged

Текущий профиль собирается быть сброшенным

 AcApProfileManagerReactor::currentProfileWillBeReset

Текущий профиль был сброшен

 AcApProfileManagerReactor::currentProfileReset

Не-текущий профиль собирается быть сброшенным

 AcApProfileManagerReactor::profileWillReset

Не-текущий профиль был сброшен

AcApProfileManagerReactor:: profileReset

Пример менеджера профилей

Следующая выборка демонстрирует использование Классов AcApProfileManagerReactor и AcApProfileManager:

// Определить класс, полученный из AcApProfileManagerReactor, чтобы управлять уведомлениями.

//

class AsdkProfileManagerReactor : public AcApProfileManagerReactor

{

public:

void currentProfileWillChange(const char *newProfile);

void currentProfileChanged(const char *newProfile);

void currentProfileWillBeReset(const char *curProfile);

void currentProfileReset(const char *curProfile);

void profileWillReset(const char *profName);

void profileReset(const char *proName);

};

// Define the notification functions.

//

void

AsdkProfileManagerReactor::

currentProfileWillChange(const char *newProfile)

{

acutPrintf("\nCurrent profile will change: %s", newProfile);

}

void

AsdkProfileManagerReactor::

currentProfileChanged(const char *newProfile)

{

acutPrintf("\nCurrent profile changed: %s", newProfile);

}

void

AsdkProfileManagerReactor::

currentProfileWillBeReset(const char *curProfile)

{

acutPrintf("\nCurrent profile will be reset: %s", curProfile);

}

void

AsdkProfileManagerReactor::


currentProfileReset(const char *curProfile)

{

acutPrintf("\ nCurrent profile has been reset: %s", curProfile);

}

void

AsdkProfileManagerReactor::

profileWillReset(const char *profName)

{

acutPrintf("\nNon-current profile will be reset: %s", profName);

}

void

AsdkProfileManagerReactor::

profileReset(const char *profName)

{

acutPrintf("\nNon-current profile has been reset:%s", profName);

}

void

aFunction()

{

acutPrintf("This is AsdkProfileSample Test Application...\n");

// Attach the reactor for the duration of this command. Normally

// this would be added upon application initialization.

//

AsdkProfileManagerReactor *pProfileRector =

new AsdkProfileManagerReactor();

acProfileManagerPtr()->addReactor(pProfileRector);

// Obtain the path for the registry keys and print it out.

//

char *pstrKey;

acProfileManagerPtr()->ProfileRegistryKey(pstrKey, NULL);

if (pstrKey != NULL) {

acutPrintf("\nThe profiles registry key is: %s", pstrKey);

acutDelString(pstrKey);

}

// Get the list of all profiles in the user’s configuration

// and print them out.

//

AcApProfileNameArray arrNameList;

int nProfiles =

acProfileManagerPtr()->ProfileListNames(arrNameList);

acutPrintf("\nNumber of profiles currently "

"in the user profile list is: %d", nProfiles);

for (int i = 0; i < nProfiles; i++)

acutPrintf("\nProfile name is: %s", arrNameList[i]);

// Copy the unnamed profile to the AsdkTestProfile.

//

acProfileManagerPtr()->ProfileCopy(

"AsdkTestProfile",

"<<Unnamed Profile>>",

"This is a test");

// Reset the newly copied profile to AutoCAD defaults.

//

acProfileManagerPtr()->ProfileReset("AsdkTestProfile");

// Make this new profile current.

//

acProfileManagerPtr()->ProfileSetCurrent("AsdkTestProfile");

// Change a value in the profile. For this example, make the

// cursor big.

//

struct resbuf rbCursorSize;

rbCursorSize.restype = RTSHORT;

rbCursorSize.resval.rint = 100;

acedSetVar("CURSORSIZE", &rbCursorSize);

// Rename the profile to a new name.

//

acProfileManagerPtr()->ProfileRename(

"AsdkTestProfile2",

"AsdkTestProfile",

"This is another test");

// Export the profile.

//

acProfileManagerPtr()->ProfileExport(

"AsdkTestProfile2",

"./AsdkTestProfile2.arg");

// Import the profile.

//

acProfileManagerPtr()->ProfileImport(

"AsdkTestProfile3",

"./AsdkTestProfile2.arg",

"This is a copy of AsdkTestProfile2"

"by Exporting/Importing",

Adesk::kTrue);

// Remove the reactor.

//

acProfileManagerPtr()->removeReactor(pProfileRector);

}


AcAxOleLinkManager


AcAxOleLinkManager используется, чтобы управлять связью от объекта резидента базы до его объекта COM. Это сделано,  прикрепляя переходный реактор к AcDbObject. Переходный реактор имеет одну переменную, содержащую IUNKNOWN объекта COM. Этот переходный реактор также используется, чтобы вызвать IACADBASEOBJECT:: OnModified () когда AcDbObject изменяется.

Получить указатель на OLE связывают менеджера, используют AcAxGetOleLinkManager (). AcAxOleLinkManager класс описан ниже:

// AcAxOleLinkManager

используется, чтобы поддержать связь между объектами ARX и их соответствующей оберткой COM.

//

class AcAxOleLinkManager

{

public:

// Учитывая указатель на объект резидента базы, возвратите IUNKNOWN

//  обертки COM. NULL возвращен, если никакая обертка не найдена.

//

virtual IUnknown* GetIUnknown(AcDbObject* pObject) = 0;

// Установить связь между объектом резидента базы и оберткой COM.

//  Если IUNKNOWN

- NULL, то связь удалена.

//

virtual Adesk::Boolean SetIUnknown(AcDbObject* pObject, IUnknown* pUnknown) = 0;

// Учитывая указатель на объект базы данных, возвратите IUNKNOWN

// обертки COM. NULL возвращен, если никакая обертка не найдена.

//

virtual IUnknown* GetIUnknown(AcDbDatabase* pDatabase) = 0;

// Установить связь между объектом базы данных и оберткой COM.

// Если IUNKNOWN

- NULL, то связь удалена.

//

virtual Adesk::Boolean SetIUnknown(AcDbDatabase* pDatabase,

IUnknown* pUnknown) = 0;

// Учитывая указатель на объект базы данных, возвратите IDISPATCH объекта документа.

// NULL возвращен, если база данных не принадлежит специфическому документу.

//

virtual IDispatch* GetDocIDispatch(AcDbDatabase* pDatabase)= 0;

// Установить связь между объектом базы данных и IDISPATCH

документа, которому

// это принадлежит. Если IDISPATCH

- NULL, то связь удалена.

//

virtual Adesk::Boolean SetDocIDispatch(AcDbDatabase* pDatabase,

IDispatch* pDispatch) = 0;

};



AcBr Описания Класса


AcBr библиотека составлена из нескольких функциональных компонентов. Все функции, возводящие в степень объекты AcBr передают их как ссылки. Следовательно, образец AcBrFace класса, должно быть,  был создан перед запросом getFace () функция от traverser или цикла.



AcDb Библиотека


AcDb библиотека обеспечивает классы, которые составляют базу данных AutoCAD.

Эта база данных сохраняет всю информацию для графических объектов, называемых

Объекты, которые составляют рисунок AutoCAD, также как неграфический Объект (например, уровни, linetypes, и текстовые стили) которые являются также частью рисунка. Вы можете сделать запрос и управлять существующими образцами Объектов AutoCAD и объекты библиотеки AcDb,  Вами могут создавать новые образцы из объектов базы данных.

База данных AutoCAD содержит эти главные элементы:

·

набор девяти таблиц идентификаторов, которые имеют уникально названный входом таблицы идентификаторов Объектов. Эти объекты представляют различный обычно используемый AcDbDatabase Объекты и компоненты данных.

·         словарь названий объектов (класса AcDbDictionary), который обеспечивает “Оглавление” для рисунка AutoCAD. Первоначально, эта таблица содержания содержит ИДЕНТИФИКАТОРЫ из четырех других словарей, используемых в соответствии с AutoCAD.Приложения, которые Вы разрабатываете, однако, являются свободными прибавить другие объекты Словарей.

·         фиксированный набор приблизительно 200 переменных заголовка, чей значения установлены AutoCAD.

Иерархия классов для AcDb библиотеки следующие:

AcRxObject

AcDbDictionary

   AcDbDictionaryWithDefault

AcDbFilter

   AcDbLayerFilter

    AcDbSpatialFilter

AcDbGroup

AcDbIDBuffer

AcDbIndex

    AcDbLayerIndex

    AcDbSpatialIndex

AcDbLongTransaction

AcDbMlineStyle

AcDbPlaceholder

AcDbPlotSettings

    AcDbLayout

AcDbProxyObject

AcDbXrecord

AcDbEntity

AcDbRasterImageDef

AcDbRasterImageDefReactor

AcDbRasterVariables

AcDbSymbolTable

     AcDbAbstractViewTable

           AcDbViewportTable

           AcDbViewTable

AcDbBlockTable

AcDbDimStyleTable

AcDbFontTable

AcDbLayerTable

AcDbLinetypeTable

AcDbRegAppTable

AcDbTextStyleTable

AcDbUCSTable

AcDbSymbolTableRecord

      AcDbAbstractViewTableRecord

             AcDbViewportTableRecord

             AcDbViewTableRecord

AcDbBlockTableRecord

AcDbDimStyleTableRecord

AcDbFontTableRecord

AcDbLayerTableRecord

AcDbLinetypeTableRecord

AcDbRegAppTableRecord

AcDbTextStyleTableRecord

AcDbUCSTableRecord

 

Для получения дополнительной информации на AcDb библиотеке, см. главу 2, “ Учебник для начинающих Базы данных, ” глава 4, “ Операции Базы данных, ” глава 5, “ Объекты(цели) Базы данных, ” глава 6, “Объекты”, и глава 7, “ Контейнерные Объекты(цели). ” Для информации относительно получения новых классов от AcDbObject и AcDbEntity, см. главу 12, “ Происходящий от AcDbObject ” и главу 13, “ Происходящий от AcDbEntity. ”



AcDb2dPolylineVertex


AcDb2dPolyline имеет как повышение и ряд X, Y

точки класса AcDb2dPolylineVertex. Позиция () и setPosition () функции AcDb2dPolylineVertex определяет трехмерные местоположения в ECS. Координата Z прошла в к setPosition () функция сохранена в примитиве и возвращена позицией () функция, но иначе игнорируется. Это не затрагивает повышение ломаной линии.

AcDb2dPolyline класс обеспечивает vertexPosition () функцией, которая возвращается,  значение Мировой системы координат для вершины прошло в. Единственный способ изменять{*заменять*} повышение ломаной линии использует AcDb2dPolyline:: setElevation () функция.



AcDbCompositeFilteredBlockIterator Класс


AcDbCompositeFilteredBlockIterator класс обеспечивает замену к нормальной блочной итерации. Обеспечивая список фильтра в init () метод, объект

AcDbCompositeFilteredBlockIterator ищет передачу

AcDbIndex полученные объекты через

AcDbFilter:: indexClass () метод, и создает объекты

AcDbFilteredBlockIterator. Если совпадение

-to-date indexClass () объекты не доступны, это создает

AcDbFilteredBlockIterator через AcDbFilter:: newIterator () метод. Это тогда заказывает композицию объектов

AcDbFilteredBlockIterator, основанных на

AcDbFilteredBlockIterator:: estimatedHits () и

AcDbFilteredBlockIterator::buffersForComposition () методы. Коллекция фильтров - конъюнкция условий{*состояний*}. Это означает, что объект ID выводится от iterator только, если бы вводы () метод каждого фильтра приняли бы объект ID.



AcDbCurve: Функции к Перегрузке


Класс пользователя должен перегрузить следующие функции:

virtual Adesk::Boolean

isClosed() const;

virtual Adesk::Boolean

isPeriodic() const;

virtual Adesk::Boolean

isPlanar() const;

virtual Acad::ErrorStatus

getPlane(AcGePlane&, AcDb::Planarity&) const;

virtual Acad::ErrorStatus

getStartParam(double&) const;

virtual Acad::ErrorStatus

getEndParam(double&) const;

virtual Acad::ErrorStatus

getStartPoint(AcGePoint3d&) const;

virtual Acad::ErrorStatus

getEndPoint(AcGePoint3d&) const;

virtual Acad::ErrorStatus

getPointAtParam(double, AcGePoint3d&) const;

virtual Acad::ErrorStatus

getParamAtPoint(const AcGePoint3d&, double&)const;

virtual Acad::ErrorStatus

getDistAtParam(double param, double& dist) const;

virtual Acad::ErrorStatus

getParamAtDist(double dist, double& param) const;

virtual Acad::ErrorStatus

getDistAtPoint(const AcGePoint3d&, double&) const;

virtual Acad::ErrorStatus

getPointAtDist(double, AcGePoint3d&) const;

virtual Acad::ErrorStatus

getFirstDeriv(

double param,

AcGeVector3d& firstDeriv) const;

virtual Acad::ErrorStatus

getFirstDeriv(

const AcGePoint3d&,

AcGeVector3d& firstDeriv) const;

virtual Acad::ErrorStatus

getSecondDeriv(

double param,

AcGeVector3d& secDeriv) const;

virtual Acad::ErrorStatus

getSecondDeriv(

const AcGePoint3d&,

AcGeVector3d& secDeriv) const;

virtual Acad::ErrorStatus

getClosestPointTo(

const AcGePoint3d& givenPnt,

AcGePoint3d& pointOnCurve,

Adesk::Boolean extend

= Adesk::kFalse) const;

virtual Acad::ErrorStatus

getClosestPointTo(

const AcGePoint3d& givenPnt,

const AcGeVector3d& normal,

AcGePoint3d& pointOnCurve,

Adesk::Boolean extend

= Adesk::kFalse) const;

virtual Acad::ErrorStatus

getOrthoProjectedCurve(

const AcGePlane&,


AcDbCurve*& projCrv) const;

virtual Acad::ErrorStatus

getProjectedCurve(

const AcGePlane&,

const AcGeVector3d& projDir,

AcDbCurve*& projCrv) const;

virtual Acad::ErrorStatus

getOffsetCurves(

double offsetDist,

AcDbVoidPtrArray& offsetCurves) const;

virtual Acad::ErrorStatus

getSpline(AcDbSpline*& spline) const;

virtual Acad::ErrorStatus

getSplitCurves(

const AcGeDoubleArray& params,

AcDbVoidPtrArray& curveSegments) const;

virtual Acad::ErrorStatus

getSplitCurves(

const AcGePoint3dArray& points,

AcDbVoidPtrArray& curveSegments) const;

virtual Acad::ErrorStatus

extend(double newParam);

virtual Acad::ErrorStatus

extend(

Adesk::Boolean extendStart,

const AcGePoint3d& toPoint);

virtual Acad::ErrorStatus

getArea(double&) const;


AcDbDatabase


Всегда инициализируйте AcDbDatabase перед использованием любых функций AcDb. Обратитесь к “Инициализация AcDbDatabas ” на странице 676.



AcDbDatabase:: insert()


При вставке одной базы данных в другой, порядок разрушения критический.

При использовании этой функции, база данных, выполняющая вставку - "К" базе данных, и используемой базе данных, поскольку параметр - “От” базы данных. Всегда уничтожьте “От” базы данных сначала, и "К" базе данных последний; иначе Вы вызовете фатальную ошибку в ObjectDBX DLL.



 AcDbDatabase::restoreForwardingXrefSymbols () Функция


RestoreForwardingXrefSymbols () функция восстанавливает таблицу перекрестных ссылок назад к правильному{*допустимому*}, приложенное государство{*состояние*}. Мало того, что это восстанавливает оригинал решенные символы, но и  это также разыскивает недавно добавленные символы и решает их также. RestoreForwardingXrefSymbols () функция не может обрабатывать недавно добавленный, вложенные отчеты{*записи*} таблицы блока таблицы перекрестных ссылок, если они уже не существуют и решены в ведущем рисунке.



AcDbDatabase:: restoreOriginalXrefSymbols () Функция


RestoreOriginalXrefSymbols () функция восстанавливает решенную базу данных таблицы перекрестных ссылок к ее первоначальной форме, поскольку это было бы если только что загружено от ее файла. Таблица перекрестных ссылок - тогда в условии{*состоянии*}, где это может изменяться и сохранен назад к файлу. После запроса этой функции, рисунок главного компьютера - больше не в правильном{*допустимом*} государстве{*состоянии*} для перегенерального или для любых модификаций команды таблицы перекрестных ссылок или перезагрузок. Модификации базы данных, сохраните{*экономьте*} назад, и restoreForwardingXrefSymbols () функция должна назваться прежде, чем что - нибудь, что могло бы позволять перегенеральный.



AcDbDatabase - советы


ObjectDBX позволяет Вам иметь несколько образцов класса AcDbDatabase, хотя Вы должны убедиться, что удалили их всех перед вашими прикладными выходами. Также важно, что Вы всегда имеете один образец AcDbDatabase, который является текущей базой данных. Эти требования описаны в следующих секциях.



AcDbDatabase:: wblockCloneObjects () Функция


WblockCloneObjects () функция - элемент AcDbDatase. Это будет глубоко имитировать объекты от одной базы данных до другой и следовать за жесткими ссылками{*справочниками*} так, чтобы все зависимые объекты также имитировались. Поведение отчетов{*записей*} таблицы идентификаторов, когда дубликаты найдены, определено параметром типа. Следующая диаграмма показывает отношениям между типом таблицы идентификаторов (перечисление DuplicateRecordCloning) и глубокий тип аналога (перечисление DeepCloneType).

Отношения между DeepCloneTypes и DuplicateRecordCloning для Различные команды и функции

Command or API Function

DeepCloneType

DuplicateRecordCloning

COPY

kDcCopy

kDrcNotApplicable

EXPLODE

kDcExplode

kDrcNotApplicable

BLOCK

kDcBlock

kDrcNotApplicable

INSERT/BIND

kDcXrefInsert

kDrcIgnore

XRESOLVE

kDcSymTableMerge

kDrcXrefMangleName

INSERT

kDcInsert

kDrcIgnore

insert()

kDcInsertCopy

kDrcIgnore

WBLOCK

kDcWblock

kDrcNotApplicable

deepCloneObjects()

kDcObjects

kDrcNotApplicable

wblockObjects()

kDcObjects

kDrcIgnore

wblockObjects()

kDcObjects

kDrcReplace

wblockObjects()

kDcObjects

kDrcMangleName

wblockObjects()

kDcObjects

kDrcUnmangleName

Пример

длинной транзакции

Эти простые показы примера, как проверять объекты от другой базы данных, измените их в текущей базе данных, и затем проверьте{*отметьте*} их назад в к первоначальной базе данных. Запросы, которые являются частью длинного операционного процесса,  обозначены в полужирной печати.

void

refEditApiExample()

{

AcDbObjectId transId;

AcDbDatabase* pDb;

char *fname;

struct resbuf *rb;

// Get a dwg file from the user.

//

rb = acutNewRb(RTSTR);

acedGetFileD("Pick a drawing", NULL, "dwg", 0, rb);

fname = (char*)acad_malloc(strlen(rb->resval.rstring) + 1);

strcpy(fname, rb->resval.rstring);

acutRelRb(rb);

// Open the dwg file.


//

pDb = new AcDbDatabase(Adesk::kFalse);

pDb->readDwgFile(fname);

// Get the block table and then the model space record.

//

AcDbBlockTable *pBlockTable;

pDb->getSymbolTable(pBlockTable, AcDb::kForRead);

AcDbBlockTableRecord *pOtherMsBtr;

pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr,

AcDb::kForRead);

pBlockTable->close();

// Create an iterator

//

AcDbBlockTableRecordIterator *pIter;

pOtherMsBtr->newIterator(pIter);

// Set up an object ID array.

//

AcDbObjectIdArray objIdArray;

// Iterate over the model space BTR. Look specifically

// for Lines and append their object ID to the array.

//

for (pIter->start(); !pIter->done(); pIter->step()) {

AcDbEntity *pEntity;

pIter->getEntity(pEntity, AcDb::kForRead);

// Look for only AcDbLine objects and add them to the

// objectId array.

//

if (pEntity->isKindOf(AcDbLine::desc())) {

objIdArray.append(pEntity->objectId());

}

pEntity->close();

}

delete pIter;

pOtherMsBtr->close();

// Now get the current database and the object ID for the

// current database’s model space BTR.

//

AcDbBlockTable *pThisBlockTable;

acdbHostApplicationServices()->workingDatabase()

->getSymbolTable(pThisBlockTable, AcDb::kForRead);

AcDbBlockTableRecord *pThisMsBtr;

pThisBlockTable->getAt(ACDB_MODEL_SPACE, pThisMsBtr,

AcDb::kForWrite);

pThisBlockTable->close();

AcDbObjectId id = pThisMsBtr->objectId();

pThisMsBtr->close();

// Create the long transaction. This will check all the entities

// out of the external database.

acapLongTransactionManagerPtr()->checkOut(transId,

objIdArray, id);

// Now modify the color of these entities.

//

int colorIndex;

acedGetInt("\nEnter color number to change entities to: ",

&colorIndex);

AcDbObject* pObj;

if (acdbOpenObject(pObj, transId, AcDb::kForRead) == Acad::eOk)

{

// Get a pointer to the transaction

//

AcDbLongTransaction* pLongTrans =

AcDbLongTransaction::cast(pObj);

if (pLongTrans != NULL) {



// Get a work set iterator

//

AcDbLongTransWorkSetIterator* pWorkSetIter =

pLongTrans->newWorkSetIterator();

// Iterate over the entities in the work set

// and change the color.

for (pWorkSetIter->start(); !pWorkSetIter->done(); pWorkSetIter->step()) {

AcDbEntity *pEntity;

acdbOpenAcDbEntity(pEntity, pWorkSetIter->objectId(),

AcDb::kForWrite);

pEntity->setColorIndex(colorIndex);

pEntity->close();

}

delete pWorkSetIter;

}

pObj->close();

}

// Pause just to see the change.

//

char str[132];

acedGetString(0, "\nNote the new colors. Press return to \

check the objects back in to the original database", str);

// Check the entities back in to the orginal database.

//

acapLongTransactionManagerPtr()->checkIn(transId);

// Save the original database, since we made changes

//

pDb->saveAs(fname);

// Close and Delete the database.

//

delete pDb;

pDb = NULL;

acad_free(fname);

}


AcDbDatabase:: xrefBlockId () Функция


XrefBlockId () функция получит AcDbObjectId блочного отчета{*записи*} таблицы, который обращается{*относится*} к этой базе данных как таблица перекрестных ссылок. Когда таблица перекрестных ссылок перезагружена по любой причине (например, Перезагрузке ТАБЛИЦЫ ПЕРЕКРЕСТНЫХ ССЫЛОК или командам Пути ТАБЛИЦЫ ПЕРЕКРЕСТНЫХ ССЫЛОК), прежняя база данных сохраняется в памяти для Отмены. Это означает, что больше чем одна база данных могут указывать на тот же самый отчет{*запись*} таблицы блока таблицы перекрестных ссылок. Однако только каждый будет в настоящее время активная база данных таблицы перекрестных ссылок для того отчета{*записи*}. Указатель базы данных, возвращенный AcDbBlockTableRecord:: xrefDatabase () функция на найденном отчете{*записи*} будет активная база данных для той таблицы перекрестных ссылок.



AcDbDatabaseSummaryInfo Класс


AcDbDatabaseSummaryInfo класс формирует набор символьных строк, которые могут использоваться, чтобы прибавить дополнительную информацию к DWG файлу. Максимальная длина этих строк - 511 символов. Эта информация сохранена и восстановлена{*отыскана*} в объекте Summary Information с определенными методами для каждого информационного поля. Предопределенные поля

N Заголовок

N Тема

N Автор

N Ключевые слова

N Комментарии

N Последний{*прошлый*} сохраненный

N номер Пересмотра

N ядро Гиперсвязи

Вы можете создавать ваши собственные заказные поля в дополнение к предопределенным полям.

Эти заказные поля сохранены в списке, и Вы можете управлять заказными полями или их названием{*именем*} (или клавиша{*ключ*}) или позиция (индекс) в списке. Заказные поля индексированы, начинаясь в 1, и не имеется никакого предела числу полей, которые Вы можете создавать.



AcDbEntity: Функции к Перегрузке


Если Вы осуществляете заказной объект, перегружают список функций см. главу 13, “ Происходящий от AcDbEntity, ”.



AcDbEntity функции, обычно перегружаемые


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

virtual void

viewportDraw(AcGiViewportDraw* mode);

virtual void

list() const;

virtual Acad::ErrorStatus

intersectWith(

const AcDbEntity* ent,

AcDb::Intersect intType,

AcGePoint3dArray& points,

int thisGsMarker = 0,

int otherGsMarker = 0) const;

virtual Acad::ErrorStatus

intersectWith(

const AcDbEntity* ent,

AcDb::Intersect intType,

const AcGePlane& projPlane,

AcGePoint3dArray& points,

int thisGsMarker = 0,

int otherGsMarker = 0) const;

virtual Acad::ErrorStatus

getOsnapPoints(

AcDb::OsnapMode osnapMode,

int gsSelectionMark,

const AcGePoint3d& pickPoint,

const AcGePoint3d& lastPoint,

const AcGeMatrix3d& viewXform,

AcGePoint3dArray& snapPoints,

AcDbIntArray& geomIds) const;

virtual Acad::ErrorStatus

getStretchPoints( AcGePoint3dArray&) const;

virtual Acad::ErrorStatus

moveStretchPointsAt(

const AcDbIntArray& indices,

const AcGeVector3d& offset);

virtual Acad::ErrorStatus

explode( AcDbVoidPtrArray& entitySet) const;

virtual Acad::ErrorStatus

getSubentPathsAtGsMarker(

AcDb::SubentType type,

int gsMark,

const AcGePoint3d& pickPoint,

const AcGeMatrix3d& viewXform,

int& numPaths,

AcDbFullSubentPath* & subentPaths,

int numInserts = 0,

AcDbObjectId* entAndInsertStack = NULL) const;

virtual Acad::ErrorStatus

applyPartialUndo(

AcDbDwgFiler* undoFiler,

AcRxClass* classObj);

virtual void

subSetDatabaseDefaults( AcDbDatabase* pDb);

virtual void

saveAs( AcGiWorldDraw* mode, AcDb::SaveType st);



AcDbEntity Функции, редко перегружаемые


Следующие функции AcDbEntity редко перегружаются:

virtual Acad::ErrorStatus

setColor( const AcCmColor &color);

virtual Acad::ErrorStatus

setColorIndex( Adesk::UInt16 color);

virtual Acad::ErrorStatus

setLinetype( const char* newVal);

virtual Acad::ErrorStatus

setLinetype( AcDbObjectId newVal);

virtual void

getEcs( AcGeMatrix3d& retVal) const;

virtual Acad::ErrorStatus

getGsMarkersAtSubentPath(

const AcDbFullSubentPath& subPath,

AcDbIntArray& gsMarkers) const;

virtual Acad::ErrorStatus

highlight( const AcDbFullSubentPath& subId = kNullSubent) const;

virtual Acad::ErrorStatus

unhighlight( const AcDbFullSubentPath& subId = kNullSubent) const;

virtual AcDbEntity*

subentPtr( const AcDbFullSubentPath& id) const;

virtual Adesk::Boolean

saveImagesByDefault() const;

virtual void

setAttributes( AcGiSubEntityTraits* pTraits);

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



AcDbEntity перегружаемые функции


Следующие функции должны быть перегружены, когда Вы получаете класс пользователя из AcDbEntity:

virtual Adesk::Boolean

worldDraw(AcGiWorldDraw* mode);

virtual Acad::ErrorStatus

getGeomExtents(AcDbExtents& extents) const;

virtual Acad::ErrorStatus

transformBy(const AcGeMatrix3d& xform);

virtual Acad::ErrorStatus

getTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const;

virtual Acad::ErrorStatus

getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const;

virtual Acad::ErrorStatus

moveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset);



AcDbEntityHyperlinkPE Класс


Методы AcDbEntityHyperlinkPE класса позволяют Вам устанавливать, получать, и считать гиперсвязи, связанные с примитивом.



AcDbFilter класс


AcDbFilter класс, как предполагается,  определяет “запрос”. Это обеспечивает “клавишу”{*“ключ”*} к AcDbCompositeFilteredBlockIterator, для которого соответствующий индекс получен через indexClass () метод.



AcDbFilteredBlockIterator Класс


AcDbFilteredBlockIterator класс обеспечивает метод обработать “запрос” на индексе. Это используется

AcDbCompositeFilteredBlockIterator.



AcDbHyperlink Класс


Объект AcDbHyperlink содержит имя гиперсвязи (например, http://www.autodesk.com), подместоположение в пределах той связи{*ссылки*}, описание гиперсвязи или дружественное имя (“ Нажимает в этом месте для Autodesk ”), и строки дисплея для гиперсвязи. Для AutoCAD, подместоположение - названное представление{*вид*}, в то время как в приложении электронной таблицы, например, подместоположение могло бы быть ячейка или группа ячеек. Строка дисплея - обычно тот же самый как описание гиперсвязи.

Если описание нулевое{*пустое*}, имя гиперсвязи и подместоположение используется вместо этого, в “ имя - подместоположение ” формат.

Гиперсвязи могут также иметь уровни вложенности. Уровень вложенности только представляет интерес когда имеющий дело с коллекциями гиперсвязи, связанными с примитивом в пределах блока, или с коллекциями, связанными с примитивом ВСТАВКИ.



AcDbHyperlinkCollection Класс


Этот класс - коллекция объектов AcDbHyperlink, и имеет разнообразие методов для добавления и удаления тех объектов. AcDbHyperlinkCollection удаляет его содержание, когда они удалены, и когда объект самой коллекции удален. Гиперсвязи в коллекции пронумерованы от нуля.



AcDbIndex Класс


AcDbIndex класс - базовый класс для всех индексных объектов. AcDbSpatialIndex и AcDbLayerIndex происходят от этого класса.

Хранение индекса современный достигнуто через AcDbIndexFilterManager:: updateIndexes () функциональные запросы,  явно вызываемые (или приложением или AutoCAD).

AcDbFilteredBlockIterator будет служить как средства, чтобы посетить весь AcDbObjectIds, которые являются “нажатиями” от запроса, определенного AcDbFilter, пропускал{*прошел*} к его конструктору. Например, в пространственном индексном случае{*регистре*}, образец объекта AcDbSpatialFilter прошел к newIterator () метод определит область{*регион*} запроса. Объект AcDbSpatialIndex, через его newIterator () метод, обеспечит AcDbSpatialIndexIterator, который возвратит объект IDs, которые соответствуют объектам, которые соответствуют в пределах тома{*объема*} запроса.



AcDbIndexFilterManager Namespace


AcDbIndexFilterManager namespace - коллекция функций, который обеспечивает индекс и доступ фильтра и эксплуатационные функциональные возможности.



AcDbLongTransaction Класс


AcDbLongTransaction - класс, который содержит информацию, необходимую, чтобы проследить длинную сделку. AcDbLongTransactionManager класс берет ответственность за создание и добавление в конец объектов AcDbLongTransaction к базе данных. Это тогда возвращает AcDbObjectId объекта AcDbLongTransaction. Подобно всем другим объектам резидента базы, его разрушение обработано базой данных.

ОБРАТИТЕ ВНИМАНИЕ, что  объекты AcDbLongTransaction добавлены к базе данных, в то время как они активны и стерты, как только сделка завершила. Они не сохранены в DWG или DXF файлах, и поэтому не постоянны.



AcDbLongTransWorkSetIterator Класс


AcDbLongTransWorkSetIterator обеспечивает доступ только для чтения к объектам в наборе работ. В течение конструкции в AcDbLongTransaction:: newWorkSetIterator (), это может быть установлено, чтобы включить только активный набор работ, или включать объекты, добавлялся к набору работ, потому что они упомянуты объектами в наборе работ (вторичные объекты). Это может также обрабатывать объекты, удаленные из набора работ, или AcDbLongTransaction:: removeFromWorkSet (), или,  стирая.



AcDbObject: Функции Часто Перегружаемые


Класс пользователя часто отменяет следующие функции:

virtual Acad::ErrorStatus

audit(AcDbAuditInfo*);

// Commonly useful, as this happens at a point where a new

// object state is being committed.

//

virtual Acad::ErrorStatus subClose();

// The next two functions apply to container objects.

//

virtual Acad::ErrorStatus

deepClone(AcDbObject* pOwnerObject,

AcDbObject*& pClonedObject,

AcDbIdMapping& idMap,

Adesk::Boolean isPrimary = Adesk::kTrue) const;

virtual Acad::ErrorStatus

wblockClone(AcRxObject* pOwnerObject,

AcDbObject*& pClonedObject,

AcDbIdMapping& idMap,

Adesk::Boolean isPrimary = Adesk::kTrue) const;



AcDbObject: Функции Иногда Перегружаемые


Класс пользователя иногда отменяет следующие функции:

virtual Acad::ErrorStatus

subErase(Adesk::Boolean erasing);

virtual Acad::ErrorStatus

subHandOverTo(AcDbObject* newObject);

virtual Acad::ErrorStatus

subOpen(AcDb::OpenMode);

virtual Acad::ErrorStatus

subCancel();

virtual Acad::ErrorStatus

subSwapIdWith(AcDbObjectId otherId,

Adesk::Boolean swapXdata = Adesk::kFalse);



AcDbObject: Функции Редко Перегружаемые


Класс пользователя редко отменяет следующие функции:

virtual Acad::ErrorStatus

setOwnerId(AcDbObjectId);

virtual resbuf*

xData(const char* regappName = NULL) const;

virtual Acad::ErrorStatus

setXData(const resbuf* xdata);

virtual void

addPersistentReactor(AcDbObjectId objId);

virtual Acad::ErrorStatus

removePersistentReactor(AcDbObjectId objId);

virtual void cancelled(const AcDbObject* dbObj);

virtual void copied(const AcDbObject* dbObj, const AcDbObject* newObj);

virtual void erased(const AcDbObject* dbObj, Adesk::Boolean pErasing = Adesk::kTrue);

virtual void goodbye(const AcDbObject* dbObj);

virtual void openedForModify(const AcDbObject* dbObj);

virtual void modified(const AcDbObject* dbObj);

virtual void modifyUndone(const AcDbObject* dbObj);

virtual void modifiedXData(const AcDbObject* dbObj);

virtual void unappended(const AcDbObject* dbObj);

virtual void objectClosed(const AcDbObjectId objId);

virtual void modifiedGraphics(const AcDbEntity* dbEnt);



AcDbObject и События Уведомления Базы данных


Когда Вы получаете стертый () уведомление на объекте базы данных, объект отмечено как стерто, но - все еще часть базы данных. Когда Вы получаете недобавленный в конец () уведомление, объект было отмечено недобавленным в конец и - не часть базы данных, если это не повторно добавлено в конец. До свидания () уведомление на объекте послано непосредственно перед тем, как это уходит полностью. Эти сигналы уведомления, что объект собирается быть удаленным из базы данных и удален от памяти.

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

AcDbDatabaseReactor::objectErased()

AcDbDatabaseReactor::objectUnappended()

AcDbDatabaseReactor::objectReappended()



AcDbObject: необходимые функции для перегрузки


Заказной класс должен перегрузить следующие функции:

virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);

virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;

virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer);

virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;

<Destructor>



AcDbSummaryInfoManager Класс


AcDbSummaryInfoManager класс организовывает итоговые информационные реакторы, с методами прибавлять и удалить реакторы, и посылать уведомление, что итоговая информация изменилась.



AcDbSummaryInfoReactor Класс


Этот класс обеспечивает реактор, чтобы сообщить, изменена{*заменена ли*} итоговая информация.



AcEd Библиотека


AcEd библиотека обеспечивает классы для определения и регистрации новых команд AutoCAD, которые работают как встроенные команды. Новые команды, которые Вы определяете,  упомянуты как “родные” команды, потому что они постоянно находятся в той же самой внутренней структуре (AcEdCommandStack) как встроенные команды. AcEd библиотека также обеспечивает редактора реактором и набором из глобальных функций для взаимодействия с AutoCAD. Важный класс в этом библиотеке - AcEditorReactor; это контролирует состояние редактора AutoCAD и уведомляет приложение, когда указанные события происходят, типа старта, окончания или команды отмены.

Иерархия классов для AcEd библиотеки следующие:

AcRxObject

AcEdCommand

AcEdCommandStack

AcEdUlContext

AcEdJlg

AcEdInputPointFilter

AcEdInputPointMonitor

AcEdInputPointMeneger

AcEdSolidSubEntitySelector

AcTransaction

AcDbTransactionMeneger

AcTransactionMeneger

Для информации относительно регистрации новых команд AutoCAD, использующих ObjectARX, cм. главу 3, “ ObjectARX Прикладные Основы. ” Для примера использования

Редактор реактор, см. главу 15, “Уведомление”.



AcEditorReactor Класс


Следующие AcEditorReactor уведомления имеют силу в ObjectDBX:

dwgFileOpened

databaseToBeDestroyed

saveComplete

beginInsert

otherInsert

abortInsert

endInsert

wblockNotice

beginWblock

otherWblock

endWblock

beginDeepClone

beginDeepCloneXlation

abortDeepClone

endDeepClone

sysVarChanged

sysVarWillChange



AcGe Библиотека


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

AcGe библиотека состоит из двух главных подмножеств: классы для двумерной геометрии и классов для трехмерной геометрии. Главные абстрактные классы - AcGeEntity2d и AcGeEntity3d. Несколько основных классов, не полученные из любого другого класса включают AcGePoint2d, AcGeVector2d, и AcGeMatrix2d (показанный в начале иерархии классов). Эти основные классы могут использоваться, чтобы исполнить много типов общих(обычных) операций, типа добавления вектора к точке, вычисление точки или векторного произведения двух векторов, и вычисления программы двух матриц. Классы с  более высоким уровнем этой библиотеки осуществлены, используя thesebasic классы. Иерархия классов для AcGe библиотеки следующие:

AcGeEntity2D

AcGeBoundBlock2d

AcGeClipBoundary2d

AcGeCurve2d

       AcGeCircArc2d

       AcGeCompositeCurve2d

       AcGeEllipArc2d

       AcGeExternalCurve2d

       AcGeLinearEnt2d

              AcGeLine2d

              AcGeLineSeg2d

              AcGeRay2d

       AcGeOffsetCurve2d

       AcGeSplineEnt2d

               AcGeCubicSplineCurve2d

               AcGeNurbCurve2d

               AcGePolyline2d

AcGeCurveCurveInt2d

AcGePointEnt2d

       AcGePointOnCurve2d

       AcGePosition2d

 

AcGeCurveBoundary

AcGe

AcGeContext

AcGeDwgIO

AcGeDxfIO

AcGeFileIO

AcGeFiler

AcGeInterval

AcGeKnotVector

AcGeLibVersion

AcGeMatrix2d

AcGeMatrix3d

AcGePoint2d

     AcAxPoint2d

AcGePoint3d

       AcAxPoint3d

AcGeScale2d

AcGeScale3d

AcGeTol

AcGeVector2d

AcGeVector3d

AcGeEntity2D

 

AcGeBoundBlock3d

AcGeCurve3d

        AcGeCircArc3de

        AcGeCompositeCurve3d

        AcGeEllipArc3e

        AcGeExternalCurve3d

        AcGeLinearEnt3d

                AcGeLine3d

                AcGeLineSeg3d

                AcGeRay3d

                AcGeMatrix3d

        AcGeOffsetCurve3d

        AcGeSplineEnt3d

                AcGeCubicSplineCurve3d

                AcGeNurbCurve3d

                AcGePolyline3d

                         AcGeAugPolyline3d

AcGeCurveCurveInt3d

AcGeCurveSurfInt

AcGePointEnt3d

         AcGePointOnCurve3d

         AcGePointOnSurface

         AcGePosition3d

AcGeSurfSurfInt

AcGeSurface

        AcGeCone

        AcGeCylinder

        AcGeExternalBoundedSurface

        AcGeExternalSurface

        AcGeNurbSurface

        AcGeOffsetSurface

        AcGePlanarEnt

                AcGeBoundedPlanet

                AcGePlane

        AcGeSphere

        AcGeTorus

 

 

 

AcGe библиотека обеспечивает несколько различных систем координат. Для получения дополнительной информации, см. главу 27, “ Использование Библиотеки Геометрии. ” Выборка программ этого справочника иллюстрирует многочисленные обычные использования классов AcGe.



AcGe Примеры Постоянства


Следующее - пример чтения и записи AcGeExternalSurface с конкретным подклассом AcGeFiler. С целью этого примера, регистратор преобразования в последовательную форму - DWG регистратор. Следовательно, это обеспечивает постоянство,  читая и пишущий формат DWG:

#include "gefiler.h"

class AcDbDwgFiler;

class AcGeDwgFiler : public AcGeFiler

{

public:

// Construct the filer with DWG filer.

// All read and write methods are implemented

// by delegating to this filer.

AcGeDwgFiler (AcDbDwgFiler* = NULL);

// Read/write methods.

//

Acad::ErrorStatus readBoolean(Adesk::Boolean*);

Acad::ErrorStatus writeBoolean(Adesk::Boolean);

Acad::ErrorStatus readBool(bool*);

Acad::ErrorStatus writeBool(bool);

Acad::ErrorStatus readChar(char*);

Acad::ErrorStatus writeChar(char);

Acad::ErrorStatus readShort(short*);

Acad::ErrorStatus writeShort(short);

Acad::ErrorStatus readLong(long*);

Acad::ErrorStatus writeLong(long);

Acad::ErrorStatus readUChar(unsigned char*);

Acad::ErrorStatus writeUChar(unsigned char);

Acad::ErrorStatus readUShort(unsigned short*);

Acad::ErrorStatus writeUShort(unsigned short);

Acad::ErrorStatus readULong(unsigned long*);

Acad::ErrorStatus writeULong(unsigned long);

Acad::ErrorStatus readDouble(double*);

Acad::ErrorStatus writeDouble(double);

Acad::ErrorStatus readPoint2d(AcGePoint2d*);

Acad::ErrorStatus writePoint2d(const AcGePoint2d&);

Acad::ErrorStatus readPoint3d(AcGePoint3d*);

Acad::ErrorStatus writePoint3d(const AcGePoint3d&);

Acad::ErrorStatus readVector2d(AcGeVector2d*);

Acad::ErrorStatus writeVector2d(const AcGeVector2d&);

Acad::ErrorStatus readVector3d(AcGeVector3d*);

Acad::ErrorStatus writeVector3d(const AcGeVector3d&);

// Set/Get methods

//

AcGeDwgFiler& setDwgFiler (AcDbDwgFiler*);

AcDbDwgFiler* dwgFiler ();

protected:

AcDbDwgFiler* mpFiler;

};

// Inline methods.

//

inline

AcGeDwgFiler::AcGeDwgFiler(AcDbDwgFiler* filer) : mpFiler(filer)

{}

inline AcGeDwgFiler&

AcGeDwgFiler::setDwgFiler(AcDbDwgFiler* filer)


{

mpFiler = filer;

return *this;

}

inline AcDbDwgFiler*

AcGeDwgFiler::dwgFiler()

{

return mpFiler;

}

Следующий фрагмент кода иллюстрирует выполнение нескольких функций.

Другие функции осуществлены тем же самым способом:

Acad::ErrorStatus AcGeDwgFiler::readBoolean(Adesk::Boolean* data)

{

return mpFiler ? mpFiler->readBoolean(data) : Acad::eNoDatabase;

}

Acad::ErrorStatus AcGeDwgFiler::writeBoolean(Adesk::Boolean data)

{

return mpFiler ?

mpFiler->writeBoolean(data) : Acad::eNoDatabase;

}

Следующий пример иллюстрирует постоянный класс, который использует AcGeExternalSurface. Код после объявления класса иллюстрирует чтение и запись внешнего поверхностного класса. В частности обратите внимание на это:  AcGe:: gLibVersion написан из первого и впоследствии читать сначала до записи или чтения внешнего поверхностного класса:

class AcGeExternalCurve2d;

class AcGeExternalCurve3d;

class AcGeExternalBoundedSurface;

class AcGeExternalSurface;

class AcGePersistentXEnt : public AcDbObject

{

public:

ACRX_DECLARE_MEMBERS (AcGePersistentXEnt);

AcGePersistentXEnt ();

~AcGePersistentXEnt ();

Acad::ErrorStatus dwgOutFields (AcDbDwgFiler*) const;

Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);

AcGeExternalSurface* mpXSrf;

};

Реализация этого класса следующая:

ACRX_DXF_DEFINE_MEMBERS(

AcGePersistentXEnt, AcDbObject, 0,

GEPERSISTENT, "GeometryLib");

Acad::ErrorStatus

AcGePersistentXEnt::dwgOutFields(AcDbDwgFiler* filer) const

{

assertReadEnabled();

Acad::ErrorStatus stat = AcDbObject::dwgOutFields(filer);

if (stat != Acad::eOk)

{

ADS_ASSERT(0);

return stat;

}

// Only interested in a file filer.

//

if (filer->filerType() != AcDb::kFileFiler)

return stat;

AcGeDwgFiler geDwgFiler(filer);

stat = AcGeFileIO::outFields(

&geDwgFiler,

AcGe::gLibVersion);

if ((stat = AcGeFileIO::outFields(&geDwgFiler, *mpXSrf)) != Acad::eOk)

return stat;

return stat;

}

Acad::ErrorStatus

AcGePersistentXEnt::dwgInFields(AcDbDwgFiler* filer)

{

assertWriteEnabled();

Acad::ErrorStatus stat = AcDbObject::dwgInFields(filer);

if (stat != Acad::eOk)

{

ADS_ASSERT(0);

return stat;

}

// Only interested in a file filer.

//

if (filer->filerType() != AcDb::kFileFiler)

return stat;

AcGeDwgFiler geDwgFiler(filer);

AcGeLibVersion gelibVersion;

if ((stat = AcGeFileIO::inFields(&geDwgFiler, gelibVersion)) != Acad::eOk)

return stat;

acutPrintf("\n... Reading External Surface\n");

mpXSrf = new AcGeExternalSurface;

ADS_ASSERT(mpXSrf);

if ((stat = AcGeFileIO::inFields(&geDwgFiler, *mpXSrf, gelibVersion)) != Acad::eOk)

return stat;

return stat;

}


AcGi


AcGi API - интерфейс между AcDb и системы исполнения имели обыкновение отображать AcDb модели. Этот интерфейс используется функциями члена AcDbEntity worldDraw (), viewportDraw (), и saveAs (), которые являются частью стандартного протокола примитива.

Один метод создания приложения, способного к основному рассмотрению должен осуществить полностью AcGi API. Получите ваши собственные классы выполнения из классов AcGi, типа AcGiWorldDraw и AcGiWorldGeometry. Чтобы рисовать данный примитив, вызовите его worldDraw () функцией, затем пройдите в указателе на образец вашего AcGiWorldDraw-полученного класса. Вы тогда получите повторные вызовы в различных членов вашего класса. Функции члена - графические примитивы типа круга () и ломаной линии () функции. Их будут пропускать все необходимые параметры, необходимые, чтобы рисовать их. AcGi должен быть осуществлен ведущим приложением, желающим, чтобы использовать определенный графический символ, выполняющий логику, определенную примитивами. Преимущество использования AcGi состоит в том, что приложение главного компьютера не должно знать что - нибудь относительно того, как примитив предназначен, чтобы быть представленным вне установленного набора геометрических примитивов и графических черт, типа цвета, linetype, и текстового шрифта. AutoCAD имеет его собственное внутреннее выполнение AcGi, в то время как AcGix библиотека снабжала ObjectDBX, сломает многое из комплекса, выполняющего логику, указанную AcGi в относительно простой набор графических примитивов.

Некоторые методы AcGiWorldDraw - для целей запроса (deviation() и numberOfIsolines ()) и могут использоваться примитивом, чтобы определить степень, к которой различные примитивы будут “ мозаичны; ” другими словами, насколько “плотный” линии, составляющие сферу (например) были бы.

AcGiWorldDraw:: regenType () метод может использоваться, чтобы сообщить AcGi,является ли перегенеральный запрос для каркасов или лиц с нормалями. Например, это - от acgi.h file:

// Они - текущие виды режимов регенерации области просмотра.

// Этот режим не может быть установлен пользователем, но этом можно делать запрос в случае, если Вы должны брать различные действия для различных режимов регенерации.

//

//

typedef enum {

eAcGiRegenTypeInvalid = 0,

kAcGiStandardDisplay = 2,

kAcGiHideOrShadeCommand,

kAcGiRenderCommand,

kAcGiSaveWorldDrawForR12

} AcGiRegenType;

ОБРАТИТЕ ВНИМАНИЕ Для примеров использования интерфейса AcGi, см. типовой модуль в samples/common/myacgi.*.



AcGi API


Предназначенное использование AcGi уровня описано в “AcGi” на странице 664. Определенное в AutoCAD выполнение его AcGi уровня - не часть ObjectDBX.  Вместо этого, ObjectDBX

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



AcGi Библиотека


AcGi библиотека обеспечивает графический интерфейс, используемый для рисунка объектов AutoCAD. Эта библиотека используется AcDbEntity функциями элемента

WorldDraw (), viewportDraw (), и saveAs (), вся часть стандартного протокола объекта. WorldDraw () функция должен быть определен всеми заказными классами объекта. Объект AcGiWorldDraw обеспечивает API, через который AcDbEntity:: worldDraw () может производить его графическое представление во всех областях просмотра одновременно. Точно так же объект(цель) AcGiViewportDraw обеспечивает API, через который AcDbEntity:: viewportDraw () функция может про-ducedifferent графические представления для каждой области просмотра.

Иерархия классов для AcGi библиотеки следующие:

AcRxObject

AcGiCommonDraw

AcGiWorldDraw

AcGiWorldDraw

AcGiContext

AcGiEdgeData

AcGiFaceData

AcGiGeometry

AcGiViewportGeometry

AcGiWorldGeometry

AcGiLinetypeEngine

AcGiSubEntityTraits

AcGiDrawableTraits

AcGiTextStyle

AcGiVertexData

AcGiViewport

AcGiDrawable

AcGiGlyph

Для получения дополнительной информации при использовании AcGi классы, см. главу 13, “ Происходящий от AcDbEntity. ”



AcGi Краткий обзор


AcGi библиотека определяет набор интерфейсов, с которыми объекты могут выполнять себя к основной системе графики. Эта глава обсуждает, как AcGi работает в среде AutoCAD. Однако, это работает подобным способом для других систем, которые осуществляют интерфейсы AcGi.

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

Обратитесь к AcGi, происходит в пределах следующего три функции члена базового класса AcGiDrawable:

Adesk::Boolean

worldDraw( AcGiWorldDraw*);

void

viewportDraw( AcGiViewportDraw*);

Adesk::UInt32

setAttributes( AcGiDrawableTraits*);

AcDbEntity наследует эти функции от AcGiDrawable. Как правило, при осуществлении заказного примитива, Вы перегрузите эти функции и обеспечите ваше собственное выполнение.

Когда AutoCAD должен восстановить графику, чтобы отобразить примитив, это вызывает эти функции следующим способом:

AcGiDrawable *pDrawable;

pDrawable->setAttributes(pDt);

if (!pDrawable->worldDraw(pWd))

{

for each viewport

pDrawable->viewportDraw(pVd);

}

Для заказных примитивов, AutoCAD вызывает ваш setAttributes (), worldDraw (), и viewportDraw () функциями, если Вы перегрузили их. AutoCAD проходит в соответствующих объектах AcGi к этим функциям. Это позволило бы AutoCAD отобразить ваш заказной примитив, также, как если это был встроенный примитив.

SetAttributes() функция инициализирует атрибуты для примитива, типа цвета, уровня, и linetype. WorldDraw () функция формирует часть из графического представления примитива, которое может быть определено независимым от любого специфического вида пространства модели или контекстов области просмотра пространства листа. ViewportDraw () функция тогда формирует часть иждивенца представления из графики примитива. Если любая из графики примитива - иждивенец представления, worldDraw () должен возвратить kFalse, и viewportDraw () должен быть осуществлен.

Наоборот, если примитив не имеет никакой графики иждивенца представления, то worldDraw () должен возвратить kTrue, и заказной примитив не осуществляет viewportDraw ().


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



Объект AcGiContext обеспечивает общий контекст, к которому можно обращаться в течение всех частей процесса регенерации. Это обеспечивает информацию относительно текущего состояния перегенеральных. Например, Вы можете получить текущую базу данных от объекта AcGiContext в любое время в течение процесса регенерации.

Иерархия классов для AcGi следующая:



Базовый класс AcGiCommonDraw формирует общие функциональные возможности AcGiViewportDraw и AcGiWorldDraw. Базовый класс AcGiGeometry формирует общие функциональные возможности AcGiViewportGeometry и AcGiWorldGeometry. Эти базовые классы позволяют Вам записывать большее количество общего кода, который может обрабатывать оба случая, если желательно.


AcGix


Эта библиотека - двигатель, который разбивает AcGi-определенную геометрию и черты в маленький, простой набор графических примитивов, определенных в соответствии с протоколом класса AcGixVectorTaker. Это работает на зарегистрированном наборе областей просмотра, для которых приложение должно обеспечить выполнение AcGixVectorTaker и AcGiViewport. AcGix делает запрос снабженного AcGiViewport для параметров регенерации и транслирует AcGi примитивы, в которые это получает от примитивов,  вызывает к снабженному vectortaker. AcGix не делает никакую интерпретацию из того, как снабженные приложением области просмотра фактически отображены. Это - до выполнения AcGixVectorTaker.

Чтобы использовать AcGix с заказной графической системой скорее чем использование SimpleView, Вы должны снабдить ваши собственные выполнение Классов AcGiViewport и AcGixVectorTaker. Фактические образцы области просмотра и vectortaker могут быть разделены между множественными областями просмотра, если это имеет смысл для вашего приложения.

Принимается, что vectortaker выполнение исполнит отсечение необходимого примитивов против степеней области просмотра. AcGix библиотека снабжена в двоичной форме с набором файлов заголовка API.

Следующие файлы заголовка содержат исходное определение AcGix API:

§         include/acgix.h

§         include/acgixcontext.h

§         include/acgixstd.h

§         include/acgixutilities.h

§         include/acgixvectortaker.h

§         include/acgixviewportset.h

§         include/acgixviewportmanager.h

AcGix клиенты связываются с release/AcGix.lib, который связывает приложение с release/AcGix.dll.



AcRx Библиотека


AcRx библиотека обеспечивает классы с  системным уровнем для DLL инициализации и соединения и для регистрации класса во время выполнения и идентификации. Базовый класс этой библиотеки - AcRxObject, который обеспечивает следующие средства:

·         идентификация класса во время выполнения и анализу наследования

·         добавление во время выполнения нового протокола к существующему классу (см. главу 19,“Расширение Протокола”)

·         объектное равенство и испытание сравнения

·         копирование объекта

AcRx библиотека также обеспечивает набор макрокоманд C++, чтобы помочь Вам создать новые ObjectARX классы, полученные из AcRxObject (см. главу 11, «Получение

заказного ObjectARX класса»).

AcRxDictionary - другой важный класс в этой библиотеке. Словарь - a

Отображение от текстовой строки до другого объекта(цели). AcRx библиотека размещает ее объекты, классы, и сервисные словари в глобальном объектном словаре, который

является образцом AcRxDictionary класса. Приложения могут прибавлять объекты к

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

Иерархия классов для AcRx библиотеки следующие:

AcRxObject

AcRxClass

AcRxDictionary

AcRxDynamicLinker

AcRxEvent

AcEditor

AcRxService

AcRxKernal

AcDbServices

AcEdServices

AcadAppInfo



AcrxEntryPoint () Функция


ObjectARX-приложение не имеет главного, потому что это - DLL. Также, приложение не вызывает ads_init (), ads_abort (), и ads_link (). Программист ADS осуществляет функцию acrxEntryPoint () со следующей сигнатурой:

extern "C"

AcRx::AppRetCode

acrxEntryPoint(AcRx::AppMsgCode msg, void* appId);

Первый параметр, компонент данных AcRx класса вызвал сообщение, представляет сообщение, посланное от ObjectARX ядра до приложения.

Второй параметр - непрозрачная метка к данным, пропускал к блокировке и разблокировать функции для приложения. Функция возвращает код состояния, типа RSRSLT или RSERR.

AutoCAD вызывает в ObjectARX модуль acrxEntryPoint () чтобы передать сообщения к приложению. Все запросы, чтобы вызвать функции через acedDefun () сделаны acrxEntryPoint (), упрощая перемещение программ ADS к среде программы ObjectARX.

ObjectARX-приложения отвечают на значение компонента данных AcRx класса AppMsgCode скорее чем к возвращаемому значению ads_link (), ads_exit (), и ads_abort ().



AcRxObject: Функции Редко Перегружаемые


Класс пользователя редко отменяет эти функции:

virtual AcRxObject*

clone() const;

virtual void

copyFrom(const AcRxObject* pSrc);

// Do not override; AcDbObject behavior is already accounted for.

//

virtual HRESULT __stdcall

QueryInterface (    REFIID riid,

void ** ppvObject );

virtual ULONG __stdcall

AddRef();

virtual ULONG __stdcall

Release();



AcTransaction и Классы AcTransactionReactor


Эти классы были перемещены от AutoCAD до ObjectDBX DLL. Их файл заголовка - теперь dbtrans.h, хотя Вы можете продолжать использовать actrans.h заголовок, так как actrans.h включает dbtrans.h. Для информации относительно классов, пожалуйста см. секции на AcTransaction и AcTransactionReactor в ObjectARX Ссылке.



AcTransactionManager и Классы AcDbTransactionManager


AcDbTransactionManager класс нов в этом выпуске, и существующий AcTransactionManager класс теперь получен из AcDbTransactionManager.

Все методы AcTransactionManager, кроме enableGraphicsFlush () и flushGraphics (), теперь принадлежат AcDbTransactionManager. EnableGraphicsFlush () и flushGraphics () методы - все еще члены AcTransactionManager класса. Для описания классов и методов, пожалуйста см. ObjectARX Ссылку. AcTransactionManager класс - все еще часть acad.lib библиотеки.



AcUi Диалоговые классы


Диалоговые классы AcUi формируют на диалоговые классы AdUi и пригодны для использования только с AutoCAD.

CAcUiDialog Класс

CAcUiDialog - класс общего назначения, который обеспечивает набор функций члена, учитывающих диалоги изменяемого размера и постоянство данных в AutoCAD.

CAcUiTabMainDialog

Класс

CAcUiTabMainDialog представляет основной контейнерный диалог в AutoCAD табулированный диалог. CAcUiTabMainDialog и CACUITABMAINDIALOG используются на месте CPROPERTYSHEET и CPROPERTYPAGE, чтобы создать табулированные диалоги в AutoCAD.

CAcUiTabChildDialog

Класс

CAcUiTabChildDialog представляет позицию табуляции в табулированном диалоге.

CAcUiTabMainDialog и CACUITABCHILDDIALOG используются на месте CPROPERTYSHEET и CPROPERTYPAGE, чтобы создать табулированные диалоги в AutoCAD. Каждая позиция табуляции в AutoCAD табулировала диалог - CACUITABCHILDDIALOG.

CAcUiAlertDialog

Класс

CAdUiAlertDialog представляет аварийный диалог с тремя кнопками. Одна кнопка - кнопка CANCEL, и другие два текста командной кнопки установлены программистом. Это - аварийный диалог общего назначения.

CAcUiFileDialog Класс

CAcUiFileDialog обеспечивает Определенное автохамом образование из CADUIFILEDIALOG.



AcUi Классы Кнопки


Это средство управления формирует на классы AdUi и пригодно для использования только с AutoCAD.

CAcUiPickButton Класс

CAcUiPickButton специализирует CACUIBITMAPBUTTON, который является оберткой для класса CAdUiBitmapButton. CAcUiPickButton обеспечивает кнопку, которая отображает стандартный точечный рисунок кнопки указки.

CAcUiSelectButton

Класс

CAcUiSelectButton специализирует CACUIPICKBUTTON. Это обеспечивает кнопку, которая отображает стандартный точечный рисунок кнопки выбора.



AcUi MRU Поля со списком


AcUi расширяет{*продлевает*} поддержку поля со списком, чтобы управлять MRU (наиболее недавно используемый) список автоматически в пределах управления. Основные функциональные возможности обеспечиваются классом CAcUiMRUComboBox (полученный из CACUICOMBOBOX). Класс компаньона, CAcUiMRUListBox, обеспечивает поддержку DrawTip для combo поля ComboLBox. Это необходимо из-за MRU выполнения поля со списком как владелец - тянущееся управление.

Пять специализировался, MRU классы поля со списком также обеспечиваются: CAcUiArrowHeadComboBox, CAcUiColorComboBox, CAcUiLineWeightComboBox, CAcUiPlotStyleTablesComboBox, и CACUIPLOTSTYLENAMESCOMBOBOX. Они обеспечивают стандартные интерфейсы пользователя для управления dimensioning стрелками - указателями, цветными и lineweight выборами, и составляют график таблицы стиля и составляют график стиля, называет выбор.

CAcUiMRUComboBox

Класс

CAcUiMRUComboBox наследует CACUICOMBOBOX и служит, поскольку базовый класс для владелец - тянет поля со списком, которые осуществляют список MRU. Каждый элемент{*пункт*} в списке может содержать маленькое изображение{*образ*}, сопровождаемое некоторым текстом. Каждый элемент{*пункт*} также прослеживает уникальное значение, упомянутое как груз, и поддерживаемый как стандартный Windows ® ITEMDATA в пределах управления. Класс показывает встроенную поддержку для до двух универсальных, необязательных элементов{*пунктов*}, упомянутых как Option1 и Option2. Они обычно соответствуют{*переписываются*} “ByLayer” и “ByBlock” и часто имеют специальное значение.

Два других элемента{*пункта*}, Other1 и Other2, можно также допускать и появляться только, когда список понижен вниз. Выбор любого из этих элементов{*пунктов*} вызывает специальный случай в пределах управления.

CAcUiArrowHeadComboBox

Класс

CAcUiArrowHeadComboBox специализирует CACUIMRUCOMBOBOX для dimensioning выбора стрелки - указателя. Управление отображает точечные рисунки, представляющие стандарт AutoCAD dimensioning стили стрелки - указателя, которые являются всегда подарком{*настоящим*} в списке. По умолчанию никакие необязательные или дополнительные элементы{*пункты*} не присутствуют или добавленный. Груз, связанный с каждым элементом{*пунктом*} - индекс AutoCAD для связанной готовой стрелки - указателя. Когда MRU элементы{*пункты*} добавлены к списку, они автоматически назначены уникальное грузовое значение (который будет больший чем индекс AutoCAD для определяемого пользователем стиля стрелки - указателя).


CAcUiColorComboBox

Класс


CAcUiColorComboBox специализирует CACUIMRUCOMBOBOX для цветного выбора. Образчики цветов дисплея управления, представляющие выборы от палитры AutoCAD.

Готовые элементы{*пункты*} всегда представляют в управлении, отражают номера цвета 1 до 7. Оба необязательных элемента{*пункта*} используются; Option1 отображает “ByLayer”, и Option2 отображает “ByBlock”. MRU дисплей элементов{*пунктов*} “ Окрашивают nnn, ”, где nnn - связанный номер цвета. Груз, связанный с каждым элементом{*пунктом*} указывает, что номер цвета AutoCAD (типа от 1 до 255), “ByBlock” касается 0, и “ByLayer” соответствует 256. Other1 элемент{*пункт*} допускается и вызывает диалог Выбора Цвета AutoCAD. Если Other2 допускают, это отображает как “ Windows ... ” и по умолчанию вызывает Выбор Цвета Windows Общий{*обычный*} диалог. Если пользователь выбирает элемент{*пункт*} от любого из этих диалогов,  выбор появляется в списке MRU и становится текущим элементом{*пунктом*} в управлении.

CAcUiLineWeightComboBox

Класс


CAcUiLineWeightComboBox специализирует CACUIMRUCOMBOBOX для lineweight выбора. Управление отображает маленький предварительный просмотр lineweights AutoCAD, поддерживает, в пределах от 0.05mm к 2.11mm, и не включает “Ни один” и произвольно “Значение по умолчанию”. И показатель и имперские значения отображены, в зависимости от установки LWUNITS системной переменной. Оба необязательных элемента{*пункта*} используются; Option1 отображает “ByLayer”, и Option2 отображает “ByBlock”. Каждый элемент{*пункт*} обслуживает{*поддерживает*} груз, который передает AcDb элемента{*пункта*}:: kLnWtxxx значение.

CAcUiPlotStyleTablesComboBox

Класс


CAcUiPlotStyleTablesComboBox специализирует CACUIMRUCOMBOBOX для графического выбора таблицы стиля. Управление отображает графические названия{*имена*} таблицы стиля согласно текущему графическому режиму стиля (цветное - зависимый режим или названные графические стили). MRU функциональные возможности поля со списком не используются. Точечный рисунок, указывающий внедренную адресную таблицу отображен в названном графическом режиме стиля для тех таблиц, которые имеют внедренную адресную таблицу.

CAcUiPlotStyleNamesComboBox

Класс


CAcUiPlotStyleNamesComboBox специализирует CACUIMRUCOMBOBOX для графического выбора имени стиля. MRU функциональные возможности combo не используются, и “ByLayer”, “ByBlock”, и “ Другой ... ” элементы{*пункты*} может быть условно отображен. Если подарок{*настоящее*}, “ Другой ... ” элемент{*пункт*} может вызывать или Назначающийся Графический диалог Стиля, или Поток Набора Составляет график диалога Стиля.

CAcUiMRUListBox Класс

CAcUiMRUListBox происходит от CACUILISTBOX. Я t я s, используемый CACUIMRUCOMBOBOX, чтобы подклассифицировать список управления (ComboLBox) и обеспечиваю поддержку DrawTip.

Расширенные приложения, которые используют специализированный MRU поля со списком, могут были должны получить специальные списки MRU, чтобы отобразить DrawTips правильно.


AdUi Диалоговые классы


Диалоговые классы AdUi пригодны для использования в приложениях других чем AutoCAD.

CAdUiBaseDialog Класс

CAdUiBaseDialog обеспечивает основную поддержку для окон совета{*предупреждения*} (ToolTips и TextTips) и AdUi системы обработки сообщения. Это также поддерживает контекстную справку и справку F1 в диалогах. Это - общий{*обычный*} базовый класс для всех диалогов кроме, те базировались на общем{*обычном*} диалоге файла.

CAdUiDialog Класс

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

CAdUiFileDialog

CAdUiFileDialog специализирует CFILEDIALOG аналогичный путь, поскольку CAdUiBaseDialog специализирует CDIALOG. Класс обеспечивает основную поддержку для окон совета{*предупреждения*} (ToolTips и TextTips), контекстной справки и AdUi обработки сообщения в общем{*обычном*} диалоге файла. В отличие от CADUIBASEDIALOG, не имеется никакой встроенной поддержки для постоянства размера и позиции.

CAdUiTabMainDialog

Класс

CAdUiTabMainDialog представляет основной контейнерный диалог в табулированном диалоге.

CAdUiTabMainDialog и CADUITABMAINDIALOG используются на месте CPROPERTYSHEET и CPROPERTYPAGE, чтобы создать табулированные диалоги.

CAdUiTabChildDialog

Класс

CAdUiTabChildDialog представляет позицию табуляции в табулированном диалоге.

CAdUiTabMainDialog и CADUITABCHILDDIALOG используются на месте CPROPERTYSHEET и CPROPERTYPAGE, чтобы создать табулированные диалоги. Каждая позиция табуляции в табулированном диалоге - CADUITABCHILDDIALOG.



AdUi и AcUi Классы Строки управления


Следующие классы обеспечивают поддержку для состыковывающихся окон.

CAdUiDockControlBar

Класс

CADUIDOCKCONTROLBAR класс, часть системы стыковки, добавляет расширенные{*продленные*} возможности к MFC CControlBar класс. Основная особенность, обеспеченная - изменение размеров строк управления когда состыковано{*закреплено*}. Больше чем одна строка управления можно закреплять вместе, каждый из них являющийся способным быть измененными, индивидуально используя расщепители, созданные системой стыковки. CAdUiDockControlBar также идет с областью механизма захвата и близкой кнопкой когда состыковано{*закреплено*}. Управляйте состоянием областей, может переключаться состыкованным{*закрепленным*} с несостыкованным{*незакрепленным*} или наоборот, дважды нажимая на механизме захвата когда состыковано{*закреплено*}, или области заголовка когда несостыковано{*незакреплено*}, или,  перемещая их с мышью. Система стыковки обрабатывает постоянство строк управления, сохранение их позиция и состояние поперек сеансов. Наконец, CAdUiDockControlBar обеспечивает заданное по умолчанию контекстное меню, чтобы управлять поведением области, с возможностью для разработчика, чтобы настроить это меню.

CAcUiDockControlBar

Класс

CACUIDOCKCONTROLBAR класс добавляет к CADUIDOCKCONTROLBAR, классифицируют поведение, обычное к AutoCAD dockable инструментальные средства: когда пользователь перемещает курсор мыши из области{*региона*} строки управления, фокус автоматически отдается обратно к AutoCAD.



AdUi и AcUi Средства редактирования


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

CAdUiEdit Класс

CAdUiEdit получен из CEDIT класса, чтобы обеспечить средство управления окна редактирования. Этот класс обеспечивает поддержку для окон совета{*предупреждения*} за обрезанные текстовые элементы{*пункты*} (TextTips).

Этот класс берет разрядные флажки, чтобы добавить желательное поведение проверки правильности, основанное на следующих типах ввода: Числовой, Строковый, Угловой, и названия{*имена*} Символа. Вообще Вы должны использовать один из классов, полученных из Определенного автохамом класса CAcUiComboBox, который добавляет определенную проверку правильности типа данных и постоянство к управлению. Они - CACUISTRINGEDIT, CAcUiSymbolEdit, CAcUiNumericEdit, и

CACUIANGLEEDIT.

CAcUiEdit Класс

CAcUiEdit обеспечивает Определенное автохамом образование из CADUIEDIT.

CAcUiAngleEdit Класс

CAcUiAngleEdit получен из CACUIEDIT и обеспечивает специализированный конструктор, чтобы гарантировать, что бит стиля AC_ES_ANGLE всегда устанавливается в маске стиля. Объекты этого класса предназначены для использования в редактировании угловых / вращательных данных, определенных к параметрам настройки AutoCAD.

CAcUiNumericEdit

Класс

CAcUiNumericEdit получен из CACUIEDIT и обеспечивает специализированный конструктор, чтобы гарантировать, что бит стиля AC_ES_NUMERIC всегда устанавливается в маске стиля. Объекты этого класса предназначены для использования в редактировании числовых данных (типа расстояния) определенный к параметрам настройки AutoCAD.

CAcUiStringEdit Класс

CAcUiStringEdit получен из CACUIEDIT и обеспечивает специализированный конструктор, чтобы гарантировать, что бит стиля AC_ES_STRING всегда устанавливается в маске стиля. Любой ввод приемлем.

CAcUiSymbolEdit Класс

CAcUiSymbolEdit получен из CACUIEDIT и обеспечивает специализированный конструктор, чтобы гарантировать, что бит стиля AC_ES_SYMBOL всегда устанавливается в маске стиля. Объекты этого класса предназначены для использования в редактировании правильных{*допустимых*} названий{*имен*} символа AutoCAD.


CAdUiListBox Класс

CAdUiListBox специализирует MFC CListBox, чтобы обеспечить управление, которое поддерживает AdUi передачу сообщений. Класс может использоваться, где-нибудь CLISTBOX может использоваться. Так как это обеспечивает дополнительную контейнерно - побочную поддержку для AdUi зарегистрированными сообщениями, удобно использовать CADUIBASEDIALOG (или полученный класс) с CADUILISTBOX (или полученный класс) средство управления.

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

CAdUiListCtrl Класс

CAdUiListCtrl получен из CLISTCTRL класса, чтобы обеспечить средство управления списка. Этот класс обеспечивает поддержку для окон совета{*предупреждения*} за обрезанные текстовые элементы{*пункты*} (TextTips).

TextTips будет появляться за обрезанные элементы{*пункты*} заголовка для средства управления списка в представлении{*виде*} сообщения, и для индивидуума обрезанные текстовые элементы{*пункты*} в столбцах в теле управления списка. Нарисованное пользователем средство управления поддержано.

CAdUiHeaderCtrl

CAdUiHeaderCtrl специализирует CHEADERCTRL. Наиболее часто, CAdUiHeaderCtrl представляет подклассифицируемый заголовок, содержащийся в управлении списка (CAdUiListCtrl).

Вы не должны подклассифицировать управление заголовка, чтобы получить поддержку TextTip для заголовков столбца в управлении списка (обеспеченные автоматически в CADUILISTCTRL).


AdUi и AcUi Средство управления Поля со списком


Следующие классы обеспечивают поддержку для средства управления поля со списком.

CAdUiComboBox Класс

CAdUiComboBox получен из CCOMBOBOX класса, чтобы обеспечить средство управления поля со списком. Этот класс обеспечивает поддержку для окон совета{*предупреждения*} за обрезанные текстовые элементы{*пункты*} (TextTips), и проверку правильности данных в средствах редактирования. Этот класс берет разрядные флажки, чтобы добавить желательное поведение проверки правильности, основанное на следующих типах ввода: числовой, строковый, угловой, и названия{*имена*} символа. Вообще, Вы должны использовать один из классов, полученных из Определенного автохамом класса CAcUiComboBox, который добавляет определенную проверку правильности типа данных и постоянство к управлению. Они - CACUISTRINGCOMBOBOX, CAcUiSymbolComboBox, CAcUiNumericComboBox, и

CACUIANGLECOMBOBOX. В поддержку для нарисованного пользователем средства управления также встраивают.

CAcUiAngleComboBox

Класс

CACUIANGLECOMBOBOX конструктор автоматически создает CACUIANGLEEDIT, чтобы подклассифицировать окно редактирования управления. Это учитывает проверку правильности углов, определенных к параметрам настройки AutoCAD.

CAcUiNumericComboBox

Класс

CACUIANGLECOMBOBOX конструктор автоматически создает CACUINUMERICEDIT, чтобы подклассифицировать окно редактирования управления. Это учитывает проверку правильности чисел{*номеров*}, определенных к параметрам настройки AutoCAD.

CAcUiStringComboBox

Класс

CACUISTRINGCOMBOBOX конструктор автоматически создает CACUISTRINGEDIT, чтобы подклассифицировать окно редактирования управления. Любой ввод приемлем.

CAcUiSymbolComboBox

Класс

CACUISYMBOLCOMBOBOX конструктор автоматически создает CACUISYMBOLEDIT, чтобы подклассифицировать окно редактирования управления. Правильные{*допустимые*} названия{*имена*} символа AutoCAD - приемлемый ввод.



AdUi Классы Кнопки


Это средство управления пригодно для использования в приложениях других чем AutoCAD.

CAdUiOwnerDrawButton

Класс

Этот класс обеспечивает основным, владелец - тянут кнопку. Класс может использоваться, где-нибудь CBUTTON может использоваться. Когда используется в AdUi-полученном диалоге (или класс, который поддерживает, AdUi передача сообщений) CAdUiOwnerDrawButton автоматически обеспечивает для дисплея AdUi окна совета{*предупреждения*}. Класс также поддерживает, перетащат и опустить, Статический и Дисплей Инструмента, и эффекты PointedAt. В Режиме визуального отображения Инструмента, кнопка кажется плоской и выскочит когда направлено в (типа того, когда мышь перемещается поверх кнопки). Щелчок кнопки заставит это поместить вниз.

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

CAdUiBitmapButton

Класс

Этот класс специализирует CADUIOWNERDRAWBUTTON, чтобы обеспечить кнопку, которая отображает точечный рисунок (изображение{*образ*} оттянуто очевидно в кнопке). По умолчанию, объекты этого класса автоматически изменяют размеры, чтобы приспособить связанное растровое изображение. В отличие от CBITMAPBUTTON MFC'S, только один точечный рисунок необходим, чтобы определить все государства кнопки (класс MFC'S требует четырех точечных рисунков).

CAdUiBitmapStatic

Класс

CAdUiBitmapStatic специализирует CADUIBITMAPBUTTON, чтобы обеспечить кнопку, которая допускает Статическому Дисплею по умолчанию. Это средство управления действует скорее статика чем кнопки.

CAdUiDropSite Класс

CAdUiDropSite специализирует CADUIBITMAPSTATIC, чтобы обеспечить кнопку, которая допускает, перетащат и опустить также как Статический Дисплей. Это средство управления может получать файлы через, перетащат и опустить.

CAdUiToolButton Класс

CAdUiToolButton специализирует CADUIBITMAPBUTTON, чтобы обеспечить кнопку, которая допускает Дисплею Инструмента по умолчанию. Это средство управления появляется скорее кнопки инструментальной панели чем регулярные кнопки.



AdUi Окна подсказок


AdUi

обеспечивает три типа окон совета{*предупреждения*}: ToolTips, TextTips, и DrawTips.

ToolTips

представляют готовый Windows ToolTips, как предусмотрено обычным Средством управления DLL установленный на системе пользователя. TextTips

- основанные на тексте окна совета, которые выскочат по управлению, обычно показать данные, которые пользователь был бы иначе должен листать в представление. DrawTips – расширение TextTips.

Управление ниже совета обычно ответствено за закрашивание содержания совета (аналогичное владельцу - тянущемуся совету).

Большинство приложений редко вовлекает эти классы непосредственно, так как AdUi

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

CAdUiTipWindow Класс

CAdUiTipWindow - основной AdUi класс окна совета{*предупреждения*}. Эти объекты обрабатывают универсальный совет{*предупреждение*}, отображают и знают, когда автоматически скрыть себя (типа обнаружения движения курсора, краткой блокировки времени, или деятельности клавиатуры).

CAdUiTextTip Класс

CAdUiTextTip специализирует CADUITIPWINDOW, чтобы отобразить TextTip.

CAdUiDrawTipText

Класс

CAdUiDrawTipText используется внутренне AdUi системой передачи сообщений, чтобы сообщить управлению, что окно совета{*предупреждения*} нуждается в перекрашивании. Управление имеет опцию изменения{*замены*} атрибутов контекста устройства окна совета{*предупреждения*} и рисунка текста.



AdUi Передача сообщений


AdUi

библиотека использует внутреннюю схему передачи сообщений облегчить связь между объектами. Типично это вовлекает контейнер (типа диалога) отвечающий на уведомление от содержащегося окна (типа управления).

Расширенные приложения могут приспосабливать встроенную систему к их потребностям, или добавлять AdUi поддержку передачи сообщений к другому CWND полученные классы.



AdUi Расширяемость Позиции табуляции Поддержки Классов


Следующие классы обеспечивают поддержку для диалогов позиции табуляции.

CAdUiTabExtensionManager

Класс

CAdUiDialogManager - класс, который управляет добавлением и удалением позиций табуляции от табулированного диалога, который является расширяемым. Если диалог - расширяемая позиция табуляции, образец этого класса найден в CADUITABMAINDIALOG.

CAdUiTab Класс

CAdUiTab формирует MFC CTabCtrl и добавляет функциональные возможности к этому. Один из этих объектов найден в основном объекте диалога.



Активный Документ


Документ, который имеет фокус окна, и получает следующее событие ввода пользователя, если пользователь не переключает к (формированию) другого документа. Активный документ - всегда текущий документ при обработке ввода пользователя, но программы могут временно изменять{*заменять*} текущий документ в течение некоторых операций.



Анонимные Блоки


Вы можете создавать анонимные блоки,  вызывая acdbEntMake (). Чтобы делать так, Вы должны открыть блок с именем, чей первый символ - * и блочный флажок типа (группа 70) чей младший бит установлен в 1. AutoCAD назначает новый анонимный блок имя; символы в строке имени, которые следуют за *,  часто игнорируются. Вы тогда создаете анонимный блок,  путем Вы создали бы регулярный блок, за исключением того, что это более важно вызвать acedGetInput ().

Поскольку имя сгенерировано в соответствии с AutoCAD, ваша программа не имеет никакого другого пути знания имени нового блока.

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

int status;

struct resbuf *entlist;

ads_point basept;

char newblkname[20];

ads_point pnt1 = ( 0.0, 0.0, 0.0);

entlist = acutBuildList(

RTDXF0, "BLOCK",

2, "*ANON", // Only the ’*’ matters.

10, "1", // No other flags are set.

0 );

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake buffer.

if (status != RTNORM) {

acdbFail("Unable to start anonymous block\n");

return BAD;

}

// Add entities to the block by more acdbEntMake calls.

.

.

.

entlist = acutBuildList(RTDXF0, "ENDBLK", 0 );

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake buffer.

if (status != RTKWORD) {

acdbFail("Unable to close anonymous block\n");

return BAD;

}

status = acedGetInput(newblkname);

if (status != RTNORM) {

acdbFail("Anonymous block not created\n");

return BAD;

}

К ссылке анонимный блок, создайте примитив вставки с acdbEntMake() (Вы не можете передавать анонимный блок к команде INSERT.)

Продолжая предыдущий пример, следующий кодовый фрагмент вставляет анонимный блок в (0,0).

basept[X] = basept[Y] = basept[Z] = 0.0;


entlist = acutBuildList(

RTDXF0, "INSERT",

2, newblkname, // From acedGetInput

10, basept,

0 );

if (entlist == NULL) {

acdbFail(" Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake buffer.

if (status != RTNORM) {

acdbFail("Unable to insert anonymous block\n");

return BAD;

}

Функции Данных Примитива и Графический Экран

Изменяется к рисунку, сделанному функциями данных примитива,  отражен на графическом экране, при условии, что удаляемый примитив, восстановлен, изменяется, или сделан, находится в области и находится на уровне, который является в настоящее время видимым. Имеется одно исключение: когда acdbEntMod() изменяет подпримитив, это не модифицирует изображение сложного примитива. Причина должна быть ясна. Если, например, приложение должно было изменить 100 вершин сложной ломаной линии с 100 выполняемый с помощью итераций, вызывает acdbEntMod(), время, требуемое, чтобы повторно вычислять и восстановить изображение полной ломаной линии, поскольку каждая вершина была изменена, будет неприемлемо медленно. Вместо этого, приложение может исполнять ряд модификаций подпримитива и затем восстанавливать изображение полного примитива с одиночным запросом к acdbEntUpd () функция.

В следующем примере, первый примитив в текущем рисунке - ломаная линия с несколькими вершиной. Следующий код изменяет вторую вершину ломаной линии и затем восстанавливает его отображаемое изображение.

ads_name e1, e2;

struct resbuf *ed, *cb;

if (acdbEntNext(NULL, e1) != RTNORM) {

acutPrintf("\nNo entities found. Empty drawing.");

return BAD;

}

acdbEntNext(e1, e2);

if ((ed = acdbEntGet(e2)) != NULL) {

for (cb = ed; cb != NULL; cb = cb->rbnext)

if (cb->restype == 10) { // Start point DXF code

cb->resval.rpoint[X] = 1.0;// Change coordinates.

cb->resval.rpoint[Y] = 2.0;

if (acdbEntMod(ed) != RTNORM) { // Move vertex.

acutPrintf("\nBad vertex modification.");

acutRelRb(ed);

return BAD;

} else {

acdbEntUpd(e1); // Regen the polyline.

acutRelRb(ed);

return GOOD; // Indicate success.

}

}

acutRelRb(ed);

}

return BAD; // Indicate failure.

Параметр acdbEntUpd() может определить или основной примитив или - tity; в любом случае, acdbEntUpd() восстанавливает полный примитив. Хотя его первичное использование - для сложных примитивов, acdbEntUpd() может восстанавливать любой примитив в текущем рисунке.

ОБРАТИТЕ ВНИМАНИЕ, находится ли изменяемый примитив на блочном определении, то acdbEntUpd() функция не достаточен. Вы должны восстановить рисунок,  вызывая команду REGEN AutoCAD (с acedCmd() или acedCommand()) чтобы гарантировать, что все образцы блок-ссылок модифицированы.


API Дизайн-центра AutoCAD


Дизайн-центр AutoCAD обеспечивает API, который может использоваться, чтобы обеспечить информацию относительно содержания, которое это выставляет{*подвергает*}. Этот API состоит из четырех Объектной модели программных компонентов интерфейсы (COM) для управления содержания. Два из этих интерфейсов (IAcDcContentBrowser и IAcDcContentView) разработаны{*предназначены*}, чтобы позволить составляющему средству доступа отобразить их содержание в Дизайн-центре AutoCAD, и сохранении, два интерфейса (IAcDcContentFinder и IAcDcContentFinderSite) разработаны{*предназначены*}, чтобы позволить составляющему средству доступа участвовать в механизме Средства поиска Дизайн-центра AutoCAD. Интерфейсы описаны в следующих секциях. Имеется также другой интерфейс (IAcPostDrop), который составляющие средства доступа могут осуществлять к заказной метке щелкн&ый правой кнопкой мыши, перемещаются элементов{*пунктов*} от Дизайн-центра AutoCAD.



ARX Команда


Следующие разделы описывают команду ARX и ее опции. Начальная подсказка следующие:

? /Load/Unload/Commands/Options: Введите

опцию, или нажмите ENTER



AutoCAD ActiveX Выполнение Автоматизации


ActiveX модель Автоматизации AutoCAD становится все более и более видимой поперек всех сред программирования, которые это поддерживает. Понимание возможности Автоматизации AutoCAD позволит Вам формировать приложения, которые берут полное преимущество VBA и особенностей подобно OPM

и AutoCAD DesignCenter.



AutoCAD, Системный реестр Системы Windows, и Приложения ObjectArx


AutoCAD использует системный реестр системы Windows, чтобы поддержать широкий диапазон прикладной информации, включая информацию, которая уникально идентифицирует различный AutoCAD, выпуск версии языка и программы (типа Карты AutoCAD ®) который может быть установлен на любом данном компьютере. Информация системного реестра, которая идентифицирует различные версии AutoCAD, имеет специфическое значение для ObjectARX разработчиков. Инсталляционная программа для приложения ObjectARX должна присоединить информацию относительно того Приложения ObjectArx с информацией относительно версии(й) AutoCAD, с которым предполагается работать.

Программа инсталляции AutoCAD создает уникальную клавишу{*ключ*} временной метки в системном реестре немедленно ниже цифровой клавиши выпуска (также как добавление той же самой инсталляции ID к выполнимой программе непосредственно). Эта клавиша{*ключ*} гарантирует, что различные версии AutoCAD от того же самого выпуска будут способны заполнить их собственные разделы системного реестра. В пределах этой клавиши{*ключа*}, значения сохранены для местоположения файлов AutoCAD, версии языка, и названия{*имени*} изделия{*программы*}, как иллюстрировано в этом примере:

\\HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R15.0\

ACAD-1:409\

...

AcadLocation:REG_SZ:f:\ACAD2000

Language:REG_SZ:English

ProductName:REG_SZ:AutoCAD Map R15.0

...

 Инсталляционная программа для Приложения ObjectArx должна быть способна расположить соответствующий выпуску AutoCAD клавишу{*ключ*}, также как соответствующий язык и значения программы. Клавиша{*ключ*} временной метки также используется, чтобы идентифицировать версию AutoCAD, который в настоящее время загружен (или версия, которая была наиболее недавно загружена). Эта идентификация необходима, потому что “текущая” версия AutoCAD сбрасывает информацию в глобальной переменной HKEY_CLASSES_ROOT раздел системного реестра для его собственного использования, когда это загружено.

Значение CurVer в разделе клавиши{*ключа*} выпуска системного реестра используется, чтобы идентифицировать текущую версию, например:

 \\HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R15.0\

...

CurVer:REG_SZ:ACAD-1:409

Когда AutoCAD пытается требовать загрузку Приложение ObjectArx, это смотрит в разделе системного реестра, который принадлежит самому последнему выпуску AutoCAD для информации относительно Приложения ObjectArx. Если это не находит ObjectARX информацию там, это проверяет{*отмечает*} раздел для предыдущего выпуска AutoCAD, и так далее в обратном заказе{*порядке*}, пока информация не найдена или информация выпуска AutoCAD истощена.



Автоматическая Отмена


AssertWriteEnabled () функция имеет следующую сигнатуру:

Пусто assertWriteEnabled (

Adesk:: Булева автоотмена = Adesk:: kTrue,

Adesk:: Булев

recordModified = Adesk:: kTrue);

Когда функция модификации вызывает{*называет*} assertWriteEnabled (), это сначала проверяет{*отмечает*} значение recordModified параметра. Если recordModified - kFalse, никакая регистрация отмены не выполнена. Если recordModified - kTrue, это затем проверяет{*отмечает*} параметр автоотмены, который определяет, должна ли авто операция отмены быть выполнена.

Если автоотмена - kTrue (значение по умолчанию), полное объектное государство{*состояние*} автоматически написано к регистратору отмены объекта. Если Вы определяете kFalse для автоотмены, никакая информация не зарегистрирована. AutoCAD предполагает, что ваша функция модификации будет заботиться о регистрации измененного{*замененного*} объектного государства{*состояния*} к регистратору отмены объекта.

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



База данных


Рисунок AutoCAD, определенно образец AcDbDatabase. Хотя база данных - часть документа, это не синонимично с документом.



 База данных Linetype Значение


Следующий набор функций и восстанавливает{*отыскивает*} поток{*ток*} linetype значение в базе данных:

Acad::ErrorStatus

AcDbDatabase::setCeltype(AcDbObjectId);

AcDbObjectId AcDbDatabase::celtype() const;



 База данных Linetype Значение Масштаба


База данных имеет три linetype параметры настройки масштаба:

§

установка масштаба linetype для текущего объекта, сохраненного в CELTSCALE системной переменной.

§         установка масштаба linetype для текущего рисунка, сохраненного в LTSCALE системной переменной.

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

Глобальная переменная LTSCALE и PSLTSCALE параметры настройки используется, когда рисунок восстановлен (см. главу 6, “примитивы”). Используйте следующие функции, чтобы устанавливать и запросить эти значения:

Acad::ErrorStatus

AcDbDatabase::setLtscale(double);

double AcDbDatabase::ltScale() const;

Acad::ErrorStatus

AcDbDatabase::setCeltscale(double);

double AcDbDatabase::celtscale() const;

Acad::ErrorStatus

AcDbDatabase::setPsltscale(Adesk::Boolean)

Adesk::Boolean AcDbDatabase::psltscale() const;



Библиотека классов ObjectARX


ObjectARX среда состоит из следующих групп классов и функций:

AcRx Классы для связывания приложения и для класса во время выполнения

регистрации и идентификации.

AcEd Классы для регистрации команд AutoCAD и для уведомления о событиях AutoCAD.

AcDb классы базы данных AutoCAD.

AcGi Графические классы для исполнения объектов AutoCAD.

AcGe Сервисные классы для общей линейной алгебры и геометрического объекта.

Следующая таблица перечисляет библиотеки, требуемые, чтобы связать приложения ObjectARX.

AcRx

acad.lib, rxapi.lib, acrx15.lib

AcEd

acad.lib, rxapi.lib, acedapi.lib, acrx15.lib

AcDb

acad.lib, rxapi.lib, acdb15.lib, acrx15.lib

AcGi

acad.lib, rxapi.lib, acgiapi.lib, acrx15.lib

AcGe

acad.lib, rxapi.lib, acge15.lib, acrx15.lib

Все приложения ObjectARX должны связаться с acad.lib и rxapi.lib. Другие библиотеки могут также требоваться в зависимости от префикса ObjectARX класса и функции, что Вы используете.

Следующие разделы берут,  ближе смотрят на каждую из ObjectARX библиотек.

Для получения дополнительной информации относительно определенных(удельных) классов и функций элемента, см. ObjectARX справочники.



Блокировка документа


Запросы Автоматизации могут быть обработаны во всех возможных контекстах AutoCAD. Это означает, что Вы ответствены за блокировку документа перед изменением этого. Будут также иметься времена, когда Вы будете хотеть делать документ “поток” временно. Например, при добавлении примитива к *MODELSPACE или *PAPERSPACE Вы должны блокировать и делать поток документа. Отказ{*неудача*} блокировать документ в некоторых контекстах вызовет нарушение “блокировки” в течение модификации базы данных. Неудача делать поток документа заставит ваш примитив быть “невидимым” в графическом дисплее (даже после регенерации).

ObjectARX API включает функции в менеджера документа класс, чтобы делать это. Так как это - общая задача, мы формировали функциональные возможности в экспортируемый класс AcAxDocLock.

Например:

STDMETHODIMP CMyEntity::Modify()

{

AcAxDocLock docLock(m_objId, AcAxDocLock::kNormal);

if(docLock.lockStatus() != Acad::eOk)

{

return E_FAIL;

}

// It is now safe to modify the database

//

return S_OK;

}



Буфера pезультатов и Коды Типа


Буфер результатов общего назначения (resbuf) структура обрабатывает все типы данных AutoCAD. Коды Типа определены, чтобы определить типы данных в буфере результатов.



C-библиотеки времени выполнения


Выпуск DLLs для ObjectDBX связан с выпускаемыми версиями Библиотеки поддержки C Microsoft, MSVCRT.dll. Ваше приложение должно также связать с выпускаемой версией, а не отладочную версию. При смешивании выпуска и отладки или статический и комбинаций DLL C библиотеки Времени выполнения могут вызывать ошибки освобождения или распределение памяти.



CAcExtensionModule Класс


ObjectARX SDK обеспечивает два простых класса C++, которые могут использоваться, чтобы делать управление ресурсами проще. CACEXTENSIONMODULE класс обслуживает две цели —, это обеспечивает метку - заполнитель для структуры AFX_EXTENSION_MODULE (обычно имел обыкновение инициализировать или заканчивать MFC расширение{*продление*} DLL) и прослеживает двух проводников{*средств доступа*} ресурса для DLL. Проводники{*средства доступа*} ресурса - модуль

Ресурсы (которые являются обычно DLL непосредственно, но могут быть установлены в некоторый другой модуль) и заданные по умолчанию ресурсы (обычно ведущее приложение, но - фактически проводник{*средство доступа*} в настоящее время активные, когда AttachInstance () вызван{*назван*}).

CAcExtensionModule прослеживает их, чтобы упростить переключение MFC поиск ресурса между значением по умолчанию и модулем. DLL должен создать один образец этого класса и обеспечивать выполнение для класса.



CAcModuleResourceOverride Класс


Используйте образец этого класса, чтобы переключить между средствами доступа ресурса. Когда объект создан, новое средство доступа ресурса переключится в. После разрушения, первоначальное средство доступа ресурса будет восстановлено. Следующий код обеспечивает пример:

Пусто MyFunc ()

{

                 CAcModuleResourceOverride myResources;

}

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

§

Используют заданный по умолчанию конструктор (никакие параметры) чтобы переключить к ресурсам модуля. Заданные по умолчанию ресурсы будут восстановлены деструктором. Ресурсы модуля по умолчанию - поддерживаемые CAcExtensionModule DLL'S.

§         Передают NULL (или 0)  конструктору. Ресурсы DLL'S будут выбраны и ресурсы, которые были, в действительности будет восстановлен, когда объект перегрузки разрушен.

§         Передают дескриптор не-NULL к конструктору. Ресурсы связанного модуля будут выбраны и ресурсы, которые были, в действительности будет восстановлен, когда объект перегрузки разрушен.

Имеются две макрокоманды если, названный AC_DECLARE_EXTENSION_MODULE и AC_IMPLEMENT_EXTENSION_MODULE, помогать определять и осуществляют классы в вашем приложении.

Следующий код иллюстрирует, как использовать классы CAcExtensionModule и CAcModuleResourceOverride в ObjectARX-приложении:

AC_IMPLEMENT_EXTENSION_MODULE(theArxDLL);

HINSTANCE _hdllInstance = NULL;

extern "C" int APIENTRY

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

{

// Remove this if you use lpReserved

UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)

{

theArxDLL.AttachInstance(hInstance);

hdllInstance = hInstance;

}

else if (dwReason == DLL_PROCESS_DETACH)

{

theArxDLL.DetachInstance();

}

return 1; // ok

}



Частичная Отмена


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

Однако, если ваше объектное состояние маленькое (512 байтов или меньше), это не вероятно стоит усилие, чтобы осуществить вашу собственную частичную регистрацию отмены и восстановление схемы.

Если ваша функция модификации делает запись частичного объектного состояния, Вы должны осуществить applyPartialUndo () функция для вашего класса так, чтобы данные могли также быть восстановлены выборочно. См. “ Восстанавливающий Государство{*состояние*} ” на странице 326.



Черты Подпримитива


Следующие черты (свойства) могут быть назначены на уровне подпримитивов,  вызывая функции члена объекта AcGiSubEntityTraits:

§          Color

§          Layer

§          Linetype

§          Fill type

§          GS marker

§          Line weight

§          Thickness

§          Line type scale

Цвет, уровень, и linetype - свойства примитива AutoCAD, так что они могут также быть установлены на уровне drawable как описано в предыдущей секции. Заполните тип, и GS маркер - не свойства примитива AutoCAD.

Перед каждым запросом к worldDraw () и viewportDraw (), AutoCAD вызывает setAttributes () чтобы позволить drawable инициализировать цвет, уровень, linetype, вес линии, толщину, и черты подпримитива масштаба типа линии. Это инициализирует, заполняют тип, чтобы соответствовать перегенеральному типу, и это инициализирует GS

маркер, чтобы обнулить (нулевой маркер имеет значение “ никакой маркер ”).



Чистка (Purge)


Механизм чистки позволяет Вам стирать неиспользованные объекты в базе данных. Если объект имеет жесткого владельца или ссылку{*справочники*} указателя, это не может быть очищено. Чистка () функция AcDbDatabase вызвана на набор объектов, указанных в массиве ID:

AcDbDatabase:: чистка (AcDbObjectIdArray &idArray);

Purge() возвращает в том же самом ID массив ID объектов, которые могут быть очищены (то есть которые не имеют никаких жестких ссылок к ним). Как только Вы имеете этот массив объектов IDs, Вы ответствены за стирание объектов.

Когда рисунок загружен, AutoCAD проходит базу данных и производит чистку, несослался на анонимные блоки и вложил блоки таблицы перекрестных ссылок. Эти блоки стерты, когда чертежный файл закрыт. Если Вы создаете любые анонимные блоки между открытым и близким из рисунка, они будут очищены без вашего знания, если Вы не защищаете их,  вызывая автономную функцию acdbSetReferenced (). Эта чистка происходит, даже если объекты имеют жесткие ссылки к ним.



Цикл перетаскивания


После того, как Вы установили подсказку дисплея для перетащенной последовательности, Вы звоните,  AcEdJig::drag() функцию, которая исполняет перетащенный цикл, пока прессы пользователя НЕ ВВОДЯТ или клавиша "пробел", или указки с устройством управления позицией. Следующий список описывает последовательность перетащенного цикла:

1 перетащенный цикл получает случай.

2 Это называет AcEdJig::sampler() функцией. Sampler() функция устанавливает список ключевого слова (если любой) с запросом к AcEdJig::setKeywordList() функция, специальный тип курсора (если желательно) с запросом к

AcEdJig:: setSpecialCursorType () функция, и любой пользователь вводит средство управления с запросом к AcEdJig:: setUserInputControls () функция. Затем, это называет один из acquireXXX () функциями, чтобы получить геометрическое значение (угол, расстояние, или пункт{*точка*}). Функция всегда возвращает немедленно после опроса текущую позицию устройства управления позицией.

3 Ваша sampler() функция должна выяснить, если имеется любое изменение{*замена*} в геометрическом дискретном значении. Если не имеется никакого изменения{*замены*}, ваш sampler () функция должна возвратить kNoChange и возвращаться, чтобы шагнуть. Это позволит изображению{*образу*} завершать его последнюю{*прошлую*} модификацию на экране. Это особенно важно для изображений{*образов*}, содержащих кривые.

4, даже если геометрическое значение дискретный изменилось, ваш sampler() функция может возвращать kNoChange (так, чтобы изображение{*образ*} не было модифицировано) и возвращение, чтобы шагнуть.

Если дискретное значение изменилось, и изображение{*образ*} должно быть модифицировано, перейдите шагать.

5 dragger называет AcEdJig::update () функцией, используя приобретенное геометрическое значение, чтобы модифицировать объект.

6 dragger тогда называет AcEdJig::entity() функцией, проходящей в указателе, который будет установлен в адрес объекта, который будет восстановлен. Затем, dragger называет worldDraw () функцией на объекте, чтобы восстановить это.

7 Возвращения, чтобы шагнуть, если поток{*ток*} dragger случай не был сгенерирован,  выбирая с устройством управления позицией, нажимая ОТМЕНУ, или издавая строковый символ завершения, чтобы закончить перемещение.

Следующая блок-схема показывает эти шаги.



Цикл жизни прокси-объекта


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

О прокси(полномочным) можно думать как о обертке, содержащей заказной объект. Полномочный обеспечивает AutoCAD доступом к элементам базового класса (типа цвета и уровня) заказного объекта, и

Это формирует членов данных заказного класса, к которым нельзя обращаться в отсутствии родительского приложения. При большинстве обстоятельств, полномочная обертка - навеска, когда база данных рисунка

записана в файл. Тот же самый двоичный объект, который читался в,  выписан. Если сохраняющая операция вовлекает преобразование файла типа между DWG

и DXF

(для которого конверсионная функция родительского приложения – не загружена), полномочная обертка сохранен с заказными двоичными данными также.

Когда родительское приложение не загружено перед записью в файл, данные обработаны следующим образом:

§

если файлы ввода и вывода - тот же самый файл типа (и DWG или DXF), никакая операция трансляции необходим, и те же самые данные, который читался в,  записан. Данные, сохраненные в прокси-объекте написаны к выходному файлу.

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



CLASSID Регистрация


Минимальная регистрация, требуемая компонентом под HKEY_CLASSES_ROOT :

[HKEY_CLASSES_ROOT\CLSID\{<App

CLSID

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>}\

InProcServer32]

@="<full path to application>\mycomponent.arx"



Clone ()


Этот метод зарезервирован для будущего использования.



Commands


Отображает все названия{*имена*} команды во всех группах команд, зарегистрированных от программ ARX.



Цвет примитива


Цвет Примитива может быть установлен и читать как числовые индексные значения в пределах от от 0 до 256, или образцами AcCmColor, который обеспечивается для будущего использования расширенной цветовой моделью. В настоящее время, цвет использований AutoCAD индексирует только. Правильный цветной индекс может быть получен от образца AcCmColor использование AcCmColor:: getColorIndex () функция члена.

Цвет индексирует 1 до 7,  используются для стандартных цветов, как показано в следующей таблице:

Color Number

Color Name

1

Red

2

Yellow

3

Green

4

Cyan

5

Blue

6

Magenta

7

White or Black

Цвета 8 до 255 определены устройством отображения.

Следующие индексные значения имеют специальные значения:

0 Определяет BYBLOCK. Примитивы наследуют цвет текущей блочной ссылки{*справочников*}, которая указывает на блочный отчет{*запись*} таблицы, что примитив постоянно находится в, или черный / белый, если примитив постоянно находится непосредственно в образцовом пространственном или бумажном пространственном блочном отчете{*записи*} таблицы.

256 Определяет BYLAYER. Примитивы принимают цвет связанного уровня примитива.

257 Никаких цвета. Только подарок{*настоящее*} со времени,  примитив является первым instantiated до его цвета,  установлен в значение между 0 и 256, или примитив добавлен к базе данных и принимает текущий цветной индекс базы данных.

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

virtual Acad::ErrorStatus

AcDbEntity::setColorIndex(Adesk::UInt16 color);

Adesk::UInt16

AcDbEntity::colorIndex() const;



Данные Класса или Xdata Номера версии


Номер версии может быть сохранен как 8-разрядный целочисленный компонент данных (типа Adesk:: UInt8) класса, и может быть зарегистрирован в и из как первый компонент данных для каждого объекта. Поскольку эти данные постоянны, и - первое чтение элемента{*пункта*}, это может быть проверено, чтобы определить версию объекта прежде, чем любые другие данные читаются.

Когда номер используется, чтобы дифференцировать версии объекта, родительское Приложение ObjectArx должно быть способно обработать эти два случая{*дел*} несовместимых версий объектов:

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

§         когда старшая версия приложения сталкивается с более новой версией объекта (то есть когда номер пересмотра объекта больший чем номер пересмотра приложения), dxfInFields заказного класса () и dwgInFields () функции должны немедленно возвратиться,  ошибка закодирует eMakeMeProxy к AutoCAD. AutoCAD тогда создаст полномочный объект для сеанса рисунка, и записывать первоначальный объект к файлу, когда рисунок сохранен.

Возразите, что versioning с номером версии компонента данных иллюстрирован в следующих кодовых фрагментах от \objectarx\samples\polysamp\poly.cpp в ObjectARX SDK.

// Object Version

#define VERSION 1

...

Acad::ErrorStatus

AsdkPoly::dwgInFields(AcDbDwgFiler* filer)

{

...

// Object Version - must always be the first item

Adesk::Int16 version;

filer->readItem(&version);

if (version > VERSION)

return Acad::eMakeMeProxy;

...

}

Acad::ErrorStatus

AsdkPoly::dwgOutFields(AcDbDwgFiler* filer) const

{

...

// Object Version - must always be the first item

Adesk::Int16 version = VERSION;

filer->writeItem(version);

...

}

Acad::ErrorStatus

AsdkPoly::dxfInFields(AcDbDxfFiler* filer)

{

...

// Object Version

case AcDb::kDxfInt16:

Adesk::Int16 version;

version = rb.resval.rint;

if (version > VERSION)

return Acad::eMakeMeProxy;

break;

...

}

Acad::ErrorStatus

AsdkPoly::dxfOutFields(AcDbDxfFiler* filer) const

{

...

// Object Version

Adesk::Int16 version = VERSION;

filer->writeItem(AcDb::kDxfInt16, version);

...

}



Данные " в документ "


Приложения не могут сохранять данные " в документ " в глобальных или статических переменных.

Это включает объекты AcDbDatabase, объекты AcDbObject, AcDbObjectId значения, значения переменной заголовка, значения переменной документа, наборы выбора, и другая документированная - определенная информация. Любое возникновение данных " в документ " в глобальных и статических переменных могло бы быть разрушено, если ваше приложение - работают в множественных параллельных сеансах редактирования.

Чтобы избегать коррупции данных, Вы можете формировать поведение команды и данные в классы. Образец класса может инициализироваться для каждого запроса к команде. Поскольку команда приобретает документированные - определенные данные, это сохраняет ее собственные копии " в случай " этого данными.

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

Используйте documentActivated () реактор, чтобы переключить между образцами скрытых данных.

Вы можете создавать данные " в документ " на как - необходимом основании, или создавать это, когда приложение сначала загружено. Если создано на как - необходимом основании, поскольку зарегистрированные команды приложения или реакторы вызваны{*названы*}, текущий документ определен, и запрос сделан, чтобы получить данные документа. Если это не найдено, это создано в то время.

Создавать данные " в документ " когда приложение сначала загружено, использование AcApDocumentIterator в AcRx:: kInitAppMsg обработчик, чтобы получить список всех открытых документов. Тогда используйте AcApDocManagerReactor:: documentCreated () чтобы знать, когда создать дополнительные данные " в документ " для документов, открыл после того, как приложение загружено.

Какой бы ни метод используется, чтобы ассигновать{*разместить*} данные " в документ ", приложение должно использовать AcApDocManagerReactor::documentToBeDestroyed () реактор, чтобы знать, когда удалить данные. Приложения должны также удалить остающиеся данные в течение AcRx:: kUnloadAppMsg обработчик.



DeepClone ()


AcDbHardPointerId проблема ссылки, упомянутая выше не будет происходить в этом случае, потому что deepClone () не следует За AcDbHardPointerId ссылками для клонирования.

Приложение может создавать проблемы в течение deepClone () если это пытается добавлять новые примитивы, в то время как AcDbObjectIds - все еще в состоянии непрерывного изменения. Поэтому, никогда не пытайтесь вызывать AcDbBlockTableRecord:: appendAcDbEntity () на любом клонированном, определяемом пользователем AcDbBlockTableRecords до окончания AcEditorReactor:: endDeepClone () уведомление далось. Напротив, Вы можете безопасно добавлять к пространству модели и пространству листа AcDbBlockTableRecords, потому что они никогда не клонированы в deepClone ().

Никогда попытка добавлять вершину к клонированный AcDb2dPolylines, AcDb3dPolylines, AcDbPolyFaceMeshes, или AcDbPolygonMeshes, приписывает клонированному AcDbBlockReferences, или вхождения в клонированные словари, до окончания AcEditorReactor:: endDeepClone () уведомление.

Если Вы создали примитивы в течение клонирования, то Вы будете должны сохранить их в памяти, наряду с ID их будущего владельца, до окончания AcEditorReactor:: endDeepClone () уведомлением. Они могут быть безопасно добавлены в конец, как только глубокий клон закончен.



Демонстрация Функциональных возможностей Автоматизации


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



Диапазоны Кода DXF-группы


DXF представление объекта составлено из пар кодов группы и данных, с каждым отображением кода группы к определенному типу данных. Когда Вы определяете ваше собственное DXF представление, первая группа данных Вы записываете и читаете, должен быть маркер данных подкласса. Этот маркер состоит из  кода группы 100, сопровождаемых строкой, которая является текущим именем класса. Тогда, Вы выбираете коды группы от следующей таблицы, которые соответствуют типам данных каждого поля данных, которое Вы записываете.

DXF group code ranges for object representation

From

To

Data Type

1

4

Text

6

9

Text

10

17

Point or vector (3 reals)

38

59

Real

60

79

16-bit integer

90

99

32-bit integer

100

100

Subclass data marker

102

102

Text

140

149

Real

170

179

16-bit integer

210

219

3 reals

270

279

16-bit integer

280

289

8-bit integer

300

309

Text

310

319

Binary chunk

320

329

Handle

330

339

Soft Pointer ID

340

349

Hard Pointer ID

350

359

Soft owner ID

360

369

Hard owner ID

Объект ID транслирует к rlname. Например, AcDbObjectId соответствует ads_name, который представлен в resval объединении как rlname.

Порядок зависимости

С DXF, по усмотрению автора класса, группы данных могут быть представлены в произвольном порядке, или произвольно опущен. Некоторые классы поддерживают независимость порядка групп данных, в то время как другие делают нет. Если Вы позволяете независимость порядка, то ваш dxfInFields () функция должен использовать инструкцию выключателя, чтобы выбрать действие, основанное на значении кода группы. Независимость порядка обычно соответствующая объектам с фиксированным и предсказуемым набором полей. Объекты с массивами переменной длины или структурами имеют тенденцию быть иждивенцем заказа, когда они зарегистрированы из и в.

Типовой Код для dxfOutFields ()


Следующее - типовой код от AsdkPoly:: dxfOutFields ():

Acad::ErrorStatus

AsdkPoly::dxfOutFields(AcDbDxfFiler* filer) const

{

assertReadEnabled();

Acad::ErrorStatus es;

if ((es = AcDbCurve::dxfOutFields(filer))

!= Acad::eOk)

{

return es;

}

filer->writeItem(AcDb::kDxfSubclass, "AsdkPoly");

// Object Version

//

Adesk::Int16 version = VERSION;

filer->writeInt16(AcDb::kDxfInt16, version);

filer->writePoint2d(AcDb::kDxfXCoord, mCenter);

filer->writePoint2d(AcDb::kDxfXCoord + 1, mStartPoint);

filer->writeInt32(AcDb::kDxfInt32, mNumSides);

// Always use max precision when writing out the normal.

filer->writeVector3d(AcDb::kDxfNormalX, mPlaneNormal,16);

filer->writeString(AcDb::kDxfText, mpName);

filer->writeItem(AcDb::kDxfHardPointerId, mTextStyle);

filer->writeDouble(AcDb::kDxfReal, mElevation);

return filer->filerStatus();

}

Типовой Код для dxfInFields () с Независимостью порядка

Следующее - типовой код для AsdkPoly:: dxfInFields ():

Acad::ErrorStatus

AsdkPoly::dxfInFields(AcDbDxfFiler* filer)

{

assertWriteEnabled();

Acad::ErrorStatus es = Acad::eOk;

resbuf rb;

if ((AcDbCurve::dxfInFields(filer) != Acad::eOk) || !filer->atSubclassData("AsdkPoly"))

{

return filer->filerStatus();

}

// Object Version

Adesk::Int16 version;

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfInt16)

{

filer->pushBackItem();

filer->setError(Acad::eInvalidDxfCode,

"\nError: expected group code %d (version)",

AcDb::kDxfInt16);

return filer->filerStatus();

}

version = rb.resval.rint;

if (version > VERSION)

return Acad::eMakeMeProxy;

AcGePoint3d cen3d,sp3d;

AcGePoint2d cen2d,sp2d;

long numSides;

AcDbObjectId textStyle;

double elevation;

Adesk::UInt32 fieldsFlags = 0;

char * pName = NULL;

AcGeVector3d planeNormal;

while ((es == Acad::eOk) && ((es = filer->readResBuf(&rb)) == Acad::eOk))

{

switch (rb.restype) {



case AcDb::kDxfXCoord:

if (version == 1)

cen3d = asPnt3d(rb.resval.rpoint);

else

cen2d = asPnt2d(rb.resval.rpoint);

fieldsFlags |= 0x1;

break;

case AcDb::kDxfXCoord + 1:

if (version == 1)

sp3d = asPnt3d(rb.resval.rpoint);

else

sp2d = asPnt2d(rb.resval.rpoint);

fieldsFlags |= 0x2;

break;

case AcDb::kDxfInt32:

numSides = rb.resval.rlong;

fieldsFlags |= 0x4;

break;

case AcDb::kDxfNormalX:

planeNormal = asVec3d(rb.resval.rpoint);

fieldsFlags |= 0x8;

break;

case AcDb::kDxfText:

acutUpdString(rb.resval.rstring,pName);

fieldsFlags |= 0x11;

break;

case AcDb::kDxfHardPointerId:

acdbGetObjectId(textStyle, rb.resval.rlname);

fieldsFlags |= 0x12;

break;

case AcDb::kDxfReal:

if (version == 2)

{

fieldsFlags |= 0x10;

elevation = rb.resval.rreal;

break;

}

//fall through intentional

default:

// An unrecognized group. Push it back so that

// the subclass can read it again.

filer->pushBackItem();

es = Acad::eEndOfFile;

break;

}

}

// At this point, the es variable must contain eEndOfFile,

// either from readResBuf() or from pushbackBackItem(). If

// not, it indicates that an error happened and we should

// return immediately.

//

if (es != Acad::eEndOfFile)

return Acad::eInvalidResBuf;

// Now check to be sure all necessary group codes were

// present.

//

// Mandatory fields:

// - center

// - start point

// - normal

// - number of sides

// - elevation (if version > 1)

short required[] =

{AcDb::kDxfXCoord, AcDb::kDxfXCoord+1, AcDb::kDxfInt32,

AcDb::kDxfNormalX, AcDb::kDxfReal};

for (short i = 0; i < (version>1?4:3); i++) {

if (!fieldsFlags & 0x1) {

filer->setError(Acad::eMissingDxfField,

"\nMissing DXF group code: %d", 2, required[i]);

return Acad::eMissingDxfField;

} else

fieldsFlags >>= 1;

}

mPlaneNormal = planeNormal;

mNumSides = numSides;

mTextStyle = textStyle;

setName(pName);

acutDelString(pName);

if (version==1)

{

//convert data from old format

acdbWcs2Ecs(asDblArray(cen3d),asDblArray(cen3d),



asDblArray(planeNormal),Adesk::kFalse);

mCenter.set(cen3d.x,cen3d.y);

mElevation = cen3d.z;

acdbWcs2Ecs(asDblArray(sp3d),asDblArray(sp3d),

asDblArray(planeNormal),Adesk::kFalse);

mStartPoint.set(sp3d.x,sp3d.y);

assert(mElevation == sp3d.z);

} else {

mCenter = cen2d;

mStartPoint = sp2d;

mElevation = elevation;

}

return es;

}

Законченный код для AsdkPoly определенного приложением класса может быть найден в каталоге примеров.

Типовой Код для dxfInFields () с  порядком зависимостей

Эта выборка кода показывает, как Вы могли записывать dxfInFields () функция, которая является иждивенцем заказа (порядка).

Acad::ErrorStatus

AsdkPoly::dxfInFields(AcDbDxfFiler* filer)

{

assertWriteEnabled();

if ((AcDbCurve::dxfInFields(filer) != Acad::eOk) || !filer->atSubclassData("AsdkPoly") )

{

return filer->filerStatus();

}

try

{

struct resbuf rb;

// Object Version

Adesk::Int16 version;

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfInt16)

throw AcDb::kDxfInt16;

version = rb.resval.rint;

if (version > VERSION)

return Acad::eMakeMeProxy;

if (version == 1)

{

AcGePoint3d cent,sp;

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfXCoord)

throw AcDb::kDxfXCoord

cent = asPnt3d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfXCoord + 1)

throw AcDb::kDxfXCoord + 1;

sp = asPnt3d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfInt32)

throw AcDb::kDxfInt32;

mNumSides = rb.resval.rlong;

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfNormalX)

throw AcDb::kDxfNormalX

mPlaneNormal = asVec3d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfText)

throw AcDb::kDxfText;

setName(rb.resval.rstring);

filer->readItem(&rb);

if (rb.restype != kDxfHardPointerId)

throw AcDb::kDxfHardPointerId;

acdbGetObjectId(mTextStyle, rb.resval.rlname);



// Convert data from old format.

acdbWcs2Ecs(asDblArray(cent),asDblArray(cent),

asDblArray(mPlaneNormal),Adesk::kFalse);

mCenter.set(cent.x,cent.y);

mElevation = cent.z;

acdbWcs2Ecs(asDblArray(sp),asDblArray(sp),

asDblArray(mPlaneNormal),Adesk::kFalse);

mStartPoint.set(sp.x,sp.y);

assert(mElevation == sp.z);

}

else if (version == 2)

{

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfXCoord)

throw AcDb::kDxfXCoord;

mCenter = asPnt2d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfXCoord + 1)

throw AcDb::kDxfXCoord + 1;

mStartPoint = asPnt2d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfInt32)

throw AcDb::kDxfInt32

mNumSides = rb.resval.rlong;

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfNormalX)

throw AcDb::kDxfNormalX;

mPlaneNormal = asVec3d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfText)

throw AcDb::kDxfText

setName(rb.resval.rstring);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfHardPointerId)

throw AcDb::kDxfHardPointerId;

acdbGetObjectId(mTextStyle, rb.resval.rlname);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfReal)

throw AcDb::kDxfReal;

mElevation = rb.resval.rreal;

}

else assert(false);

}

catch (AcDb::DxfCode code)

{

filer->pushBackItem();

filer->setError(Acad::eInvalidDxfCode,

"\nError: expected group code %d", code);

return filer->filerStatus();

}

}