建立三维实体的方法:建立标准形状的实体、拉伸面域建立实体、旋转面域建立实体。数组
AcDb3dSolid 类用于表明 AutoCAD 中的三维实体,提供了建立和合并实体的一些方法。可是 ACIS 实体才是实体真正的几何表示, AcDb3dSolid 类只是 ACIS 实体的容器和接口, 该类中并无提供直接操做 ACIS实体边、顶点和面的方法。要遍历 ACIS 实体中隐含(没法直接访问子实体)的边、面和顶点,必须使用 ObjectARX 开发包中的 BREP 应用程序开发接口(API) 。app
长方体:createBox函数
createBox函数定义为:.net
virtual Acad::ErrorStatus createBox(double xLen, double yLen, double zLen);
第一个参数:xLen:长方体的长;第二个参数:yLen:长方体的宽;第三个参数:zLen:长方体的高。 3d
void AddBox() { AcDb3dSolid *pSolid = new AcDb3dSolid(); Acad::ErrorStatus es = pSolid->createBox(40, 50, 30); if (es != Acad::eOk) { acedAlert("建立长方体失败!"); delete pSolid; return; } // 使用几何变换矩阵移动长方体 AcGeMatrix3d xform; AcGeVector3d vec(100, 100, 100); xform.setToTranslation(vec); pSolid->transformBy(xform); // 将长方体添加到模型空间 PostToModelSpace(pSolid); }
圆锥体: createFrustumcode
createFrustum 函数定义为:orm
virtual Acad::ErrorStatus createFrustum(double height,double xRadius,double yRadius,double topXRadius);
第一个参数:height:平截头体的高度;第二个参数:xRadius:底面在 X 轴方向的半径;第三个参数:yRadius:底面在 Y轴方向的半径;第四个参数:topXRadius:顶面在 X 轴方向的半径;(圆锥时topXRadius为0, xRadius 和 yRadius 的值相等)。blog
Void AddCylinder() { // 建立特定参数的圆柱体(其实是一个圆锥体) AcDb3dSolid *pSolid = new AcDb3dSolid(); pSolid->createFrustum(30, 10, 10, 0); // 将圆锥体添加到模型空间 PostToModelSpace(pSolid); }
弹簧:接口
Void AddSpire() { // 指定建立螺旋线的参数 double radius = 30; // 半径 double deltaVertical = 12;//每一圈在垂直方向的增量 int number = 5;//螺旋线的旋转圈数 int segment = 30; //组成一圈的分段数 // 计算点的个数和角度间隔 int n = number * segment; // 点的个数其实是n+1 double angle = 8 * atan(1) / segment; // 两点之间的旋转角度(atan(1)其值为π/4) // 计算控制点的坐标 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 = PostToModelSpace(p3dPoly); // 建立一个圆做为拉伸的截面 AcGeVector3d vec(0, 1, 0); // 圆所在平面的法矢量 AcGePoint3d ptCenter(30, 0, 0); // 圆心位置与半径的大小有关 AcDbCircle *pCircle = new AcDbCircle(ptCenter, vec, 3); AcDbObjectId circleId = PostToModelSpace(pCircle); // 根据圆建立一个面域 AcDbObjectIdArray boundaryIds, regionIds; boundaryIds.append(circleId); regionIds = CreateRegion(boundaryIds); // 打开拉伸截面和拉伸路径 AcDbRegion *pRegion = NULL; acdbOpenObject(pRegion, regionIds.at(0), AcDb::kForRead); AcDb3dPolyline *pPoly = NULL; acdbOpenObject(pPoly, spireId, AcDb::kForRead); // 进行拉伸操做 AcDb3dSolid *pSolid = new AcDb3dSolid(); pSolid->extrudeAlongPath(pRegion, pPoly); PostToModelSpace(pSolid); pPoly->close(); pRegion->close(); }
CreateRegion()函数建立一个面域,具体封装在http://www.javashuo.com/article/p-btcbjatc-ka.htmlci
皮带轮:
void RevolveEnt() { AcGePoint3d vertex[5]; vertex[0] = AcGePoint3d(15, 0, 0); vertex[2] = AcGePoint3d(45, 0, 0); vertex[2] = AcGePoint3d(35, 9, 0); vertex[3] = AcGePoint3d(41, 18, 0); vertex[4] = AcGePoint3d(15, 18, 0); AcGePoint3dArray points; for (int i = 0; i <= 4; i++) { points.append(vertex[i]); } // 建立做为旋转截面的多段线 AcDb3dPolyline *p3dPoly = new AcDb3dPolyline(AcDb::k3dSimplePoly,points, true); AcDbObjectId polyId = PostToModelSpace(p3dPoly); // 将闭合的多段线转化成面域 AcDbObjectIdArray boundaryIds, regionIds; boundaryIds.append(polyId); regionIds = CreateRegion(boundaryIds); // 进行旋转操做 AcDbRegion *pRegion = NULL; Acad::ErrorStatus es = acdbOpenObject(pRegion, regionIds.at(0),AcDb::kForRead); AcDb3dSolid *pSolid = new AcDb3dSolid(); es = pSolid->revolve(pRegion, AcGePoint3d::kOrigin,AcGeVector3d(0, 1, 0), 8 * atan(1)); PostToModelSpace(pSolid); pRegion->close(); }
长方形布尔:
void Boolean() { // 建立两个长方体 AcDb3dSolid *pSolid1 = new AcDb3dSolid(); pSolid1->CreateBox(40, 50, 30); AcDb3dSolid *pSolid2 = new AcDb3dSolid(); pSolid2->createBox(40, 50, 30); // 使用几何变换矩阵移动长方体 AcGeMatrix3d xform; AcGeVector3d vec(20, 25, 15); xform.setToTranslation(vec); pSolid1->transformBy(xform); // 将长方体添加到模型空间 AcDbObjectId solidId1 = PostToModelSpace(pSolid1); AcDbObjectId solidId2 = PostToModelSpace(pSolid2); // 进行布尔运算,生成新的实体 acdbOpenObject(pSolid1, solidId1, AcDb::kForWrite); acdbOpenObject(pSolid2, solidId2, AcDb::kForWrite); Acad::ErrorStatus es = pSolid1->booleanOper(AcDb::kBoolUnite,pSolid2); assert(pSolid2->isNull()); pSolid2->erase(); // 将其删除 pSolid2->close();// 删除以后仍是须要关闭该实体 pSolid1->close(); }