4、c++ Arx二次開發創建多段線


一、本節課程

c++ Arx二次開發創建多段線

二、本節要講解的知識點

   如何應用C++ ARX二次開發創建多段線(AcDbPolylineAcDb2dPolyLineAcDb3dPolyline的使用)

三、具體內容

1ARX提供了三種多段線相關的類:AcDbPolylineAcDb2dPolyLineAcDb3dPolylinePLINE 創建的是AcDbPolyline3DPOLY創建AcDb3dPolyline。創建一般的輕量多段線只需要調用AcDbPolyline的構造函數即可,創建矩形、正多邊形、圓形、圓環對象,關鍵在於頂點和凸度的確定。

2、添加多段線對象的函數實現:

AcDbObjectId CPolylineUtil::Add(const AcGePoint2dArray &points,double width)

{

int numVertices=points.length();

AcDbPolyline *pPoly=new AcDbPolyline(numVertices);

for (int i=0;i<numVertices;i++)

{

pPoly->addVertexAt(i,points.at(i),0,width,width);

}

return CDwgDatabaseUtil::PostToModelSpace(pPoly);

}

 

AcDbObjectId CPolylineUtil::Add(const AcGePoint2d &ptStart,const AcGePoint2d &ptEnd,double width)

{

AcGePoint2dArray points;

points.append(ptStart);

points.append(ptEnd);

return Add(points,width);

}

AcDbObjectId CPolylineUtil::Add3dPolyline(const AcGePoint3dArray &points)

{

AcGePoint3dArray verts=points;

AcDb3dPolyline *pPoly3d=new AcDb3dPolyline(AcDb::k3dSimplePoly,verts);

return CDwgDatabaseUtil::PostToModelSpace(pPoly3d);

}

AcDbObjectId  CPolylineUtil::AddPolygon(const AcGePoint2d &ptCenter,int number,double radius,double rotation,double width)

{

double angle=2*CMathUtil::PI()/(double)number;

AcGePoint2dArray points;

for (int i=0;i<number;i++)

{

AcGePoint2d pt;

pt.x=ptCenter.x+radius*cos(i*angle);

pt.y=ptCenter.y+radius*sin(i*angle);

points.append(pt);

 

}

AcDbObjectId polyId=Add(points,width);

 

AcDbEntity *pEnt=NULL;

if (acdbOpenObject(pEnt,polyId,AcDb::kForWrite)==Acad::eOk)

{

AcDbPolyline *pPoly=AcDbPolyline::cast(pEnt);

if (pPoly!=NULL)

{

pPoly->setClosed(Adesk::kTrue);

}

pEnt->close();

 

}

EntityUtil::Rotate(polyId,ptCenter,rotation);

return polyId;

}

AcDbObjectId CPolylineUtil::AddRectangle(const AcGePoint2d &pt1,const AcGePoint2d &pt2,double width)

{

 

double x1=pt1.x,x2=pt2.x;

double y1=pt1.y,y2=pt2.y;

 

AcGePoint2d ptLeftBottom(min(x1,x2),min(y1,y2));

AcGePoint2d ptRightBottom(max(x1,x2),min(y1,y2));

AcGePoint2d ptRightTop(max(x1,x2),max(y1,y2));

AcGePoint2d ptLeftTop(min(x1,x2),max(y1,y2));

 

AcDbPolyline *pPoly=new AcDbPolyline(4);

pPoly->addVertexAt(0,ptLeftBottom,0,width,width);

pPoly->addVertexAt(1,ptRightBottom,0,width,width);

pPoly->addVertexAt(2,ptRightTop,0,width,width);

pPoly->addVertexAt(3,ptLeftTop,0,width,width);

pPoly->setClosed(true);

return CDwgDatabaseUtil::PostToModelSpace(pPoly);

 

}

AcDbObjectId CPolylineUtil::AddPolyCircle(const AcGePoint2d &ptCenter,double radius,double width)

{

AcGePoint2d pt1,pt2,pt3;

pt1.x=ptCenter.x+radius;

pt1.y=ptCenter.y;

pt2.x=ptCenter.x-radius;

pt2.y=ptCenter.y;

pt3.x=ptCenter.x+radius;

pt3.y=ptCenter.y;

 

AcDbPolyline *pPoly=new AcDbPolyline(3);

pPoly->addVertexAt(0,pt1,1,width,width);

pPoly->addVertexAt(1,pt2,1,width,width);

pPoly->addVertexAt(2,pt3,1,width,width);

pPoly->setClosed(Adesk::kTrue);

 

return CDwgDatabaseUtil::PostToModelSpace(pPoly);

}

 

 

四、總結

1AUTOCAD的三種多段線對象:AcDbPolylineAcDb2dPolylineAcDb3dPolyline,我們重點實現了AcDbPolylineAcDb3dPolyline

2、如何創建多段線,利用多段線對象來創建正多邊形、矩形、圓、圓弧(關鍵點在於頂點坐標的計算和頂點凸度的概念的掌握)。如果對凸度概念不是很清楚,自己可以用代碼來驗證。

3、騰訊課堂搜索雲幽學院貢獻相應的公開課和報名的收費課的上課源代碼、上課筆記技術咨詢指導。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM