UG二次开发的自动装配技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 != NULL_TAG)
{
UF_ASSEM_ask_component_data(part_occs, part_n, refset_name,?
instance_name, origin, csys_matrix, transform);
if(strcmp(strlwr(instance_name),strlwr(inst_name)) ==0 ) break;
i++;
}
if(part_occs != NULL_TAG)?
*occ_tag = part_occs;
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;
= NULL;
er_name = false;
for(i=0; i<3; i++)
{
ftf.constraints.from_status = UF_ASSEM_ok;
ftf.constraints.to_status = UF_ASSEM_ok;
if(strcmp(strlwr(mate_type),"m") == 0)
ftf.constraints.mate_type = UF_ASSEM_v16_mate;
else
ftf.constraints.mate_type = UF_ASSEM_v16_align ;
ftf.constraints.from_type = UF_ASSEM_datum_plane;
ftf.constraints.to_type = UF_ASSEM_datum_plane;
ftf.constraints.from = from_obj_tag;
ftf.constraints.from_part_occ = from_part_occ;
ftf.constraints.to = to_obj_tag;
ftf.constraints.to_part_occ = to_part_occ;
ftf.constraints.offset = NULL_TAG;
= NULL;
er_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();
}
}
}。

相关文档
最新文档