📄 asmxmlctrl.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 + -