首页 获取组立档的层次结构

获取组立档的层次结构

小白鼠 2019-03-30 10:19:37 0 2668
在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;
}

装配 · 遍历 · 结构 ·

发表评论