Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

868 lines
17 KiB
C++

#include "stdafx.h"
#include "resource.h"
#include "ThunderXData.h"
#include <map>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CThunderXData::CThunderXData()
{
}
CThunderXData::~CThunderXData()
{
}
// 设置扩展数据
bool CThunderXData::SetBaseInformationExData(const AcDbObjectId& idEnt, const CStringArray& arsXData, LPCTSTR pszAppName)
{
if (pszAppName == NULL && idEnt.isValid())
{
return false;
}
INT_PTR iSize = arsXData.GetSize();
if (iSize < 1) return false;
//滚球法:编号, 高度,半径, 维数, 图块系数, 字体高度
//折线法:编号, 高度,图块系数, 字体高度
struct resbuf* pRb = NULL;
struct resbuf* pTemp = NULL;
// 添加程序名称
acdbRegApp(pszAppName);
pRb = acutNewRb(AcDb::kDxfRegAppName);
if (Acad::eOk != acutNewString(pszAppName, pRb->resval.rstring))
{
acutRelRb(pRb);
return false;
}
pTemp = pRb;
// 添加数据
for (int i = 0;i < iSize;i++)
{
pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
pTemp = pTemp->rbnext;
if (acutNewString(arsXData.GetAt(i), pTemp->resval.rstring) != Acad::eOk)
{
acutRelRb(pRb);
return false;
}
}
AcDbEntity* pEnt = NULL;
if (acdbOpenAcDbEntity(pEnt, idEnt, AcDb::kForWrite) != Acad::eOk)
{
acutRelRb(pRb);
return false;
}
pEnt->setXData(pRb);
pEnt->close();
acutRelRb(pRb);
return true;
}
// 获取扩展数据
bool CThunderXData::GetBaseInformationExData(const AcDbObjectId& idEnt, CStringArray& arsXData, LPCTSTR pszAppName)
{
if (pszAppName == NULL)
{
return false;
}
//滚球法: 编号, 高度,半径, 维数, 图块系数, 字体高度
//折线法: 编号, 高度,图块系数, 字体高度
struct resbuf* pRb = NULL;
AcDbEntity* pEnt = NULL;
Acad::ErrorStatus es;
es = acdbOpenAcDbEntity(pEnt, idEnt, AcDb::kForRead,true);
if (es != Acad::eOk)
{
return false;
}
pRb = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
if (pRb == NULL)
{
pEnt->close();
return false;
}
else
{
arsXData.RemoveAll();
// 首先跳过程序名
for (pTemp = pRb->rbnext; pTemp != NULL;
pTemp = pTemp->rbnext)
{
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
arsXData.Add(pTemp->resval.rstring);
}
}
}
acutRelRb(pRb);
pEnt->close();
return true;
}
bool CThunderXData::GetBaseInformationExData(AcDbEntity* pEnt, CStringArray& arsXData, LPCTSTR pszAppName)
{
if (pEnt == NULL)
{
return false;
}
if (pszAppName == NULL)
{
return false;
}
//滚球法: 编号, 高度,半径, 维数, 图块系数, 字体高度
//折线法: 编号, 高度,图块系数, 字体高度
struct resbuf* pRb = NULL;
pRb = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
if (pRb == NULL)
{
return false;
}
else
{
// 跳过程序名
arsXData.RemoveAll();
for (pTemp = pRb->rbnext; pTemp != NULL;
pTemp = pTemp->rbnext)
{
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
arsXData.Add(pTemp->resval.rstring);
}
}
}
acutRelRb(pRb);
return true;
}
// 获取指定项
bool CThunderXData::GetIndexOf(AcDbEntity* pEnt, CString& strDes, int iIndex, LPCTSTR pszAppName)
{
if (pszAppName == NULL)
{
return false;
}
// 调用者负责关闭pEnt指针
if (pEnt == NULL)
{
return false;
}
//滚球法: 编号,高度,半径, 维数, 图块系数, 字体高度
//折线法: 编号,高度,图块系数, 字体高度
struct resbuf* pRb = NULL;
pRb = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
if (NULL == pRb)
{
return false;
}
else
{
pTemp = pRb;
// 首先跳过程序名,再到指定索引处
for (int i = 0;i <= iIndex;i++)
{
if (pTemp != NULL)
{
pTemp = pTemp->rbnext;
}
else
{
acutRelRb(pRb);
return false;
}
}
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
strDes = pTemp->resval.rstring;
}
}
acutRelRb(pRb);
return true;
}
// 获取指定项
bool CThunderXData::GetIndexOf(AcDbObjectId& entId, CString& strDes, int iIndex, LPCTSTR pszAppName)
{
if (pszAppName == NULL)
{
return false;
}
AcDbEntity* pEnt = NULL;
if (acdbOpenAcDbEntity(pEnt, entId, AcDb::kForRead) != Acad::eOk)
{
return false;
}
// 滚球法: 编号,高度,半径, 维数, 图块系数, 字体高度
// 折线法: 编号,高度,图块系数, 字体高度
struct resbuf* pRb = NULL;
pRb = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
if (NULL == pRb)
{
pEnt->close();
return false;
}
else
{
pTemp = pRb;
// 首先跳过程序名,再到指定索引处
for (int i = 0;i <= iIndex;i++)
{
if (pTemp != NULL)
{
pTemp = pTemp->rbnext;
}
else
{
acutRelRb(pRb);
pEnt->close();
return false;
}
}
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
strDes = pTemp->resval.rstring;
}
}
acutRelRb(pRb);
pEnt->close();
return true;
}
// 将ID字符串转换成ID
bool CThunderXData::GetEntityIdFromExData(const AcDbObjectId& idInput, AcDbObjectId& idOutput, LPCTSTR pszAppName)
{
AcDbObjectIdArray arId;
GetEntityIdFromExData(idInput, arId, pszAppName);
if (arId.length() > 0)
{
idOutput = arId.first();
}
return idOutput.isValid();
}
bool CThunderXData::GetEntityIdFromExData(AcDbEntity* pEnt, AcDbObjectId& idOutput, LPCTSTR pszAppName)
{
AcDbObjectIdArray arId;
GetEntityIdFromExData(pEnt, arId, pszAppName);
if (arId.length() == 1)
{
idOutput = arId.first();
return true;
}
return false;
}
bool CThunderXData::GetEntityIdFromExData(AcDbEntity* pEnt, AcDbObjectIdArray& aridOutput, LPCTSTR pszAppName)
{
aridOutput.setLogicalLength(0);
bool bSuc = false;
if (pEnt != NULL)
{
struct resbuf* pRb = pEnt->xData(pszAppName);
if (pRb != NULL)
{
struct resbuf* pTemp = NULL;
CString sEntHdl;
AcDbObjectId id;
// 首先跳过程序名
for (pTemp = pRb->rbnext;pTemp != NULL;pTemp = pTemp->rbnext)
{
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
sEntHdl = pTemp->resval.rstring;
AcDbHandle hadl(sEntHdl);
acdbCurDwg()->getAcDbObjectId(id, true, hadl);
if (id.isValid())
{
aridOutput.append(id);
}
}
}
acutRelRb(pRb);
bSuc = true;
}
}
return bSuc;
}
bool CThunderXData::GetEntityIdFromExData(const AcDbObjectId& idInput, AcDbObjectIdArray& arIdOutput, LPCTSTR pszAppName)
{
arIdOutput.setLogicalLength(0);
if (pszAppName == NULL || !idInput.isValid())
{
return false;
}
// 读取圆的扩展数据
CStringArray arsThunderId;
if (!GetBaseInformationExData(idInput, arsThunderId, pszAppName))
{
return false;
}
CString strId;
AcDbObjectId idT;
for (int i = 0;i < arsThunderId.GetSize();++i)
{
strId = arsThunderId[i];
if (!strId.IsEmpty())
{
// 将避雷针句柄转换成ID
AcDbHandle hdlThunder(strId);
AcDbDatabase* pDb = acdbCurDwg();
if (pDb != NULL && pDb->getAcDbObjectId(idT, true, hdlThunder) == Acad::eOk)
{
arIdOutput.append(idT);
}
}
}
return arIdOutput.length() > 0;
}
// 将实体ID转换成字符串并写入指定实体的扩展数据
bool CThunderXData::SetEntityIdToExData(const AcDbObjectIdArray& arIdData, const AcDbObjectId& idGoal, LPCTSTR pszAppName)
{
if (pszAppName == NULL)
{
return false;
}
// 用避雷针Id 获取句柄然后转换成字符串
AcDbHandle hdl;
TCHAR szHandleStr[20];
CStringArray arsXData;
AcDbObjectId idT;
for (int i = 0;i < arIdData.length();++i)
{
idT = arIdData[i];
if (idT.isValid())
{
hdl = idT.handle();
hdl.getIntoAsciiBuffer(szHandleStr);
arsXData.Add(CString(szHandleStr));
}
}
// 将避雷针句柄字符串写入圆的扩展数据
if (!SetBaseInformationExData(idGoal, arsXData, pszAppName))
{
return false;
}
return true;
}
BOOL CThunderXData::SetXData(const AcDbObjectId& id, LPCTSTR pszAppName, LPCTSTR pszXData)
{
BOOL bSuc = FALSE;
if (id.isValid())
{
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
{
bSuc = SetXData(pEnt, pszAppName, pszXData);
pEnt->close();
}
}
return bSuc;
}
BOOL CThunderXData::SetXData(AcDbEntity* pEnt, LPCTSTR pszAppName, LPCTSTR pszXData)
{
if (pEnt == NULL || pszAppName == NULL)
{
return FALSE;
}
struct resbuf* pRb = NULL;
struct resbuf* pTemp = NULL;
// 添加程序名称
acdbRegApp(pszAppName);
pRb = acutNewRb(AcDb::kDxfRegAppName);
if (Acad::eOk != acutNewString(pszAppName, pRb->resval.rstring))
{
acutRelRb(pRb);
return FALSE;
}
// 添加数据
pTemp = pRb;
pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
pTemp = pTemp->rbnext;
if (acutNewString(pszXData, pTemp->resval.rstring) != Acad::eOk)
{
acutRelRb(pRb);
return FALSE;
}
Acad::ErrorStatus es = pEnt->setXData(pRb);
acutRelRb(pRb);
return es == Acad::eOk;
}
BOOL CThunderXData::GetXData(const AcDbObjectId& id, LPCTSTR pszAppName, CString& sXData)
{
BOOL bSuc = FALSE;
if (id.isValid())
{
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
bSuc = GetXData(pEnt, pszAppName, sXData);
pEnt->close();
}
}
return bSuc;
}
BOOL CThunderXData::GetXData(AcDbEntity* pEnt, LPCTSTR pszAppName, CString& sXData)
{
sXData.Empty();
if (pszAppName == NULL || pEnt == NULL)
{
return FALSE;
}
struct resbuf* pRb = NULL;
pRb = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
if (pRb == NULL)
{
return FALSE;
}
else
{
// 首先跳过程序名
for (pTemp = pRb->rbnext; pTemp != NULL;
pTemp = pTemp->rbnext)
{
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
sXData = pTemp->resval.rstring;
break;
}
}
}
acutRelRb(pRb);
return TRUE;
}
BOOL CThunderXData::SetXData(const AcDbObjectId& idSrc,LPCTSTR pszAppName,const AcDbObjectId& oid)
{
AcDbEntity* pEnt = NULL;
if(acdbOpenAcDbEntity(pEnt,idSrc,AcDb::kForWrite) != Acad::eOk)
return FALSE;
BOOL bSuc = SetXData(pEnt,pszAppName,oid);
pEnt->close();
return bSuc;
}
BOOL CThunderXData::SetXData(AcDbEntity* pEnt,LPCTSTR pszAppName,const AcDbObjectId& oid)
{
if(!oid.isValid())
return FALSE;
if (pEnt == NULL || pszAppName == NULL)
return FALSE;
struct resbuf* pBuf = NULL;
acdbRegApp(pszAppName);
pBuf = acutNewRb(AcDb::kDxfRegAppName);
if (Acad::eOk != acutNewString(pszAppName, pBuf->resval.rstring))
{
acutRelRb(pBuf);
return FALSE;
}
struct resbuf* pTemp = NULL;
//将ID转换成句柄字符串
TCHAR sHandle[20];
oid.handle().getIntoAsciiBuffer(sHandle);
pTemp = acutNewRb(AcDb::kDxfXdAsciiString);
acutNewString(sHandle,pTemp->resval.rstring);
pBuf->rbnext = pTemp;
pTemp->rbnext = NULL;
Acad::ErrorStatus es = pEnt->setXData(pBuf);
acutRelRb(pBuf);
return es == Acad::eOk;
}
BOOL CThunderXData::GetXData(const AcDbObjectId& idSrc,LPCTSTR pszAppName,AcDbObjectId& oid)
{
AcDbEntity* pEnt = NULL;
if(acdbOpenAcDbEntity(pEnt,idSrc,AcDb::kForWrite) != Acad::eOk)
return FALSE;
BOOL bSuc = GetXData(pEnt,pszAppName,oid);
pEnt->close();
return bSuc;
}
BOOL CThunderXData::GetXData(AcDbEntity* pEnt,LPCTSTR pszAppName,AcDbObjectId& oid)
{
if (pEnt == NULL || pszAppName == NULL)
return FALSE;
struct resbuf* pBuf = pEnt->xData(pszAppName);
struct resbuf* pTemp = NULL;
Acad::ErrorStatus es = Acad::eOk;
if (pBuf == NULL)
{
return FALSE;
}
CString sHandle;
for (pTemp = pBuf->rbnext;pTemp != NULL; pTemp = pTemp->rbnext)
{
if (pTemp->restype == AcDb::kDxfXdAsciiString)
{
sHandle = pTemp->resval.rstring;
AcDbHandle handle(sHandle);
es = pEnt->database()->getAcDbObjectId(oid,true,handle);
break;
}
}
acutRelRb(pBuf);
return es == Acad::eOk;
}
BOOL CThunderXData::GetProtectHeightFromObjEx(const AcDbObjectId& idThunder, AcGeDoubleArray& arProHeight)
{
BOOL bRet = FALSE;
if (idThunder.isValid())
{
OPENOBJ_BEGIN(idThunder,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
bRet = GetProtectHeightFromObjEx(pEnt, arProHeight);
}
OPENOBJ_END();
}
return bRet;
}
BOOL CThunderXData::GetProtectHeightFromObjEx(AcDbEntity* pEnt, AcGeDoubleArray& arProHeight)
{
arProHeight.setLogicalLength(0);
CString sValue;
if (GetXData(pEnt, TEL_THUNDER_MULTIPROHT, sValue))
{
SplitValue(sValue, TEL_SPLIT_CH, arProHeight);
// 排序
std::map<double,double> mapData;
for (int i = 0;i < arProHeight.length();++i)
{
mapData.insert(std::make_pair(arProHeight[i],arProHeight[i]));
}
arProHeight.setLogicalLength(0);
std::map<double,double>::iterator it;
for (it = mapData.begin();it != mapData.end();++it)
{
arProHeight.append(it->second);
}
return TRUE;
}
return FALSE;
}
BOOL CThunderXData::GetFoldProHeightFromObjEx(const AcDbObjectId& idThunder, AcGeDoubleArray& arProHeight)
{
BOOL bRet = FALSE;
if (idThunder.isValid())
{
OPENOBJ_BEGIN(idThunder,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
bRet = GetFoldProHeightFromObjEx(pEnt, arProHeight);
}
OPENOBJ_END();
}
return bRet;
}
BOOL CThunderXData::GetFoldProHeightFromObjEx(AcDbEntity* pEnt, AcGeDoubleArray& arProHeight)
{
arProHeight.setLogicalLength(0);
CString sValue;
if (GetXData(pEnt, KEY_FOLD_THUNDER_MULTIPROHT, sValue))
{
SplitValue(sValue, TEL_SPLIT_CH, arProHeight);
// 排序
std::map<double,double> mapData;
for (int i = 0;i < arProHeight.length();++i)
{
mapData.insert(std::make_pair(arProHeight[i],arProHeight[i]));
}
arProHeight.setLogicalLength(0);
std::map<double,double>::iterator it;
for (it = mapData.begin();it != mapData.end();++it)
{
arProHeight.append(it->second);
}
return TRUE;
}
return FALSE;
}
BOOL CThunderXData::SetProtectHeightToObjEx(const AcDbObjectId& idThunder, const AcGeDoubleArray& arProHeight)
{
CString sValue = ConvertToCString(arProHeight, TEL_SPLIT_CH);
if (SetXData(idThunder, TEL_THUNDER_MULTIPROHT, sValue))
{
return TRUE;
}
return FALSE;
}
BOOL CThunderXData::SetFoldProHeightToObjEx(const AcDbObjectId& idThunder, const AcGeDoubleArray& arProHeight)
{
CString sValue = ConvertToCString(arProHeight, TEL_SPLIT_CH);
if (SetXData(idThunder, KEY_FOLD_THUNDER_MULTIPROHT, sValue))
{
return TRUE;
}
return FALSE;
}
BOOL CThunderXData::SplitValue(LPCTSTR pszSrc, LPCTSTR pszSplitCh, AcGeDoubleArray& arValue)
{
arValue.setLogicalLength(0);
CString sValue;
CString sSrc = pszSrc;
while (SplitString(sSrc, pszSplitCh, sValue))
{
arValue.append(_tstof(sValue));
}
return arValue.length() > 0;
}
CString CThunderXData::ConvertToCString(const AcGeDoubleArray& arValue, LPCTSTR pszSplitCh)
{
CString sData,sTemp;
for (int i = 0;i < arValue.length();++i)
{
sTemp.Format(_T("%g"), arValue[i]);
sData += sTemp;
sData += pszSplitCh;
}
return sData;
}
BOOL CThunderXData::SplitString(CString& sSrc, LPCTSTR pszSplitCh, CString& sValue)
{
if (!sSrc.IsEmpty())
{
int nIndex = sSrc.Find(pszSplitCh, 0);
if (nIndex > 0)
{
sValue = sSrc.Left(nIndex);
sSrc = sSrc.Right(sSrc.GetLength()-nIndex-1);
return TRUE;
}
}
return FALSE;
}
// 避雷针保护高度
BOOL CThunderXData::GetProtectHeightFromReg(AcGeDoubleArray& arProHeight, LPCTSTR pszKey)
{
if (pszKey == NULL)
{
return FALSE;
}
arProHeight.setLogicalLength(0);
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
CString sProHt;
if (regProp.GetValue(pszKey, sProHt))
{
if (SplitValue(sProHt, TEL_SPLIT_CH, arProHeight))
{
// 排序
std::map<double,double> mapData;
for (int i = 0;i < arProHeight.length();++i)
{
mapData.insert(std::make_pair(arProHeight[i],arProHeight[i]));
}
arProHeight.setLogicalLength(0);
std::map<double,double>::iterator it;
for (it = mapData.begin();it != mapData.end();++it)
{
arProHeight.append(it->second);
}
return TRUE;
}
}
return FALSE;
}
BOOL CThunderXData::SetProtectHeightToReg(const AcGeDoubleArray& arProHeight, LPCTSTR pszKey)
{
if (pszKey == NULL)
{
return FALSE;
}
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
CString sProHt = ConvertToCString(arProHeight, TEL_SPLIT_CH);
if (regProp.SetValue(pszKey, sProHt))
{
return TRUE;
}
return FALSE;
}
int CThunderXData::GetGroupNO(Entity& ent)
{
int nNO = -1;
OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
nNO = GetGroupNO(pEnt);
}
OPENOBJ_END();
return nNO;
}
int CThunderXData::GetGroupNO(const AcDbObjectId& id)
{
int nNO = -1;
OPENOBJ_BEGIN(id,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
nNO = GetGroupNO(pEnt);
}
OPENOBJ_END();
return nNO;
}
int CThunderXData::GetGroupNO(AcDbEntity* pEnt)
{
int nNo = -1;
if (pEnt != NULL)
{
CString sNo;
GetXData(pEnt,TEL_GROUP_NO,sNo);
nNo = _ttoi(sNo);
}
return nNo;
}
int CThunderXData::GetFoldGroupNO(Entity& ent)
{
int nNO = -1;
OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
nNO = GetFoldGroupNO(pEnt);
}
OPENOBJ_END();
return nNO;
}
int CThunderXData::GetFoldGroupNO(const AcDbObjectId& id)
{
int nNO = -1;
OPENOBJ_BEGIN(id,AcDb::kForRead,AcDbEntity,pEnt);
if (pEnt != NULL)
{
nNO = GetFoldGroupNO(pEnt);
}
OPENOBJ_END();
return nNO;
}
int CThunderXData::GetFoldGroupNO(AcDbEntity* pEnt)
{
int nNo = -1;
if (pEnt != NULL)
{
CString sNo;
GetXData(pEnt,KEY_FOLD_GROUP_NO,sNo);
nNo = _ttoi(sNo);
}
return nNo;
}