fix: 未入库管道实体存截面时临时文件名不再撞车
objectId() 为 kNull 时(剪贴板复制、临时序列化等),handle 取不到, 原来拼出来的文件名固定是 Region_<pid>_.dat,同一次存盘里所有截面共用 一个临时文件。 改为:句柄有效时仍用句柄,否则用进程内递增序号 N1/N2/... 作为后缀。 日志里的标识同步从 handle 改成 tag。
This commit is contained in:
1 parent
8941246b16
commit
8630e2a499
1 file changed
+21
-6
@@ -1201,10 +1201,25 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
|||||||
//避免多文档crash:文件名带进程号,同一张图在两个 CAD 实例里同时打开不会互相覆盖
|
//避免多文档crash:文件名带进程号,同一张图在两个 CAD 实例里同时打开不会互相覆盖
|
||||||
TCHAR szHandleStr[19];
|
TCHAR szHandleStr[19];
|
||||||
memset(szHandleStr,0,sizeof(szHandleStr) );
|
memset(szHandleStr,0,sizeof(szHandleStr) );
|
||||||
objectId().handle().getIntoAsciiBuffer(szHandleStr);
|
|
||||||
|
CString sTag;
|
||||||
|
AcDbObjectId idSelf = objectId();
|
||||||
|
if (!idSelf.isNull())
|
||||||
|
idSelf.handle().getIntoAsciiBuffer(szHandleStr);
|
||||||
|
|
||||||
|
if (szHandleStr[0] != _T('\0'))
|
||||||
|
{
|
||||||
|
sTag = szHandleStr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 未入库实体(剪贴板、临时序列化)没有句柄,用进程内递增序号保证文件名唯一
|
||||||
|
static LONG s_nTempSeq = 0;
|
||||||
|
sTag.Format(_T("N%ld"),(long)::InterlockedIncrement(&s_nTempSeq));
|
||||||
|
}
|
||||||
|
|
||||||
CString sFileName;
|
CString sFileName;
|
||||||
sFileName.Format(_T("Region_%lu_%s.dat"),(unsigned long)::GetCurrentProcessId(),szHandleStr);
|
sFileName.Format(_T("Region_%lu_%s.dat"),(unsigned long)::GetCurrentProcessId(),(LPCTSTR)sTag);
|
||||||
|
|
||||||
CString sFullPath = FilePath::getSystemTemporaryFolder();
|
CString sFullPath = FilePath::getSystemTemporaryFolder();
|
||||||
sFullPath += _T("\\");
|
sFullPath += _T("\\");
|
||||||
@@ -1216,7 +1231,7 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
|||||||
Acad::ErrorStatus es = AcDbBody::acisOut(sFullPath, arBodyPtrs);
|
Acad::ErrorStatus es = AcDbBody::acisOut(sFullPath, arBodyPtrs);
|
||||||
if (Acad::eOk != es)
|
if (Acad::eOk != es)
|
||||||
{
|
{
|
||||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面 acisOut 失败,handle=%s,err=%d,改用原生写法。"),szHandleStr,es);
|
acutPrintf(_T("\nAecDbEwPipeBase: 截面 acisOut 失败,tag=%s,err=%d,改用原生写法。"),(LPCTSTR)sTag,es);
|
||||||
::DeleteFile(sFullPath);
|
::DeleteFile(sFullPath);
|
||||||
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
||||||
}
|
}
|
||||||
@@ -1224,7 +1239,7 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
|||||||
CFile file;
|
CFile file;
|
||||||
if (!file.Open(sFullPath, CFile::modeRead))
|
if (!file.Open(sFullPath, CFile::modeRead))
|
||||||
{
|
{
|
||||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件打开失败,handle=%s,改用原生写法。"),szHandleStr);
|
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件打开失败,tag=%s,改用原生写法。"),(LPCTSTR)sTag);
|
||||||
::DeleteFile(sFullPath);
|
::DeleteFile(sFullPath);
|
||||||
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
||||||
}
|
}
|
||||||
@@ -1243,8 +1258,8 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
|||||||
if (nLen == 0 || nRead != nLen)
|
if (nLen == 0 || nRead != nLen)
|
||||||
{
|
{
|
||||||
// 空文件或短读:尾部是未初始化内存,不能写进 DWG
|
// 空文件或短读:尾部是未初始化内存,不能写进 DWG
|
||||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件异常,handle=%s,期望%u字节实读%u字节,改用原生写法。")
|
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件异常,tag=%s,期望%u字节实读%u字节,改用原生写法。")
|
||||||
,szHandleStr,nLen,nRead);
|
,(LPCTSTR)sTag,nLen,nRead);
|
||||||
::DeleteFile(sFullPath);
|
::DeleteFile(sFullPath);
|
||||||
delete[] pszTxt;
|
delete[] pszTxt;
|
||||||
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
||||||
|
|||||||
Reference in new issue
Block a user