iCAx开思工具箱

标题: 怎么用pro/toolkit创建一个拉伸特征啊! [打印本页]

作者: flosea    时间: 2009-3-10 16:06
标题: 怎么用pro/toolkit创建一个拉伸特征啊!
各位大侠:
       跪求一个完整的用pro/toolkit在pro/e2.0上创建拉伸特征的的C源程序,只要能创建一个正方形即可。
      先谢谢啦!!
作者: usedID    时间: 2009-3-10 18:36
看 李世国的书,上面很详细,
作者: flosea    时间: 2009-3-10 22:03
/*====================================================================*\
FUNCTION : UsrCreateExtrudeFeat(创建拉伸特征)
\*====================================================================*/
void UsrCreateExtrudeFeat(
       double depth_value,    //(In)拉伸深度
                         ProGeomitem SketchPln, //(In)草绘平面
                         ProGeomitem RefPln1, //(In)参照平面1
                         ProGeomitem RefPln2,  //(In)参照平面2
                         int ProtrusionOrCut, //(In)特征类型
       int index,             //(In)草图序号
        double *dimValue)     //(In)直径
{
ProError         status;
    ProSolid solid;
    ProSection section;
    ProElement elem_tree, element, stdsec_elem, setup_elem,
  depth_elem, depthfrom_elem, depthto_elem, secpln_elem;
    ProFeatureCreateOptions opts[1];
    ProModelitem modelitem;
    ProSelection sel;
    ProFeature feature;
    ProErrorlist errors;
int ivalue;
int win_id;

    ProMdlCurrentGet((ProMdl*)&solid);

/*---------------------------------------------------------------*\
    为特征树分配内存
\*---------------------------------------------------------------*/
    ProElementAlloc(PRO_E_FEATURE_TREE, &elem_tree);
/*---------------------------------------------------------------*\
    向特征树添加特征类型元素
\*---------------------------------------------------------------*/
    UsrElemtreeElementAdd(PRO_E_FEATURE_TYPE,elem_tree,
       &ProtrusionOrCut,PRO_VALUE_TYPE_INT,&element);
/*---------------------------------------------------------------*\
    向特征树添加特征形式元素
\*---------------------------------------------------------------*/
ivalue=PRO_EXTRUDE;
    UsrElemtreeElementAdd(PRO_E_FEATURE_FORM,elem_tree,
       &ivalue,PRO_VALUE_TYPE_INT,&element);
/*---------------------------------------------------------------*\
    向特征树添加标准截面元素
\*---------------------------------------------------------------*/   
ProElementAlloc(PRO_E_STD_SECTION, &stdsec_elem);
    ProElemtreeElementAdd(elem_tree, NULL, stdsec_elem);
/*---------------------------------------------------------------*\
    向特征树添加标准截面设置元素
\*---------------------------------------------------------------*/   
    ProElementAlloc(PRO_E_STD_SEC_SETUP_PLANE, &setup_elem);
    ProElemtreeElementAdd(stdsec_elem, NULL, setup_elem);
/*---------------------------------------------------------------*\
    向特征树添加草绘平面元素
\*---------------------------------------------------------------*/   
  ProElementAlloc(PRO_E_STD_SECTION_PLANE, &secpln_elem);
  ProElemtreeElementAdd(setup_elem, NULL, secpln_elem);
/*---------------------------------------------------------------*\
    向特征树添加草绘平面设置元素
\*---------------------------------------------------------------*/   
  ProSelectionAlloc(NULL, &SketchPln, &sel);
     UsrElemtreeElementAdd(PRO_E_STD_SEC_PLANE,secpln_elem,
       &sel,PRO_VALUE_TYPE_SELECTION,&element);
  ProSelectionFree(&sel);
   
/*---------------------------------------------------------------*\
    向特征树添加草绘平面视图方向设置元素
\*---------------------------------------------------------------*/   
ivalue=PRO_SEC_VIEW_DIR_SIDE_ONE;
    UsrElemtreeElementAdd(PRO_E_STD_SEC_PLANE_VIEW_DIR,secpln_elem,
       &ivalue,PRO_VALUE_TYPE_INT,&element);
/*---------------------------------------------------------------*\
    向特征树添加草绘平面定位方向设置元素
\*---------------------------------------------------------------*/   
ivalue=PRO_SEC_ORIENT_DIR_UP;
    UsrElemtreeElementAdd(PRO_E_STD_SEC_PLANE_ORIENT_DIR,secpln_elem,
       &ivalue,PRO_VALUE_TYPE_INT,&element);
/*---------------------------------------------------------------*\
    向特征树添加草绘平面参照基准设置元素
\*---------------------------------------------------------------*/   
ProSelectionAlloc(NULL, &top, &sel);
    UsrElemtreeElementAdd(PRO_E_STD_SEC_PLANE_ORIENT_REF,secpln_elem,
       &sel,PRO_VALUE_TYPE_SELECTION,&element);
  ProSelectionFree(&sel);
/*---------------------------------------------------------------*\
    向特征树添加标准截面草绘方法元素
\*---------------------------------------------------------------*/   
ivalue=PRO_SEC_SKETCH;
    UsrElemtreeElementAdd(PRO_E_STD_SEC_METHOD,setup_elem,
       &ivalue,PRO_VALUE_TYPE_INT,&element);
/*---------------------------------------------------------------*\
    创建非完全特征
\*---------------------------------------------------------------*/
    status=ProMdlCurrentGet((ProMdl*)&solid);
if(status!=PRO_TK_NO_ERROR)return(status);
  
  
ProMdlToModelitem(solid, &modelitem);
    ProSelectionAlloc(NULL, &modelitem, &sel);
    opts[0] = PRO_FEAT_CR_INCOMPLETE_FEAT;
    ProFeatureCreate(sel, elem_tree, opts, 1, &feature, &errors);
    ProSelectionFree(&sel);
  
/*---------------------------------------------------------------*\
    从数据库中获得截面元素
\*---------------------------------------------------------------*/
UsrSectionGet(&feature,PRO_E_STD_SECTION, &section);
  
/*---------------------------------------------------------------*\
    构建和求解截面
\*---------------------------------------------------------------*/  
    UsrSectionBuild(&RefPln1, &RefPln2, section,index,dimValue);
  
/*---------------------------------------------------------------*\
    将草绘器元素添加到特征元素树中
\*---------------------------------------------------------------*/
    UsrElemtreeElementAdd(PRO_E_SKETCHER,stdsec_elem,
       &section,PRO_VALUE_TYPE_POINTER,&element);
/*---------------------------------------------------------------*\
    拉伸深度定义
\*---------------------------------------------------------------*/
    ProElementAlloc(PRO_E_STD_EXT_DEPTH, &depth_elem);
    ProElemtreeElementAdd(elem_tree, NULL, depth_elem);
/*---------------------------------------------------------------*\
    起始面定义
\*---------------------------------------------------------------*/
    ProElementAlloc(PRO_E_EXT_DEPTH_FROM, &depthfrom_elem);
    ProElemtreeElementAdd(depth_elem, NULL, depthfrom_elem);
/*---------------------------------------------------------------*\
    拉伸深度类型(给定深度值)
\*---------------------------------------------------------------*/
ivalue=PRO_EXT_DEPTH_FROM_BLIND;
    UsrElemtreeElementAdd(PRO_E_EXT_DEPTH_FROM_TYPE,depthfrom_elem,
       &ivalue,PRO_VALUE_TYPE_INT,&element);
/*---------------------------------------------------------------*\
    深度值设置
\*---------------------------------------------------------------*/
    UsrElemtreeElementAdd(PRO_E_EXT_DEPTH_FROM_VALUE,depthfrom_elem,
       &depth_value,PRO_VALUE_TYPE_DOUBLE,&element);
  
/*---------------------------------------------------------------*\
    终止面定义
\*---------------------------------------------------------------*/
    ProElementAlloc(PRO_E_EXT_DEPTH_TO, &depthto_elem);
/*---------------------------------------------------------------*\
    终止面类型
\*---------------------------------------------------------------*/
ProElemtreeElementAdd(depth_elem, NULL, depthto_elem);
/*---------------------------------------------------------------*\
    终止面深度值
\*---------------------------------------------------------------*/
ivalue=PRO_EXT_DEPTH_TO_NONE;
    UsrElemtreeElementAdd(PRO_E_EXT_DEPTH_TO_TYPE,depthto_elem,
       &ivalue,PRO_VALUE_TYPE_INT,&element);
  
/*--------------------------------------------------------------------*\
    向特征元素树添加新的深度定义元素后重定义特征
\*--------------------------------------------------------------------*/
    ProFeatureRedefine(NULL, &feature, elem_tree, opts, 1, &errors);
    status=ProSectionFree(&section);
/*---------------------------*\
重新调整模型,使其在当前窗口完全显示
\*--------------------------*/
ProWindowCurrentGet(&win_id);
  
ProWindowRefit(win_id);

}
/*====================================================================*\
FUNCTION : UsrSectionGet()
从指定特征的元素树中选出草绘器(PRO_E_SKETCHER)元素之值
\*====================================================================*/
int UsrSectionGet(ProFeature *feature, //(In)  特征句柄
        int elemId,   //(In)  截面标识符
        ProSection *section) //(Out) 截面元素
{
    ProError status;
    ProElempath path;
    ProElempathItem path_items[2];
    ProValue value;
    ProValueData value_data;
    *section = NULL;
  

//设置特征截面元素的路径
    path_items[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
  

    path_items[0].path_item.elem_id = elemId;
    path_items[1].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
    path_items[1].path_item.elem_id = PRO_E_SKETCHER;
    ProElempathAlloc(&path);
  

    ProElempathDataSet (path, path_items, 2);
//从指定特征中得到路径为path的元素值(非透明的ProValue对象)
    status =ProFeatureElemValueGet(feature, path, &value);
  

    if(status != PRO_TK_NO_ERROR)
  return(0);
    ProElempathFree(&path);
    //从非透明的ProValue对象得到用户可以访问的数据对象ProValueData
    ProValueDataGet(value, &value_data);
//获得截面元素指针
    *section = (ProSection)value_data.v.p;
  

    return(1);
}

粉红色的这个程序是不是有问题啊?这就是李世国书上的,但拉伸出不来啊?
作者: flosea    时间: 2009-3-10 22:31
各位大侠,帮帮忙吧!实在想不出来啊!发个程序过来让我参考参考吧!谢谢啦!!
作者: 5I3D    时间: 2009-3-24 10:53
至少在4.0上有问题,
*section = (ProSection)value_data.v.p;
测试一下可以发现:*section ==NULL;为真。
所以程序会自动退出。
处理的办法是:(注册运行之后)在点击按钮CreateFeature(bolt)之前需要——Applications->Legacy->Feature->Done,然后点击上述按钮就可以创建特征。
至于怎么用修改程序,还在摸索中.........。要是哪位高人知道,请指点。
作者: Easy2009    时间: 2009-4-8 11:02
我这里有个 Proe 2001 下 VC6 做的非常简陋的 拉伸 加料特征程序。
仅供参考。看不懂别骂我。
1, C++的代码;
2,没有注释。
作者: Easy2009    时间: 2009-4-8 11:03
附加代码在此
作者: DavidJiang    时间: 2009-4-8 11:37
李世国的例子特征创建元素树是采用2001的结构,当然不能在野火上运行,参照野火拉伸特征元素树修改一下就可以了。
作者: xiaohong1009    时间: 2010-3-7 22:45
具体怎么改啊 楼上的 可以把你改的代码我参照一下吗 谢谢你   我QQ601698998  有空可以交流一下
作者: yzq122600    时间: 2010-3-24 23:49
学习中。。。。。
作者: 2323220987    时间: 2010-3-26 20:32
我有4.0的代码,QQ:527318405
作者: yzq122600    时间: 2010-3-29 21:40
学学啊....
作者: lightshining    时间: 2010-5-22 15:38
我拉伸出来的还是不完全特征,没有草绘元素,怎么办?
作者: llp008008    时间: 2010-8-20 18:46
肯請DX將能在2.0上用的方法傳上來,謝謝.
作者: xbin_cax    时间: 2010-11-24 21:06
protoolkit幫助文件内有實例的呀。
作者: aiber    时间: 2015-11-22 20:36
非常感谢楼上的分享




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