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 实例里同时打开不会互相覆盖
|
||||
TCHAR szHandleStr[19];
|
||||
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;
|
||||
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();
|
||||
sFullPath += _T("\\");
|
||||
@@ -1216,7 +1231,7 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
||||
Acad::ErrorStatus es = AcDbBody::acisOut(sFullPath, arBodyPtrs);
|
||||
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);
|
||||
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
||||
}
|
||||
@@ -1224,7 +1239,7 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
||||
CFile file;
|
||||
if (!file.Open(sFullPath, CFile::modeRead))
|
||||
{
|
||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件打开失败,handle=%s,改用原生写法。"),szHandleStr);
|
||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件打开失败,tag=%s,改用原生写法。"),(LPCTSTR)sTag);
|
||||
::DeleteFile(sFullPath);
|
||||
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
||||
}
|
||||
@@ -1243,8 +1258,8 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile
|
||||
if (nLen == 0 || nRead != nLen)
|
||||
{
|
||||
// 空文件或短读:尾部是未初始化内存,不能写进 DWG
|
||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件异常,handle=%s,期望%u字节实读%u字节,改用原生写法。")
|
||||
,szHandleStr,nLen,nRead);
|
||||
acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件异常,tag=%s,期望%u字节实读%u字节,改用原生写法。")
|
||||
,(LPCTSTR)sTag,nLen,nRead);
|
||||
::DeleteFile(sFullPath);
|
||||
delete[] pszTxt;
|
||||
return WriteRegionNativeFallback(pFiler, m_pRegion);
|
||||
|
||||
Reference in new issue
Block a user