iCAx开思工具箱

标题: 初步探讨:Pro/E二次开发在装配环境下插入零部件的方法 [打印本页]

作者: ufowyf    时间: 2006-6-11 16:59
标题: 初步探讨:Pro/E二次开发在装配环境下插入零部件的方法
今天写了一篇笔记发到自己的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二次开发时间很短,所以水平还很菜.第一次写笔记,写得不好,不清楚,还请大家多多包涵,多提点意
作者: ufowyf    时间: 2006-6-11 19:01
特征树的图片没有粘贴上来,请大家查询Protookit帮助文档,或到我blog看全文了




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3