修复 GiDrawUtility 逻辑缺陷 L7、B2-B5 #65
@@ -111,6 +111,22 @@ namespace
|
|||||||
return true;
|
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)
|
AcDbRegion* createRegion(AcDbEntity *pEnt)
|
||||||
{
|
{
|
||||||
AcDbVoidPtrArray arr, segs;
|
AcDbVoidPtrArray arr, segs;
|
||||||
@@ -121,7 +137,7 @@ namespace
|
|||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return (AcDbRegion*)segs[0];
|
return TakeFirstRegion(segs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -176,10 +192,9 @@ AECDLLIMPEXP AcGeMatrix3d GiDrawUtility::RotateAndMove(const AcGeVector3d &vtOri
|
|||||||
, const AcGeVector3d &vtDist
|
, const AcGeVector3d &vtDist
|
||||||
, const AcGePoint3d &ptDist)
|
, const AcGePoint3d &ptDist)
|
||||||
{
|
{
|
||||||
AcGeVector3d _vtOrig(vtOrig);
|
// 零向量无法确定旋转方向,退化为 Z 轴(与本函数既有调用都以 Z 轴为基准一致)
|
||||||
AcGeVector3d _vtDist(vtDist);
|
AcGeVector3d _vtOrig(vtOrig.isZeroLength() ? AcGeVector3d::kZAxis : vtOrig);
|
||||||
_vtOrig *= 1;// 保证长度不为0
|
AcGeVector3d _vtDist(vtDist.isZeroLength() ? AcGeVector3d::kZAxis : vtDist);
|
||||||
_vtDist *= 1;// 保证长度不为0
|
|
||||||
AcGeMatrix3d mat(AcGeMatrix3d::kIdentity);
|
AcGeMatrix3d mat(AcGeMatrix3d::kIdentity);
|
||||||
//mat = _vtDist.rotateTo(_vtOrig);
|
//mat = _vtDist.rotateTo(_vtOrig);
|
||||||
mat = _vtOrig.rotateTo(_vtDist);
|
mat = _vtOrig.rotateTo(_vtDist);
|
||||||
@@ -292,9 +307,7 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawRevolve(const AcDbLine& lnAxis
|
|||||||
AcDbRegion *pReg = createRegion(_pC);
|
AcDbRegion *pReg = createRegion(_pC);
|
||||||
if (!pReg)
|
if (!pReg)
|
||||||
{
|
{
|
||||||
//DELETE_PTR(_pC);
|
DELETE_PTR(_pC);
|
||||||
_pC->setColorIndex(1);
|
|
||||||
AddToModelSpace(_pC);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AcDbEntity *p = DrawRevolve(lnAxis, pReg);
|
AcDbEntity *p = DrawRevolve(lnAxis, pReg);
|
||||||
@@ -351,6 +364,13 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawMesh( const Adesk::UInt32 &rows
|
|||||||
, const AcGePoint3d *pVertexList
|
, const AcGePoint3d *pVertexList
|
||||||
, bool bHasSeal /* = true*/)
|
, 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;
|
int first = 1, last = rows - 1;
|
||||||
if (!bHasSeal)
|
if (!bHasSeal)
|
||||||
@@ -589,6 +609,10 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawTydf(const AcGePoint3d &ptPos
|
|||||||
cir.transformBy(xForm1);
|
cir.transformBy(xForm1);
|
||||||
ptTop.transformBy(xForm1);
|
ptTop.transformBy(xForm1);
|
||||||
|
|
||||||
|
// 两个截面已各自平移,引导线须重新连到变换后的截面中心
|
||||||
|
line.setStartPoint(ptBottom);
|
||||||
|
line.setEndPoint(ptTop);
|
||||||
|
|
||||||
p = DrawLoft(&plBottom, &cir, &line);
|
p = DrawLoft(&plBottom, &cir, &line);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -673,19 +697,19 @@ AECDLLIMPEXP AcDbEntity* GiDrawUtility::DrawDish(const double &dH /*小半径*/
|
|||||||
arCurves.append(&elArc);
|
arCurves.append(&elArc);
|
||||||
if (AcDbRegion::createFromCurves(arCurves, arRegs) != Acad::eOk)
|
if (AcDbRegion::createFromCurves(arCurves, arRegs) != Acad::eOk)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (arRegs.isEmpty()) return NULL;
|
AcDbRegion *pReg = TakeFirstRegion(arRegs);
|
||||||
|
if (!pReg) return NULL;
|
||||||
|
|
||||||
AcDbEntity *p = DrawRevolve(
|
AcDbEntity *p = DrawRevolve(
|
||||||
AcDbLine(AcGePoint3d::kOrigin , AcGePoint3d::kOrigin + AcGeVector3d::kZAxis * 1)
|
AcDbLine(AcGePoint3d::kOrigin , AcGePoint3d::kOrigin + AcGeVector3d::kZAxis * 1)
|
||||||
, (AcDbRegion*)arRegs[0]);
|
, pReg);
|
||||||
|
DELETE_PTR(pReg);
|
||||||
|
|
||||||
if (!p) return NULL;
|
if (!p) return NULL;
|
||||||
|
|
||||||
AcGeMatrix3d mat = RotateAndMove(AcGeVector3d::kZAxis, AcGePoint3d::kOrigin, axisDir, axisPnt);
|
AcGeMatrix3d mat = RotateAndMove(AcGeVector3d::kZAxis, AcGePoint3d::kOrigin, axisDir, axisPnt);
|
||||||
p->transformBy(mat);
|
p->transformBy(mat);
|
||||||
|
|
||||||
AcDbEntity *pDel((AcDbEntity*)arRegs[0]);
|
|
||||||
DELETE_PTR(pDel);
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -830,9 +854,7 @@ AcDbEntity* GiDrawUtility::DrawPipe(const AcDbCurve *pCurve, double dR)
|
|||||||
arCurPts.append(&cir);
|
arCurPts.append(&cir);
|
||||||
|
|
||||||
AcDbRegion::createFromCurves(arCurPts, arRegs);
|
AcDbRegion::createFromCurves(arCurPts, arRegs);
|
||||||
if (arRegs.isEmpty()) return NULL;
|
AcDbRegion *pReg = TakeFirstRegion(arRegs);
|
||||||
|
|
||||||
AcDbRegion *pReg = (AcDbRegion *)arRegs.first();
|
|
||||||
if (!pReg) return NULL;
|
if (!pReg) return NULL;
|
||||||
|
|
||||||
Acad::ErrorStatus es;
|
Acad::ErrorStatus es;
|
||||||
|
|||||||
Reference in new issue
Block a user