pTemp = pRb;

pTemp->resval. rstring

= (char*) malloc(strlen(appName) + 1);

strcpy(pTemp->resval. rstring, appName);

}

// Add user-specified string to the xdata.

//

pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);

pTemp = pTemp->rbnext;

pTemp->resval. rstring

= (char*) malloc(strlen(resString) + 1);

strcpy(pTemp->resval. rstring, resString);

// The following code shows the use of upgradeOpen()

// to change the entity from read to write.

//

pObj->upgradeOpen();

pObj->setXData(pRb);

pObj->close();

acutRelRb(pRb);

}

Словарь Расширения

Каждый объект может иметь словарь расширения{*продления*}, который может содержать произвольный набор объектов AcDbObject. При использовании этого механизма, несколько приложений могут прикреплять данные к тому же самому объекту. Словарь расширения{*продления*} требует более верхний чем xdata, но это также обеспечивает более гибкий механизм более высокой способностью{*вместимостью*} для добавляющихся данных.

Для примера использования словаря расширения{*продления*}, чтобы прикрепить произвольную строку к любому AcDbObject, см. программу edinvent в каталоге выборок.

Следующий пример показывает instantiating xrecord и добавление этого к словарю расширения{*продления*} в названном объектном словаре:

void

createXrecord()

{

AcDbXrecord *pXrec = new AcDbXrecord;

AcDbObject *pObj;

AcDbObjectId dictObjId, xrecObjId;

AcDbDictionary* pDict;

pObj = selectObject(AcDb::kForWrite);

if (pObj == NULL) {

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

return;

}

// Try to create an extension dictionary for this

// object. If the extension dictionary already exists,

// this will be a no-op.

//

pObj->createExtensionDictionary();

// Get the object ID of the extension dictionary for the

// selected object.

//

dictObjId = pObj->extensionDictionary();

pObj->close();

// Open the extension dictionary and add the new

// xrecord to it.

//

acdbOpenObject(pDict, dictObjId, AcDb::kForWrite);

pDict->setAt("ASDK_XREC1", pXrec, xrecObjId);

pDict->close();

// Create a resbuf list to add to the xrecord.

//

struct resbuf* head;

ads_point testpt = {1.0, 2.0, 0.0};

head = acutBuildList(AcDb::kDxfText,

"This is a test Xrecord list",

AcDb::kDxfXCoord, testpt,

AcDb::kDxfReal, 3.14159,

AcDb::kDxfAngle, 3.14159,

AcDb::kDxfColor, 1,

AcDb::kDxfInt16, 180,

0);

// Add the data list to the xrecord. Notice that this

// member function takes a reference to a resbuf NOT a

// pointer to a resbuf, so you must dereference the

// pointer before sending it.

//

pXrec->setFromRbChain(*head);

pXrec->close();

acutRelRb(head);

}

// The listXrecord() function gets the xrecord associated with the

// key "ASDK_XREC1" and lists out its contents by passing the resbuf

// list to the function printList().

//

void

listXrecord()

{

AcDbObject *pObj;

AcDbXrecord *pXrec;

AcDbObjectId dictObjId;

AcDbDictionary *pDict;

pObj = selectObject(AcDb::kForRead);

if (pObj == NULL) {

return;

}

// Get the object ID of the object’s extension dictionary.

//

dictObjId = pObj->extensionDictionary();

pObj->close();

// Open the extension dictionary and get the xrecord

// associated with the key ASDK_XREC1.

//

acdbOpenObject(pDict, dictObjId, AcDb::kForRead);

pDict->getAt("ASDK_XREC1", (AcDbObject*&)pXrec,

AcDb::kForRead);

pDict->close();

// Get the xrecord’s data list and then close the xrecord.

//

struct resbuf *pRbList;

pXrec->rbChain(&pRbList);

pXrec->close();

printList(pRbList);

acutRelRb(pRbList);

}

Глобальный Функциональный Пример

Следующий пример использует глобальные функции ObjectARX, чтобы создать xrecord и прибавлять это к словарю, связанному с клавишей ASDK_REC{*ключом*}.

int

createXrecord()

