objectarx 自定义实体dwgOutFields如何保存自定义结构体
时间: 2023-12-10 16:39:15 浏览: 231
在 ObjectARX 中,可以通过将自定义结构体序列化为字符串,然后将其保存在实体的扩展数据中来实现保存自定义结构体。
以下是实现此功能的一般步骤:
1. 定义自定义结构体,并在其中添加需要存储的字段。
```
struct MyData {
double value1;
int value2;
wchar_t name[50];
};
```
2. 将自定义结构体序列化为字符串。可以使用 STL 中的 stringstream 来实现。
```
MyData data;
// 设置 data 的值
std::stringstream ss;
ss << data.value1 << "," << data.value2 << "," << data.name;
std::string str = ss.str();
```
3. 将序列化后的字符串保存到实体的扩展数据中。可以使用 AcDbObjectId::setXData() 方法来设置扩展数据。
```
AcDbObjectId entityId; // 实体的 Object ID
AcDbEntity *pEntity = nullptr;
acdbOpenAcDbEntity(pEntity, entityId, AcDb::kForWrite);
if (pEntity) {
resbuf *pResBuf = acutBuildList(
AcDb::kDxfRegAppName, "MyApp",
AcDb::kDxfXdAsciiString, str.c_str(),
0);
pEntity->setXData(pResBuf);
acutRelRb(pResBuf);
pEntity->close();
}
```
4. 读取实体的扩展数据并反序列化为自定义结构体。可以使用 AcDbObjectId::getXData() 方法来读取扩展数据。
```
AcDbObjectId entityId; // 实体的 Object ID
AcDbEntity *pEntity = nullptr;
acdbOpenAcDbEntity(pEntity, entityId, AcDb::kForRead);
if (pEntity) {
resbuf *pResBuf = pEntity->getXData("MyApp");
if (pResBuf) {
std::wstring str;
for (resbuf *pRes = pResBuf; pRes; pRes = pRes->rbnext) {
if (pRes->restype == AcDb::kDxfXdAsciiString) {
str = pRes->resval.rstring;
break;
}
}
acutRelRb(pResBuf);
std::wstringstream ss(str);
MyData data;
ss >> data.value1;
ss.ignore();
ss >> data.value2;
ss.ignore();
ss.getline(data.name, 50);
}
pEntity->close();
}
```
注意,实体的扩展数据可用于存储任意类型的数据,但建议使用自定义应用程序名(例如 "MyApp")来标识存储的数据类型,以避免与其他应用程序的扩展数据冲突。
阅读全文