建立三維實體的方法:建立標準形狀的實體、拉伸面域建立實體、旋轉面域建立實體。數組
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(); }