首页   产品介绍   开发培训   技术文档   下载中心   招聘信息   客户服务  
   
公司产品
自动拼图系统
工程图辅助设计系统OpenDraft
G/OpenAPI开发宝典-基础篇
UG/OpenAPI开发宝典-问答篇
UG/OpenAPI开发宝典-实例篇
UG/OpenAPI开发宝典-综合篇
电极工艺图生成系统
孔自动标注
注塑模具辅助设计系统OpenMold
加工表单生成器
电极自动生成工具
加工辅助工具集ToolCAM
文件加密系统
公差自动标注系统
车床快速设计系统
格栅除污机快速设计系统
     
FLEXlm对CADLicense的管理
UG中约束的分类与应用
Windows平台上UG的二次开发
UG中标准件库的建立
UG中装配件特殊运动的实现
UG的二次开发中特征的识别和设定
UG二次开发的自动装配技术
UG二次开发中定位约束孔的建立
UG二次开发中爆炸图和ODBC示例
UG二次开发动画示例
             
 
产品介绍
公司产品
培训与招聘
相关信息
技术文档
技术文档
技术交流
联系我们
相关联接
技术联接

UGOPEN

 

UG二次开发的自动装配技

南京欧奔软件技术有限公司

        利用UG/OPEN API开发具体产品的应用系统时,常常遇到如何建立零件间装配约束关系的问题。如何实现零件间自动装配,是开发应用系统的难点之一。

1. 装配约束关系的简化

        在实际应用中,装配约束的配合类型有贴合、对准、角度、平行、正交、对中等多种类型,用于装配约束的对象类型有面、边、基准面、基准轴、点、线、曲线、坐标系等多种形式。为了便于数据描述,可将组件间的装配关系做了适当的简化,如图1、2所示,该例中,将零件间的装配约束关系简化为两组件间三个基准面的贴合或对准的装配约束类系。其中,图2中X,Y,Z为对应部件中的基准面名。

1     简化前的装配约束关系

?

2     简化后的装配约束关系

        简化组件装配约束关系后,将主动组件的部件名、组件名与对象名,从动组件的部件名、组件名与对象名,以及装配约束类型等信息保存在ODBC数据库中。在系统加载部件时,可根据数据库中的装配信息,实现组件的自动装配。

2.自动装配的实现

2.1主动组件的加载

        使用UF_ASSEM_add_part_to_assembly函数即可将部件加载到装配体。下段程序用于加载部件的,其中,parent_tag为父部件的部件标识,part_name为加载部件的部件名,inst_name为加载部件的组件名,inst_tag返回加载部件的实例标识。

void         UG_OPEN_add_part_to_assem(tag_t parent_tag,char *part_name,?char *inst_name,tag_t *inst_tag)

{
double origin[3] = {0,0,0};
double csys_matrix[6] = {1,0,0,0,1,0};
int layer = -1;
UF_PART_load_status_t load_status;
UF_ASSEM_add_part_to_assembly(parent_tag, part_name, NULL,inst_name, origin, csys_matrix, layer, inst_tag, &load_status);
if ( load_status.file_names != NULL )
UF_free_string_array( load_status.n_parts, load_status.file_names );
if ( load_status.statuses != NULL )
UF_free(load_status.statuses );
}

2.2 主动、从动组件事例标识的获取

        主动组件的事例标识可以通过UF_ASSEM_ask_part_occ_of_inst函数直接获取。从动组件事例标识的获取较为繁琐,其步骤为:(1) 确定从动组件的部件标识;(2)获取从动组件的所有事例标识;(3)匹配事例标识对应的组件名与从动组件组件名,确定从动组件的事例标识。需要注意的是,在同一装配中,部件名相同的其组件名不能相同,组件名相同的其部件名不能相同。

        下段程序代码用于获取从动组件事例标识,其中,part_name 为部件文件文件名,inst_name为部件文件组件名,occ_tag返回部件文件事例标识。

void         UG_OPEN_ask_part_occ_by_name(char *part_name, char *inst_name,tag_t *occ_tag )
{

tag_t *part_occs;
tag_t temp_tag;
int i;
char part_n[133], refset_name[31],instance_name[31];?
double origin[ 3 ],csys_matrix[ 9 ],transform[ 4 ][ 4 ];?
temp_tag = UF_PART_ask_part_tag(part_name);
if(temp_tag != NULL_TAG)
{
UF_ASSEM_ask_occs_of_part (NULL_TAG, temp_tag, &part_occs );
i = 0;
while(part_occs[i] != NULL_TAG)
{
UF_ASSEM_ask_component_data(part_occs[i], part_n, refset_name,?
instance_name, origin, csys_matrix, transform);
if(strcmp(strlwr(instance_name),strlwr(inst_name)) ==0 ) break;
i++;
}
if(part_occs[i] != NULL_TAG)?
*occ_tag = part_occs[i];
else
*occ_tag = NULL_TAG;
UF_free(part_occs);
}
else
*occ_tag = NULL_TAG;
}

