原创辛苦,转载请注明!
编写一ObjectARX程序,使其能生成下图的三维实体,命令为MakeSolid。
圆柱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 BaiyangBaiyangMakeSolid()
{
// 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();
}