868 lines
17 KiB
C++
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;
|
|
}
|