objectarx自定义实体dwgOutFields和dwgInFields如何存储和读取含义类指针的自定义结构体
时间: 2024-02-01 12:16:47 浏览: 276
在使用 ObjectARX 自定义实体时,可以通过实现 `dwgOutFields()` 和 `dwgInFields()` 函数来控制实体的存储和读取。而对于含义类指针的自定义结构体,我们可以考虑以下两种方法进行存储和读取:
1. 将含义类指针转换为实际数据类型,并存储实际数据类型的成员变量。
在 `dwgOutFields()` 函数中,我们可以将含义类指针转换为实际数据类型,并将实际数据类型的成员变量存储到 `AcDbDwgFiler` 对象中。在 `dwgInFields()` 函数中,我们可以读取实际数据类型的成员变量,并根据这些成员变量创建含义类指针。
下面是一个示例代码:
```cpp
class MyEntity : public AcDbEntity
{
public:
struct MyData
{
int x;
int y;
};
MyData* m_pData;
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const override
{
Acad::ErrorStatus es = AcDbEntity::dwgOutFields(pFiler);
if (es != Acad::eOk)
return es;
if (pFiler->writingVersion() >= AcDb::kDHL_1027)
{
if (m_pData)
{
pFiler->writeBool(true);
pFiler->writeInt32(m_pData->x);
pFiler->writeInt32(m_pData->y);
}
else
{
pFiler->writeBool(false);
}
}
return pFiler->filerStatus();
}
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler) override
{
Acad::ErrorStatus es = AcDbEntity::dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
if (pFiler->readingVersion() >= AcDb::kDHL_1027)
{
bool hasData;
pFiler->readBool(&hasData);
if (hasData)
{
int x, y;
pFiler->readInt32(&x);
pFiler->readInt32(&y);
m_pData = new MyData{ x, y };
}
else
{
m_pData = nullptr;
}
}
return pFiler->filerStatus();
}
};
```
2. 在 `dwgOutFields()` 函数中将含义类指针序列化为字节流,并存储该字节流。在 `dwgInFields()` 函数中读取字节流,并根据字节流创建含义类指针。
下面是一个示例代码:
```cpp
class MyEntity : public AcDbEntity
{
public:
struct MyData
{
int x;
int y;
};
MyData* m_pData;
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const override
{
Acad::ErrorStatus es = AcDbEntity::dwgOutFields(pFiler);
if (es != Acad::eOk)
return es;
if (pFiler->writingVersion() >= AcDb::kDHL_1027)
{
if (m_pData)
{
int size = sizeof(MyData);
char* pData = reinterpret_cast<char*>(m_pData);
pFiler->writeInt32(size);
pFiler->writeBytes(size, pData);
}
else
{
pFiler->writeInt32(0);
}
}
return pFiler->filerStatus();
}
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler) override
{
Acad::ErrorStatus es = AcDbEntity::dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
if (pFiler->readingVersion() >= AcDb::kDHL_1027)
{
int size;
pFiler->readInt32(&size);
if (size > 0)
{
char* pData = new char[size];
pFiler->readBytes(size, pData);
m_pData = reinterpret_cast<MyData*>(pData);
}
else
{
m_pData = nullptr;
}
}
return pFiler->filerStatus();
}
};
```
需要注意的是,在使用第二种方法时,需要确保序列化和反序列化的字节顺序一致。如果字节顺序不一致,可能会导致读取的数据不正确。
阅读全文