⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmxmlctrl.cpp

📁 VC+XML+UG OPEN API做的自动装配
💻 CPP
字号:
// AsmXMLCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "AutoASM.h"
#include "AsmXMLCtrl.h"

#include <algorithm>
#include <cassert>
#include <vector>

#include <uf.h>
#include <uf_modl.h>
#include <uf_defs.h>
#include <uf_exit.h>
#include <uf_ui.h>
#include <uf_styler.h>
#include <uf_mb.h> 
#include <uf_assem.h> 
#include <uf_part.h> 
#include <uf_obj.h>

#include <uf_ui_ont.h>
#include <uf_cambnd.h>
#include <uf_cam.h>
#include <uf_object_types.h>
#include <uf_disp.h>
#include <uf_ude.h>


const int MAXTEXTLEN=1024;
#define  SUB_NODE	"sub_node"
#define	 IS_PART	"pt"
#define  PART_NAME  "name"
#define  ASSEMBLY   "ASM"
#define  NUM_CONSTRAINS		"num"
#define  NAME_CONSTRAINS	"name"
#define  NAME_TO_P_OCC		"value"
#define  NAME_TO_F_OCC		"value"
#define  NAME_FROM_P_OCC		"value"
#define  NAME_FROM_F_OCC		"value"
#define  FROM_TYPE		"value"
#define  TO_TYPE		"value"
#define  MATE_TYPE		"value"

std::vector<tag_t> occ_arry;
std::vector<CString> name_arry;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAsmXMLCtrl

CAsmXMLCtrl::CAsmXMLCtrl()
{
	num_of_part=0;
	RootNode=NULL;
}

CAsmXMLCtrl::~CAsmXMLCtrl()
{
}

bool CAsmXMLCtrl::Load(const char* filename, const char* tree_name, bool bImage)
{
	CXMLFile xmlfile(filename);
	MSXML2::IXMLDOMNodePtr PtrNode;
	xmlfile.GetNode(tree_name, PtrNode);

	RootNode=PtrNode;

	if(PtrNode==NULL)
	{
		UF_UI_write_listing_window("Create new asm fail!!");("XML文件");
		UF_UI_write_listing_window(filename);
		UF_UI_write_listing_window("载入错误,请重新检查文件路径、文件名");
		return false;
	}
	
	PtrNode=PtrNode->GetfirstChild();
	if(PtrNode==NULL)
		return false;

	char * part_name="E:\\UG\\application\\assem_test6";		//新的装配文件名
	
	//创建一个新的文件,再里面逐个增加零件,在产生配合条件进行装配 
	int ret; 
	char message[133]; 

	UF_UI_open_listing_window(); //

	tag_t part,part2;		//occ of new assembly
	tag_t * child_part_occs;
	ret=UF_PART_new(part_name, UF_PART_METRIC, &part);

	if(ret != 0) 
	{ 
		UF_get_fail_message(ret,message); 
		UF_UI_write_listing_window("Create new asm fail!! ErrMessage:   ");
		UF_UI_write_listing_window(message);
		UF_UI_write_listing_window("\n");
		UF_terminate();
		return false;
	} 
	UF_UI_write_listing_window("Create new asm success!! FileName:  ");
	UF_UI_write_listing_window(part_name);
	UF_UI_write_listing_window("\n");

	GetAllAssems(PtrNode,part);
	

	//一下代码把所有零件名,及对应Occ保存至全局数组
	//采用遍历装配空间所有节点的方法
	occ_arry.clear();
	name_arry.clear();

	int i,partNum;
	char part_name2[132+1];
	char refset_name[30+1];
	char instance_name[50+1];
	double origin[3];
	double csys_matrix[9];
	double transform[4][4];
	
	//保证已经新建一个装配文件
	tag_t displayPart=UF_PART_ask_display_part();
	
	part2=UF_ASSEM_ask_root_part_occ(displayPart);

	if(part2==NULL_TAG)	//是装配体的情况//
	{
		UF_UI_write_listing_window("没有装配体,请打开一装配图");
		UF_UI_write_listing_window("\n");
	}
	partNum=UF_ASSEM_ask_part_occ_children(part2,&child_part_occs);
	for(i=0;i<partNum;i++)
	{     	
		UF_ASSEM_ask_component_data(child_part_occs[i],part_name2,refset_name,instance_name,origin,csys_matrix,transform);
		
		//递归
		SaveToArry(child_part_occs[i]);
	}
	
	if(occ_arry.size()==name_arry.size())
		num_of_part=occ_arry.size();
	else
	{
		UF_UI_write_listing_window("Error!  \"载入零件个数与XML中读取不一致");
		UF_UI_write_listing_window("\n");
	}
	return true;
}


