天气与日历 切换到窄版

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

ARX方式创建三维实体

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
编写一ObjectARX程序,使其能生成下图的三维实体,命令为MakeSolid。
[img]https://img-my.csdn.net/uploads/201212/08/1354967358_8981.png[/img]

圆柱1:直径100,高度200;

圆柱2:直径50,长度200;

圆柱3:直径30,长度200;

球1:直径150;

方盒:端面为60×60正方形,高度200。

具体代码如下:原创辛苦,转载请注明!





MakeSolid.cpp

//
// ObjectARX defined commands

#include "StdAfx.h"
#include "StdArx.h"

// This is command 'MAKESOLID'
void XXXXXMakeSolid()
{
        // TODO: Implement the command
        //创建对象并设置属性
        AcDb3dSolid *pSphere1=new AcDb3dSolid();
        //创建一个直径150的球体,球心默认为在原点
        pSphere1->createSphere(75);
        //创建一个圆柱实体1,高200,X方向半径为50,y方向半径为50
        AcDb3dSolid *pFrustum1=new AcDb3dSolid();
        pFrustum1->createFrustum(200,50,50,50);

        //创建圆柱实体2,高200,直径为50
        AcDb3dSolid *pFrustum2=new AcDb3dSolid();
        pFrustum2->createFrustum(200,25,25,25);

        //创建圆柱实体3,高200,直径为30
        AcDb3dSolid *pFrustum3=new AcDb3dSolid();
        pFrustum3->createFrustum(200,15,15,15);

        //创建圆柱实体1中需要挖去的立方体
        //立方体高200,底部为60X60的正方形
        AcDb3dSolid *pBox1=new AcDb3dSolid();
        pBox1->createBox(60,60,200);
        //上面创建的实体中心均默认为在原点,需要进行旋转、平移等操作
        //才能得到最后的图

        //对各个实体进行旋转、平移
        double PI=3.1415926;
        AcGeMatrix3d mr;//进行旋转操作的矩阵
        AcGeVector3d v(0,1,0);//沿Y轴旋转
        AcGePoint3d center(0,0,0);//进行旋转操作的中心
        mr.setToRotation(PI/2.0,v,center);//旋转方式设置为以原点为中心
        //沿Y轴旋转,旋转方向默认为逆时针

        //旋转圆柱体2、3
        pFrustum2->transformBy(mr);
        pFrustum3->transformBy(mr);

        //布尔运算求并
        //将球体、圆柱体1、圆柱体2并成一个实体并存到圆柱实体2的指针中
        pFrustum2->booleanOper(AcDb::kBoolUnite,pSphere1);
        pFrustum2->booleanOper(AcDb::kBoolUnite,pFrustum1);
       
        //将圆柱实体3、立方体1并成一个实体
        pFrustum3->booleanOper(AcDb::kBoolUnite,pBox1);

        //用并后的实体2减去并后的实体3
        pFrustum2->booleanOper(AcDb::kBoolSubtract,pFrustum3);

        //获取当前图形的块表指针
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable
                (pBlockTable,AcDb::kForRead);

        //获取当前图形的块表记录指针
        AcDbBlockTableRecord *pBlockTableRecord;
        pBlockTable->getAt(ACDB_MODEL_SPACE,
                pBlockTableRecord,AcDb::kForWrite);
        //关闭块表指针
        pBlockTable->close();
        //将对象写入块表记录指针
        AcDbObjectId pFrustum2ID;
        pBlockTableRecord->appendAcDbEntity(pFrustum2ID,pFrustum2);
       
        //写入完毕,关闭块表记录指针
        pBlockTableRecord->close();
        //设置图层
        pFrustum2->setLayer("0");
        //关闭之前创建所有对象
        pSphere1->close();
        pFrustum1->close();
        pFrustum2->close();
        pFrustum3->close();
        pBox1->close();
}

 

 

 

 

ARX方式创建三维实体
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 15:34 , Processed in 0.143842 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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