天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 65|回复: 0

【c++】ObjectARX 炸开三维实体

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
//  [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
    {
//.........这里部分代码省略......

 

 

 

 

【c++】ObjectARX  炸开三维实体
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:28 , Processed in 0.129368 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表