对于在CAD平台上的开发,本人是个新手,前段时间想画一个带圆角的矩形,在网上找了好几天也没找到答案,本论坛中也有不少想求此解的朋友。后来看了张帆的教程,受到启发,终于得解,现分享一下。
我用的主要的函数是AcDbPolyline,其下有个addVertexAt(unsigned int index,const AcGePoint2d& pt,double bulge = 0.,double startWidth = -1.,double endWidth = -1);
我们向其输入一系列的点,以及点与点之间的凸度,至于后面两个参数,可以不理会它。
下面我把代码贴出来。说明一下,我是要在一块板四角打四个孔,图纸只给出了孔间距a、 b,以及孔径。板的边尺寸和圆角半径自己看着办,这里不牵涉打孔问题,只要知道孔中心位置即可,设圆角半径设为r。 需要用人工方法算出圆角与直线连接点的坐标,共八个点(从右下角开始按逆时针方向):
AcGePoint2d vertex[8];
vertex[0] = AcGePoint2d(a/2-r, -b/2);
vertex[1] = AcGePoint2d(a/2, -b/2+r);
vertex[2] = AcGePoint2d(a/2, b/2-r);
vertex[3] = AcGePoint2d(a/2-r, b/2);
vertex[4] = AcGePoint2d(-a/2+r, b/2);
vertex[5] = AcGePoint2d(-a/2, b/2-r);
vertex[6] = AcGePoint2d(-a/2, -b/2+r);
vertex[7] = AcGePoint2d(-a/2+r, -b/2);
AcGePoint2dArray points;
for (int i = 0; i <= 7; i++)
{
points.append(vertex);
}
//生成圆角矩形
AcDbPolyline *pPoly= new AcDbPolyline(8);
pPoly->addVertexAt(0,points.at(0),0.5);
pPoly->addVertexAt(1,points.at(1),0);
pPoly->addVertexAt(2,points.at(2),0.5);
pPoly->addVertexAt(3,points.at(3),0);
pPoly->addVertexAt(4,points.at(4),0.5);
pPoly->addVertexAt(5,points.at(5),0);
pPoly->addVertexAt(6,points.at(6),0.5);
pPoly->addVertexAt(7,points.at(7),0);
pPoly->setClosed(Adesk::kTrue);//将其闭合
AcDbObjectId polyId;
polyId=PostToModelSpace(pPoly);
pPoly->close();
上面的0.5是凸度,90度。我的八个点坐标是按逆时针顺序的,如果顺时针,那么凸度就是负值。
也可以用一个结构体,将points和凸度存在一起,那么生成矩形就可以用一个循环来完成。
上面所说的是矩形,如果是梯形、三角形等非直角情况,则要计算出角度,而连接点的坐标算法也会复杂得多。如果算出夹角为alfa,那么凸度就应为1-alfa/pi pi指圆周率。
上面是用AcDbPolyline函数,但是AcDb2dPolyline和AcDb3dPolyline都找不到类似的方法。特别是AcDb3dPolyline的构造函数(AcDb::Poly3dType unnamed,AcGePoint3dArray& vertices,Adesk::Boolean closed = Adesk::kFalse); 我想要用这个函数,因为它可以定义三维坐标,但是不知道第一个参数是什么意思,它有三个选项k3dSimplePoly 、k3dQuadSplinePoly、k3dCubicSplinePoly,第一个比较明白,就是最基本的把所有点直接连起来,我在画六角螺母时就用了这个函数,但是后面两个选项就不明白了,哪位高人可以给指点一下。
最好能够用AcDb3dPolyline来生成带圆角的图形。象我现在用AcDbPolyline生成的,如果想表现在三维空间中,还要用诸如移动、旋转等一系列操作,麻烦。
本人水平有限,代码就是直接实现功能,至于错误判断、指针释放等都不怎么会用,见笑了。 |