|
// [9/5/2007 suzhiyong] 【c++】ObjectARX 炸开三维实体
Acad::ErrorStatus PDEcone::explodeTo3DSolid(AcDb3dSolid* &p3dSolid) const
{
assertReadEnabled();
#ifdef _OBJECTARX2004_
Acad::ErrorStatus es = Acad::eOk;
int i = 0;
AcGeVector3d faceVect = getFaceVect();
AcDbCurve *pCurve = NULL;
AcDbVoidPtrArray curveSegments;
double pathLen = m_ptStart.distanceTo(m_ptEnd);
AcGePoint3d sp, ep;
double d1, d2;
if(m_dDiameter1 >= m_dDiameter2)
{
sp = m_ptStart;
ep = m_ptEnd;
d1 = m_dDiameter1;
d2 = m_dDiameter2;
}
else
{
sp = m_ptEnd;
ep = m_ptStart;
d1 = m_dDiameter2;
d2 = m_dDiameter1;
}
//extrudeAlongPath函数在由较大region拉成较小region时容易产生自交问题,所以
//炸开时选择由小的region拉成大的region
AcDbLine *pLine = new AcDbLine(ep, sp);
pLine->setPropertiesFrom(this);
pCurve = pLine;
if(pCurve != NULL)
{
if((es = addToDb(pCurve)) == Acad::eOk)
{
AcDbObjectId id;
id = pCurve->objectId();
pCurve->close();
if((es = acdbOpenObject((AcDbCurve*&)pCurve, id, AcDb::kForRead)) != Acad::eOk)
return Acad::eNotApplicable;
}
else
{
if(pCurve != NULL)
delete pCurve;
return Acad::eNotApplicable;
}
}
AcDbCircle sCir(ep, faceVect, d2 / 2.0);
curveSegments.append(&sCir);
AcDbVoidPtrArray regions;
es = AcDbRegion::createFromCurves(curveSegments, regions);
if(es == Acad::eOk && !regions.isEmpty())
{
AcDb3dSolid *pBody;
pBody = new AcDb3dSolid;
////求taper Angle
//AcGeVector3d vec1 = (m_ptStart-m_ptEnd);//.normal();
////m_dDiameter1和m_dDiameter2的大小问题
//AcGeVector3d perpVec = faceVect.perpVector()*((m_dDiameter1/2-m_dDiameter2/2));
//AcGePoint3d point2(m_ptStart.x+perpVec.x, m_ptStart.y+perpVec.y, m_ptStart.z+perpVec.z);
//AcGeVector3d vec2 = (point2 - m_ptEnd);//.normal();
////taperAngle为负时表示放大region,反之为缩小
//double angle = -1*vec1.angleTo(vec2);
////angle没有到达最大值时仍然有问题,建议不使用extrudeAlongPath函数
//taperAngle是指两个圆心连线垂直于圆面时的角度,大于0时表示缩小,小于0时表示放大
es = pBody->extrudeAlongPath((AcDbRegion*)(regions[0]), pCurve,//angle);
-1*atan((d1 / 2.0 - d2 / 2.0) / pathLen));
if(es != Acad::eOk)
{
if(pCurve != NULL)
{
pCurve->upgradeOpen();
pCurve->erase();
pCurve->close();
}
delete pBody;
for(i = 0; i < regions.length(); i++)
delete (AcRxObject*)regions[i];
return Acad::eNotApplicable;
}
pBody->setPropertiesFrom(this);
p3dSolid = pBody;
}
else
{
//.........这里部分代码省略...... |
|