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;