From f80ec5618998b8cdef612c46cdda9f49448e6ace Mon Sep 17 00:00:00 2001 From: company-desktop-computer Date: Wed, 21 Oct 2026 15:31:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20AcDbX3dSolid=20=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E6=80=A7=E5=B0=8F=E4=BF=AE=EF=BC=88=E5=A4=B1=E8=B4=A5=E7=95=99?= =?UTF-8?q?=E7=97=95/=E7=BC=93=E5=AD=98=E5=A4=B1=E6=95=88/GSMarker/?= =?UTF-8?q?=E6=AD=BB=E4=BB=A3=E7=A0=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - StringToRegion 两个重载在 fixACISFormat 拒绝时打印长度与 SAT 首行, 原来完全静默,现场只表现为构件消失,无法定位 - ReCreate 统一失效绘制缓存:清 m_pSolidDraw、m_arRegionFaces、 m_pSubDMeshDraw。原来只有 AddMove/ResetMove/AddRotate/ResetRotate 清, TransformBy/SetSolidData/SetOrgPoint 调完 ReCreate 后 Draw3d 仍画旧几何 - GSMarker 改用独立成员 m_nGSMarker,不再借用 m_sszPoint2ds。 后者在 kExtrude/kLoft/kSweep 里存断面/路径串,SetGSMarkerID 会覆盖成数字, 导致 ReCreate 静默失败、几何丢失 - 删除 GetDrawSubDMesh 中 return 之后的 28 行不可达代码 - GetDraw2d / ByJson 补注释说明现状 --- SourceCode/Code2026/CoreCommand/CoreTools.cpp | 26 ++++++- .../Code2026/CoreLibrary/AcDbX3dSolid.cpp | 72 ++++++++----------- SourceCode/Code2026/inc/AcDbX3dSolid.h | 1 + 3 files changed, 54 insertions(+), 45 deletions(-) diff --git a/SourceCode/Code2026/CoreCommand/CoreTools.cpp b/SourceCode/Code2026/CoreCommand/CoreTools.cpp index 22cb767..6278f2d 100644 --- a/SourceCode/Code2026/CoreCommand/CoreTools.cpp +++ b/SourceCode/Code2026/CoreCommand/CoreTools.cpp @@ -3520,7 +3520,19 @@ AcDbRegion* CoreTools::StringToRegion(const CString & sRegionScrp) { std::string sUtf8 = CoreTools::unicode2Ansii((LPCTSTR)sRegionScrp, CP_UTF8); std::string sNewSrc; - if (!fixACISFormat(sUtf8.c_str(), sUtf8.size(), sNewSrc)) return NULL; + if (!fixACISFormat(sUtf8.c_str(), sUtf8.size(), sNewSrc)) + { + // 解析失败必须留痕,否则现场只表现为“构件不见了” + CString sHead = sRegionScrp; + int nLineEnd = sHead.Find(_T('\n')); + if (nLineEnd > 0) + sHead = sHead.Left(nLineEnd); + else + sHead = sHead.Left(60); + acutPrintf(_T("\nCoreTools::StringToRegion: 数据无效,长度=%d,首行=\"%s\"。"), + sRegionScrp.GetLength(), (LPCTSTR)sHead); + return NULL; + } CFile file; CString sFullPath = MakeTempSatPath(); @@ -3569,7 +3581,17 @@ AcDbRegion* CoreTools::StringToRegion(const CString & sRegionScrp) AcDbRegion *CoreTools::StringToRegion(Adesk::UInt64 nLen, char *pszReg) { std::string sNewSrc; - if (!fixACISFormat(pszReg, (size_t)nLen, sNewSrc)) return NULL; + if (!fixACISFormat(pszReg, (size_t)nLen, sNewSrc)) + { + // 解析失败必须留痕,否则现场只表现为“构件不见了” + std::string sHead(pszReg, (size_t)(nLen < 60 ? nLen : 60)); + size_t nLineEnd = sHead.find('\n'); + if (nLineEnd != std::string::npos) + sHead.erase(nLineEnd); + acutPrintf(_T("\nCoreTools::StringToRegion: 数据无效,长度=%I64u,首行=\"%S\"。"), + nLen, sHead.c_str()); + return NULL; + } AcDbRegion *pReg(NULL); CString sFullPath = MakeTempSatPath(); diff --git a/SourceCode/Code2026/CoreLibrary/AcDbX3dSolid.cpp b/SourceCode/Code2026/CoreLibrary/AcDbX3dSolid.cpp index f8b8897..615fd80 100644 --- a/SourceCode/Code2026/CoreLibrary/AcDbX3dSolid.cpp +++ b/SourceCode/Code2026/CoreLibrary/AcDbX3dSolid.cpp @@ -225,13 +225,14 @@ AcDbX3dSolid::AcDbX3dSolid(void) m_pSubDMeshDraw = NULL; #endif - m_sszPoint2ds = _T("-1"); - m_dH = 0.0; - m_dT = 0.0; - m_dW = 0.0; - m_sScr = _T(""); - m_dLen = 0.0; - memset(m_fStair,0,sizeof(float) * 3); + m_sszPoint2ds = _T(""); + m_dH = 0.0; + m_dT = 0.0; + m_dW = 0.0; + m_sScr = _T(""); + m_dLen = 0.0; + memset(m_fStair,0,sizeof(float) * 3); + m_nGSMarker = -1; m_nSatLen = 0; m_pSatBuffer = NULL; @@ -259,6 +260,7 @@ AcDbX3dSolid::AcDbX3dSolid(const AcDbX3dSolid& xSolid) m_vtDirXY = xSolid.m_vtDirXY; memcpy(m_fStair,xSolid.m_fStair,sizeof(float) * 3); m_nKind = xSolid.m_nKind; //类型 + m_nGSMarker = -1; //GSMarker 不随 Clone 传递 //变换部分 m_vtMove = xSolid.m_vtMove; //总移动 @@ -3896,37 +3898,9 @@ AcDbSubDMesh* AcDbX3dSolid::GetDrawSubDMesh() const EnsureCreated(); if (!m_pSubDMesh) return NULL; + + // 移动和旋转操作在Group内完成,这里只返回未变换的副本 return (AcDbSubDMesh*)m_pSubDMesh->clone(); - - // 移动和旋转操作在Group内完成,这里属于预留 - - if (m_pSubDMesh != NULL) - { - AcDbSubDMesh* pSubDMesh = (AcDbSubDMesh*)m_pSubDMesh->clone(); - if (pSubDMesh != NULL) - { - if (m_arAxisVector.length() < MAX_AXISROTATS) - { - //先旋转 - AcGeMatrix3d xRote; - for (int i = 0; i < m_arAxisVector.length(); i++) - { - if (fabs(m_dAxisRotats[i]) > 1.e-10) - { - xRote.setToRotation(m_dAxisRotats[i], m_arAxisVector.at(i), m_ptOrg); - pSubDMesh->transformBy(xRote); - } - } - } - - AcGeMatrix3d xMove; - xMove.setToTranslation(m_vtMove); - pSubDMesh->transformBy(xMove); - - return pSubDMesh; - } - } - return NULL; } void AcDbX3dSolid::GetDrawSubDMesh2D(AcArray &ar) const @@ -3939,6 +3913,7 @@ void AcDbX3dSolid::GetDrawSubDMesh2D(AcArray &ar) const bool AcDbX3dSolid::GetDraw2d(AcDbVoidPtrArray& arCurPtrs) { + // 本类只负责三维几何,二维表达由外层 AecDbXxx 实体自己绘制 return false; } @@ -3973,16 +3948,14 @@ int AcDbX3dSolid::SetActiveFace(int nFace) void AcDbX3dSolid::SetGSMarkerID(Adesk::Int32 nMarker) { - //当AcDbX3dSolid不用在拉伸体时 gsmarker共用m_sszPoint2ds - //m_sszPoint2ds - m_sszPoint2ds.Format(_T("%d"),nMarker); + // 独立成员保存:m_sszPoint2ds 在 kExtrude/kLoft/kSweep 等类型里存断面/路径串, + // 直接覆盖会让 ReCreate 拿到一串数字,几何静默丢失。 + m_nGSMarker = nMarker; } Adesk::Int32 AcDbX3dSolid::GetGSMarkerID() const { - if (m_sszPoint2ds.IsEmpty()) - return -1; - return _ttoi(m_sszPoint2ds); + return m_nGSMarker; } void AcDbX3dSolid::SetOrgPoint(const AcGePoint3d & pt) @@ -4173,6 +4146,18 @@ Acad::ErrorStatus AcDbX3dSolid::ReCreate() DELETE_PTR(m_pSolid); } + // 几何已重建,绘制缓存和活动面缓存必须一起失效, + // 否则 Draw3d/DrawActiveFace 仍会画上一轮的几何。 + if (m_pSolidDraw != NULL) + DELETE_PTR(m_pSolidDraw); + + FreeBuffer(0, m_arRegionFaces); + +#if ARX > 17 + if (m_pSubDMeshDraw != NULL) + DELETE_PTR(m_pSubDMeshDraw); +#endif + switch(m_eType) { @@ -5471,6 +5456,7 @@ SHJson::WValue &AcDbX3dSolid::ToJson() const bool AcDbX3dSolid::ByJson(const SHJson::WValue &v) { + // 反序列化尚未实现,ToJson 目前只能单向导出 return false; } diff --git a/SourceCode/Code2026/inc/AcDbX3dSolid.h b/SourceCode/Code2026/inc/AcDbX3dSolid.h index 560b380..05363fe 100644 --- a/SourceCode/Code2026/inc/AcDbX3dSolid.h +++ b/SourceCode/Code2026/inc/AcDbX3dSolid.h @@ -244,6 +244,7 @@ protected: AcGeVector3d m_vtDirXY; float m_fStair[3]; // Adesk::Int32 m_nKind; //类型 + Adesk::Int32 m_nGSMarker; //GSMarker,不序列化.不能与 m_sszPoint2ds 共用,后者在拉伸/放样/扫掠时存几何 //变换部分 AcGeVector3d m_vtMove; //总移动