objectarx自定义实体dwgOutFields和dwgInFields如何存储和读取含有类指针,类指针中有多种vector数据的自定义结构体
时间: 2024-02-02 07:05:31 浏览: 207
在 ObjectARX 中,如果需要将自定义结构体存储到 DWG 文件中,需要使用 `dwgOutFields` 和 `dwgInFields` 函数进行序列化和反序列化操作。
如果结构体中包含类指针和多种 vector 数据,需要注意以下几点:
1. 类指针需要手动实现序列化和反序列化操作,可以通过将类指针转换为另一种类型(如指向基类的指针)来避免序列化指向派生类的指针时可能出现的问题。
2. vector 数据需要使用 `std::vector::size()` 和 `std::vector::operator[]` 等函数进行序列化和反序列化。
下面是一个示例代码,其中包含了一个自定义结构体 `MyStruct`,其中包含一个指向基类的指针和两个 vector 数据。
```cpp
class MyBaseClass {
public:
virtual ~MyBaseClass() {}
};
class MyDerivedClass : public MyBaseClass {
// ...
};
struct MyStruct {
MyBaseClass* ptr;
std::vector<int> vec1;
std::vector<float> vec2;
void dwgOutFields(AcDbDwgFiler* filer) const {
filer->wrInt32(vec1.size());
for (int i = 0; i < vec1.size(); i++) {
filer->wrInt32(vec1[i]);
}
filer->wrInt32(vec2.size());
for (int i = 0; i < vec2.size(); i++) {
filer->wrDouble(vec2[i]);
}
// 将指向派生类的指针转换为指向基类的指针
MyBaseClass* basePtr = dynamic_cast<MyBaseClass*>(ptr);
filer->wrBool(basePtr != nullptr);
if (basePtr) {
filer->wrItem(basePtr->isA()->name());
basePtr->dwgOutFields(filer);
}
}
Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer) {
int size1;
filer->rdInt32(&size1);
vec1.resize(size1);
for (int i = 0; i < size1; i++) {
filer->rdInt32(&vec1[i]);
}
int size2;
filer->rdInt32(&size2);
vec2.resize(size2);
for (int i = 0; i < size2; i++) {
filer->rdDouble(&vec2[i]);
}
bool hasPtr;
filer->rdBool(&hasPtr);
if (hasPtr) {
ACHAR* className;
filer->rdItem(&className);
if (Acad::eOk == acdbGetClassDictionary(NULL, true)->getAt(className, (AcRxClass*&)ptr)) {
ptr = ptr->rxCreate();
ptr->dwgInFields(filer);
}
}
return Acad::eOk;
}
};
```
在使用 `dwgOutFields` 和 `dwgInFields` 进行序列化和反序列化时,可以通过以下代码进行操作:
```cpp
MyStruct data;
// ... 初始化 data ...
AcDbDwgFiler* filer;
// ... 初始化 filer ...
filer->writeItem(&data);
// ...
AcDbObjectId objId;
filer->writeHardOwnershipId(objId);
// ...
filer->readItem(&data);
// ...
filer->readHardOwnershipId(&objId);
```
阅读全文