在Pro/TOOLKIT中,类型ProAssembly表示组立档,而组立档下的元件,则用ProAsmcomp表示。
typedef struct pro_model_item
{
ProType type;
int id;
ProMdl owner;
} ProAsmcomp;
ProAsmcomp和ProModelitem共用相同的数据结构,更确切地说,ProAsmcomp是特征(ProFeature)的一种。
- type:值为PRO_FEATURE。
- id:ID。
- owner:拥有元件特征的组立档。
我们对元件特征ProAsmcomp调用ProFeatureTypeGet,获取的特征类型为PRO_FEAT_COMPONENT。
要想访问组立档下的所有元件特征,可以调用ProSolidFeatVisit函数来遍历组立档下的所有特征,通过判断特征类型是否为PRO_FEAT_COMPONENT来确定是否为元件。
函数ProAsmcompMdlGet用于获取元件特征关联的实体档案。举个例子来说明元件特征和关联的实体档案的关系:
如上图所示:A.ASM下包含了两个不同的元件特征,而这两个元件特征关联的模型均为B.PRT。
事实上,元件特征只是记录了将哪个模型(模型的路径信息)通过怎样的方式组装到组立档案中,并不包含关联的档案本身。
代码
struct AsmTreeNode
{
wstring strName; // 节点名称
bool bIsAsm; // true:组立档; false:零件档
AsmTreeNode *pParent; // 父节点
list<AsmTreeNode> lstChilds; // 子节点的集合
AsmTreeNode()
{
strName = L"";
pParent = NULL;
}
};
// 获取组立档的层次结构并输出到对话框
int OutputAsmTree(uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ProError err;
// 获取当前模型
ProMdl mdlCurr;
err = ProMdlCurrentGet(&mdlCurr);
ProMdlType mdlType;
err = ProMdlTypeGet(mdlCurr, &mdlType);
if (PRO_MDL_ASSEMBLY != mdlType)
{
return -1;
}
ProName name;
err = ProMdlNameGet(mdlCurr, name);
// 构造节点
AsmTreeNode head;
head.strName = wstring(name) + wstring(L".ASM");
head.bIsAsm = true;
head.pParent = NULL;
// 遍历访问组立档下的元件特征
err = ProSolidFeatVisit((ProSolid)mdlCurr, AsmCompVisitFunc, NULL, &head);
// 将模型树的层次结构输出到对话框中
CAsmTreeDlg dlg(&head);
dlg.DoModal();
return 0;
}
ProError AsmCompVisitFunc(ProFeature* p_feature,
ProError status,
ProAppData app_data)
{
AsmTreeNode *pParent = (AsmTreeNode*)app_data;
// 判断是不是元件特征
ProError err;
ProFeattype featType;
ProFeatureTypeGet(p_feature, &featType);
if (PRO_FEAT_COMPONENT != featType)
{
return PRO_TK_NO_ERROR;
}
// 获取元件特征关联的模型的信息
ProMdl mdl;
ProAsmcompMdlGet(p_feature, &mdl);
ProName mdlName;
ProMdlNameGet(mdl, mdlName);
ProMdlType mdlType;
ProMdlTypeGet(mdl, &mdlType);
// 构造节点
AsmTreeNode node;
if (mdlType == PRO_MDL_ASSEMBLY)
{
node.bIsAsm = true;
node.strName = wstring(mdlName) + wstring(L".ASM");
}
else
{
node.strName = wstring(mdlName) + wstring(L".PRT");
node.bIsAsm = false;
}
// 递归遍历子节点
if (mdlType == PRO_MDL_ASSEMBLY)
{
err = ProSolidFeatVisit((ProSolid)mdl, AsmCompVisitFunc, NULL, &node);
}
// 和父节点关联
node.pParent = pParent;
pParent->lstChilds.push_back(node);
return PRO_TK_NO_ERROR;
}