Merge pull request '修复 GiDrawUtility 逻辑缺陷 L7、B2-B5' (#65) from home-lenovo-legion-r9000/fix-gidrawutility-l7-b2-b5 into main

Reviewed-on: #65
Reviewed-by: gjm <littleoldpan@163.com>
This commit was merged in pull request #65.
This commit is contained in:
gjm committed 2026-10-25 18:48:15 +08:00
commit 01b21dfa0d
1 file changed
+37 -15
+37 -15
View File
@@ -111,6 +111,22 @@ namespace
return true;
}
// createFromCurves 可能返回多个 region(自交轮廓等),只保留第一个,其余就地释放
AcDbRegion* TakeFirstRegion(AcDbVoidPtrArray &regions)
{
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;