#include "stdafx.h" #include "resource.h" #include "ThunderXData.h" #include #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 mapData; for (int i = 0;i < arProHeight.length();++i) { mapData.insert(std::make_pair(arProHeight[i],arProHeight[i])); } arProHeight.setLogicalLength(0); std::map::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 mapData; for (int i = 0;i < arProHeight.length();++i) { mapData.insert(std::make_pair(arProHeight[i],arProHeight[i])); } arProHeight.setLogicalLength(0); std::map::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 mapData; for (int i = 0;i < arProHeight.length();++i) { mapData.insert(std::make_pair(arProHeight[i],arProHeight[i])); } arProHeight.setLogicalLength(0); std::map::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; }