Pro/TOOLKIT示例程序(七)获取几何元素:边

在Pro/TOOLKIT中,类型ProEdge表示边。ProEdge和ProGeomitem之间可以相互转换:

  • ProEdge -> ProGeomitem:ProEdgeToGeomitem
  • ProGeomitem -> ProEdge:ProGeomitemToEdge

ProEdgeTypeGet用于获取边的类型,边的类型有以下几种

  • PRO_ENT_LINE:直边。
  • PRO_ENT_ARC:圆弧边。
  • PRO_ENT_ELLIPSE:椭圆边。
  • PRO_ENT_SPLINE:样条曲线边。
  • PRO_ENT_B_SPLINE:B样条曲线边。

函数ProGeomitemdataGet用于获取边的数据,注意在用完之后要调用ProGeomitemdataFree来释放数据。
ProGeomitemdata下的ProCurvedata用于存储边的数据。对于不同类型的边,其数据分别用ProCurvedata类型下的不同变量来表示。

typedef struct geom_item_data_struct
{
    ProType     obj_type;
    union
    {
        ProCurvedata     *p_curve_data;
        ProSurfacedata   *p_surface_data;
        ProCsysdata      *p_csys_data;
    }data;
} ProGeomitemdata;

typedef union ptc_curve
{
    ProLinedata           line;      // 直边数据
    ProArrowdata          arrow;
    ProArcdata            arc;       // 圆弧边数据
    ProSplinedata         spline;    // 样条曲线边数据
    ProBsplinedata        b_spline;  // B样条曲线边数据
    ProCircledata         circle;
    ProEllipsedata        ellipse;   // 椭圆边数据
    ProPointdata          point;
    ProPolygondata        polygon;
    ProTextdata           text;
    ProCompositeCurvedata  comp_curve;
    ProSurfcurvedata    surf_curve;
} ProCurvedata;

示例代码:

// 获取边的数据
int TestGetEdgeData(uiCmdCmdId  command,
                    uiCmdValue *p_value,
                    void       *p_push_command_data)
{
    ProError err;

    // 选择边
    ProSelection *sels;
    int nSel = 0;
    err = ProSelect("edge", 1, NULL, NULL, NULL, NULL, &sels, &nSel);
    if (PRO_TK_NO_ERROR != err || 1 != nSel)
    {
        return -1;
    }

    // 获取选择的边
    ProGeomitem geomEdge;
    err = ProSelectionModelitemGet(sels[0], &geomEdge);
    ProEdge edge;
    err = ProGeomitemToEdge(&geomEdge, &edge);
    ProEnttype edgeType;
    err = ProEdgeTypeGet(edge, &edgeType);

    // 获取边的数据
    ProGeomitemdata* geomdata;
    err = ProGeomitemdataGet(&geomEdge, &geomdata);

    // 根据边的类型输出数据
    CStringW cstrInfo;
    switch (edgeType)
    {
        // 直边
    case PRO_ENT_LINE:
        {
            CStringW cstrEdgeType = L"边的类型: 直边\n";
            CStringW cstrEndInfo;
            cstrEndInfo.Format(L"端点1: (%.2f, %.2f, %.2f) \n端点2: (%.2f, %.2f, %.2f)",
                geomdata->data.p_curve_data->line.end1[0],
                geomdata->data.p_curve_data->line.end1[1],
                geomdata->data.p_curve_data->line.end1[2],
                geomdata->data.p_curve_data->line.end2[0],
                geomdata->data.p_curve_data->line.end2[1],
                geomdata->data.p_curve_data->line.end2[2]);

            cstrInfo = cstrEdgeType + cstrEndInfo;
        }
        break;

        // 圆弧边
    case PRO_ENT_ARC:
        {
            CStringW cstrEdgeType = L"边的类型: 圆弧边\n";
            CStringW cstrVector1;
            cstrVector1.Format(L"vector1 = (%.2f, %.2f, %.2f)\n", 
                geomdata->data.p_curve_data->arc.vector1[0],
                geomdata->data.p_curve_data->arc.vector1[1],
                geomdata->data.p_curve_data->arc.vector1[2]);
            CStringW cstrVector2;
            cstrVector2.Format(L"vector2 = (%.2f, %.2f, %.2f)\n", 
                geomdata->data.p_curve_data->arc.vector2[0],
                geomdata->data.p_curve_data->arc.vector2[1],
                geomdata->data.p_curve_data->arc.vector2[2]);
            CStringW cstrArcCenter;
            cstrArcCenter.Format(L"圆心: (%.2f, %.2f, %.2f)\n",
                geomdata->data.p_curve_data->arc.origin[0],
                geomdata->data.p_curve_data->arc.origin[1],
                geomdata->data.p_curve_data->arc.origin[2]);
            CStringW cstrRadius;
            cstrRadius.Format(L"半径: %.2f\n", geomdata->data.p_curve_data->arc.radius);
            CStringW cstrStartEndAngle;
            cstrStartEndAngle.Format(L"起始角度: %.2f \n终止角度: %.2f",
                geomdata->data.p_curve_data->arc.start_angle * 180.0 / 3.1415926,
                geomdata->data.p_curve_data->arc.end_angle * 180.0 / 3.1415926);

            cstrInfo = cstrEdgeType + cstrVector1 + cstrVector2 + cstrArcCenter + cstrRadius + cstrStartEndAngle;
        }
        break;

        // 椭圆边
    case PRO_ENT_ELLIPSE:
        cstrInfo = L"边的类型: 椭圆边\n";
        break;

        // 样条曲线边
    case PRO_ENT_SPLINE:
        cstrInfo = L"边的类型: 样条曲线边\n";
        break;

        // B样条曲线边
    case PRO_ENT_B_SPLINE:
        cstrInfo = L"边的类型: B样条曲线边\n";
        break;

    default:
        return -1;
        break;
    }
    MessageBoxW(NULL, cstrInfo, L"icaxdev: Sample004", MB_OK);

    // 释放数据
    err = ProGeomitemdataFree(&geomdata);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值