设为首页收藏本站

中国膜结构网

 找回密码
 立即注册
膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 55|回复: 1

C++ ARX二次开发-创建三维实体

[复制链接]
  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

    发表于 2021-2-16 10:37 | 显示全部楼层 |阅读模式
    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构咨询服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系QQ:463017170.
    具体内容
    1、思路:AcDb3dSolid类,提供一个不包含任何参数的构造函数,用来创建一个“空”的实体,在构建对象AcDb3dSolid之后,要使用其成员函数来完成实体的创建。

    (1)长方体:createBox函数用于创建长方体的,定义:

    virtual Acad::ErrorStatus createBox(

        double xLen,

        double yLen,

        double zLen

    );

    创建的是一个中心位于世界坐标系原点的长方体,长、宽和高分别平行于X、Y和Z轴。

    (2)圆锥体:

    virtual Acad::ErrorStatus createFrustum(

        double height,

        double xRadius,

        double yRadius,

        double topXRadius

    );//创建平截头体





    Height表示平截头体的高度,xRadius表示底面在X轴方向的半径,yRadius表示底面在y轴方向的半径,topXRadius表示顶面在X轴方向的半径。要创建圆锥体的话,topXRadius=0,xRadius=yRadius。

    (3)拉伸面域来创建实体

    virtual Acad::ErrorStatus extrudeAlongPath(

        const AcDbRegion* region,

        const AcDbCurve* path,

        double taperAngle = 0.0

    );

    (4)旋转面域来创建实体

    virtual Acad::ErrorStatus revolve(

        const AcDbRegion* region,

        const AcGePoint3d& axisPoint,

        const AcGeVector3d& axisDir,

        double angleOfRevolution

    );



    (5)布尔运算:

    virtual Acad::ErrorStatus booleanOper(

        AcDb::BoolOperType operation,

        AcDb3dSolid* solid

    );

    AcDb::kBoolUnite

    AcDb::kBoolIntersect

    AcDb::kBoolSubtract

    2、如何实现:

    ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddBox ,AddBox, ACRX_CMD_MODAL, NULL)

    ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddCylinder ,AddCylinder, ACRX_CMD_MODAL, NULL)

    ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddSpire ,AddSpire, ACRX_CMD_MODAL, NULL)



    //创建长方体

    static void YunyouMyGroupAddBox()

    {

    AcDb3dSolid *pSolid=new AcDb3dSolid();

    Acad::ErrorStatus es=pSolid->createBox(40,50,30);

    if (es!=Acad::eOk)

    {

    acedAlert(TEXT("创建长方体失败!"));

    delete pSolid;

    return;

    }

    AcGeMatrix3d xform;

    AcGeVector3d vec(100,100,100);

    xform.setToTranslation(vec);

    es=pSolid->transformBy(xform);

    CDwgDatabaseUtil:ostToModelSpace(pSolid);

    }

    //创建圆锥体

    static void YunyouMyGroupAddCylinder()

    {

    AcDb3dSolid *pSolid=new AcDb3dSolid();

    Acad::ErrorStatus es=pSolid->createFrustum(30,10,10,0);

    if (es!=Acad::eOk)

    {

    acedAlert(TEXT("创建失败!"));

    delete pSolid;

    return;

    }

    CDwgDatabaseUtil:ostToModelSpace(pSolid);

    }

    //创建弹簧螺旋线

    static void YunyouMyGroupAddSpire()

    {

    double radius,deltaVertical;

    int number,segment;

    radius=30,deltaVertical=12;

    number=5,segment=30;

    int n=number*segment;

    double angle=8*atan(1)/segment;

    AcGePoint3dArray points;

    for (int i=0;i<n+1;i++)

    {

    AcGePoint3d vertex;

    vertex[X]=radius*cos(8*i*atan(1)/segment);

    vertex[Y]=radius*sin(8*i*atan(1)/segment);

    vertex[Z]=i*deltaVertical/segment;

    points.append(vertex);

    }

    AcDb3dPolyline *p3dPoly=new AcDb3dPolyline(AcDb::k3dSimplePoly,points);

    AcDbObjectId spireId=CDwgDatabaseUtil:ostToModelSpace(p3dPoly);

    AcGeVector3d vec(0,1,0);

    AcGePoint3d ptCenter(30,0,0);

    AcDbCircle *pCircle=new AcDbCircle(ptCenter,vec,3);

    AcDbObjectId circleId=CDwgDatabaseUtil:ostToModelSpace(pCircle);

    AcDbObjectIdArray boundaryIds,regionIds;

    boundaryIds.append(circleId);

    regionIds=CRegionUtil::Add(boundaryIds);

    AcDbRegion *pRegion=NULL;

    if (acdbOpenObject(pRegion,regionIds.at(0),AcDb::kForRead)==Acad::eOk)

    {

    AcDb3dPolyline *pPoly=NULL;

    if (acdbOpenObject(pPoly,spireId,AcDb::kForRead)==Acad::eOk)

    {

    AcDb3dSolid *pSolid=new AcDb3dSolid();

    pSolid->extrudeAlongPath(pRegion,pPoly);

    CDwgDatabaseUtil:ostToModelSpace(pSolid);

    pPoly->close();

    }

    pRegion->close();

    }

    }
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-16 10:38 | 显示全部楼层
    1. AcdbPolyline的GetPointAt有两个:一个是获取二维点坐标(In OCS),一个是获取三维点坐标(In WCS)
    Acad::ErrorStatus

    getPointAt(

    unsigned int index,

    AcGePoint2d& pt) const;

    This function sets pt to the 2D location of the vertexindex in thepolyline's own ojbect coordinate system (OCS).



    Acad::ErrorStatus

    getPointAt(

    unsigned int unnamed,

    AcGePoint3d& pt) const;

    This function sets pt to the 3D location of the vertexindexin World Coordinates.



    如果AcdbPolyLine不在x/y平面上的话,我们可以看出来,他们是不完全对应的:

    例如下面的这个

    Point: x-670.8292, y-18.2542

    Point: x-670.8292, y-12.0000, z-18.2542



    二维、三维之间如何转换呢?借助matrix可以完成转换:我们借助两个函数
    AcDbEntity::getEcs Function

    virtual void

    getEcs(

    AcGeMatrix3d& retVal) const;

    retVal        Output filled in with transformation matrix to go from OCS to WCS


    AcDbPolyline::elevationFunction

    double

    elevation() const;

    This returns the distance from the WCS origin to the plane of the polyline.



    第一种方法: 通过getEcs获取其转换矩阵,通过elevation获取PLine线所在面 距 WCS原点的距离

    (我们通过GetPointAt获取二维点时,其实他们本身是缺省带有z坐标elevation的---也就是PLine线所在面 距 WCS原点的距离)

            AcGeMatrix3d matixToWCS;
            pPlineTop->getEcs(matixTransToWCS);       
            double dElevetion = pPlineTop->elevation();
    转换的时候:调用transformby,完成转换

    注:dElevetion作为了z坐标

    AcGePoint3d  pt3dPoint = AcGePoint3d(pt2dTemp.x, pt2dTemp.y, dElevetion).transformBy(matixToWCS);


    第二种方法: 把dElevetion也放到转换矩阵中来,直接转换

            AcGeMatrix3d matixToWCS;
            pPlineTop->getEcs(matixTransToWCS);       
            // 矩阵附加elevation的转换       
            matixTransToWCS *= AcGeMatrix3d::translation(AcGeVector3d::kZAxis * pPlineTop->elevation());       
                   
            AcGePoint3d pt3dPoint = AcGePoint3d(pt2dTemp.x, pt2dTemp.y, dElevToWCS).transformBy(matixToWCS);
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /5 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构协会

    QQ|申请友链|Archiver|手机版|中国膜结构论坛

    GMT+8, 2021-3-8 02:05 , Processed in 0.294145 second(s), 26 queries .

    Powered by 中国膜结构网->膜材采购->膜结构设计->膜结构安装->膜结构维修

    © 2014-2020 膜结构协会->进口膜材->国产膜材->PVDF膜材->PTFE膜材->ETFE膜材.

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