2.3 约束对象标识的获取

        获取用于建立装配约束关系的对象标识的步骤为:(1)将对象所在部件设置为工作部件;(2)利用UF_OBJ_cycle_by_name 获取对象标识。同样需要注意的是,在同一部件中,对象名应唯一。

        下段程序代码用于获取对象标识,其中part_tag为对象所在部件的部件标识,obj_name为对象名,obj_tag返回约束对象的标识。

void UG_OPEN_ask_obj_tag_by_name(tag_t part_tag, char *obj_name, tag_t *obj_tag)

{
tag_t work_part, object_tag = NULL_TAG;?
work_part = UF_ASSEM_ask_work_part();
if(part_tag != NULL_TAG)
{
UF_ASSEM_set_work_part(part_tag);
UF_OBJ_cycle_by_name (obj_name, &object_tag);?
if (object_tag != NULL_TAG)
*obj_tag = object_tag;
else
*obj_tag = NULL_TAG;
}
else
{
*obj_tag = NULL_TAG;
}
UF_ASSEM_set_work_part(work_part);
}

2.4装配约束关系的建立

        建立组件间的装配约束的步骤为:(1) 定义装配约束,即填充结构UF_ASSEM_constraint_s;(2)利用函数UF_ASSEM_solve_mc求解约束;(3) 利用函数UF_ASSEM_apply_mc_data将约束应用到装配体上;(4) 利用函数UF_MODl_update更新模型,以反映模型变化。

        下段程序代码用于两组件间的装配约束关系的建立,其中, from_part_ins为主动组件实例标识,from_obj_tag为主动组件中的对象标识,from_part_occ为主动组件的事例标识,to_obj_tag为从动组件的对象标识,to_part_occ为从动组件的事例标识,mate_type为装配类型。

void        UG_OPEN_atuo_mate_by_datum(tag_t from_part_ins,tag_t *from_obj_tag,
tag_t from_part_occ,tag_t *to_obj_tag,
tag_t to_part_occ,char **mate_type )
{
UF_ASSEM_mating_condition_t? ftf;
UF_ASSEM_mc_status_t? status;
UF_ASSEM_mc_structure_state_t struct_status;
UF_ASSEM_dof_t? dof;
double transform[4][4];
int ret,i;
UF_ASSEM_init_mc (&ftf);
ftf.mated_object = from_part_ins;
ftf.name = NULL;
ftf.user_name = false;
for(i=0; i<3; i++)
{
ftf.constraints[i].from_status = UF_ASSEM_ok;
ftf.constraints[i].to_status = UF_ASSEM_ok;
if(strcmp(strlwr(mate_type[i]),"m") == 0)
ftf.constraints[i].mate_type = UF_ASSEM_v16_mate;
else
ftf.constraints[i].mate_type = UF_ASSEM_v16_align ;
ftf.constraints[i].from_type = UF_ASSEM_datum_plane;
ftf.constraints[i].to_type = UF_ASSEM_datum_plane;
ftf.constraints[i].from = from_obj_tag[i];
ftf.constraints[i].from_part_occ = from_part_occ;
ftf.constraints[i].to = to_obj_tag[i];
ftf.constraints[i].to_part_occ = to_part_occ;
ftf.constraints[i].offset = NULL_TAG;
ftf.constraints[i].name = NULL;
ftf.constraints[i].user_name = false;
}

ftf.num_constraints = 3;
ftf.suppressed = false;
ret=UF_ASSEM_solve_mc(&ftf, &status, &dof, transform);
if(ret == 0 || status == UF_ASSEM_mc_solved)
{
UF_ASSEM_apply_mc_data(&ftf, &struct_status, &status);
if(struct_status == UF_ASSEM_structure_ok && status == UF_ASSEM_mc_solved)
{
UF_DISP_refresh();
UF_MODL_update();
}
}
}

 

 

Copyright © 2011 南京欧奔软件技术有限公司,保留全部权利
南京欧奔软件技术有限公司
地址: 南京市洪武路359号福鑫国际大厦23楼2309室 邮编: 210002
电话:(86)025-84456296 传真:(86)025-84456296 手机:13186429310 13901591847
技术讨论QQ群:49466232
网站备案/许可证号:苏ICP备05038408号