Pro/TOOLKIT示例程序(一)模型和模型项

模型和模型项

模型:ProMdl

在Pro/TOOLKIT中,由类型ProMdl代表模型。ProMdl本质上是void类型指针,定义如下:

typedef void* ProMdl;

Pro/E中有哪些类别的模型呢?可以在新建模型对话框中看出:
这里写图片描述

  • ProMdlCurrentGet:获取当前模型。
  • ProMdlTypeGet:获取模型的类型。
  • ProMdlDataGet:获取模型数据,包含模型的名称、类型、路径信息等。
模型项:ProModelitem

模型项是组成模型的元素。
对于一个零件档而言,它是由点、边、面、轴、坐标系、特征等组成。理所当然,这些元素都是模型项。
在Pro/TOOLKIT中,模型项由类型ProModelitem表示,具体定义如下:

typedef struct pro_model_item
{
    ProType   type;
    int       id;
    ProMdl    owner;
}ProModelitem;
  • type:模型项类型。点(PRO_POINT)、边(PRO_EDGE)、面(PRO_SURFACE)、特征(PRO_FEATURE)等。
  • id:模型项的ID,类似于身份证号码。
  • owner:所属的模型。

由type、id、owner就可以唯一确定一个模型项。
在Pro/TOOLKIT中,点、边、面既可以分别由类型ProPoint、ProEdge、ProSurface来表示,也可以由ProModelitem来表示。
ProModelitem就好比现实世界中的身份证,它通过记录的信息(类型、ID、所属模型)来表示组成模型的元素。而ProPoint、ProEdge、ProSurface类型则代表这些元素本身。唯一不同的是,在现实世界中,一般每个人只有一张身份证,而ProModelitem则没有此限制。

  • ProModelitemByNameInit:通过名称和类型初始化模型项。
  • ProModelitemNameSet:设置模型项的名称。

示例

该示例添加了一个菜单和两个菜单项。如下图所示:
这里写图片描述
菜单项【获取当前模型信息】:获取当前模型的名称、类型和模型文件全路径。
菜单项【测试模型项】:在当前模型中,获取名称为front,类型为特征的模型项,并更名为icaxdev_front。

// 命令响应函数:获取当前模型的名称
int GetCurrModelInfo(uiCmdCmdId  command,
                     uiCmdValue *p_value,
                     void       *p_push_command_data)
{
    ProError err;

    // 获取当前模型
    ProMdl mdlCurr;
    err = ProMdlCurrentGet(&mdlCurr);
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }

    // 获取当前模型的名称
    ProName name;
    err = ProMdlNameGet(mdlCurr, name);
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }
    wstring wstrInfo = wstring(L"当前模型的名称为:") + wstring(name);
    MessageBoxW(NULL, wstrInfo.c_str(), L"protk_sample_01", MB_OK);

    // 获取当前模型的类型
    ProMdlType type;
    err = ProMdlTypeGet(mdlCurr, &type);
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }
    wstring wstrType;
    switch (type)
    {
    case PRO_MDL_ASSEMBLY:
        wstrType = L"组件";
        break;
    case PRO_MDL_PART:
        wstrType = L"零件";
        break;
    case PRO_MDL_DRAWING:
        wstrType = L"绘图";
        break;
    case PRO_MDL_3DSECTION:
        wstrType = L"3D草绘";
        break;
    case PRO_MDL_2DSECTION:
        wstrType = L"2D草绘";
        break;
    case PRO_MDL_LAYOUT:
        wstrType = L"布局";
        break;
    case PRO_MDL_DWGFORM:
        wstrType = L"格式";
        break;
    case PRO_MDL_MFG:
        wstrType = L"制造";
        break;
    case PRO_MDL_REPORT:
        wstrType = L"报告";
        break;
    case PRO_MDL_MARKUP:
        wstrType = L"标记";
        break;
    case PRO_MDL_DIAGRAM:
        wstrType = L"图标";
        break;
    default:
        wstrType = L"未知";
        break;
    }
    wstrInfo = wstring(L"当前模型的类型为:") + wstrType;
    MessageBoxW(NULL, wstrInfo.c_str(), L"protk_sample_01", MB_OK);

    // 获取当前模型的全路径
    ProMdldata mdldata;
    err = ProMdlDataGet(mdlCurr, &mdldata);
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }
    CStringW cstrwFileFullPath;
    cstrwFileFullPath.Format(L"当前模型的全路径为%s:%s%s.%s", mdldata.device, mdldata.path, mdldata.name, mdldata.type);
    MessageBoxW(NULL, cstrwFileFullPath, L"protk_sample_01", MB_OK);

    return 0;
}

int TestModelItem(uiCmdCmdId  command,
                  uiCmdValue *p_value,
                  void       *p_push_command_data)
{
    ProError err;

    // 获取当前模型
    ProMdl mdlCurr;
    err = ProMdlCurrentGet(&mdlCurr);
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }

    // 获取名称为:FRONT,类型为特征的模型项
    ProModelitem item;
    err = ProModelitemByNameInit(mdlCurr, PRO_FEATURE, L"FRONT", &item);
    if (PRO_TK_E_NOT_FOUND == err)
    {
        AfxMessageBox(_T("没有找到名称为FRONT,类型为特征的模型项。"));
        return 0;
    }
    else if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }

    // 设置模型项的新名称
    err = ProModelitemNameSet(&item, L"icaxdev_front");
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }
    AfxMessageBox(_T("特征名称变更:FRONT -> icaxdev_front。"));

    // 刷新窗口及模型树
    err = ProWindowRepaint(-1);
    err = ProTreetoolRefresh(mdlCurr);

    return 0;
}
代码说明:

ProWindowRepaint:刷新窗口显示。
ProTreetoolRefresh:刷新模型树。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值