ObjectARX_AcDb3dSolid 三維實體

建立三維實體的方法:建立標準形狀的實體、拉伸面域建立實體、旋轉面域建立實體。數組

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();
}
相關文章
相關標籤/搜索