diff --git a/SourceCode/Code2026/AecRxBase/AecDbCurveBase.cpp b/SourceCode/Code2026/AecRxBase/AecDbCurveBase.cpp index b5c5519..9042794 100644 --- a/SourceCode/Code2026/AecRxBase/AecDbCurveBase.cpp +++ b/SourceCode/Code2026/AecRxBase/AecDbCurveBase.cpp @@ -800,7 +800,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner, for (; it != end; ) { if (!pXDataMap->GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard + if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard { idSrc.setFromOldId(cVal.nVal); @@ -820,7 +820,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner, if (pXDataMapCloned != NULL) { pXDataMapCloned->RemoveAt(sKey); - pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } continue; } @@ -880,7 +880,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner, if (idCloned.isValid()) { pXDataMapCloned->RemoveAt(sKey); - pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } else { @@ -888,7 +888,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner, } } } - else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { arHandKeys.Add(sKey); } @@ -1253,7 +1253,7 @@ Acad::ErrorStatus AecDbCurveBase::subWblockClone(AcRxObject* pOwner, for (; it != end;) { if (!pXDataMap->GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard + if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard { idSrc.setFromOldId(cVal.nVal); @@ -1272,7 +1272,7 @@ Acad::ErrorStatus AecDbCurveBase::subWblockClone(AcRxObject* pOwner, { if (pXDataMapCloned != NULL) { - pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } continue; } @@ -1321,10 +1321,10 @@ Acad::ErrorStatus AecDbCurveBase::subWblockClone(AcRxObject* pOwner, if (pXDataMapCloned != NULL) { pXDataMapCloned->RemoveAt(sKey); - pXDataMapCloned->SetAt(sKey,idCloned,cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey,idCloned,cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } } - else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { arHandKeys.Add(sKey); } diff --git a/SourceCode/Code2026/AecRxBase/AecDbEntityBase.cpp b/SourceCode/Code2026/AecRxBase/AecDbEntityBase.cpp index f8e7ae3..4193989 100644 --- a/SourceCode/Code2026/AecRxBase/AecDbEntityBase.cpp +++ b/SourceCode/Code2026/AecRxBase/AecDbEntityBase.cpp @@ -752,7 +752,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner, for (; it != end; ) { if (!pXDataMap->GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard + if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard { idSrc.setFromOldId(cVal.nVal); @@ -772,7 +772,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner, if (pXDataMapCloned != NULL) { pXDataMapCloned->RemoveAt(sKey); - pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } continue; } @@ -832,7 +832,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner, if (idCloned.isValid()) { pXDataMapCloned->RemoveAt(sKey); - pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } else { @@ -840,7 +840,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner, } } } - else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { arHandKeys.Add(sKey); } @@ -1207,7 +1207,7 @@ Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner, for (; it != end;) { if (!pXDataMap->GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard + if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard { idSrc.setFromOldId(cVal.nVal); @@ -1226,7 +1226,7 @@ Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner, { if (pXDataMapCloned != NULL) { - pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } continue; } @@ -1276,10 +1276,10 @@ Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner, if (pXDataMapCloned != NULL) { pXDataMapCloned->RemoveAt(sKey); - pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == VT_UI4 ? TRUE : FALSE); + pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE); } } - else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { arHandKeys.Add(sKey); } diff --git a/SourceCode/Code2026/AecRxBase/AecDbObjXDataMap.cpp b/SourceCode/Code2026/AecRxBase/AecDbObjXDataMap.cpp index be147af..ea021b1 100644 --- a/SourceCode/Code2026/AecRxBase/AecDbObjXDataMap.cpp +++ b/SourceCode/Code2026/AecRxBase/AecDbObjXDataMap.cpp @@ -29,6 +29,9 @@ static char THIS_FILE[]=__FILE__; #define _ttof(pszVal) _tcstod((pszVal), NULL) #endif + +const int AecDbObjXDataMap::g_nVersion = 0x41454301; // 魔数: 'AEC' + 0x01; + using namespace SHJson; namespace @@ -120,78 +123,28 @@ AecDbObjXDataMap::AecDbObjXDataMap() AecDbObjXDataMap::AecDbObjXDataMap(const AecDbObjXDataMap& datamap) { - if (this != &datamap) - { - //map 互相复制 - m_xData.erase(m_xData.begin(),m_xData.end()); - m_xData.clear(); - CopyFrom(&datamap); - } + //map 互相复制(CopyFrom 内部会先 Empty 再深拷贝) + CopyFrom(&datamap); } -// -/* -struct DelStringFunc -{ - void operator () (std::pair& pairT) const - { - if (pairT.second.nVt == VT_BSTR || - pairT.second.nVt == (VT_BYREF | VT_R8 + 4) ) - { - if (pairT.second.pszVal != NULL && pairT.second.npszLen > 0) - { - delete [] pairT.second.pszVal; - pairT.second.pszVal = NULL; - pairT.second.npszLen = 0; - } - } - } -}; -*/ - AecDbObjXDataMap::~AecDbObjXDataMap() { - //释放 xData 是自符串的元素 -// std::for_each(m_xData.begin(),m_xData.end(),DelStringFunc()); - //std::map::iterator itor; - It itor; - for (itor = m_xData.begin();itor != m_xData.end();++itor) - { - if (itor->second.nVt == VT_BSTR || - itor->second.nVt == (VT_BYREF | VT_R8 + 4) ) - { - if (itor->second.pszVal != NULL && itor->second.npszLen > 0) - { - delete[] itor->second.pszVal; - itor->second.pszVal = NULL; - itor->second.npszLen = 0; - } - } - - if ( itor->second.nVt == (VT_BYREF | VT_R8 + 5) ) - { - if (itor->second.pData != NULL && itor->second.npszLen > 0) - { - delete[] itor->second.pData; - itor->second.pData = NULL; - itor->second.npszLen = 0; - } - } - } + Empty(); } -BOOL AecDbObjXDataMap::SetAt( LPCTSTR pszKey,int nVal ) +BOOL AecDbObjXDataMap::SetAt( LPCTSTR pszKey, const int &nVal ) { if (pszKey != NULL) { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = VT_I4; + xdata.nVt = AecXData::kTypeInt; xdata.nVal = nVal; It it = m_xData.find(pszKey); if (it != m_xData.end()) { + it->second.Free(); (*it).second = xdata; } else @@ -204,18 +157,19 @@ BOOL AecDbObjXDataMap::SetAt( LPCTSTR pszKey,int nVal ) return FALSE; } -BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, Adesk::Int16 nVal) +BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, const Adesk::Int16 &nVal) { if (pszKey != NULL) { AecXData xdata; memset(&xdata, 0, sizeof(xdata)); - xdata.nVt = VT_I2; + xdata.nVt = AecXData::kTypeShort; xdata.nVal = nVal; It it = m_xData.find(pszKey); if (it != m_xData.end()) { + it->second.Free(); (*it).second = xdata; } else @@ -228,18 +182,19 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, Adesk::Int16 nVal) return FALSE; } -BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, DWORD dw) +BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, const DWORD &dw) { if (pszKey != NULL) { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = VT_I4; + xdata.nVt = AecXData::kTypeInt; xdata.nVal = dw; It it = m_xData.find(pszKey); if (it != m_xData.end()) { + it->second.Free(); (*it).second = xdata; } else @@ -252,18 +207,19 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, DWORD dw) return FALSE; } -BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,double dVal) +BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey, const double &dVal) { if (pszKey != NULL) { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = VT_R8; + xdata.nVt = AecXData::kTypeDouble; xdata.dVal[0] = dVal; It it = m_xData.find(pszKey); if (it != m_xData.end()) { + it->second.Free(); (*it).second = xdata; } else @@ -304,11 +260,11 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransfo sTmpKey += DIF_VT_PT; AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = (VT_BYREF | VT_R8 + 2); + xdata.nVt = AecXData::kTypeVector; if(bTransformBy) { // 向量随cad实体变化而改变 - xdata.nVt = (VT_BYREF | VT_R8 + 3); + xdata.nVt = AecXData::kTypeVectorWorld; } xdata.dVal[0] = vt.x; xdata.dVal[1] = vt.y; @@ -317,6 +273,7 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransfo It it = m_xData.find(sTmpKey); if (it != m_xData.end()) { + it->second.Free(); (*it).second = xdata; } else @@ -338,11 +295,11 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcGePoint3d& ptGe,BOOL bTransf { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = VT_BYREF | VT_R8; + xdata.nVt = AecXData::kTypePoint; if (bTransformBy) { // 点随cad实体变化而改变 - xdata.nVt = (VT_BYREF|VT_R8 + 1); + xdata.nVt = AecXData::kTypePointWorld; } xdata.dVal[0] = ptGe.x; @@ -352,6 +309,7 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcGePoint3d& ptGe,BOOL bTransf It it = m_xData.find(pszKey); if (it != m_xData.end()) { + it->second.Free(); (*it).second = xdata; } else @@ -387,7 +345,7 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcGeMatrix3d& xform) { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = (VT_BYREF | VT_R8 + 4); + xdata.nVt = AecXData::kTypeMatrix; CString sText = _T(""),sTemp; for (int i = 0;i < 4;i++) @@ -402,21 +360,13 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcGeMatrix3d& xform) xdata.npszLen = sText.GetLength() + 1; xdata.pszVal = new TCHAR[xdata.npszLen]; - ::memset(xdata.pszVal, 0, sizeof(xdata.npszLen) * sizeof(TCHAR)); + ::memset(xdata.pszVal, 0, xdata.npszLen * sizeof(TCHAR)); _tcsncpy_s(xdata.pszVal, xdata.npszLen, sText, xdata.npszLen - 1); It it = m_xData.find(pszKey); if (it != m_xData.end()) //找到 { - if ( (*it).second.nVt == VT_BSTR || - (*it).second.nVt == (VT_BYREF | VT_R8 + 4) ) - { - if ( (*it).second.npszLen > 0 && (*it).second.pszVal != NULL) - { - delete[] (*it).second.pszVal; - } - } - + it->second.Free(); (*it).second = xdata; } else //未找到 @@ -435,7 +385,7 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,void* pData,int nSize) { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = (VT_BYREF | VT_R8 + 5); + xdata.nVt = AecXData::kTypeBinary; xdata.npszLen = nSize; xdata.pData = new byte[nSize]; @@ -444,15 +394,7 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,void* pData,int nSize) It it = m_xData.find(pszKey); if (it != m_xData.end()) //找到 { - if ( (*it).second.nVt == VT_BSTR || - (*it).second.nVt == (VT_BYREF | VT_R8 + 5) ) - { - if ( (*it).second.npszLen > 0 && (*it).second.pszVal != NULL) - { - delete[] (*it).second.pszVal; - } - } - + it->second.Free(); (*it).second = xdata; } else //未找到 @@ -501,7 +443,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AcGeMatrix3d& xform) const if ((it = m_xData.find(pszKey)) != m_xData.end()) { AecXData xdata = (*it).second; - if ( xdata.nVt == (VT_BYREF | VT_R8 + 4)) + if ( xdata.nVt == AecXData::kTypeMatrix) { CString sText = xdata.pszVal; CStringArray arTexts; @@ -526,52 +468,28 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AcGeMatrix3d& xform) const BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,LPCTSTR pszValue) { - if (pszKey != NULL) - { - int nVt = 0; - if (HasKey(pszKey, nVt)) - { - RemoveAt(pszKey); - } - CString sTmp = pszValue; - //if(sTmp.GetLength() >= MAX_PATH) - //return FALSE; + if (!pszKey) return FALSE; - if (_tcslen(pszValue) < 0) - return FALSE; + if (!pszValue || _tcslen(pszValue) == 0) + return FALSE; - AecXData xdata; - memset(&xdata,0,sizeof(xdata)); + int nVt = 0; + if (HasKey(pszKey, nVt)) + RemoveAt(pszKey); - xdata.nVt = VT_BSTR; - xdata.npszLen = _tcslen(pszValue) + 1; - xdata.pszVal = new TCHAR[xdata.npszLen]; - memset(xdata.pszVal,0,xdata.npszLen); - _tcsncpy_s(xdata.pszVal, xdata.npszLen, pszValue, xdata.npszLen - 1); + AecXData xdata; + memset(&xdata, 0, sizeof(xdata)); - It it = m_xData.find(pszKey); - if (it != m_xData.end()) - { - // Rem:.2010.7.23 原来的要删除 - if ((*it).second.npszLen > 0 && (*it).second.pszVal != NULL) - delete[] (*it).second.pszVal; - - //(*it).second = xdata; - (*it).second.pszVal = new TCHAR[xdata.npszLen]; - memset((*it).second.pszVal,0,xdata.npszLen); - _tcsncpy_s((*it).second.pszVal, xdata.npszLen, pszValue, xdata.npszLen - 1); + xdata.nVt = AecXData::kTypeString; + xdata.npszLen = _tcslen(pszValue) + 1; + xdata.pszVal = new TCHAR[xdata.npszLen]; + memset(xdata.pszVal, 0, xdata.npszLen * sizeof(TCHAR)); + _tcsncpy_s(xdata.pszVal, xdata.npszLen, pszValue, xdata.npszLen - 1); - delete[] xdata.pszVal; - xdata.pszVal = NULL; - } - else - { - std::pair pa(pszKey,xdata); - m_xData.insert(pa); - } - return TRUE; - } - return FALSE; + std::pair pa(pszKey, xdata); + m_xData.insert(pa); + + return TRUE; } BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,int iIndex,LPCTSTR pszValue) @@ -613,93 +531,93 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,int iIndex,const AecDbObjXDataMap& x switch (xdata.nVt) { - case VT_I2: + case AecXData::kTypeShort: { - sType.Format(_T("%d"), VT_I2); + sType.Format(_T("%d"), AecXData::kTypeShort); sInfo.Format(_T("%d"), xdata.iVal); sRecord.Format(_T("{%s|%s|%s}"), sKey, sType, sInfo); sText += sRecord; break; } - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 { - sType.Format(_T("%d"),VT_I4); + sType.Format(_T("%d"),AecXData::kTypeInt); sInfo.Format(_T("%d"),xdata.nVal); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case VT_UI4: + case AecXData::kTypeSoftId: { - sType.Format(_T("%d"),VT_UI4); + sType.Format(_T("%d"),AecXData::kTypeSoftId); sInfo.Format(_T("%d"),xdata.nVal); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case VT_UI8: + case AecXData::kTypeHardId: { - sType.Format(_T("%d"),VT_UI8); + sType.Format(_T("%d"),AecXData::kTypeHardId); sInfo.Format(_T("%d"),xdata.nVal); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 { - sType.Format(_T("%d"),VT_R8); + sType.Format(_T("%d"),AecXData::kTypeDouble); sInfo.Format(_T("%.9f"),xdata.dVal[0]); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 { - sType.Format(_T("%d"),(VT_BYREF | VT_R8)); + sType.Format(_T("%d"),AecXData::kTypePoint); sInfo.Format(_T("%.4f,%.4f,%.4f"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 { - sType.Format(_T("%d"),(VT_BYREF | VT_R8 + 1)); + sType.Format(_T("%d"),AecXData::kTypePointWorld); sInfo.Format(_T("%.9f,%.9f,%.9f"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 { - sType.Format(_T("%d"),(VT_BYREF | VT_R8 + 2)); + sType.Format(_T("%d"),AecXData::kTypeVector); sInfo.Format(_T("%.9f,%.9f,%.9f"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypeVectorWorld: // 变化向量 { - sType.Format(_T("%d"),(VT_BYREF | VT_R8 + 3)); + sType.Format(_T("%d"),AecXData::kTypeVectorWorld); sInfo.Format(_T("%.9f,%.9f,%.9f"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 { - sType.Format(_T("%d"),VT_BYREF | VT_R8 + 4); + sType.Format(_T("%d"),AecXData::kTypeMatrix); sInfo.Format(_T("%s"),xdata.pszVal); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; break; } - case (VT_BYREF | VT_R8 + 5): // binary data + case AecXData::kTypeBinary: // binary data { break; } - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 { - sType.Format(_T("%d"),VT_BSTR); + sType.Format(_T("%d"),AecXData::kTypeString); sInfo.Format(_T("%s"),xdata.pszVal); sRecord.Format(_T("{%s|%s|%s}"),sKey,sType,sInfo); sText += sRecord; @@ -847,34 +765,34 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int iIndex,AecDbObjXDataMap& xDataMa int nVt = _ttoi(sType); switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: { xDataMap.SetAt(sKey, (short)_ttoi(sInfo)); break; } - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 { xDataMap.SetAt(sKey,_ttoi(sInfo)); break; } - case VT_UI4: + case AecXData::kTypeSoftId: { id.setFromOldId((INT_PTR)_ttoi(sInfo)); xDataMap.SetAt(sKey,id); break; } - case VT_UI8: + case AecXData::kTypeHardId: { id.setFromOldId((INT_PTR)_ttoi(sInfo)); xDataMap.SetAt(sKey,id,FALSE); break; } - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 { xDataMap.SetAt(sKey,_ttof(sInfo)); break; } - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 { if (StringToAcGePoint3d(sInfo,ptGe)) { @@ -882,7 +800,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int iIndex,AecDbObjXDataMap& xDataMa } break; } - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 { if (StringToAcGePoint3d(sInfo,ptGe)) { @@ -890,7 +808,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int iIndex,AecDbObjXDataMap& xDataMa } break; } - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 { if (StringToAcGeVector3d(sInfo,vt)) { @@ -900,7 +818,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int iIndex,AecDbObjXDataMap& xDataMa } break; } - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypeVectorWorld: // 变化向量 { if (StringToAcGeVector3d(sInfo,vt)) { @@ -910,7 +828,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int iIndex,AecDbObjXDataMap& xDataMa } break; } - case (VT_BYREF | VT_R8 + 4): //矩阵 + case AecXData::kTypeMatrix: //矩阵 { memset(&xDat,0,sizeof(AecXData)); xDat.npszLen = sInfo.GetLength() + 1; @@ -920,11 +838,11 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int iIndex,AecDbObjXDataMap& xDataMa delete[] xDat.pszVal; break; } - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeBinary: //binary data { break; } - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 { xDataMap.SetAt(sKey,sInfo); break; @@ -958,12 +876,13 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcDbObjectId& id,BOOL bIsSoft) { AecXData xdata; memset(&xdata,0,sizeof(xdata)); - xdata.nVt = VT_UI4; - if (!bIsSoft) xdata.nVt = VT_UI8; + xdata.nVt = AecXData::kTypeSoftId; + if (!bIsSoft) xdata.nVt = AecXData::kTypeHardId; xdata.nVal = id.asOldId(); It it = m_xData.find(pszKey); if (it != m_xData.end()) { + (*it).second.Free(); (*it).second = xdata; } else @@ -990,72 +909,69 @@ BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AcDbHandle& handle) return FALSE; } -BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AecXData& XData) +bool AecXData::CopyFrom(const AecXData& src) { - if (pszKey != NULL) + if (this == &src) return true; + + Free(); + + nVt = src.nVt; + npszLen = src.npszLen; + + // 先整体复制 union(POD 类型一次到位),字符串/二进制随后重新分配覆盖 + memcpy(dVal, src.dVal, sizeof(dVal)); + + if (src.nVt == AecXData::kTypeString || src.nVt == AecXData::kTypeMatrix) { - It it = m_xData.find(pszKey); - if (it != m_xData.end()) //找到 + // 字符串 / 矩阵(矩阵以逗号分隔的字符串存储) + pszVal = NULL; + if (src.pszVal != NULL && src.npszLen > 0) { - if ( (*it).second.nVt == XData.nVt ) //判断类型相同 - { - if ( (*it).second.nVt == VT_BSTR || - (*it).second.nVt == (VT_BYREF | VT_R8 + 4) ) //字符串特殊处理 - { - // mcl changed to below 2010.7.23 -// if ((*it).second.npszLen > 0 && (*it).second.pszVal != NULL) //清空原来的 -// { -// delete [] (*it).second.pszVal; -// } - - // 重新分配空间赋值 - if (XData.npszLen > 0 && XData.pszVal != NULL) - { - if ((*it).second.npszLen > 0 && (*it).second.pszVal != NULL) //清空原来的 - delete[] (*it).second.pszVal; - - (*it).second = XData; - (*it).second.pszVal = new TCHAR[XData.npszLen]; - memset((*it).second.pszVal,0,XData.npszLen); - _tcsncpy_s((*it).second.pszVal, XData.npszLen, XData.pszVal, XData.npszLen - 1); - } - } - else if( (*it).second.nVt == (VT_BYREF | VT_R8 + 5) )//binary data - { - // 重新分配空间赋值 - if (XData.npszLen > 0 && XData.pData != NULL) - { - if ((*it).second.npszLen > 0 && (*it).second.pData != NULL) //清空原来的 - delete[] (*it).second.pData; - - (*it).second = XData; - (*it).second.pData = new byte[XData.npszLen]; - memset((*it).second.pData,0,XData.npszLen); - memcpy((*it).second.pData,XData.pData,XData.npszLen); - } - } - else - { - (*it).second = XData; - } - } + pszVal = new TCHAR[src.npszLen]; + _tcsncpy_s(pszVal, src.npszLen, src.pszVal, src.npszLen - 1); } else { - if (XData.nVt == VT_BSTR || - XData.nVt == (VT_BYREF | VT_R8 + 4)) - { - SetAt(pszKey,XData.pszVal); - } - else - { - std::pair pa(pszKey,XData); - m_xData.insert(pa); - } + npszLen = 0; } - return TRUE; } - return FALSE; + else if (src.nVt == AecXData::kTypeBinary) + { + // 二进制数据块 + pData = NULL; + if (src.pData != NULL && src.npszLen > 0) + { + pData = new byte[src.npszLen]; + memcpy(pData, src.pData, src.npszLen); + } + else + { + npszLen = 0; + } + } + + return true; +} + +BOOL AecDbObjXDataMap::SetAt(LPCTSTR pszKey,const AecXData& XData) +{ + if (pszKey == NULL) return FALSE; + + It it = m_xData.find(pszKey); + if (it != m_xData.end()) //找到 + { + // 已存在:原地深拷贝覆盖(释放旧资源,允许类型变化) + return it->second.CopyFrom(XData) ? TRUE : FALSE; + } + + // 未找到:先深拷贝再插入,避免与源共享字符串/二进制缓冲 + AecXData xdata; + xdata.CopyFrom(XData); + + std::pair pa(pszKey,xdata); + m_xData.insert(pa); + + return TRUE; } BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AecXData& XData) const @@ -1081,7 +997,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,void*& pData,int& nSize) const if ((it = m_xData.find(pszKey)) != m_xData.end()) { XData = (*it).second; - if (XData.nVt == (VT_BYREF | VT_R8 + 5) ) + if (XData.nVt == AecXData::kTypeBinary ) { if (XData.npszLen > 0) { @@ -1105,7 +1021,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey, DWORD & dw) const { AecXData xdata = (*it).second; - if (xdata.nVt == VT_I4) + if (xdata.nVt == AecXData::kTypeInt) { dw = (int)xdata.nVal; return TRUE; @@ -1124,7 +1040,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,int& nVal) const { AecXData xdata = (*it).second; - if (xdata.nVt == VT_I4) + if (xdata.nVt == AecXData::kTypeInt) { nVal = (int)xdata.nVal; return TRUE; @@ -1143,7 +1059,7 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey, short &nVal) const { AecXData xdata = (*it).second; - if (xdata.nVt == VT_I2)//优先 + if (xdata.nVt == AecXData::kTypeShort)//优先 { nVal = (short)xdata.iVal; return TRUE; @@ -1162,17 +1078,17 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,double& dVal) const { AecXData xdata = (*it).second; - if (xdata.nVt == VT_R8) + if (xdata.nVt == AecXData::kTypeDouble) { dVal = xdata.dVal[0]; return TRUE; } - else if (xdata.nVt == VT_I4) + else if (xdata.nVt == AecXData::kTypeInt) { dVal = 1.0 * xdata.nVal; return TRUE; } - else if (xdata.nVt == VT_I2)//优先 + else if (xdata.nVt == AecXData::kTypeShort)//优先 { dVal = 1.0 * xdata.iVal; return TRUE; @@ -1216,8 +1132,8 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AcGeVector3d& vt) const { AecXData xdata = (*it).second; - if ((xdata.nVt == (VT_BYREF | VT_R8) + 2) - || (xdata.nVt == ((VT_BYREF | VT_R8) + 3))) + if ((xdata.nVt == AecXData::kTypeVector) + || (xdata.nVt == (AecXData::kTypeVectorWorld))) { vt.x = xdata.dVal[0]; vt.y = xdata.dVal[1]; @@ -1239,8 +1155,8 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AcGePoint3d& ptGe) const { AecXData xdata = (*it).second; - if ( (xdata.nVt == (VT_BYREF | VT_R8)) - || (xdata.nVt == (VT_BYREF | VT_R8 + 1))) + if ( (xdata.nVt == AecXData::kTypePoint) + || (xdata.nVt == AecXData::kTypePointWorld)) { ptGe.x = xdata.dVal[0]; ptGe.y = xdata.dVal[1]; @@ -1282,23 +1198,23 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,CString &sValue) const { AecXData xdata = (*it).second; - if (xdata.nVt == VT_BSTR || - xdata.nVt == (VT_BYREF | VT_R8 + 4)) + if (xdata.nVt == AecXData::kTypeString || + xdata.nVt == AecXData::kTypeMatrix) { sValue = xdata.pszVal; return TRUE; } - else if (xdata.nVt == VT_I4 || xdata.nVt == VT_I8) + else if (xdata.nVt == AecXData::kTypeInt || xdata.nVt == AecXData::kTypeInt64) { sValue.Format(_T("%d"), xdata.nVal); return TRUE; } - else if (xdata.nVt == VT_I2) + else if (xdata.nVt == AecXData::kTypeShort) { sValue.Format(_T("%d"), xdata.iVal); return TRUE; } - else if (xdata.nVt == VT_R8) + else if (xdata.nVt == AecXData::kTypeDouble) { sValue.Format(_T("%.9f"), xdata.dVal[0]); sValue.TrimRight(_T('0')); @@ -1309,41 +1225,6 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,CString &sValue) const return FALSE; } -//BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,TCHAR* pszValue) const -//{ -// if (pszKey != NULL && pszValue != NULL) -// { -// CIt it; -// if ((it = m_xData.find(pszKey)) != m_xData.end()) -// { -// AecXData xdata = (*it).second; -// -// if (xdata.nVt == VT_BSTR || -// xdata.nVt == (VT_BYREF | VT_R8 + 4) ) -// { -// _tcscpy(pszValue,xdata.pszVal); -// return TRUE; -// } -// else if (xdata.nVt == VT_I4 || xdata.nVt == VT_I8) -// { -// swprintf(pszValue,_T("%d"), (int)xdata.nVal); -// return TRUE; -// } -// else if (xdata.nVt == VT_I2) -// { -// swprintf(pszValue, _T("%d"), (int)xdata.iVal); -// return TRUE; -// } -// else if (xdata.nVt == VT_R8) -// { -// swprintf(pszValue,_T("%.9f"), xdata.dVal[0]); -// return TRUE; -// } -// } -// } -// return FALSE; -//} - BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AcDbObjectId& id) const { if (pszKey != NULL) @@ -1353,8 +1234,8 @@ BOOL AecDbObjXDataMap::GetAt(LPCTSTR pszKey,AcDbObjectId& id) const { AecXData xdata = (*it).second; - if (xdata.nVt == VT_UI4 || - xdata.nVt == VT_UI8) + if (xdata.nVt == AecXData::kTypeSoftId || + xdata.nVt == AecXData::kTypeHardId) { id.setFromOldId(xdata.nVal); return TRUE; @@ -1436,72 +1317,36 @@ BOOL AecDbObjXDataMap::HasKey(LPCTSTR pszKey,int& nVt) const void AecDbObjXDataMap::Empty() { + for (It it = m_xData.begin(); it != m_xData.end(); ++it) + it->second.Free(); m_xData.clear(); } BOOL AecDbObjXDataMap::RemoveAt(LPCTSTR pszKey) { - if (pszKey != NULL) + if (!pszKey) return FALSE; + + CString sTmpKey = pszKey; + sTmpKey += DIF_VT_PT; + It it = m_xData.find(pszKey); + It it1 = m_xData.find(sTmpKey); + + BOOL bRemoved = FALSE; + if (it != m_xData.end()) { - CString sTmpKey = pszKey; - sTmpKey += DIF_VT_PT; - It it = m_xData.find(pszKey); - It it1 = m_xData.find(sTmpKey); - if (it != m_xData.end()) - { - if ( (*it).second.nVt == VT_BSTR || - (*it).second.nVt == (VT_BYREF | VT_R8 + 4) ) - { - if ((*it).second.npszLen > 0 && (*it).second.pszVal != NULL) - { - delete[] (*it).second.pszVal; - } - (*it).second.pszVal = NULL; - } - - if ( (*it).second.nVt == (VT_BYREF | VT_R8 + 5) ) - { - if ((*it).second.npszLen > 0 && (*it).second.pData != NULL) - { - delete[] (*it).second.pData; - (*it).second.pData = NULL; - } - } - m_xData.erase(it); - //m_xData.clear(); - return TRUE; - } - else if(it1 != m_xData.end()) - { - if ( (*it1).second.nVt == VT_BSTR || - (*it1).second.nVt == (VT_BYREF | VT_R8 + 4) ) - { - if ((*it1).second.pszVal != NULL) - { - delete[] (*it1).second.pszVal; - } - (*it1).second.pszVal = NULL; - } - - if ( (*it1).second.nVt == (VT_BYREF | VT_R8 + 5) ) - { - if ((*it1).second.npszLen > 0 && (*it1).second.pData != NULL) - { - delete[] (*it1).second.pData; - (*it1).second.pData = NULL; - } - } - - m_xData.erase(it1); - //m_xData.clear(); - return TRUE; - } - else - { - return FALSE; - } + it->second.Free(); // 释放内存 + m_xData.erase(it); + bRemoved = TRUE; } - return FALSE; + + if (it1 != m_xData.end()) + { + it1->second.Free(); // 释放内存 + m_xData.erase(it1); + bRemoved = TRUE; + } + + return bRemoved; } BOOL AecDbObjXDataMap::RemoveAt(LPCTSTR pszKey,int nIndex) @@ -1517,99 +1362,38 @@ BOOL AecDbObjXDataMap::RemoveAt(LPCTSTR pszKey,int nIndex) AecDbObjXDataMap& AecDbObjXDataMap::operator = (const AecDbObjXDataMap& srcMap) { - if (this != &srcMap) - { - //map 互相复制 - m_xData.erase(m_xData.begin(),m_xData.end()); - m_xData.clear(); - CopyFrom(&srcMap); - } + //map 互相复制(CopyFrom 内部已处理 this == &srcMap 与 Empty) + CopyFrom(&srcMap); return *this; } BOOL AecDbObjXDataMap::CopyFrom(const AecDbObjXDataMap* pSrc) { - AecDbObjXDataMap* pTDbXDataMap = (AecDbObjXDataMap*) pSrc; - if(pTDbXDataMap != NULL && this != pSrc) + if (pSrc == NULL || this == pSrc) + return FALSE; + + //map 互相复制:SetAt 内部走 AecXData::CopyFrom 深拷贝, + //字符串/矩阵/二进制都会重新分配,不与源共享缓冲 + Empty(); + + for (CIt it = pSrc->m_xData.begin();it != pSrc->m_xData.end();it++) { - //map 互相复制 - //m_xData = pSrc->m_xData; - - m_xData.erase(m_xData.begin(),m_xData.end()); - m_xData.clear(); - - for (CIt it = pSrc->m_xData.begin();it != pSrc->m_xData.end();it++) - { - if ( (*it).second.nVt == VT_BSTR /*|| - (*it).second.nVt == (VT_BYREF | VT_R8 + 4 )*/) - { - //VT_BYREF | VT_R8 + 4 类型不能以字符串复制 - //直接 INSERT 2013-10-10 - SetAt( (*it).first,(*it).second); - } - else - { - if ((*it).second.nVt == (VT_BYREF | VT_R8 + 4 )) - { - AcGeMatrix3d xform; - pSrc->GetAt( (*it).first,xform); - SetAt((*it).first,xform); - } - else if ((*it).second.nVt == (VT_BYREF | VT_R8 + 5 )) - { - AecXData xData; - pSrc->GetAt((*it).first,xData); - SetAt((*it).first,xData.pData,xData.npszLen); - } - else - { - m_xData.insert( (*it) ); - } - } - } - return TRUE; + SetAt((*it).first,(*it).second); } - return FALSE; + return TRUE; } BOOL AecDbObjXDataMap::AppendFrom(const AecDbObjXDataMap* pSrc) { - AecDbObjXDataMap* pTDbXDataMap = (AecDbObjXDataMap*) pSrc; - if(pTDbXDataMap != NULL && this != pSrc) + if (pSrc == NULL || this == pSrc) + return FALSE; + + //合并:同名键以 pSrc 的值覆盖(SetAt 语义) + for (CIt it = pSrc->m_xData.begin();it != pSrc->m_xData.end();it++) { - for (CIt it = pSrc->m_xData.begin();it != pSrc->m_xData.end();it++) - { - if ( (*it).second.nVt == VT_BSTR /*|| - (*it).second.nVt == (VT_BYREF | VT_R8 + 4 )*/) - { - //VT_BYREF | VT_R8 + 4 类型不能以字符串复制 - //直接 INSERT 2013-10-10 - RemoveAt((*it).first); - SetAt( (*it).first,(*it).second); - } - else - { - if ((*it).second.nVt == (VT_BYREF | VT_R8 + 4 )) - { - AcGeMatrix3d xform; - pSrc->GetAt( (*it).first,xform); - SetAt((*it).first,xform); - } - else if ((*it).second.nVt == (VT_BYREF | VT_R8 + 5 )) - { - AecXData xData; - pSrc->GetAt((*it).first,xData); - SetAt((*it).first,xData.pData,xData.npszLen); - } - else - { - m_xData.insert( (*it) ); - } - } - } - return TRUE; + SetAt((*it).first,(*it).second); } - return FALSE; + return TRUE; } AecDbObjXDataMap::It AecDbObjXDataMap::Begin() @@ -1621,21 +1405,21 @@ BOOL AecDbObjXDataMap::GetNext(It& it,CString& sKey,AecXData& xData) { if (it != m_xData.end()) { - if ((*it).second.nVt == VT_BSTR) + if ((*it).second.nVt == AecXData::kTypeString) { if ((*it).second.npszLen > 0 && (*it).second.pszVal != NULL) { memset(&xData, 0, sizeof(AecXData)); - xData.nVt = VT_BSTR; + xData.nVt = AecXData::kTypeString; xData.npszLen = (*it).second.npszLen;//!!! xData.pszVal = new TCHAR[xData.npszLen];//!!! _tcsncpy_s(xData.pszVal, xData.npszLen, (*it).second.pszVal, xData.npszLen - 1);//!!! } else { - //异常-->VT_I4 0 代替 + //异常-->AecXData::kTypeInt 0 代替 memset(&xData, 0, sizeof(AecXData)); - xData.nVt = VT_I4; + xData.nVt = AecXData::kTypeInt; } } else @@ -1671,48 +1455,48 @@ void AecDbObjXDataMap::List() const switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: acutPrintf(_T("%d : VT_I2"), (int)xdata.iVal); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 acutPrintf(_T("%d : VT_I4"),(int)xdata.nVal); break; - case VT_UI4: //s id + case AecXData::kTypeSoftId: //s id #ifndef _WIN64 acutPrintf(_T("%ld : VT_UI4"),xdata.nVal); #else acutPrintf(_T("%d : VT_UI4"),xdata.nVal); #endif break; - case VT_UI8: //h id + case AecXData::kTypeHardId: //h id #ifndef _WIN64 acutPrintf(_T("%ld : VT_UI4"),xdata.nVal); #else acutPrintf(_T("%d : VT_UI4"),xdata.nVal); #endif break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 acutPrintf(_T("%.9f : VT_R8"),xdata.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 acutPrintf(_T("%.9f,%.9f,%.9f : Point3d"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 acutPrintf(_T("%.9f,%.9f,%.9f : Point3d"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 acutPrintf(_T("%.9f,%.9f,%.9f : Vector3d"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypeVectorWorld: // 变化向量 acutPrintf(_T("%.9f,%.9f,%.9f : Vector3d"),xdata.dVal[0],xdata.dVal[1],xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 acutPrintf(_T("%s : Matrix3d"),xdata.pszVal); break; - case (VT_BYREF | VT_R8 + 5): // binarydata + case AecXData::kTypeBinary: // binarydata acutPrintf(_T("%p:%d bytes : Binary data"),xdata.pData,xdata.npszLen); break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 acutPrintf(_T("%s : String"),xdata.pszVal); break; default: @@ -1746,48 +1530,48 @@ void AecDbObjXDataMap::List(CListCtrl* pList,int nImage) const switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: swprintf(szData, _T("%d : VT_I4"), xdata.iVal); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 swprintf(szData,_T("%d : VT_I4"), (int)xdata.nVal); break; - case VT_UI4: //s id + case AecXData::kTypeSoftId: //s id #ifndef _WIN64 swprintf(szData, _T("%ld : VT_UI4"), xdata.nVal); #else swprintf(szData, _T("%d : VT_UI4"), (int)xdata.nVal); #endif break; - case VT_UI8: //h id + case AecXData::kTypeHardId: //h id #ifndef _WIN64 swprintf(szData, _T("%ld : VT_UI4"), xdata.nVal); #else swprintf(szData, _T("%d : VT_UI4"), (int)xdata.nVal); #endif break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 swprintf(szData, _T("%.3f : VT_R8"), xdata.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 swprintf(szData, _T("(%.3f,%.3f,%.3f) : Point3d"), xdata.dVal[0], xdata.dVal[1], xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 swprintf(szData, _T("(%.3f,%.3f,%.3f) : Point3d"), xdata.dVal[0], xdata.dVal[1], xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 swprintf(szData, _T("(%.3f,%.3f,%.3f) : Vector3d"), xdata.dVal[0], xdata.dVal[1], xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypeVectorWorld: // 变化向量 swprintf(szData, _T("(%.3f,%.3f,%.3f) : Vector3d"), xdata.dVal[0], xdata.dVal[1], xdata.dVal[2]); break; - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 swprintf(szData, _T("%s : Matrix3d"), xdata.pszVal); break; - case (VT_BYREF | VT_R8 + 5): // binarydata + case AecXData::kTypeBinary: // binarydata swprintf(szData, _T("%p:%d bytes : Binary data"), xdata.pData, (int)xdata.npszLen); break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 { //太长...多余的截掉 if (xdata.npszLen > MAX_PATH * 4) @@ -1820,23 +1604,23 @@ static bool XDataEqu(const AecXData& xdata1,const AecXData& xdata2) switch (xdata1.nVt) { - case VT_I2: + case AecXData::kTypeShort: if (xdata1.iVal != xdata2.iVal) return false; - case VT_I4: // 整型 - case VT_UI4: //s id - case VT_UI8: //h id + case AecXData::kTypeInt: // 整型 + case AecXData::kTypeSoftId: //s id + case AecXData::kTypeHardId: //h id if (xdata1.nVal != xdata2.nVal) return false; break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 if ( fabs(xdata1.dVal[0] - xdata2.dVal[0]) > 1.e-3) return false; break; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): // cad变化点 - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypePoint: // 点 + case AecXData::kTypePointWorld: // cad变化点 + case AecXData::kTypeVector: // 向量 + case AecXData::kTypeVectorWorld: // 变化向量 if ( fabs(xdata1.dVal[0] - xdata2.dVal[0]) > 1.e-3) return false; @@ -1847,15 +1631,15 @@ static bool XDataEqu(const AecXData& xdata1,const AecXData& xdata2) if ( fabs(xdata1.dVal[2] - xdata2.dVal[2]) > 1.e-3) return false; break; - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 if (_tcscmp(xdata1.pszVal,xdata2.pszVal) != 0) return false; break; - case (VT_BYREF | VT_R8 + 5): // binarydata + case AecXData::kTypeBinary: // binarydata if (xdata1.npszLen != xdata2.npszLen) return false; break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 if (_tcscmp(xdata1.pszVal,xdata2.pszVal) != 0) return false; break; @@ -1912,51 +1696,51 @@ Acad::ErrorStatus AecDbObjXDataMap::dxfOutFields(AcDbDxfFiler* pFiler) const switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: pFiler->writeInt16(AcDb::kDxfXdInteger16, xdata.iVal); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 pFiler->writeInt32(AcDb::kDxfXdInteger32, (int)xdata.nVal); break; - case VT_UI4: //s id + case AecXData::kTypeSoftId: //s id id.setFromOldId(xdata.nVal); pFiler->writeObjectId(AcDb::kDxfSoftPointerId,id); break; - case VT_UI8: //h id + case AecXData::kTypeHardId: //h id id.setFromOldId(xdata.nVal); pFiler->writeObjectId(AcDb::kDxfHardPointerId,id); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 pFiler->writeDouble(AcDb::kDxfXdReal, xdata.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 ptVal.x = xdata.dVal[0]; ptVal.y = xdata.dVal[1]; ptVal.z = xdata.dVal[2]; pFiler->writePoint3d(AcDb::kDxfXdXCoord, ptVal); break; - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 ptVal.x = xdata.dVal[0]; ptVal.y = xdata.dVal[1]; ptVal.z = xdata.dVal[2]; pFiler->writePoint3d(AcDb::kDxfXdWorldXCoord, ptVal); break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 vt.x = xdata.dVal[0]; vt.y = xdata.dVal[1]; vt.z = xdata.dVal[2]; pFiler->writeVector3d(AcDb::kDxfXdXCoord, vt); break; - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypeVectorWorld: // 变化向量 vt.x = xdata.dVal[0]; vt.y = xdata.dVal[1]; vt.z = xdata.dVal[2]; pFiler->writeVector3d(AcDb::kDxfXdWorldXDir, vt); break; - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 pFiler->writeString(AcDb::kDxfXdAsciiString, xdata.pszVal); break; - case (VT_BYREF | VT_R8 + 5): // binary data + case AecXData::kTypeBinary: // binary data { ads_binary binary; binary.clen = xdata.npszLen; @@ -1964,7 +1748,7 @@ Acad::ErrorStatus AecDbObjXDataMap::dxfOutFields(AcDbDxfFiler* pFiler) const pFiler->writeBChunk(AcDb::kDxfXdBinaryChunk,binary); } break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 pFiler->writeString(AcDb::kDxfXdAsciiString, xdata.pszVal); break; default: @@ -2025,13 +1809,13 @@ Acad::ErrorStatus AecDbObjXDataMap::dxfInFields(AcDbDxfFiler* pFiler) switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: SetAt(sKey, rb.resval.rint); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 SetAt(sKey,rb.resval.rlong); break; - case VT_UI4: //s id + case AecXData::kTypeSoftId: //s id #ifdef _WIN64 id.setFromOldId(rb.resval.mnInt64); @@ -2041,7 +1825,7 @@ Acad::ErrorStatus AecDbObjXDataMap::dxfInFields(AcDbDxfFiler* pFiler) SetAt(sKey,id); break; - case VT_UI8: //h id + case AecXData::kTypeHardId: //h id #ifdef _WIN64 id.setFromOldId(rb.resval.mnInt64); @@ -2051,32 +1835,32 @@ Acad::ErrorStatus AecDbObjXDataMap::dxfInFields(AcDbDxfFiler* pFiler) SetAt(sKey,id,FALSE); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 SetAt(sKey,rb.resval.rreal); break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 SetAt(sKey, asPnt3d(rb.resval.rpoint)); break; - case (VT_BYREF | VT_R8 + 1): // 变化点 + case AecXData::kTypePointWorld: // 变化点 SetAt(sKey, asPnt3d(rb.resval.rpoint),TRUE); break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 sKey.Replace(DIF_VT_PT,_T(" ")); sKey.TrimRight(); SetAt(sKey, asPnt3d(rb.resval.rpoint)); break; - case (VT_BYREF | VT_R8 + 3): // cad变化向量 + case AecXData::kTypeVectorWorld: // cad变化向量 sKey.Replace(DIF_VT_PT,_T(" ")); sKey.TrimRight(); SetAt(sKey, asPnt3d(rb.resval.rpoint),TRUE); break; - case (VT_BYREF | VT_R8 + 4): //矩阵 + case AecXData::kTypeMatrix: //矩阵 SetAt(sKey, rb.resval.rstring); break; - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeBinary: //binary data SetAt(sKey,rb.resval.rbinary.buf,rb.resval.rbinary.clen); break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 SetAt(sKey, rb.resval.rstring); break; default: @@ -2100,7 +1884,7 @@ void AecDbObjXDataMap::BeginCloneXlation(AecDbObjXDataMap* pMapClone,AcDbIdMappi xdata = (*it).second; switch (xdata.nVt) { - case VT_UI4: + case AecXData::kTypeSoftId: { id.setFromOldId(xdata.nVal); idpair.setKey(id); @@ -2110,7 +1894,7 @@ void AecDbObjXDataMap::BeginCloneXlation(AecDbObjXDataMap* pMapClone,AcDbIdMappi } } break; - case VT_UI8: + case AecXData::kTypeHardId: { id.setFromOldId(xdata.nVal); idpair.setKey(id); @@ -2147,47 +1931,48 @@ Acad::ErrorStatus AecDbObjXDataMap::dwgOutFields(AcDbDwgFiler* pFiler) const switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: pFiler->writeInt16(xdata.iVal); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 pFiler->writeInt32((int)xdata.nVal); break; - case VT_UI4: + case AecXData::kTypeSoftId: id.setFromOldId(xdata.nVal); pFiler->writeSoftPointerId(id); break; - case VT_UI8: + case AecXData::kTypeHardId: id.setFromOldId(xdata.nVal); pFiler->writeHardPointerId(id); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 pFiler->writeDouble(xdata.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): + case AecXData::kTypePoint: // 点 + case AecXData::kTypePointWorld: ptVal.x = xdata.dVal[0]; ptVal.y = xdata.dVal[1]; ptVal.z = xdata.dVal[2]; pFiler->writePoint3d(ptVal); break; - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): + case AecXData::kTypeVector: // 向量 + case AecXData::kTypeVectorWorld: vt.x = xdata.dVal[0]; vt.y = xdata.dVal[1]; vt.z = xdata.dVal[2]; pFiler->writeVector3d(vt); break; - case (VT_BYREF | VT_R8 + 4): //矩阵 + case AecXData::kTypeMatrix: //矩阵 pFiler->writeString(xdata.pszVal); - case (VT_BYREF | VT_R8 + 5): //binary data + break; + case AecXData::kTypeBinary: //binary data { pFiler->writeInt32(xdata.npszLen); pFiler->writeBytes(xdata.pData,xdata.npszLen); break; } break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 pFiler->writeString(xdata.pszVal); break; default: @@ -2218,8 +2003,7 @@ Acad::ErrorStatus AecDbObjXDataMap::dwgInFields(AcDbDwgFiler* pFiler) CString sText; CStringArray arTexts; - m_xData.erase(m_xData.begin(),m_xData.end()); - m_xData.clear(); + Empty(); while ((pFiler->readString(&pszVal)) == Acad::eOk) { @@ -2249,49 +2033,49 @@ Acad::ErrorStatus AecDbObjXDataMap::dwgInFields(AcDbDwgFiler* pFiler) switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: pFiler->readInt16(&iVal); xdata.iVal = iVal; SetAt(sKey, xdata.iVal); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 pFiler->readInt32(&nVt); xdata.nVal = (int)nVt; SetAt(sKey, (int)xdata.nVal); break; - case VT_UI4: + case AecXData::kTypeSoftId: pFiler->readSoftPointerId(&id); SetAt(sKey,id); break; - case VT_UI8: + case AecXData::kTypeHardId: pFiler->readHardPointerId(&idh); SetAt(sKey,idh,FALSE); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 pFiler->readDouble(&xdata.dVal[0]); SetAt(sKey, xdata.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 pFiler->readPoint3d(&ptVal); SetAt(sKey, ptVal); break; - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 pFiler->readPoint3d(&ptVal); SetAt(sKey, ptVal, TRUE); break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 pFiler->readVector3d(&vt); sKey.Replace(DIF_VT_PT,_T(" ")); sKey.TrimRight(); SetAt(sKey, vt); break; - case (VT_BYREF | VT_R8 + 3): // cad变化向量 + case AecXData::kTypeVectorWorld: // cad变化向量 pFiler->readVector3d(&vt); sKey.Replace(DIF_VT_PT,_T(" ")); sKey.TrimRight(); SetAt(sKey, vt, TRUE); break; - case (VT_BYREF | VT_R8 + 4): //矩阵 + case AecXData::kTypeMatrix: //矩阵 pszVal = NULL; pFiler->readString(&pszVal); @@ -2312,7 +2096,7 @@ Acad::ErrorStatus AecDbObjXDataMap::dwgInFields(AcDbDwgFiler* pFiler) SetAt(sKey, xform); if (pszVal != NULL) acutDelString(pszVal); break; - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeBinary: //binary data { Adesk::Int32 nSize = 0; pFiler->readInt32(&nSize); @@ -2325,7 +2109,7 @@ Acad::ErrorStatus AecDbObjXDataMap::dwgInFields(AcDbDwgFiler* pFiler) } break; } - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 pszVal = NULL; pFiler->readString(&pszVal); SetAt(sKey, pszVal); @@ -2429,14 +2213,14 @@ BOOL AecDbObjXDataMap::XDMap2Resbuf(LPCTSTR pszApp, struct resbuf*& pRb,BOOL bXR pTempNext = NULL; switch (iter->second.nVt) { - case VT_I2: + case AecXData::kTypeShort: { pTempNext = acutNewRb(AcDb::kDxfXdInteger16); pTempNext->resval.rint = (short)iter->second.iVal; pTemp->rbnext = pTempNext; break; } - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 pTempNext = acutNewRb(AcDb::kDxfXdInteger32); pTempNext->resval.rlong = (long)iter->second.nVal; pTemp->rbnext = pTempNext; @@ -2451,7 +2235,7 @@ BOOL AecDbObjXDataMap::XDMap2Resbuf(LPCTSTR pszApp, struct resbuf*& pRb,BOOL bXR so someguy want save id to an entity xdata ,must save as kDxfXdHandle kDxfXdHandle is same as string; */ - case VT_UI4: //s id + case AecXData::kTypeSoftId: //s id id.setFromOldId(iter->second.nVal); acdbGetAdsName(adsName,id); if(bXRecord) @@ -2471,7 +2255,7 @@ BOOL AecDbObjXDataMap::XDMap2Resbuf(LPCTSTR pszApp, struct resbuf*& pRb,BOOL bXR } pTemp->rbnext = pTempNext; break; - case VT_UI8: //h id not support xdata + case AecXData::kTypeHardId: //h id not support xdata id.setFromOldId(iter->second.nVal); acdbGetAdsName(adsName,id); if(bXRecord) @@ -2491,50 +2275,50 @@ BOOL AecDbObjXDataMap::XDMap2Resbuf(LPCTSTR pszApp, struct resbuf*& pRb,BOOL bXR } pTemp->rbnext = pTempNext; break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 pTempNext = acutNewRb(AcDb::kDxfXdAsciiString); acutNewString(iter->second.pszVal, pTempNext->resval.rstring); pTemp->rbnext = pTempNext; break; - case VT_R8: // 浮点型 + case AecXData::kTypeDouble: // 浮点型 pTempNext = acutNewRb(AcDb::kDxfXdReal); pTempNext->resval.rreal = iter->second.dVal[0]; pTemp->rbnext = pTempNext; break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 pTempNext = acutNewRb(AcDb::kDxfXdXCoord); pTempNext->resval.rpoint[0] = iter->second.dVal[0]; pTempNext->resval.rpoint[1] = iter->second.dVal[1]; pTempNext->resval.rpoint[2] = iter->second.dVal[2]; pTemp->rbnext = pTempNext; break; - case (VT_BYREF | VT_R8 + 1): // 随cad实体变化的点 + case AecXData::kTypePointWorld: // 随cad实体变化的点 pTempNext = acutNewRb(AcDb::kDxfXdWorldXCoord); pTempNext->resval.rpoint[0] = iter->second.dVal[0]; pTempNext->resval.rpoint[1] = iter->second.dVal[1]; pTempNext->resval.rpoint[2] = iter->second.dVal[2]; pTemp->rbnext = pTempNext; break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 pTempNext = acutNewRb(AcDb::kDxfXdXCoord); pTempNext->resval.rpoint[0] = iter->second.dVal[0]; pTempNext->resval.rpoint[1] = iter->second.dVal[1]; pTempNext->resval.rpoint[2] = iter->second.dVal[2]; pTemp->rbnext = pTempNext; break; - case (VT_BYREF | VT_R8 + 3): // 随cad实体变化的向量 + case AecXData::kTypeVectorWorld: // 随cad实体变化的向量 pTempNext = acutNewRb(AcDb::kDxfXdWorldXDir); pTempNext->resval.rpoint[0] = iter->second.dVal[0]; pTempNext->resval.rpoint[1] = iter->second.dVal[1]; pTempNext->resval.rpoint[2] = iter->second.dVal[2]; pTemp->rbnext = pTempNext; break; - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 pTempNext = acutNewRb(AcDb::kDxfXdAsciiString); acutNewString(iter->second.pszVal, pTempNext->resval.rstring); pTemp->rbnext = pTempNext; break; - case (VT_BYREF | VT_R8 + 5): + case AecXData::kTypeBinary: /*pTempNext = acutNewRb(AcDb::kDxfXdBinaryChunk); pTempNext->resval.rbinary.clen = iter->second.npszLen; pTempNext->resval.rbinary.buf = new char[iter->second.npszLen]; @@ -2569,34 +2353,34 @@ void AecDbObjXDataMap::SecondAsKey(CString& sTemp,AecXData& xData) { switch (xData.nVt) { - case VT_I2: + case AecXData::kTypeShort: sTemp.Format(_T("%d"), xData.iVal); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 sTemp.Format(_T("%d"),xData.nVal); break; - case VT_UI4: + case AecXData::kTypeSoftId: sTemp.Format(_T("%d"),xData.nVal); break; - case VT_UI8: + case AecXData::kTypeHardId: sTemp.Format(_T("%d"),xData.nVal); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 sTemp.Format(_T("%.9f"),xData.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): + case AecXData::kTypePoint: // 点 + case AecXData::kTypePointWorld: + case AecXData::kTypeVector: // 向量 + case AecXData::kTypeVectorWorld: sTemp.Format(_T("%.9f,%.9f,%.9f"),xData.dVal[0],xData.dVal[1],xData.dVal[2]); break; - case (VT_BYREF | VT_R8 + 4): //矩阵 - case VT_BSTR: // 字符串 + case AecXData::kTypeMatrix: //矩阵 + case AecXData::kTypeString: // 字符串 { sTemp = xData.pszVal; break; } - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeBinary: //binary data { CTime tNow = CTime::GetCurrentTime(); sTemp = tNow.Format(" %Y-%m-%d %H.%M.%S"); @@ -2665,7 +2449,7 @@ static bool MergeBlocks(AecXData &xData, struct resbuf*& pTemp) BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabase* pDb,BOOL bKeyAsSecond/* = FALSE*/) { if(pRb == NULL) return FALSE; - m_xData.clear(); + Empty(); struct resbuf* pTemp = pRb; @@ -2696,18 +2480,19 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas switch (pTemp->restype) { case AcDb::kDxfXdAsciiString: // 字符串 - xData.nVt = VT_BSTR; + xData.nVt = AecXData::kTypeString; xData.npszLen = _tcslen(pTemp->resval.rstring) + 1; xData.pszVal = new TCHAR[xData.npszLen]; _tcsncpy_s(xData.pszVal, xData.npszLen, pTemp->resval.rstring, xData.npszLen - 1); nMapUnitIndex++; break; case AcDb::kDxfXdInteger16: - xData.nVt = VT_I2; + xData.nVt = AecXData::kTypeShort; xData.iVal = pTemp->resval.rint; nMapUnitIndex++; + break; case AcDb::kDxfXdInteger32: // 整型 - xData.nVt = VT_I4; + xData.nVt = AecXData::kTypeInt; xData.nVal = pTemp->resval.rlong; nMapUnitIndex++; break; @@ -2719,13 +2504,13 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas */ case AcDb::kDxfSoftPointerId: //s id not support xdata acdbGetObjectId(id, pTemp->resval.rlname); - xData.nVt = VT_UI4; + xData.nVt = AecXData::kTypeSoftId; xData.nVal = id.asOldId(); nMapUnitIndex++; break; case AcDb::kDxfHardPointerId: //h id not support xdata acdbGetObjectId(id, pTemp->resval.rlname); - xData.nVt = VT_UI8; + xData.nVt = AecXData::kTypeHardId; xData.nVal = id.asOldId(); nMapUnitIndex++; break; @@ -2739,7 +2524,7 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas { if ( Acad::eOk == pDb->getAcDbObjectId(id,false,handle) ) { - xData.nVt = VT_UI4; + xData.nVt = AecXData::kTypeSoftId; xData.nVal = id.asOldId(); nMapUnitIndex++; } @@ -2747,12 +2532,12 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas } break; case AcDb::kDxfXdReal: // 浮点型 - xData.nVt = VT_R8; + xData.nVt = AecXData::kTypeDouble; xData.dVal[0] = pTemp->resval.rreal; nMapUnitIndex++; break; case AcDb::kDxfXdXCoord: // 点 向量 - xData.nVt = (VT_BYREF | VT_R8); + xData.nVt = AecXData::kTypePoint; xData.dVal[0] = pTemp->resval.rpoint[0]; xData.dVal[1] = pTemp->resval.rpoint[1]; xData.dVal[2] = pTemp->resval.rpoint[2]; @@ -2761,12 +2546,12 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas if(sTemp.Find(DIF_VT_PT) >= 0) { // 向量 - xData.nVt = (VT_BYREF | VT_R8 + 2); + xData.nVt = AecXData::kTypeVector; } break; case AcDb::kDxfXdWorldXCoord: {// 随cad实体变化的点 - xData.nVt = (VT_BYREF | VT_R8 + 1); + xData.nVt = AecXData::kTypePointWorld; xData.dVal[0] = pTemp->resval.rpoint[0]; xData.dVal[1] = pTemp->resval.rpoint[1]; xData.dVal[2] = pTemp->resval.rpoint[2]; @@ -2775,7 +2560,7 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas } case AcDb::kDxfXdWorldXDir: // 随cad实体变化的向量 { - xData.nVt = (VT_BYREF | VT_R8 + 3); + xData.nVt = AecXData::kTypeVectorWorld; xData.dVal[0] = pTemp->resval.rpoint[0]; xData.dVal[1] = pTemp->resval.rpoint[1]; xData.dVal[2] = pTemp->resval.rpoint[2]; @@ -2784,7 +2569,7 @@ BOOL AecDbObjXDataMap::Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord,AcDbDatabas } case AcDb::kDxfXdBinaryChunk: { - xData.nVt = (VT_BYREF | VT_R8 + 5); + xData.nVt = AecXData::kTypeBinary; xData.npszLen = pTemp->resval.rbinary.clen; xData.pData = pTemp->resval.rbinary.buf; @@ -3049,12 +2834,9 @@ BOOL AecDbObjXDataMap::ReadExDic(const AcDbObjectId& id,LPCTSTR pszApp) BOOL AecDbObjXDataMap::Write(CFile* pFileOut,BOOL bWriteUserData) const { - CString sTemp = MAP_BLOCK_BEGIN; - _bstr_t bst((LPCTSTR)sTemp); - std::string str; - str.append((const char*)bst); - std::string str2 = Base64::Encode(str); - pFileOut->Write(str2.c_str(), strlen(str2.c_str())); + // 1. 永远在最开头写入文件头魔数版本号 + int nVersion = g_nVersion; + pFileOut->Write(&nVersion, sizeof(int)); AecXData xdata; int nVt = -1; @@ -3085,22 +2867,17 @@ BOOL AecDbObjXDataMap::Write(CFile* pFileOut,BOOL bWriteUserData) const { mapStr2Str.GetNextAssoc(ps,sText,sVal); - bst = (LPCTSTR)sText; + // 【修复】彻底摒弃 _bstr_t,使用原生 TCHAR 直接序列化 + nSize = sText.GetLength(); + pFileOut->Write(&nSize, sizeof(int)); + pFileOut->Write((LPCTSTR)sText, nSize * sizeof(TCHAR)); - //key - nSize = strlen((const char*)bst); - pFileOut->Write(&nSize,sizeof(int)); - pFileOut->Write((const char*)bst,nSize); + nVt = AecXData::kTypeString; + pFileOut->Write(&nVt, sizeof(int)); - //vt - nVt = VT_BSTR; - pFileOut->Write(&nVt,sizeof(int)); - - //val - bst = (LPCTSTR)sVal; - nSize = strlen( (const char*)bst); - pFileOut->Write(&nSize,sizeof(int)); - pFileOut->Write((const char*)bst,nSize); + nSize = sVal.GetLength(); + pFileOut->Write(&nSize, sizeof(int)); + pFileOut->Write((LPCTSTR)sVal, nSize * sizeof(TCHAR)); } } else @@ -3126,36 +2903,36 @@ BOOL AecDbObjXDataMap::Write(CFile* pFileOut,BOOL bWriteUserData) const switch (nVt) { - case VT_I2: + case AecXData::kTypeShort: pFileOut->Write(&xdata.iVal,sizeof(short)); break; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 pFileOut->Write(&xdata.nVal,sizeof(int)); break; - case VT_UI4: + case AecXData::kTypeSoftId: pFileOut->Write(&xdata.nVal,sizeof(int)); break; - case VT_UI8: + case AecXData::kTypeHardId: pFileOut->Write(&xdata.nVal,sizeof(int)); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 pFileOut->Write(&xdata.dVal[0],sizeof(double)); break; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): + case AecXData::kTypePoint: // 点 + case AecXData::kTypePointWorld: + case AecXData::kTypeVector: // 向量 + case AecXData::kTypeVectorWorld: pFileOut->Write(xdata.dVal,sizeof(double) * 3); break; - case (VT_BYREF | VT_R8 + 4): //矩阵 - case VT_BSTR: // 字符串 + case AecXData::kTypeMatrix: //矩阵 + case AecXData::kTypeString: // 字符串 { nSize = _tcsclen(xdata.pszVal); pFileOut->Write(&nSize,sizeof(int)); pFileOut->Write(xdata.pszVal, nSize * sizeof(TCHAR)); } break; - case (VT_BYREF | VT_R8 + 5): + case AecXData::kTypeBinary: { pFileOut->Write(&xdata.npszLen,sizeof(int)); pFileOut->Write(xdata.pData, xdata.npszLen); @@ -3167,13 +2944,6 @@ BOOL AecDbObjXDataMap::Write(CFile* pFileOut,BOOL bWriteUserData) const } } - sTemp = MAP_BLOCK_END; - bst = (LPCTSTR)sTemp; - str = std::string(); - str.append((const char*)bst); - str2 = Base64::Encode(str); - pFileOut->Write(str2.c_str(), strlen(str2.c_str())); - return TRUE; } @@ -3264,82 +3034,134 @@ BOOL AecDbObjXDataMap::Read(const AcDbObjectId& id,LPCTSTR pszApp,BOOL bXRecord, return bReadIdXData; } -BOOL AecDbObjXDataMap::Read(CFile* pFileOut,BOOL bWriteUserData) +BOOL AecDbObjXDataMap::Read(CFile *pFileOut, BOOL bWriteUserData) { - CString sTemp = MAP_BLOCK_BEGIN; - _bstr_t bst((LPCTSTR)sTemp); - std::string str; - str.append((const char*)bst); - std::string str2 = Base64::Encode(str); + Empty(); - char* pszBuf = new char[str2.length() + 1]; - memset(pszBuf, 0, str2.length() + 1); - pFileOut->Read(pszBuf, str2.length()); + int nMarker = 0; + ULONGLONG startPos = pFileOut->GetPosition(); + pFileOut->Read(&nMarker, sizeof(int)); + + BOOL bIsOldVersion = FALSE; + + if (nMarker != g_nVersion) + { + bIsOldVersion = TRUE; + pFileOut->Seek(startPos, CFile::begin); + + CString sTemp = MAP_BLOCK_BEGIN; + _bstr_t bst((LPCTSTR)sTemp); + std::string str; + str.append((const char *)bst); + std::string str2 = Base64::Encode(str); + + char *pszBuf = new char[str2.length() + 1]; + memset(pszBuf, 0, str2.length() + 1); + pFileOut->Read(pszBuf, (UINT)str2.length()); + delete[] pszBuf; + } int nCount = 0; - pFileOut->Read(&nCount,sizeof(int)); + pFileOut->Read(&nCount, sizeof(int)); AecXData xdata; int nLen = 0; - for (int i = 0;i < nCount;i++) + for (int i = 0; i < nCount; i++) { ::memset(&xdata, 0, sizeof(xdata)); - //key - pFileOut->Read(&nLen,sizeof(int)); - TCHAR* pszKey = new TCHAR[nLen + 1]; + pFileOut->Read(&nLen, sizeof(int)); + TCHAR *pszKey = new TCHAR[nLen + 1]; ::memset(pszKey, 0, (nLen + 1) * sizeof(TCHAR)); pFileOut->Read(pszKey, nLen * sizeof(TCHAR)); - //value pFileOut->Read(&xdata.nVt, sizeof(int)); switch (xdata.nVt) { - case VT_I2: - pFileOut->Read(&xdata.iVal, sizeof(short)); - case VT_I4: // 整型 - pFileOut->Read(&xdata.nVal, sizeof(int)); - break; - case VT_UI4: - pFileOut->Read(&xdata.nVal, sizeof(int)); - break; - case VT_UI8: - pFileOut->Read(&xdata.nVal, sizeof(int)); - break; - case VT_R8: // 浮点 - pFileOut->Read(&xdata.dVal[0], sizeof(double)); - break; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): - pFileOut->Read(xdata.dVal, sizeof(double) * 3); - break; - case (VT_BYREF | VT_R8 + 4): //矩阵 - case VT_BSTR: // 字符串 + case AecXData::kTypeShort: { - pFileOut->Read(&xdata.npszLen, sizeof(int)); - xdata.pszVal = new TCHAR[xdata.npszLen + 1]; - ::memset(xdata.pszVal, 0, sizeof(TCHAR) * (xdata.npszLen + 1)); - pFileOut->Read(xdata.pszVal, sizeof(TCHAR) * xdata.npszLen); + short sTemp = 0; + pFileOut->Read(&sTemp, sizeof(short)); + xdata.iVal = sTemp; break; } - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeInt: + { + int nTemp = 0; + pFileOut->Read(&nTemp, sizeof(int)); + xdata.nVal = nTemp; + break; + } + case AecXData::kTypeSoftId: + case AecXData::kTypeHardId: + { + unsigned int uTemp = 0; + pFileOut->Read(&uTemp, sizeof(int)); + xdata.nVal = uTemp; + break; + } + case AecXData::kTypeDouble: + pFileOut->Read(&xdata.dVal[0], sizeof(double)); + break; + case AecXData::kTypePoint: + case AecXData::kTypePointWorld: + case AecXData::kTypeVector: + case AecXData::kTypeVectorWorld: + pFileOut->Read(xdata.dVal, sizeof(double) * 3); + break; + case AecXData::kTypeMatrix: + case AecXData::kTypeString: + { + int nCharCount = 0; + pFileOut->Read(&nCharCount, sizeof(int)); // 读到字符数 + xdata.npszLen = nCharCount + 1; // 修正:内部长度需包含 \0 + xdata.pszVal = new TCHAR[xdata.npszLen]; + ::memset(xdata.pszVal, 0, sizeof(TCHAR) * xdata.npszLen); + pFileOut->Read(xdata.pszVal, sizeof(TCHAR) * nCharCount); + break; + } + case AecXData::kTypeBinary: { pFileOut->Read(&xdata.npszLen, sizeof(int)); xdata.pData = new byte[xdata.npszLen]; - ::memset(xdata.pszVal, 0, xdata.npszLen); - pFileOut->Read(xdata.pData, xdata.npszLen); + ::memset(xdata.pData, 0, xdata.npszLen); // 修正:使用 pData 统一语义 + pFileOut->Read(xdata.pData, (UINT)xdata.npszLen); break; } default: + delete[] pszKey; continue; } - m_xData.insert(std::make_pair(pszKey, xdata)); + + It it = m_xData.find(pszKey); + if (it != m_xData.end()) + { + it->second.Free(); + it->second = xdata; + } + else + { + m_xData.insert(std::make_pair(pszKey, xdata)); + } delete[] pszKey; - pszKey = NULL; } + + // 修正:吃掉旧版本留在文件尾部的 MAP_BLOCK_END,防止污染文件流 + if (bIsOldVersion) + { + CString sTemp = MAP_BLOCK_END; + _bstr_t bst((LPCTSTR)sTemp); + std::string str; + str.append((const char *)bst); + std::string str2 = Base64::Encode(str); + + char *pszBuf = new char[str2.length() + 1]; + memset(pszBuf, 0, str2.length() + 1); + pFileOut->Read(pszBuf, (UINT)str2.length()); + delete[] pszBuf; + } + return TRUE; } @@ -3382,29 +3204,29 @@ SHJson::WValue& AecDbObjXDataMap::ToJson() const switch (type) { - case VT_I2: + case AecXData::kTypeShort: addMember(node, _T("value"), xdata.iVal); - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 addMember(node, _T("value"), xdata.nVal); break; - case VT_UI4: - case VT_UI8: + case AecXData::kTypeSoftId: + case AecXData::kTypeHardId: addMember(node, _T("value"), xdata.nVal); break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 addMember(node, _T("value"), xdata.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): + case AecXData::kTypePoint: // 点 + case AecXData::kTypePointWorld: toJson(AcGePoint3d(xdata.dVal[0], xdata.dVal[1], xdata.dVal[2]), value); addMember(node, _T("value"), value); break; - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): + case AecXData::kTypeVector: // 向量 + case AecXData::kTypeVectorWorld: toJson(AcGeVector3d(xdata.dVal[0], xdata.dVal[1], xdata.dVal[2]), value); addMember(node, _T("value"), value); break; - case (VT_BYREF | VT_R8 + 4): //矩阵 + case AecXData::kTypeMatrix: //矩阵 { AcGeMatrix3d xform; CString sText = xdata.pszVal; @@ -3425,7 +3247,7 @@ SHJson::WValue& AecDbObjXDataMap::ToJson() const addMember(node, _T("value"), value); break; } - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeBinary: //binary data { char *p = new char[xdata.npszLen]; LONG_PTR len(sizeof(char) * xdata.npszLen); @@ -3448,7 +3270,7 @@ SHJson::WValue& AecDbObjXDataMap::ToJson() const break; } break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 addMember(node, _T("value"), xdata.pszVal); break; default: @@ -3481,45 +3303,45 @@ bool AecDbObjXDataMap::ByJson(const WValue &v) switch (type) { - case VT_I2: + case AecXData::kTypeShort: SetAt(name.c_str(), va.GetInt()); //?? return true; - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 SetAt(name.c_str(), va.GetInt()); return true; - case VT_UI4: + case AecXData::kTypeSoftId: SetAt(name.c_str(), (DWORD)va.GetUint()); return true; - case VT_UI8: + case AecXData::kTypeHardId: SetAt(name.c_str(), (DWORD)va.GetUint64()); return true; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 SetAt(name.c_str(), va.GetDouble()); return true; - case (VT_BYREF | VT_R8): // 点 - case (VT_BYREF | VT_R8 + 1): + case AecXData::kTypePoint: // 点 + case AecXData::kTypePointWorld: { AcGePoint3d pt; if (!byJson(va, pt)) return false; SetAt(name.c_str(), pt); return true; } - case (VT_BYREF | VT_R8 + 2): // 向量 - case (VT_BYREF | VT_R8 + 3): + case AecXData::kTypeVector: // 向量 + case AecXData::kTypeVectorWorld: { AcGeVector3d vt; if (!byJson(va, vt)) return false; SetAt(name.c_str(), vt); return true; } - case (VT_BYREF | VT_R8 + 4): //矩阵 + case AecXData::kTypeMatrix: //矩阵 { AcGeMatrix3d m; if (byJson(va, m)) return false; SetAt(name.c_str(), m); return true; } - case (VT_BYREF | VT_R8 + 5): //binary data + case AecXData::kTypeBinary: //binary data { char *pBuffer(NULL); @@ -3544,7 +3366,7 @@ bool AecDbObjXDataMap::ByJson(const WValue &v) DELETE_ARR_(pBuffer); return true; } - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 SetAt(name.c_str(), va.GetString()); return true; default: diff --git a/SourceCode/Code2026/CoreCommand/JSTZDlg.cpp b/SourceCode/Code2026/CoreCommand/JSTZDlg.cpp index dc79ac4..da52303 100644 --- a/SourceCode/Code2026/CoreCommand/JSTZDlg.cpp +++ b/SourceCode/Code2026/CoreCommand/JSTZDlg.cpp @@ -2668,11 +2668,11 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj nVt = xdata1.nVt; switch (nVt) { - case VT_I4: // 整型 + case AecXData::kTypeInt: // 整型 sVal1.Format(_T("%d"),(int)xdata1.nVal); sVal2.Format(_T("%d"),(int)xdata2.nVal); break; - case VT_UI4: //s id + case AecXData::kTypeSoftId: //s id #ifndef _WIN64 sVal1.Format(_T("%ld"),xdata1.nVal); sVal2.Format(_T("%ld"),xdata2.nVal); @@ -2681,7 +2681,7 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj sVal2.Format(_T("%d"),xdata2.nVal); #endif break; - case VT_UI8: //h id + case AecXData::kTypeHardId: //h id #ifndef _WIN64 sVal1.Format(_T("%ld"),xdata1.nVal); sVal2.Format(_T("%ld"),xdata2.nVal); @@ -2690,33 +2690,33 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj sVal2.Format(_T("%d"),xdata2.nVal); #endif break; - case VT_R8: // 浮点 + case AecXData::kTypeDouble: // 浮点 sVal1.Format(_T("%.3f"),xdata1.dVal[0]); sVal2.Format(_T("%.3f"),xdata2.dVal[0]); break; - case (VT_BYREF | VT_R8): // 点 + case AecXData::kTypePoint: // 点 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; - case (VT_BYREF | VT_R8 + 1): // cad变化点 + case AecXData::kTypePointWorld: // cad变化点 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; - case (VT_BYREF | VT_R8 + 2): // 向量 + case AecXData::kTypeVector: // 向量 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; - case (VT_BYREF | VT_R8 + 3): // 变化向量 + case AecXData::kTypeVectorWorld: // 变化向量 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; - case (VT_BYREF | VT_R8 + 4): // 矩阵 + case AecXData::kTypeMatrix: // 矩阵 sVal1.Format(_T("%s"),xdata1.pszVal); sVal2.Format(_T("%s"),xdata2.pszVal); break; - case (VT_BYREF | VT_R8 + 5): // binarydata + case AecXData::kTypeBinary: // binarydata break; - case VT_BSTR: // 字符串 + case AecXData::kTypeString: // 字符串 sVal1.Format(_T("%s"),xdata1.pszVal); sVal2.Format(_T("%s"),xdata2.pszVal); break; diff --git a/SourceCode/Code2026/CoreCommand/pcf.cpp b/SourceCode/Code2026/CoreCommand/pcf.cpp index 4ccaa1e..2e96690 100644 --- a/SourceCode/Code2026/CoreCommand/pcf.cpp +++ b/SourceCode/Code2026/CoreCommand/pcf.cpp @@ -261,7 +261,7 @@ namespace for (AecDbObjXDataMap::It it = pMap->Begin(); it != pMap->End(); ++it) { const AecXData &xd = it->second; - if (xd.nVt == VT_BSTR && xd.pszVal) + if (xd.nVt == AecXData::kTypeString && xd.pszVal) { CString s(xd.pszVal); s.Trim(); diff --git a/SourceCode/Code2026/CoreLibrary/AecDbAssembleWell.cpp b/SourceCode/Code2026/CoreLibrary/AecDbAssembleWell.cpp index b528cca..fe447a0 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbAssembleWell.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbAssembleWell.cpp @@ -937,12 +937,12 @@ BOOL AecDbAssembleWell::CalValue(const CString &sExp,double& dRes) const break; //替换 - if (cVal.nVt == VT_I4) + if (cVal.nVt == AecXData::kTypeInt) { cal.SetVariableData(sKey, 1.0 * cVal.nVal); } - if (cVal.nVt == VT_R8) + if (cVal.nVt == AecXData::kTypeDouble) { cal.SetVariableData(sKey, cVal.dVal[0]); } diff --git a/SourceCode/Code2026/CoreLibrary/AecDbEwPipe.cpp b/SourceCode/Code2026/CoreLibrary/AecDbEwPipe.cpp index 6bbc7b8..6cfd7c9 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbEwPipe.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbEwPipe.cpp @@ -1756,7 +1756,7 @@ Acad::ErrorStatus AecDbEwPipe::TransformHole(const AcGeMatrix3d& xform) for (; it != end;) { if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break; - if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); diff --git a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp index 4570a3b..f0aa582 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp @@ -1661,7 +1661,7 @@ void AecDbEwPipeBase::GetAssocHandleObjs(AcDbObjectIdArray& arIds) for (; it != end;) { if (!m_mapSpecXData.GetNext(it, sKey,cVal)) break; - if ( sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR )//可能的实体句柄 + if ( sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString )//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); @@ -1826,7 +1826,7 @@ Acad::ErrorStatus AecDbEwPipeBase::subTransformBy(const AcGeMatrix3d& xform) for (; it != end;) { if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break; - if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); diff --git a/SourceCode/Code2026/CoreLibrary/HlrCutOption.cpp b/SourceCode/Code2026/CoreLibrary/HlrCutOption.cpp index 18470c4..deaf0d3 100644 --- a/SourceCode/Code2026/CoreLibrary/HlrCutOption.cpp +++ b/SourceCode/Code2026/CoreLibrary/HlrCutOption.cpp @@ -240,7 +240,7 @@ void HlrCutOption::ProcessHlrResult(const AcDbEntity *pE std::vector strs; for (AecDbObjXDataMap::It it = testData.Begin(); it != testData.End(); ++it) { - if (it->second.nVt == (VT_BYREF | VT_R8 + 5)) + if (it->second.nVt == AecXData::kTypeBinary) strs.push_back(it->first); } for (size_t i(0); i < strs.size(); ++i) diff --git a/SourceCode/Code2026/CoreLibrary/aecdbpipehanger.cpp b/SourceCode/Code2026/CoreLibrary/aecdbpipehanger.cpp index 4effecd..9f90f90 100644 --- a/SourceCode/Code2026/CoreLibrary/aecdbpipehanger.cpp +++ b/SourceCode/Code2026/CoreLibrary/aecdbpipehanger.cpp @@ -875,12 +875,12 @@ BOOL AecDbPipeHanger::CLC(CString &sTxt) for (; it != end; ) { m_mapSpecXData.GetNext(it, sKey, xData); - if (xData.nVt == VT_UI4 || - xData.nVt == VT_I4) + if (xData.nVt == AecXData::kTypeSoftId || + xData.nVt == AecXData::kTypeInt) { cal.SetVariableData(sKey, 1.0 * xData.nVal); } - else if (xData.nVt == VT_R8) + else if (xData.nVt == AecXData::kTypeDouble) { cal.SetVariableData(sKey, xData.dVal[0]); } diff --git a/SourceCode/Code2026/ElecCmd/AecDbECableLine.cpp b/SourceCode/Code2026/ElecCmd/AecDbECableLine.cpp index c630ce9..f8e207d 100644 --- a/SourceCode/Code2026/ElecCmd/AecDbECableLine.cpp +++ b/SourceCode/Code2026/ElecCmd/AecDbECableLine.cpp @@ -2318,7 +2318,7 @@ void AecDbECableLine::RemoveHolePipe(AecDbECableTray* pWPipe) for (; it != end;) { if (!pXDatMap->GetNext(it, sKey, cVal)) break; - if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); diff --git a/SourceCode/Code2026/HvacCmd/AecDbDuctLine.cpp b/SourceCode/Code2026/HvacCmd/AecDbDuctLine.cpp index 39f1838..552e37c 100644 --- a/SourceCode/Code2026/HvacCmd/AecDbDuctLine.cpp +++ b/SourceCode/Code2026/HvacCmd/AecDbDuctLine.cpp @@ -2888,7 +2888,7 @@ void AecDbDuctLine::RemoveHolePipe(AecDbHvacDuct* pWPipe) for (; it != end;) { if (!pXDatMap->GetNext(it, sKey, cVal)) break; - if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); diff --git a/SourceCode/Code2026/PIDLineCmd/DLGArribtEdit.cpp b/SourceCode/Code2026/PIDLineCmd/DLGArribtEdit.cpp index 827fde8..c0d65e8 100644 --- a/SourceCode/Code2026/PIDLineCmd/DLGArribtEdit.cpp +++ b/SourceCode/Code2026/PIDLineCmd/DLGArribtEdit.cpp @@ -62,13 +62,13 @@ BOOL CDLGArribtEdit::OnInitDialog() { iIndex = m_wndLstAttrib.InsertItem(0, sKey); - if (cVal.nVt == VT_BSTR) + if (cVal.nVt == AecXData::kTypeString) sKey.Format(_T("%s"), cVal.pszVal); - else if (cVal.nVt == VT_I4) + else if (cVal.nVt == AecXData::kTypeInt) sKey.Format(_T("%d"), cVal.nVal); - else if (cVal.nVt == VT_R8) + else if (cVal.nVt == AecXData::kTypeDouble) sKey.Format(_T("%g"), cVal.dVal[0]); - else if (cVal.nVt == (VT_BYREF | VT_R8)) + else if (cVal.nVt == AecXData::kTypePoint) sKey.Format(_T("%g,%g,%g"), cVal.dVal[0], cVal.dVal[1], cVal.dVal[2]); m_wndLstAttrib.SetItemText(iIndex, 1, sKey); @@ -203,13 +203,13 @@ void CDLGArribtEdit::OnOK() sValue = m_wndLstAttrib.GetItemText(iPos, 1); iVt = m_wndLstAttrib.GetItemData(iPos); - if (iVt == VT_BSTR) + if (iVt == AecXData::kTypeString) m_pmapXData->SetAt(sKey, sValue); - else if (iVt == VT_I4) + else if (iVt == AecXData::kTypeInt) m_pmapXData->SetAt(sKey, (int)_ttol(sValue)); - else if (iVt == VT_R8) + else if (iVt == AecXData::kTypeDouble) m_pmapXData->SetAt(sKey, _tcstod(sValue, NULL)); - else if (iVt == (VT_BYREF | VT_R8)) + else if (iVt == AecXData::kTypePoint) { pt.x = pt.y = pt.z = 0.0; _stscanf(sValue, _T("%lf,%lf,%lf"), &(pt.x), &(pt.y), &(pt.z)); diff --git a/SourceCode/Code2026/PipelineCmd/AecPipeLine.cpp b/SourceCode/Code2026/PipelineCmd/AecPipeLine.cpp index 45a5597..8c89ecc 100644 --- a/SourceCode/Code2026/PipelineCmd/AecPipeLine.cpp +++ b/SourceCode/Code2026/PipelineCmd/AecPipeLine.cpp @@ -4334,7 +4334,7 @@ void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* pWPipe) for (; it != end;) { if (!pXDatMap->GetNext(it, sKey, cVal)) break; - if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); diff --git a/SourceCode/Code2026/PipelineSpecCmd/AecPipeLine.cpp b/SourceCode/Code2026/PipelineSpecCmd/AecPipeLine.cpp index 699d695..9c38aac 100644 --- a/SourceCode/Code2026/PipelineSpecCmd/AecPipeLine.cpp +++ b/SourceCode/Code2026/PipelineSpecCmd/AecPipeLine.cpp @@ -4082,7 +4082,7 @@ void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* pWPipe) for (; it != end;) { if (!pXDatMap->GetNext(it, sKey, cVal)) break; - if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄 + if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄 { AcDbHandle handle(cVal.pszVal); diff --git a/SourceCode/Code2026/Pool3dCmd/GJFCDlg.cpp b/SourceCode/Code2026/Pool3dCmd/GJFCDlg.cpp index ce04f43..417b72a 100644 --- a/SourceCode/Code2026/Pool3dCmd/GJFCDlg.cpp +++ b/SourceCode/Code2026/Pool3dCmd/GJFCDlg.cpp @@ -752,7 +752,7 @@ void CGJFCDlg::CreateChildItem(AecDbObjXDataMap* pXData) for (; it != end; ) { if (!pXData->GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_BSTR) + if (cVal.nVt == AecXData::kTypeString) { sHandle = cVal.pszVal; } diff --git a/SourceCode/Code2026/Pool3dCmd/GJFCNewDlg.cpp b/SourceCode/Code2026/Pool3dCmd/GJFCNewDlg.cpp index 133604c..2ec2c99 100644 --- a/SourceCode/Code2026/Pool3dCmd/GJFCNewDlg.cpp +++ b/SourceCode/Code2026/Pool3dCmd/GJFCNewDlg.cpp @@ -393,7 +393,7 @@ void CGJFCNewDlg::OnBnClickedButton10() { memset(&cVal,0,sizeof(AecXData)); if (!xData.GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_BSTR) + if (cVal.nVt == AecXData::kTypeString) { sHandle = cVal.pszVal; } @@ -456,7 +456,7 @@ void CGJFCNewDlg::OnBnClickedButton10() { memset(&cVal,0,sizeof(AecXData)); if (!xData.GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_BSTR) + if (cVal.nVt == AecXData::kTypeString) { sHandle = cVal.pszVal; } @@ -984,7 +984,7 @@ void CGJFCNewDlg::CreateChildItem(AecDbObjXDataMap* pXData) if (!pXData->GetNext(it, sKey, cVal)) break; - if (cVal.nVt == VT_BSTR) + if (cVal.nVt == AecXData::kTypeString) { sHandle = cVal.pszVal; } diff --git a/SourceCode/Code2026/inc/AecDbObjXDataMap.h b/SourceCode/Code2026/inc/AecDbObjXDataMap.h index fb3645a..8e8eb48 100644 --- a/SourceCode/Code2026/inc/AecDbObjXDataMap.h +++ b/SourceCode/Code2026/inc/AecDbObjXDataMap.h @@ -7,6 +7,7 @@ #include #include "dbfiler.h" #include "shJson.h" +#include // VARENUM / VT_* ,供 AecXData::EType 使用 #ifdef AECRXBASE_EXPORT #define AECDLLIMPEXP __declspec(dllexport) @@ -37,19 +38,25 @@ typedef std::vector SH_BIM_BLOCK; typedef struct AecXData { - /* - VT_I4 : int - VT_BSTR : psz - VT_R8 : double - VT_BYREF | VT_R8 - VT_BYREF | VT_R8 + 1 pt - VT_BYREF | VT_R8 + 2 - VT_BYREF | VT_R8 + 3 vect - VT_UI4 : id - VT_BYREF | VT_R8 + 4 : matrix3d - VT_BYREF | VT_R8 + 5 : binary data + // 数据类型标签(nVt)。直接用 wtypes.h 的 VARENUM(VT_*) 组合来表达,直观且与 + // 原实现逐位一致;nVt 会写入 DWG/DXF/XData,改数值会破坏旧图兼容,务必保持不变。 + enum EType + { + kTypeShort = VT_I2, // short + kTypeInt = VT_I4, // int + kTypeDouble = VT_R8, // double + kTypeString = VT_BSTR, // TCHAR* 字符串 + kTypeSoftId = VT_UI4, // AcDbObjectId 软指针 + kTypeInt64 = VT_I8, // 历史遗留(仅读) + kTypeHardId = VT_UI8, // AcDbObjectId 硬指针 + kTypePoint = (VT_BYREF | VT_R8), // 点,不随实体变换 + kTypePointWorld = (VT_BYREF | VT_R8) + 1, // 点,随实体变换 + kTypeVector = (VT_BYREF | VT_R8) + 2, // 向量,不随实体变换 + kTypeVectorWorld = (VT_BYREF | VT_R8) + 3, // 向量,随实体变换 + kTypeMatrix = (VT_BYREF | VT_R8) + 4, // 矩阵(16个double串) + kTypeBinary = (VT_BYREF | VT_R8) + 5, // 二进制块 + }; - */ int nVt; LONG_PTR npszLen; //对应字符数据长度 @@ -61,10 +68,58 @@ typedef struct AecXData TCHAR* pszVal; // 字符数据 void* pData; // binary data }; + + // 1. 默认构造函数,替代原有代码中散落的 memset(&xdata, 0, sizeof(xdata)); + // 注意:struct AecXData 未 dllexport,这两个函数必须 inline 在头文件里, + // 否则其它模块(CoreLibrary / 各 Cmd)构造 AecXData 时会链接不到。 + AecXData() + { + nVt = 0; + npszLen = 0; + nVal = 0; // 清零 union,防止野指针 + } + + // 2. 核心清理函数 + void Free() + { + // 字符串和矩阵类型(两者都用 pszVal 保存) + if (nVt == kTypeString || nVt == kTypeMatrix) + { + if (pszVal != NULL && npszLen > 0) + { + delete[] pszVal; + pszVal = NULL; + } + } + // 二进制数据块类型 + else if (nVt == kTypeBinary) + { + if (pData != NULL && npszLen > 0) + { + // 必须强制转换 void* 为 byte* 才能触发 C++ 正确的数组析构逻辑 + delete[] (byte*)pData; + pData = NULL; + } + } + + // 重置状态 + npszLen = 0; + nVt = 0; + nVal = 0; + } + + + // 3. 深拷贝:先释放自身已持有的资源,再从 src 深拷贝。 + // 字符串/矩阵/二进制会重新分配内存,不与 src 共享缓冲; + // 支持类型变化(nVt 不同也照常覆盖)。this == &src 时直接返回。 + bool CopyFrom(const AecXData &src); + }AECXDATA; class AECDLLIMPEXP AecDbObjXDataMap { +private: + static const int g_nVersion; public: AecDbObjXDataMap(); @@ -72,12 +127,12 @@ public: virtual ~AecDbObjXDataMap(); public: - BOOL SetAt(LPCTSTR pszKey,int nVal); - BOOL SetAt(LPCTSTR pszKey, DWORD dw); + BOOL SetAt(LPCTSTR pszKey, const int &nVal); + BOOL SetAt(LPCTSTR pszKey, const DWORD &dw); - BOOL SetAt(LPCTSTR pszKey, Adesk::Int16 nVal); + BOOL SetAt(LPCTSTR pszKey, const Adesk::Int16 &nVal); - BOOL SetAt(LPCTSTR pszKey,double dVal); + BOOL SetAt(LPCTSTR pszKey, const double &dVal); BOOL SetAt(LPCTSTR pszKey,const AcGeDoubleArray& arVal); BOOL SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransformBy = FALSE); @@ -242,8 +297,10 @@ private: void SecondAsKey(CString& sTemp,AecXData& xData); + private: mutable SHJson::WValue m_json;//临时,不序列化 std::map m_xData;//序列化 + }; #endif //_AecDbObjXDataMap_H__