获取组立档的层次结构
在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。
事实上,元件特征只是记录了将哪个模型(模型的路径信息)通过怎样的方式组装到组立档案中,并不包含关联的档案本身。
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; }
转载请注明出处: 芝麻开花
本文的链接地址: http://www.vmould.cn/?post=137
下一篇
发表评论 取消回复