{

struct resbuf *pXrec, *pEnt, *pDict, *pTemp, *pTemp2;

ads_point dummy, testpt = {1.0, 2.0, 0.0};

ads_name xrecname, ename, extDict = {0L, 0L};

// Have the user select an entity. Then get its data.

//

if (acedEntSel("\nselect entity: ", ename, dummy) != RTNORM)

{

acutPrintf("\nNothing selected");

acedRetVoid();

return RTNORM;

}

pEnt = acdbEntGet(ename);

// Now check to see if the entity already has an

// extension dictionary.

//

for (pTemp = pEnt; pTemp->rbnext!= NULL; pTemp = pTemp->rbnext)

{

if (pTemp->restype == 102) {

if (!strcmp("{ACAD_XDICTIONARY", pTemp->resval. rstring))

{

ads_name_set(pTemp->rbnext->resval. rlname, extDict);

break;

}

}

}

// If no extension dictionary exists, add one.

//

if (extDict[0] == 0L) {

pDict = acutBuildList(RTDXF0, "DICTIONARY", 100,

"AcDbDictionary", 0);

acdbEntMakeX(pDict, extDict);

acutRelRb(pDict);

pDict = acutBuildList(102, "{ACAD_XDICTIONARY", 360,

extDict, 102, "}", 0);

for (pTemp = pEnt; pTemp->rbnext->restype!= 100; pTemp = pTemp->rbnext)

{ ; }

for (pTemp2 = pDict; pTemp2->rbnext!= NULL; pTemp2 = pTemp2->rbnext)

{ ; }

pTemp2->rbnext = pTemp->rbnext;

pTemp->rbnext = pDict;

acdbEntMod(pEnt);

acutRelRb(pEnt);

}

// At this point the entity has an extension dictionary.

// Create a resbuf list of the xrecord’s entity information

// and data.

//

pXrec = acutBuildList(RTDXF0, "XRECORD",

100, "AcDbXrecord",

1, "This is a test Xrecord list", //AcDb::kDxfText

10, testpt, //AcDb::kDxfXCoord

40, 3.14159, //AcDb::kDxfReal

50, 3.14159, //AcDb::kDxfAngle

60, 1, //AcDb::kDxfColor

70, 180, //AcDb::kDxfInt16

0);

// Create the xrecord with no owner set. The xrecord’s

// new entity name will be placed into the xrecname

// argument.

//

acdbEntMakeX (pXrec, xrecname);

acutRelRb (pXrec);

// Set the xrecord’s owner to the extension dictionary

//

acdbDictAdd(extDict, "ASDK_XRECADS", xrecname);

acedRetVoid();

return RTNORM;

}

// Accesses the xrecord associated with the key ASDK_XRECADS in

// the extension dictionary of a user-selected entity. Then

// list out the contents of this xrecord using the printList

// function.

//

int

listXrecord()

{

struct resbuf *pXrec, *pEnt, *pTemp;

ads_point dummy;

ads_name ename, extDict = {0L, 0L};

// Have the user select an entity; then get its data.

//

if (acedEntSel("\nselect entity: ", ename, dummy) != RTNORM) {

acutPrintf("\nNothing selected");

acedRetVoid();

return RTNORM;

}

pEnt = acdbEntGet(ename);

// Get the entity name of the extension dictionary.

//

for (pTemp = pEnt;pTemp->rbnext!= NULL;pTemp = pTemp->rbnext) {

if (pTemp->restype == 102) {

if (!strcmp("{ACAD_XDICTIONARY", pTemp->resval. rstring)){

ads_name_set(pTemp->rbnext->resval. rlname, extDict);

break;

}

}

}

if (extDict[0] == 0L) {

acutPrintf("\nNo extension dictionary present.");

return RTNORM;

}

pXrec = acdbDictSearch(extDict, "ASDK_XRECADS", 0);

if(pXrec) {

printList(pXrec);

acutRelRb(pXrec);

}

acedRetVoid();

return RTNORM;

}

Стирание объекта

Любой объект в базе данных может быть стерт следующей функцией:

Acad::ErrorStatus

AcDbObject::erase(Adesk::Boolean Erasing = Adesk::kTrue);

ОБРАТИТЕ ВНИМАНИЕ Erase() имеет различные результаты для объектов базы данных и примитивов, с последствиями для нестирания их:

§  когда объект базы данных стерт, информация относительно того объекта удалена из словаря. Если объект нестерт со стиранием (kfalse), информация автоматически не повторно представлена. Вы Должен использовать setAt () функция, чтобы прибавить информацию к словарю снова.

§  когда объект стерт, это просто помечено как стерто в блочном отчете{*записи*} таблицы. Объект может быть нестерт со стиранием (kfalse).

По умолчанию, Вы не можете открывать стертый объект с acdbOpenObject () функция. Если Вы пытаетесь делать так, eWasErased код ошибки будет возвращен.

extern Acad::ErrorStatus

acdbOpenObject(AcDbObject*& obj,

AcDbObjectId objId,

AcDb::OpenMode openMode,

Adesk::Boolean openErasedObject =

Adesk::kFalse);

Чтобы открывать стертый объект, используйте kTrue для последнего{*прошлого*} параметра acdbOpenObject () функция.

Контейнерные объекты типа ломаных линий и блочных отчетов{*записей*} таблицы обычно обеспечивают опцию пропуска стертых элементов при выполнении итераций по их содержанию.

Заданное по умолчанию поведение должно пропустить стертые элементы.

Стертые объекты не зарегистрированы из к DWG или DXF файлам.

Запись Объекта в файл

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

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

Запись в файл используется в нескольких контекстах в AutoCAD:

    Запись и чтение DWG файлы (использует формат DWG) Запись и чтение DXF файлы (использует формат DXF) Сообщающий среди AutoCAD, AutoLISP, и ObjectARX (использует формат DXF) регистрация Отмены и восстановление (использует формат DWG) операции Copying типа ВСТАВКИ, ТАБЛИЦЫ ПЕРЕКРЕСТНЫХ ССЫЛОК, и КОПИИ (использует формат DWG) Листание (использует формат DWG)

AcDbObject имеет две функции элемента для записи в файл из: dwgOut () и dxfOut (), и две функции элемента для записи в файл в: dwgIn () и dxfIn ().

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

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