首页 SW二次开发-遍历装配

SW二次开发-遍历装配

小白鼠 2019-07-22 10:13:34 1 4030

直接上代码,以下的代码使用了递归,遍历组件下所有部件:

void  TraverseChildren(CComPtr<IComponent>pRoofComp,std::vector<CComQIPtr<IComponent>> &pComponents)
{
	if(pRoofComp==NULL)return;

	int componentCout;
	pRoofComp->IGetChildrenCount(&componentCout);

	VARIANT vChildComp;
	pRoofComp->GetChildren(&vChildComp);

	SAFEARRAY *safeComp;
	safeComp=V_ARRAY(&vChildComp);

	LPDISPATCH *safeArraycomp;
	SafeArrayAccessData(safeComp,(void **)&safeArraycomp);

	for (int i=0;i<componentCout;i++)
	{
		CComQIPtr<IComponent>pChildComp=safeArraycomp[i];

		TraverseChildren(pChildComp,pComponents);

		pComponents.push_back(pChildComp);
	}
}

//测试调用代码

void CyuanzhuDialog::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码

	HRESULT retval;

	CString myString;


	CComPtr<IModelDoc2>pModel;
	retval = m_iSldWorks_dlg->get_IActiveDoc2(&pModel);
	if(pModel == NULL)
	{
		AfxMessageBox(_T( "获取活动文档失败"));
		return ;
	}

	CComBSTR title;
	pModel->GetTitle(&title);

	CString temp(title);

	myString=myString+temp+_T("\r\n");


	CComPtr<IConfiguration>pConfig;

	pModel->IGetActiveConfiguration(&pConfig);

	ASSERT(pConfig);

	CComPtr<IComponent>pRoofComp;
	pConfig->IGetRootComponent(&pRoofComp);

	std::vector<CComQIPtr<IComponent>> pComponents;
	TraverseChildren(pRoofComp,pComponents);
	
	for (int i=0;i<pComponents.size();++i)
	{
		CComBSTR comName;
		pComponents[i]->get_Name(&comName);

		CString childTemp (comName);
		myString+=childTemp;
		myString+=_T("\r\n");
	}
	AfxMessageBox(myString);
}

//效果见下图

20190722221237.png

装配 · 遍历 ·

发表评论

评论列表:

匿名
2019-07-23 08:10
遍历方法存在问题,遍历得出的数据顺序与模型树中的顺序不一致,可有方法解决?