From 8630e2a499c021efab5f1619e4cebc412553cd93 Mon Sep 17 00:00:00 2001 From: company-desktop-computer Date: Wed, 21 Oct 2026 23:22:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=AA=E5=85=A5=E5=BA=93=E7=AE=A1?= =?UTF-8?q?=E9=81=93=E5=AE=9E=E4=BD=93=E5=AD=98=E6=88=AA=E9=9D=A2=E6=97=B6?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=96=87=E4=BB=B6=E5=90=8D=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E6=92=9E=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit objectId() 为 kNull 时(剪贴板复制、临时序列化等),handle 取不到, 原来拼出来的文件名固定是 Region__.dat,同一次存盘里所有截面共用 一个临时文件。 改为:句柄有效时仍用句柄,否则用进程内递增序号 N1/N2/... 作为后缀。 日志里的标识同步从 handle 改成 tag。 --- .../Code2026/CoreLibrary/AecDbEwPipeBase.cpp | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp index e790717..8317b37 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp @@ -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);