fix: AcDbX3dSolid 正确性小修(失败留痕/缓存失效/GSMarker/死代码)
- 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 补注释说明现状
This commit is contained in:
1 parent
10d1fc00c8
commit
f80ec56189
3 files changed
+54
-45
No files matched your search
@@ -3520,7 +3520,19 @@ AcDbRegion* CoreTools::StringToRegion(const CString & sRegionScrp)
|
|||||||
{
|
{
|
||||||
std::string sUtf8 = CoreTools::unicode2Ansii((LPCTSTR)sRegionScrp, CP_UTF8);
|
std::string sUtf8 = CoreTools::unicode2Ansii((LPCTSTR)sRegionScrp, CP_UTF8);
|
||||||
std::string sNewSrc;
|
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;
|
CFile file;
|
||||||
CString sFullPath = MakeTempSatPath();
|
CString sFullPath = MakeTempSatPath();
|
||||||
@@ -3569,7 +3581,17 @@ AcDbRegion* CoreTools::StringToRegion(const CString & sRegionScrp)
|
|||||||
AcDbRegion *CoreTools::StringToRegion(Adesk::UInt64 nLen, char *pszReg)
|
AcDbRegion *CoreTools::StringToRegion(Adesk::UInt64 nLen, char *pszReg)
|
||||||
{
|
{
|
||||||
std::string sNewSrc;
|
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);
|
AcDbRegion *pReg(NULL);
|
||||||
CString sFullPath = MakeTempSatPath();
|
CString sFullPath = MakeTempSatPath();
|
||||||
|
|||||||
@@ -225,13 +225,14 @@ AcDbX3dSolid::AcDbX3dSolid(void)
|
|||||||
m_pSubDMeshDraw = NULL;
|
m_pSubDMeshDraw = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_sszPoint2ds = _T("-1");
|
m_sszPoint2ds = _T("");
|
||||||
m_dH = 0.0;
|
m_dH = 0.0;
|
||||||
m_dT = 0.0;
|
m_dT = 0.0;
|
||||||
m_dW = 0.0;
|
m_dW = 0.0;
|
||||||
m_sScr = _T("");
|
m_sScr = _T("");
|
||||||
m_dLen = 0.0;
|
m_dLen = 0.0;
|
||||||
memset(m_fStair,0,sizeof(float) * 3);
|
memset(m_fStair,0,sizeof(float) * 3);
|
||||||
|
m_nGSMarker = -1;
|
||||||
|
|
||||||
m_nSatLen = 0;
|
m_nSatLen = 0;
|
||||||
m_pSatBuffer = NULL;
|
m_pSatBuffer = NULL;
|
||||||
@@ -259,6 +260,7 @@ AcDbX3dSolid::AcDbX3dSolid(const AcDbX3dSolid& xSolid)
|
|||||||
m_vtDirXY = xSolid.m_vtDirXY;
|
m_vtDirXY = xSolid.m_vtDirXY;
|
||||||
memcpy(m_fStair,xSolid.m_fStair,sizeof(float) * 3);
|
memcpy(m_fStair,xSolid.m_fStair,sizeof(float) * 3);
|
||||||
m_nKind = xSolid.m_nKind; //类型
|
m_nKind = xSolid.m_nKind; //类型
|
||||||
|
m_nGSMarker = -1; //GSMarker 不随 Clone 传递
|
||||||
|
|
||||||
//变换部分
|
//变换部分
|
||||||
m_vtMove = xSolid.m_vtMove; //总移动
|
m_vtMove = xSolid.m_vtMove; //总移动
|
||||||
@@ -3896,37 +3898,9 @@ AcDbSubDMesh* AcDbX3dSolid::GetDrawSubDMesh() const
|
|||||||
|
|
||||||
EnsureCreated();
|
EnsureCreated();
|
||||||
if (!m_pSubDMesh) return NULL;
|
if (!m_pSubDMesh) return NULL;
|
||||||
|
|
||||||
|
// 移动和旋转操作在Group内完成,这里只返回未变换的副本
|
||||||
return (AcDbSubDMesh*)m_pSubDMesh->clone();
|
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<AcGeLineSeg3d> &ar) const
|
void AcDbX3dSolid::GetDrawSubDMesh2D(AcArray<AcGeLineSeg3d> &ar) const
|
||||||
@@ -3939,6 +3913,7 @@ void AcDbX3dSolid::GetDrawSubDMesh2D(AcArray<AcGeLineSeg3d> &ar) const
|
|||||||
|
|
||||||
bool AcDbX3dSolid::GetDraw2d(AcDbVoidPtrArray& arCurPtrs)
|
bool AcDbX3dSolid::GetDraw2d(AcDbVoidPtrArray& arCurPtrs)
|
||||||
{
|
{
|
||||||
|
// 本类只负责三维几何,二维表达由外层 AecDbXxx 实体自己绘制
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3973,16 +3948,14 @@ int AcDbX3dSolid::SetActiveFace(int nFace)
|
|||||||
|
|
||||||
void AcDbX3dSolid::SetGSMarkerID(Adesk::Int32 nMarker)
|
void AcDbX3dSolid::SetGSMarkerID(Adesk::Int32 nMarker)
|
||||||
{
|
{
|
||||||
//当AcDbX3dSolid不用在拉伸体时 gsmarker共用m_sszPoint2ds
|
// 独立成员保存:m_sszPoint2ds 在 kExtrude/kLoft/kSweep 等类型里存断面/路径串,
|
||||||
//m_sszPoint2ds
|
// 直接覆盖会让 ReCreate 拿到一串数字,几何静默丢失。
|
||||||
m_sszPoint2ds.Format(_T("%d"),nMarker);
|
m_nGSMarker = nMarker;
|
||||||
}
|
}
|
||||||
|
|
||||||
Adesk::Int32 AcDbX3dSolid::GetGSMarkerID() const
|
Adesk::Int32 AcDbX3dSolid::GetGSMarkerID() const
|
||||||
{
|
{
|
||||||
if (m_sszPoint2ds.IsEmpty())
|
return m_nGSMarker;
|
||||||
return -1;
|
|
||||||
return _ttoi(m_sszPoint2ds);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AcDbX3dSolid::SetOrgPoint(const AcGePoint3d & pt)
|
void AcDbX3dSolid::SetOrgPoint(const AcGePoint3d & pt)
|
||||||
@@ -4173,6 +4146,18 @@ Acad::ErrorStatus AcDbX3dSolid::ReCreate()
|
|||||||
DELETE_PTR(m_pSolid);
|
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)
|
switch(m_eType)
|
||||||
{
|
{
|
||||||
@@ -5471,6 +5456,7 @@ SHJson::WValue &AcDbX3dSolid::ToJson() const
|
|||||||
|
|
||||||
bool AcDbX3dSolid::ByJson(const SHJson::WValue &v)
|
bool AcDbX3dSolid::ByJson(const SHJson::WValue &v)
|
||||||
{
|
{
|
||||||
|
// 反序列化尚未实现,ToJson 目前只能单向导出
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -244,6 +244,7 @@ protected:
|
|||||||
AcGeVector3d m_vtDirXY;
|
AcGeVector3d m_vtDirXY;
|
||||||
float m_fStair[3]; //
|
float m_fStair[3]; //
|
||||||
Adesk::Int32 m_nKind; //类型
|
Adesk::Int32 m_nKind; //类型
|
||||||
|
Adesk::Int32 m_nGSMarker; //GSMarker,不序列化.不能与 m_sszPoint2ds 共用,后者在拉伸/放样/扫掠时存几何
|
||||||
|
|
||||||
//变换部分
|
//变换部分
|
||||||
AcGeVector3d m_vtMove; //总移动
|
AcGeVector3d m_vtMove; //总移动
|
||||||
|
|||||||
Reference in new issue
Block a user