fix: 未入库管道实体存截面时临时文件名不再撞车

objectId() 为 kNull 时(剪贴板复制、临时序列化等),handle 取不到,
原来拼出来的文件名固定是 Region_<pid>_.dat,同一次存盘里所有截面共用
一个临时文件。

改为:句柄有效时仍用句柄,否则用进程内递增序号 N1/N2/... 作为后缀。
日志里的标识同步从 handle 改成 tag。
This commit is contained in:
company-desktop-computer committed 2026-10-21 23:22:21 +08:00
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);