马上注册登录,享用更多网站功能!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
今天写了一篇笔记发到自己的blog里,也转贴到这里,希望和大家一起交流学习.也给自己的blog增加点人气,欢迎到https://ufowyf.blog.sohu.com/看看
初步探讨ro/E二次开发在装配环境下插入零部件的方法
最近在qq群里一些朋友探讨到Pro/E二次开发中,对装配体进行操作的方法.由于教材上没有涉及到这个问题,所以大家都觉得比较困难.刚好我的毕业设计做到了这一块内容,下面我把方法总结一下,希望能跟大家一起交流学习,也趁机为自己还没提笔的论文整理一下思路.
在看以下内容之前,我希望你在protookit已经入门 ,以及对特征创建方法有一定了解.具体内容,请参阅李世国老师的<<ro/Toolkit程序设计>>一书.
在pro/E中,装配体成员是作为一个装配体特征,所以以下内容采用了特征创建的方法,把零部件插入到装配体当中.首先让我们一起来认识一下零件装配特征元件树:
PRO_E_COMPONENT_MODEL是一个指针,可以把它设置为ProSolid句柄,它指向要导入装配体的成员实体,可以是零件也可以是组件;
PRO_E_COMPONENT_INIT_POS元件装入装配体的初始位置;
PRO_E_COMPONENT_CONSTRAINTS为成员的约束关系,与创建基准面的特征树相似;
具体内容请参考Protoolkit的帮助文档.
将零部件导入装配图,其实跟零件创建特征很相似,主要分为以下几个步骤进行:
(1) 调用ProElementAlloc()函数给特征元件树中的各个元素分配内存;当然元件树的树叶多少取决于你程序要完成的功能.
(2)设置特征元件树的值
所涉及的函数有ProValueDataSet(),ProElementValueSet(),ProElementElementadd()
(2) 调用特征创建函数ProFeatureCreate()
以上几个步骤,请翻阅李世国的教程第四章有过内容
下面我通过一些源代码进行说明,该源代码是从我设计内容中摘抄出来的,代码完成功能很简单,就是把零部件导入装配中,并初始位置进行一定偏移,避免零部件重叠.
//…………………..参数声明…………………………………….//
ProMdl solid_md,solid_md1;
int w_id;
ProName msgFileName;
ProElement elem_root, elem_ftype, elem_model, elem_constrs;
ProValue value;
ProValueData value_data;
ProSelection sel;
ProModelitem modelitem;
ProFeature feature;
int Xoffset;
//............................将零部件加入装配体中..........................//
/*--------------------------------------------------------------------*\
为特征树顶层元素分配内存.
\*--------------------------------------------------------------------*/
ProElementAlloc (PRO_E_FEATURE_TREE, &elem_root);
/*--------------------------------------------------------------------*\
增加特征类型元素. elem_ftype
\*--------------------------------------------------------------------*/
ProElementAlloc (PRO_E_FEATURE_TYPE, &elem_ftype);
value_data.type = PRO_VALUE_TYPE_INT;
value_data.v.i = PRO_FEAT_COMPONENT;
ProValueAlloc (&value);
ProValueDataSet (value, &value_data);
ProElementValueSet (elem_ftype, value);
status = ProElemtreeElementAdd (elem_root, NULL, elem_ftype);
/*--------------------------------------------------------------------*\
增加成员特征元素(关键部分)
\*--------------------------------------------------------------------*/
ProElementAlloc (PRO_E_COMPONENT_MODEL, &elem_model);
value_data.type = PRO_VALUE_TYPE_POINTER;
value_data.v.p = solid_md; //值为指针类型,solid_md为所增加零部件的句柄,可以用ProMdlRetrieve(),ProMdlLoad()等函数获得
ProValueAlloc (&value);
ProValueDataSet (value, &value_data);
ProElementValueSet (elem_model, value);
status = ProElemtreeElementAdd (elem_root, NULL, elem_model);
/*--------------------------------------------------------------------*\
增加X轴的偏移量
\*--------------------------------------------------------------------*/
ProStringToWstring(msgFileName, "DisplayMessage.txt");
ProMessageDisplay(msgFileName,"lease input X offset");//输出提示信息
ProMessageIntegerRead(NULL,&Xoffset);//读入坐标输入的偏移值
ProMatrix matrix={
{1.0,0.0,0.0,0.0},
{0.0,1.0,0.0,0.0},
{0.0,0.0,1.0,0.0},
{Xoffset,0.0,0.0,1.0}
}; //定义装配矩阵
ProElementAlloc(PRO_E_COMPONENT_INIT_POS,&elem_constrs);
value_data.type=PRO_VALUE_TYPE_POINTER;
value_data.v.p=matrix;
ProValueAlloc(&value);
ProValueDataSet(value,&value_data);
ProElementValueSet(elem_constrs,value);
ProElemtreeElementAdd(elem_root,NULL,elem_constrs);
/*--------------------------------------------------------------------*\
获得当前模型的选择对象
\*--------------------------------------------------------------------*/
ProMdlCurrentGet(&solid_mdl);
ProMdlToModelitem (solid_mdl, &modelitem);
ProSelectionAlloc (NULL, &modelitem, &sel);
/*--------------------------------------------------------------------*\
把零部件加入装配体中
\*--------------------------------------------------------------------*/
status = ProFeatureCreate (sel, elem_root, NULL, 0, &feature,
&errors);
ProElementFree(&elem_root);
ProSelectionFree(&sel);
ProMdlDisplay(solid_mdl);
ProMdlWindowGet(solid_mdl,&w_id);
ProWindowActivate(w_id);
好了,我们大功告成!由于学习Pro/E二次开发时间很短,所以水平还很菜.第一次写笔记,写得不好,不清楚,还请大家多多包涵,多提点意 |