objectarx二次开发自定义实体,实体数据是一个结构体tag,结构体tag中包含另外一个结构体map、一个类指针Class*、一个bool,而结构体map保存的是一个long long int数据和一个vector<wstring>.类指针class中有一个vector<class2*>, class2中包含了vector<AcGePoint3D>以及字符串、int等数据,请问如何保存读取这些数据到dwg
时间: 2024-02-09 20:09:32 浏览: 91
delphi 自定义结构数据通过内存流方式读取与保存到本地 TMemoryStream
为了保存自定义实体及其数据到DWG文件中,您需要使用AutoCAD提供的ObjectARX API进行开发。下面是大致的步骤:
1. 定义自定义实体类,其中包含tag结构体、Class类指针、bool变量等成员变量。
```cpp
class MyEntity : public AcDbEntity
{
public:
ACDB_DECLARE_MEMBERS(MyEntity);
MyEntity();
virtual ~MyEntity();
// Overridden methods from AcDbEntity
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw* pWd);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
private:
tag m_tag;
Class* m_pClass;
bool m_bFlag;
};
```
2. 在实体类中实现`dwgOutFields`和`dwgInFields`方法,用于保存和读取实体数据到DWG文件中。
```cpp
Acad::ErrorStatus MyEntity::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es = AcDbEntity::dwgOutFields(pFiler);
if (es != Acad::eOk) return es;
// Write tag data
pFiler->writeInt32(m_tag.map.size());
for (auto it = m_tag.map.begin(); it != m_tag.map.end(); ++it)
{
pFiler->writeInt64(it->first);
pFiler->writeInt32(it->second.size());
for (const auto& str : it->second)
{
pFiler->writeBChunk(str.c_str(), str.size() * sizeof(wchar_t));
}
}
pFiler->writeInt64(reinterpret_cast<AcDbUIntPtr>(m_tag.ClassPtr));
pFiler->writeBool(m_tag.bFlag);
// Write Class data
pFiler->writeInt32(m_pClass->vec2.size());
for (const auto& pClass2 : m_pClass->vec2)
{
pFiler->writeBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->writeBChunk(pClass2->str.c_str(), pClass2->str.size() * sizeof(wchar_t));
pFiler->writeInt32(pClass2->n);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus MyEntity::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es = AcDbEntity::dwgInFields(pFiler);
if (es != Acad::eOk) return es;
// Read tag data
int nSize = 0;
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
long long llKey = 0;
pFiler->readInt64(&llKey);
int nVecSize = 0;
pFiler->readInt32(&nVecSize);
std::vector<std::wstring> vecStr;
for (int j = 0; j < nVecSize; ++j)
{
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pBuf, &nLen);
vecStr.emplace_back(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
}
m_tag.map[llKey] = vecStr;
}
AcDbUIntPtr nPtr = 0;
pFiler->readInt64(reinterpret_cast<AcDbUIntPtr*>(&nPtr));
m_tag.ClassPtr = reinterpret_cast<Class*>(nPtr);
pFiler->readBool(&m_tag.bFlag);
// Read Class data
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
auto pClass2 = new class2;
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->readBChunk(&pBuf, &nLen);
pClass2->str = std::wstring(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
pFiler->readInt32(&pClass2->n);
m_pClass->vec2.emplace_back(pClass2);
}
return pFiler->filerStatus();
}
```
3. 在自定义实体的构造函数中初始化成员变量。
```cpp
MyEntity::MyEntity()
{
m_tag.ClassPtr = nullptr;
m_tag.bFlag = false;
m_pClass = new Class;
}
```
4. 在实体类中实现`subWorldDraw`方法,用于绘制实体。
```cpp
Adesk::Boolean MyEntity::subWorldDraw(AcGiWorldDraw* pWd)
{
// Draw entity using OpenGL
// ...
return Adesk::kTrue;
}
```
在AutoCAD中使用自定义实体时,可以使用下列代码进行创建并添加到当前图形数据库中:
```cpp
MyEntity* pEnt = new MyEntity;
AcDbObjectId objId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->addAcDbEntity(objId, pEnt);
if (es == Acad::eOk)
{
// Set entity properties
// ...
// Add entity to current space
AcDbBlockTableRecord* pBTR = nullptr;
es = acdbHostApplicationServices()->workingDatabase()->getModelSpace(pBTR, AcDb::kForWrite);
if (es == Acad::eOk)
{
es = pBTR->appendAcDbEntity(objId, pEnt);
pBTR->close();
}
}
else
{
delete pEnt;
}
```
当从DWG文件中读取自定义实体时,可以使用下列代码进行获取:
```cpp
AcDbObjectIdArray objIds;
acdbGetObjectsOfType(objIds, MyEntity::desc());
for (const auto& objId : objIds)
{
MyEntity* pEnt = nullptr;
Acad::ErrorStatus es = acdbOpenAcDbEntity(reinterpret_cast<AcDbEntity*&>(pEnt), objId, AcDb::kForRead);
if (es == Acad::eOk)
{
// Get entity properties
// ...
pEnt->close();
}
}
```
阅读全文