模型和模型项
模型: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:刷新模型树。