//-------------------------




//--------------------------
void CAsmXMLCtrl::GetAllAssems(MSXML2::IXMLDOMNodePtr& pNode,tag_t part)
{
	MSXML2::IXMLDOMNodePtr pTmpNode=NULL;
	MSXML2::IXMLDOMNodePtr pNdAttr=NULL;

	char szBuffer[MAXTEXTLEN+1];
	szBuffer[0]=0;	
	//the varible of assemble

	char * refset_name1=NULL; 
	double origin1[ 3 ]={0.0,0.0,0.0}; 
	char * instance_name1="ca"; 
	double csys_matrix1[ 6 ]={1.0,0.0,0.0,0.0,1.0,0.0}; 	
	int layer1=0; 
	tag_t   instance1; 
	int ret; 
	char message[133]; 
	UF_PART_load_status_t error_status1; 
	

	
	CString str_attr;
	while(pNode!=NULL)
	{	
		strcpy(szBuffer, (const char*)pNode->nodeName);
		if (!strcmp(szBuffer,"sub_node"))
		{
			pNdAttr=pNode->Getattributes()->getNamedItem("pt");
			if(pNdAttr!=NULL)
			{
				strcpy(szBuffer, (const char*)pNdAttr->text );
				if (!strcmp(szBuffer,"true"))
				{
					pNdAttr=pNode->Getattributes()->getNamedItem("name");
					
					if(pNdAttr!=NULL)
					{
						strcpy(szBuffer, (const char*)pNdAttr->text );
						str_attr="";
						str_attr+="E:\\UG\\application\\";
						str_attr+= szBuffer;
						str_attr+=".prt";
						ret = UF_ASSEM_add_part_to_assembly (part, str_attr.GetBuffer(0), refset_name1, instance_name1, origin1, csys_matrix1, layer1,&instance1, &error_status1 );
						if(ret != 0) 
						{ 
							UF_get_fail_message(ret,message); 
							UF_UI_write_listing_window("Load prt fail!!");
							UF_UI_write_listing_window("\n");
							UF_terminate();
							return ;
						}
						UF_UI_write_listing_window("Load prt success!!");
						UF_UI_write_listing_window("\n");
						//
						//此处可以加入初始化树控件、数组的代码
					}
					//这里已经到达装配树的叶子节点,无须再遍历其子节点
					pNode=pNode->GetnextSibling();
					continue;
				}
				else
				{
					// Check whether we have child items.
					if (pNode->hasChildNodes())		//这个判断可选
					{
						pTmpNode=pNode->GetfirstChild();
						GetAllAssems(pTmpNode,part);//
					}
				}
			}
		}	
		pNode=pNode->GetnextSibling();
	}
}

//--------------------
//遍历所有节点,获取装配信息
//20051116
//重新遍历所有XML节点,读取装配信息


