////创建三维图形 ////三维长方体================== static void TESTaddboxcmd(){ AcDb3dSolid* pSolid = new AcDb3dSolid(); Acad::ErrorStatus es = pSolid->createBox(40,50,30); if(es != Acad::eOk){ acedAlert(_T("创建长方体失败")); delete pSolid; return; } //acedAlert(_T("创建成功")); ////使用几何变换矩阵移动长方体 AcGeMatrix3d xform; AcGeVector3d vec(100,100,100); xform.setToTranslation(vec); pSolid->transformBy(xform); LoadEntity(pSolid); } //三维圆锥============== static void TESTaddcylinedercmd(){ AcDb3dSolid* pSolid = new AcDb3dSolid(); pSolid->createFrustum(30,10,10,0); LoadEntity(pSolid); } ////三维弹簧 static void TESTaddspirecmd(){ ////半径和每周在垂直方向的增量 double radius,deltaVertical; ////螺旋线的旋转圈数和组成一圈 double number,segment; radius = 30,deltaVertical = 12; number = 5,segment = 30; ////计算点的个数和角度间隔 int n = number * segment; double angle = 8 * atan(1.0)/segment; ////计算控制点的坐标 AcGePoint3dArray points; for(int i = 0;i < n + 1;i ++){ AcGePoint3d vertex; vertex[X] = radius * cos(8 * i * atan(1.0) / segment); vertex[Y] = radius * sin(8 * i * atan(1.0) / segment); vertex[Z] = i * deltaVertical / segment; points.append(vertex); } ////创建螺旋路径 AcDb3dPolyline* p3dPoly = new AcDb3dPolyline(AcDb::k3dSimplePoly, points); AcDbObjectId spireId = LoadEntity(p3dPoly); ////这时已经创建了2D模型,增加3D圆截面 AcGeVector3d vec(0,1,0); AcGePoint3d ptCenter(30,0,0); AcDbCircle* pCircle = new AcDbCircle(ptCenter, vec,3); AcDbObjectId circleId = LoadEntity(pCircle); ////根据圆创建面域 AcDbObjectIdArray boundaryIds,regionIds; boundaryIds.append(circleId); regionIds = CreateRegion(boundaryIds); ////打开拉伸截面和拉伸路径 AcDbRegion* pRegion; acdbOpenObject(pRegion,regionIds.at(0),AcDb::kForRead); AcDb3dPolyline* pPoly; acdbOpenObject(pPoly,spireId,AcDb::kForRead); ////进行拉伸操作 AcDb3dSolid* pSolid = new AcDb3dSolid(); pSolid->extrudeAlongPath(pRegion,pPoly); LoadEntity(pSolid); pPoly->close(); pRegion->close(); } ////多段线形成面域旋转============= static void TESTaddreventcmd(){ AcGePoint3d vertex[5]; vertex[0] = AcGePoint3d(15,0,0); vertex[1] = AcGePoint3d(45,0,0); vertex[2] = AcGePoint3d(35,10,0); vertex[3] = AcGePoint3d(41,18,0); vertex[4] = AcGePoint3d(15,20,0); AcGePoint3dArray points; for(int i = 0;i < 5; i++){ points.append(vertex[i]); } ////创建作为旋转截面的多段线 AcDb3dPolyline* p3dPoly = new AcDb3dPolyline(AcDb::k3dSimplePoly,points,true); AcDbObjectId polyId = LoadEntity(p3dPoly); ////将闭合的多段线转化为面域 AcDbObjectIdArray boundaryIds,regionIds; boundaryIds.append(polyId); regionIds = CreateRegion(boundaryIds); ////进行旋转操作 AcDbRegion* pRegion; 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.0)); LoadEntity(pSolid); pRegion->close(); }