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

       

Расширенные Данные


Расширенные{*продленные*} данные (xdata) созданы приложениями, написанными с ObjectARX или AutoLISP и могут быть добавлены к любому объекту. Xdata состоит из списка связей resbufs, используемого приложением. (AutoCAD обслуживает{*поддерживает*} информацию, но не использует это.) данные связаны с кодом группы DXF в диапазоне от 1000 до 1071.

Этот механизм пространствено - эффективен и может быть полезен для добавления легких данных к объекту. Однако, xdata ограничен 16КБ и существующим набором кодов группы DXF и напечатает.

Для более детального описания xdata, см. Руководство Настройки AutoCAD.

Используйте AcDbObject:: xData () функция, чтобы получить resbuf цепочку, содержащую копию xdata для объекта:

virtual resbuf*

AcDbObject::xData(const char* regappName = NULL) const;

Используйте AcDbObject:: setXData () функция, чтобы определить xdata для объекта:

virtual Acad::ErrorStatus

AcDbObject::setXData(const resbuf* xdata);

Следующий пример использует xData () функция, чтобы получить xdata для выбранного объекта и затем печатает xdata на экран. Это тогда прибавляет строку (testrun) к xdata и называет setXdata () функцией, чтобы изменить xdata объекта. Этот пример также иллюстрирует использование upgradeOpen () и downgradeOpen () функции.

// Эта функция называет selectObject () функцией, чтобы позволить

// пользователю выбирать объект; тогда это обращается к xdata объекта

// и посылает список printList () функцию, которая перечисляет значения resval и restype.

//

void

printXdata()

{

// Select and open an object.

//

AcDbObject *pObj;

if ((pObj = selectObject(AcDb::kForRead)) == NULL) {

return;

}

// Get the application name for the xdata.

//

char appname[133];

if (acedGetString(NULL,

"\nEnter the desired Xdata application name: ",

appname) != RTNORM)

{

return;

}

// Get the xdata for the application name.

//

struct resbuf *pRb;

pRb = pObj->xData(appname);

if (pRb != NULL) {

// Print the existing xdata if any is present.


// Notice that there is no -3 group, as there is in

// LISP. This is ONLY the xdata, so

// the -3 xdata-start marker isn’t needed.

//

printList(pRb);

acutRelRb(pRb);

} else {

acutPrintf("\nNo xdata for this appname");

}

pObj->close();

}

void

addXdata()

{

AcDbObject* pObj = selectObject(AcDb::kForRead);

if (!pObj) {

acutPrintf("Error selecting object\n");

return;

}

// Get the application name and string to be added to

// xdata.

//

char appName[132], resString[200];

appName[0] = resString[0] = ’\0’;

acedGetString(NULL, "Enter application name: ",

appName);

acedGetString(NULL, "Enter string to be added: ",

resString);

struct resbuf *pRb, *pTemp;

pRb = pObj->xData(appName);

if (pRb != NULL) {

// If xdata is present, then walk to the

// end of the list.

//

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

{ ; }

} else {

// If xdata is not present, register the application

// and add appName to the first resbuf in the list.

// Notice that there is no -3 group as there is in

// AutoLISP. This is ONLY the xdata so

// the -3 xdata-start marker isn’t needed.

//

acdbRegApp(appName);

pRb = acutNewRb(AcDb::kDxfRegAppName);

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

}


Содержание раздела