//---------------------
void CAsmXMLCtrl::MakeAssembly(MSXML2::IXMLDOMNodePtr& pNode)
{
	MSXML2::IXMLDOMNodePtr pTmpNode1=NULL;
	MSXML2::IXMLDOMNodePtr pTmpNode2=NULL;
	MSXML2::IXMLDOMNodePtr pNdAttr=NULL;

	char szBuffer[MAXTEXTLEN+1];
	szBuffer[0]=0;	

	//the varible of assemble

	char * refset_name1=NULL; 
	double origin1[ 3 ]={0.0,0.0,0.0}; 
	char * instance_name1="ca"; 
	double transform[ 4 ][ 4 ] ; 
	double csys_matrix1[ 6 ]={1.0,0.0,0.0,0.0,1.0,0.0}; 	
	int layer1=0; 
	int ret; 
	char message[133]; 
	//UF_PART_load_status_t error_status1; 
	UF_ASSEM_mc_status_t status; 
	UF_ASSEM_mc_structure_state_t struct_status; 
	UF_ASSEM_dof_t dof; 
	UF_ASSEM_mating_condition_t ftf; 
	
	while(pNode!=NULL)
	{	
		strcpy(szBuffer, (const char*)pNode->nodeName);
		if (!strcmp(szBuffer,SUB_NODE))
		{
			//组件或者零件
			pNdAttr=pNode->Getattributes()->getNamedItem(IS_PART);
			if(pNdAttr!=NULL)
			{
				strcpy(szBuffer, (const char*)pNdAttr->text );
				if (!strcmp(szBuffer,"true"))
				{
					//零件
					if (pNode->hasChildNodes())		
						pTmpNode1=pNode->GetfirstChild();
					else 
					{
						//无装配约束零件,搜索下一个兄弟
						pNode=pNode->GetnextSibling();
						continue;
					}
					//包含装配信息
					while (pTmpNode1!=NULL) {
						//搜索<ASM>节点
						if (!strcmp((const char*)pTmpNode1->nodeName,ASSEMBLY))
						{
							//包含约束
							UF_ASSEM_init_mc (&ftf);  //初始化约束关系
							pNdAttr=pNode->Getattributes()->getNamedItem(PART_NAME);
							ftf.mated_object=GetInstByName((const char*)pNdAttr->text); /////
							ftf.name=NULL; 
							ftf.user_name=FALSE; 
							ftf.suppressed=FALSE; 
							//循环读出所有约束
							pNdAttr=pTmpNode1->Getattributes()->getNamedItem(NUM_CONSTRAINS);
							if(pNdAttr!=NULL)
							{
								strcpy(szBuffer,(const char*)pNdAttr->text);
								int num=atoi(szBuffer);
								ftf.num_constraints=num;
								pTmpNode2=pTmpNode1->GetfirstChild();
								for(int i=0;i<num;i++)
								{
									pNdAttr=pTmpNode2->Getattributes()->getNamedItem(NAME_CONSTRAINS);
									if(pNdAttr!=NULL)
									{
										strcpy(szBuffer,(const char*)pNdAttr->text);
										if(strcmp(szBuffer,"")==0)
										{
											ftf.constraints[i].name = NULL;
											ftf.constraints[i].user_name = FALSE;
										}
										else
										{
											ftf.constraints[i].name = szBuffer;
											ftf.constraints[i].user_name = TRUE;
										}
									}
									MSXML2::IXMLDOMNodePtr subnode=NULL;
									subnode=pTmpNode2->GetfirstChild();
									//<From_status value="OK"/>
									ftf.constraints[i].from_status = UF_ASSEM_ok; 

									//<To_status value="OK"/>
									subnode=subnode->GetnextSibling();
									ftf.constraints[i].to_status = UF_ASSEM_ok; 

									//<Mate_type value="MATE"/>
									subnode=subnode->GetnextSibling();
									pNdAttr=subnode->Getattributes()->getNamedItem(MATE_TYPE);
									strcpy(szBuffer, (const char*)pNdAttr->text );
									if(strcmp(szBuffer,"MATE")==0)
										ftf.constraints[i].mate_type = UF_ASSEM_v16_mate;
									else
										ftf.constraints[i].mate_type = UF_ASSEM_v16_align;

									subnode=subnode->GetnextSibling();
									pNdAttr=subnode->Getattributes()->getNamedItem(FROM_TYPE);
									strcpy(szBuffer, (const char*)pNdAttr->text );
									if(strcmp(szBuffer,"PLAN_FACE")==0)
										ftf.constraints[i].from_type = UF_ASSEM_planar_face; 
									else
										ftf.constraints[i].from_type = UF_ASSEM_cylindrical_face; 									 
									
									subnode=subnode->GetnextSibling();
									pNdAttr=subnode->Getattributes()->getNamedItem(TO_TYPE);
									strcpy(szBuffer, (const char*)pNdAttr->text );
									if(strcmp(szBuffer,"PLAN_FACE")==0)
										ftf.constraints[i].to_type = UF_ASSEM_planar_face; 
									else
										ftf.constraints[i].to_type = UF_ASSEM_cylindrical_face; 
									
									//<From_P_occ value=""/>
									subnode=subnode->GetnextSibling();
									pNdAttr=pNode->Getattributes()->getNamedItem(PART_NAME);
									ftf.constraints[i].from_part_occ = GetOccByName((const char*)pNdAttr->text);								
									//pNdAttr=subnode->Getattributes()->getNamedItem(NAME_FROMO_P_OCC);			
									//ftf.constraints[i].from_part_occ =GetOccByName((const char*)pNdAttr->text);

									//<From_F_occ value="plan_cage_01"/>
									subnode=subnode->GetnextSibling();
									pNdAttr=subnode->Getattributes()->getNamedItem(NAME_FROM_F_OCC);
									ftf.constraints[i].from = GetPrtoByName((char*)pNdAttr->text); 

									//<To_P_occ value="cage_down"/>
									subnode=subnode->GetnextSibling();
									pNdAttr=subnode->Getattributes()->getNamedItem(NAME_TO_P_OCC);			
									ftf.constraints[i].to_part_occ =GetOccByName((const char*)pNdAttr->text);
					
									//<To_F_occ value="plan_cage_02"/>
									subnode=subnode->GetnextSibling();
									pNdAttr=subnode->Getattributes()->getNamedItem(NAME_TO_F_OCC);	
									ftf.constraints[i].to = GetPrtoByName((char*)pNdAttr->text); 

									ftf.constraints[i].offset = NULL_TAG; 

									pTmpNode2=pTmpNode2->GetnextSibling();
								}
								ret=UF_ASSEM_solve_mc (&ftf, &status, &dof, transform);//条件计算 
								if(ret != 0) 
								{ 
									UF_get_fail_message(ret,message); 
									UF_UI_write_listing_window("solve_mc !!");
									UF_UI_write_listing_window("\n");
								}
								UF_UI_write_listing_window("solve_mc success!!");
								UF_UI_write_listing_window("\n");
								if (ret==0||status==UF_ASSEM_mc_solved) 
								{ 
									ret=UF_ASSEM_apply_mc_data (&ftf, &struct_status, &status );//执行匹配 
									UF_DISP_refresh(); //这两句可以放后面
									UF_MODL_update(); 
								} 
								UF_UI_write_listing_window("Add Constrains success!!");	//添加零件信息
								UF_UI_write_listing_window("\n");
							}
							//搜索完一个<ASM>节点,理论上不应该有第二个,此处可退出循环
							//break;
						}
						pTmpNode1=pTmpNode1->GetnextSibling();
					}
					//到此,<sub_node>节点中所有装配信息都被处理完毕
					
					//这里已经到达装配树的叶子节点,无须再遍历其子节点
					pNode=pNode->GetnextSibling();
					continue;
				}
				else
				{
					// Check whether we have child items.
					if (pNode->hasChildNodes())		//这个判断可选
					{
						pTmpNode1=pNode->GetfirstChild();
						MakeAssembly(pTmpNode1);//
					}
				}
			}
		}		
		pNode=pNode->GetnextSibling();
	}
}

