2019独角兽企业重金招聘Python工程师标准>>>

创建三维实体的方法:创建标准形状的实体、拉伸面域创建实体、旋转面域创建实体。

AcDb3dSolid 类用于代表 AutoCAD 中的三维实体,提供了创建和合并实体的一些方法。但是 ACIS 实体才是实体真正的几何表示, AcDb3dSolid 类只是 ACIS 实体的容器和接口, 该类中并没有提供直接操作 ACIS实体边、顶点和面的方法。要遍历 ACIS 实体中隐含(无法直接访问子实体)的边、面和顶点,必须使用 ObjectARX 开发包中的 BREP 应用程序开发接口(API) 。

长方体:createBox

createBox函数定义为:

virtual Acad::ErrorStatus createBox(double xLen, double yLen, double zLen);

第一个参数:xLen:长方体的长;第二个参数:yLen:长方体的宽;第三个参数:zLen:长方体的高。  

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);
}

圆锥体: createFrustum

createFrustum 函数定义为:

virtual Acad::ErrorStatus createFrustum(double height,double xRadius,double yRadius,double topXRadius);

第一个参数:height:平截头体的高度;第二个参数:xRadius:底面在 X 轴方向的半径;第三个参数:yRadius:底面在 Y轴方向的半径;第四个参数:topXRadius:顶面在 X 轴方向的半径;(圆锥时topXRadius为0, xRadius 和 yRadius 的值相等)。

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()函数创建一个面域,具体封装在https://my.oschina/u/2930533/blog/1591427

皮带轮:

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();
}

 

转载于:https://my.oschina/u/2930533/blog/1595283

更多推荐

ObjectARX_AcDb3dSolid 三维实体