From 14d3ff43c9945167c66ea7ed681a3894b522fc60 Mon Sep 17 00:00:00 2001 From: LittleGuo Date: Sun, 25 Oct 2026 18:46:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20GiDrawUtility=20=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E7=BC=BA=E9=99=B7=20L7=E3=80=81B2-B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - L7: 新增 TakeFirstRegion,createFromCurves 返回多个 region 时只取第一个并释放其余, createRegion(AcDbEntity*)、DrawDish、DrawPipe(curve,dR) 三处统一走此路径; DrawDish 同时在 DrawRevolve 失败时释放 region。 - B2: RotateAndMove 的零向量防护原为 "*= 1" 空操作,改为显式判零并退化为 Z 轴。 - B3: DrawTydf 的 tfdy 分支截面各自平移后未更新引导线,改为重设端点到变换后的截面中心。 - B4: DrawMesh 增加入参校验(pVertexList 非空、rows>=2、columns>=3),避免越界读与空截面。 - B5: DrawRevolve 建 region 失败时不再往模型空间塞红色曲线,改为直接释放克隆对象。 --- .../Code2026/AecRxBase/GiDrawUtility.cpp | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/SourceCode/Code2026/AecRxBase/GiDrawUtility.cpp b/SourceCode/Code2026/AecRxBase/GiDrawUtility.cpp index dc97d48..ea4b36b 100644 --- a/SourceCode/Code2026/AecRxBase/GiDrawUtility.cpp +++ b/SourceCode/Code2026/AecRxBase/GiDrawUtility.cpp @@ -111,6 +111,22 @@ namespace return true; } + // createFromCurves 可能返回多个 region(自交轮廓等),只保留第一个,其余就地释放 + AcDbRegion* TakeFirstRegion(AcDbVoidPtrArray ®ions) + { + if (regions.isEmpty()) return NULL; + + AcDbRegion *pFirst = (AcDbRegion *)regions.first(); + regions.removeFirst(); + while (!regions.isEmpty()) + { + AcDbRegion *p = (AcDbRegion *)regions.last(); + regions.removeLast(); + delete p; + } + return pFirst; + } + AcDbRegion* createRegion(AcDbEntity *pEnt) { AcDbVoidPtrArray arr, segs; @@ -121,7 +137,7 @@ namespace { return NULL; } - return (AcDbRegion*)segs[0]; + return TakeFirstRegion(segs); } @@ -176,10 +192,9 @@ AECDLLIMPEXP AcGeMatrix3d GiDrawUtility::RotateAndMove(const AcGeVector3d &vtOri , const AcGeVector3d &vtDist , const AcGePoint3d &ptDist) { - AcGeVector3d _vtOrig(vtOrig); - AcGeVector3d _vtDist(vtDist); - _vtOrig *= 1;// 保证长度不为0 - _vtDist *= 1;// 保证长度不为0 + // 零向量无法确定旋转方向,退化为 Z 轴(与本函数既有调用都以 Z 轴为基准一致) + AcGeVector3d _vtOrig(vtOrig.isZeroLength() ? AcGeVector3d::kZAxis : vtOrig); + AcGeVector3d _vtDist(vtDist.isZeroLength() ? AcGeVector3d::kZAxis : vtDist); AcGeMatrix3d mat(AcGeMatrix3d::kIdentity); //mat = _vtDist.rotateTo(_vtOrig); mat = _vtOrig.rotateTo(_vtDist); @@ -292,9 +307,7 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawRevolve(const AcDbLine& lnAxis AcDbRegion *pReg = createRegion(_pC); if (!pReg) { - //DELETE_PTR(_pC); - _pC->setColorIndex(1); - AddToModelSpace(_pC); + DELETE_PTR(_pC); return NULL; } AcDbEntity *p = DrawRevolve(lnAxis, pReg); @@ -351,6 +364,13 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawMesh( const Adesk::UInt32 &rows , const AcGePoint3d *pVertexList , bool bHasSeal /* = true*/) { + // rows 少于 2 时没有可放样的截面,columns 少于 3 时截面不构成闭合轮廓 + if (!pVertexList || rows < 2 || columns < 3) + { + acutPrintf(_T("\nDrawMesh 参数无效:rows=%u, columns=%u."), rows, columns); + return NULL; + } + // 去掉头尾两个无效面 int first = 1, last = rows - 1; if (!bHasSeal) @@ -589,6 +609,10 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawTydf(const AcGePoint3d &ptPos cir.transformBy(xForm1); ptTop.transformBy(xForm1); + // 两个截面已各自平移,引导线须重新连到变换后的截面中心 + line.setStartPoint(ptBottom); + line.setEndPoint(ptTop); + p = DrawLoft(&plBottom, &cir, &line); } else @@ -673,19 +697,19 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawDish(const double &dH /*小半径*/ arCurves.append(&elArc); if (AcDbRegion::createFromCurves(arCurves, arRegs) != Acad::eOk) return NULL; - if (arRegs.isEmpty()) return NULL; + AcDbRegion *pReg = TakeFirstRegion(arRegs); + if (!pReg) return NULL; AcDbEntity *p = DrawRevolve( AcDbLine(AcGePoint3d::kOrigin , AcGePoint3d::kOrigin + AcGeVector3d::kZAxis * 1) - , (AcDbRegion*)arRegs[0]); + , pReg); + DELETE_PTR(pReg); if (!p) return NULL; AcGeMatrix3d mat = RotateAndMove(AcGeVector3d::kZAxis, AcGePoint3d::kOrigin, axisDir, axisPnt); p->transformBy(mat); - AcDbEntity *pDel((AcDbEntity*)arRegs[0]); - DELETE_PTR(pDel); return p; } @@ -830,9 +854,7 @@ AcDbEntity* GiDrawUtility::DrawPipe(const AcDbCurve *pCurve, double dR) arCurPts.append(&cir); AcDbRegion::createFromCurves(arCurPts, arRegs); - if (arRegs.isEmpty()) return NULL; - - AcDbRegion *pReg = (AcDbRegion *)arRegs.first(); + AcDbRegion *pReg = TakeFirstRegion(arRegs); if (!pReg) return NULL; Acad::ErrorStatus es; -- 2.54.0