//------------------------
//  遍历UG的装配树,把零件对应的occ保存至数组
void CAsmXMLCtrl::SaveToArry(tag_t part)
{

	tag_t *child_part_occs;
	int i,partNum;
	int root_l=0,r=0,root_m=0;
	char root[50]="";
	char part_name[132+1];
	char refset_name[30+1];
	char instance_name[50+1];
	double origin[3];
	double csys_matrix[9];
	double transform[4][4];
	CString Name;
	
	partNum=UF_ASSEM_ask_part_occ_children(part,&child_part_occs);
	for(i=0;i<partNum;i++)
	{	
		SaveToArry(child_part_occs[i]);	//递归计算求出零部件及父项的件号//
	}
	UF_free(child_part_occs);
	if(partNum==0)
	{
		occ_arry.push_back(part);
		UF_ASSEM_ask_component_data(part,part_name,refset_name,instance_name,origin,csys_matrix,transform);	
		int j=0;
		for(int num=0;part_name[num]!='.';num++)
		{
			if(part_name[num]=='\\')
				root_m++;
		}
		
		for(int n=0;n<=num-2;n++)
		{
			if(part_name[n]=='\\')
				root_l++;
			if(root_l==root_m)
			{	
				root[r]=part_name[n+1];
				r++;
			}
		}
		Name.Format(root);
		name_arry.push_back(Name);
	}
}

tag_t CAsmXMLCtrl::GetOccByName(const char * occ_name)
{
	CString str;
	str.Format(occ_name);
	for (int i=0;i<num_of_part;i++) {
		if(name_arry[i]==str)
		{
			return occ_arry[i];
		}
	}
	return NULL_TAG;
}

tag_t CAsmXMLCtrl::GetPrtoByName(char * feature_name)
{
	tag_t fea_occ;
	fea_occ=NULL_TAG;
	UF_OBJ_cycle_by_name (feature_name, &fea_occ);
	
	return UF_ASSEM_ask_prototype_of_occ(fea_occ); 
}

tag_t CAsmXMLCtrl::GetInstByName(const char * prt_name)
{
	CString str;
	str.Format(prt_name);
	for (int i=0;i<num_of_part;i++) {
		if(name_arry[i]==str)
		{
			return UF_ASSEM_ask_inst_of_part_occ(occ_arry[i]);
		}
	}
	return NULL_TAG;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -