CAD dxflib 圆弧的标注

一些vector变量同本专栏的第一篇,只是多了一个:

std::vector<DL_HatchEdgeData> dxfFillEdges

现只展示圆弧标注部分:

/// <summary>
/// 画dwf圆弧
/// </summary>
/// <param name="center">圆心</param>
/// <param name="p1">起点</param>
/// <param name="p2">中间点,用以判断弧长张开的方向</param>
/// <param name="p3">终点</param>
void drawDwfArc(Point2f center, Point2f p1, Point2f p2, Point2f p3,double radius)
{
    double start = atan2(p1.y - center.y, p1.x - center.x) / CV_PI * 180;
    double end = atan2(p3.y - center.y, p3.x - center.x) / CV_PI * 180;
    double clampAngle = atan2(p3.y - p2.y, p3.x - p2.x) - atan2(p1.y - p2.y, p1.x - p2.x);//计算夹角
    clampAngle = clampAngle / CV_PI * 180;
    if (clampAngle > 90)//如果是钝角,那么张开的圆弧角则是钝角
    {
            double temp = start;
            start = end;
            end = temp;
    }
    DL_ArcData arc(center.x, center.y, 0, radius, start, end);
    dxfArcs.push_back(arc);

    //箭柄
    Point2f midChord = (p2 + p3) / 2;
    double leanAngle = atan2(midChord.y - center.y, midChord.x - center.x) / CV_PI * 180;
    Point2f circlePoint(center.x + radius * cos(leanAngle / 180 * CV_PI), center.y + radius * sin(leanAngle / 180 * CV_PI));
    double len = 15;
    double alpha = 30;
    dxfLines.push_back(DL_LineData(center.x + 2 * radius * cos(leanAngle / 180 * CV_PI), center.y + 2 * radius * sin(leanAngle / 180 * CV_PI), 
                                        0, center.x,center.y,0));
    //箭角边
    len = 5;
    Point2f arrow;
    arrow.x = circlePoint.x + len * cos((leanAngle + alpha) / 180 * CV_PI);
    arrow.y = circlePoint.y + len * sin((leanAngle + alpha) / 180 * CV_PI);
    dxfLines.push_back(DL_LineData(arrow.x, arrow.y, 0, circlePoint.x, circlePoint.y, 0));
    dxfFillEdges.push_back(DL_HatchEdgeData(arrow.x, arrow.y, circlePoint.x, circlePoint.y));
    Point2f arrow2;
    arrow2.x = circlePoint.x + len * cos((leanAngle - alpha) / 180 * CV_PI);
    arrow2.y = circlePoint.y + len * sin((leanAngle - alpha) / 180 * CV_PI);
    dxfLines.push_back(DL_LineData(circlePoint.x, circlePoint.y, 0, arrow2.x, arrow2.y, 0));
    dxfFillEdges.push_back(DL_HatchEdgeData(circlePoint.x, circlePoint.y,arrow2.x, arrow2.y));
    dxfFillEdges.push_back(DL_HatchEdgeData(arrow2.x, arrow2.y, arrow.x, arrow.y));

    //文字标注
    char buffer[80];+
    sprintf(buffer, "R%.1f", radius);
    dxfTexts.push_back(DL_TextData(circlePoint.x + 5, circlePoint.y, 0,//text location
        0, 0.0, 0.0, //对齐坐标,
        3, 2,///文本高度和scale
        leanAngle < 0 ? 0 : 4,
        0, 0,
        buffer,
        "Standard",//字体
        leanAngle));//旋转角度
}

想填充红色箭头来着,用的方法可能不对:

 if (dxfFillEdges.size() > 0)
    {
        dxf.writeHatch1(*dw, DL_HatchData(), DL_Attributes(std::string(""),
            DL_Codes::red,
            -1,
            1,
            "BYLAYER"
        ));
        for (int i = 0; i < dxfFillEdges.size(); i += 3)
        {
            dxf.writeHatchLoop1(*dw, DL_HatchLoopData(3));
            dxf.writeHatchEdge(*dw, dxfFillEdges[i]);
            dxf.writeHatchEdge(*dw, dxfFillEdges[i+1]);
            dxf.writeHatchEdge(*dw, dxfFillEdges[i+2]);
            dxf.writeHatchLoop2(*dw, DL_HatchLoopData(3));
        }
        dxf.writeHatch2(*dw, DL_HatchData(), DL_Attributes(std::string(""),
            DL_Codes::red,
            -1,
            1,
            "BYLAYER"
        ));
    }

希望懂行的能指导一下 ,谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值