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:
commit
01b21dfa0d
1 file changed
+37
-15
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user