天气与日历 切换到窄版

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

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
具体内容
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::PostToModelSpace(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::PostToModelSpace(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::PostToModelSpace(p3dPoly);

AcGeVector3d vec(0,1,0);

AcGePoint3d ptCenter(30,0,0);

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

AcDbObjectId circleId=CDwgDatabaseUtil::PostToModelSpace(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::PostToModelSpace(pSolid);

pPoly->close();

}

pRegion->close();

}

}

 

 

 

 

C++ ARX二次开发-创建三维实体
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 15:20 , Processed in 0.182535 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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