元素树-创建特征-在一个边的中点创建一个坐标系

来源:互联网 发布:c语言疯狂讲义 v4.0 编辑:程序博客网 时间:2024/04/27 14:30

方法1:偏移原始坐标系创建新坐标系

方法2:在中点创建基准点/面,之后创建坐标系


采用方法:方法2

步骤:

选择边-添加点-添加坐标系

          创建方法:点 -边-边

1.1 选择边特征

status = ProSelect("edge", 1, NULL, NULL, NULL, NULL, &sel_1, &nSel)<pre name="code" class="cpp">status = ProSelectionCopy(*sel_1, &sel_11); //复制一份,防范而已

1.2创建一个基准点,使用方法 元素树  详情参考 ProDtmPnt.h  (可以搜索  ProElementAlloc)

setPoint(){//ProSelectionModelitemGet(*sel_1, &item);//元素树ProElement elem_tree, elem_type, elem_dpo_type, elem_array, elem_point;ProElement elem_pla_cons, elem_pla_con, elem_pla_ref, elem_pla_type;ProElement elem_dim_cons, elem_dim_con, elem_dim_ref, elem_dim_type, elem_dim_val;{status = ProElementAlloc(PRO_E_FEATURE_TREE, &elem_tree); //创建元素树根if (status != PRO_TK_NO_ERROR) { return status; }int ivalue = PRO_FEAT_DATUM_POINT;//添加类型 创建一个点UsrElemtreeElementAdd(PRO_E_FEATURE_TYPE, elem_tree, &ivalue, PRO_VALUE_TYPE_INT, &elem_type);//添加点类型 ivalue = PRO_DPOINT_TYPE_GENERAL; UsrElemtreeElementAdd(PRO_E_DPOINT_TYPE, elem_tree, &ivalue, PRO_VALUE_TYPE_INT, &elem_dpo_type); //参照数组status = ProElementAlloc(PRO_E_DPOINT_POINTS_ARRAY, &elem_array); status = ProElemtreeElementAdd(elem_tree, NULL, elem_array);//点status = ProElementAlloc(PRO_E_DPOINT_POINT, &elem_point);status = ProElemtreeElementAdd(elem_array, NULL, elem_point);//pla consstatus = ProElementAlloc(PRO_E_DPOINT_PLA_CONSTRAINTS, &elem_pla_cons);status = ProElemtreeElementAdd(elem_point, NULL, elem_pla_cons);//pla constatus = ProElementAlloc(PRO_E_DPOINT_PLA_CONSTRAINT, &elem_pla_con);status = ProElemtreeElementAdd(elem_pla_cons, NULL, elem_pla_con);//pla ref   sel_1UsrElemtreeElementAdd(PRO_E_DPOINT_PLA_CONSTR_REF, elem_pla_con, sel_1, PRO_VALUE_TYPE_SELECTION, &elem_pla_ref);//pla typeivalue = PRO_DTMPNT_CONSTR_TYPE_ON;UsrElemtreeElementAdd(PRO_E_DPOINT_PLA_CONSTR_TYPE, elem_pla_con, &ivalue, PRO_VALUE_TYPE_INT, &elem_pla_type);//dim consstatus = ProElementAlloc(PRO_E_DPOINT_DIM_CONSTRAINTS, &elem_dim_cons);status = ProElemtreeElementAdd(elem_point, NULL, elem_dim_cons);//dim constatus = ProElementAlloc(PRO_E_DPOINT_DIM_CONSTRAINT, &elem_dim_con); status = ProElemtreeElementAdd(elem_dim_cons, NULL, elem_dim_con);//dim ref select   UsrElemtreeElementAdd(PRO_E_DPOINT_DIM_CONSTR_REF, elem_dim_con, sel_1, PRO_VALUE_TYPE_SELECTION, &elem_dim_ref);//dim typeintivalue = PRO_DTMPNT_CONSTR_TYPE_RATIO;   UsrElemtreeElementAdd(PRO_E_DPOINT_DIM_CONSTR_TYPE, elem_dim_con, &ivalue, PRO_VALUE_TYPE_INT, &elem_dim_type);//dim val    doubledouble d_ratio = 0.5;  //比率0.5 UsrElemtreeElementAdd(PRO_E_DPOINT_DIM_CONSTR_VAL, elem_dim_con, &d_ratio, PRO_VALUE_TYPE_DOUBLE, &elem_dim_val);}//创建ProModelitem model_item;ProSelection mdl_sel;ProErrorlist errors;ProSolid solid;//status = ProMdlCurrentGet((ProMdl*)&solid);if (status != PRO_TK_NO_ERROR) {return status;}status = ProMdlToModelitem(solid, &model_item);if (status != PRO_TK_NO_ERROR) {return status;}status = ProSelectionAlloc(NULL, &model_item, &mdl_sel);if (status != PRO_TK_NO_ERROR) {return status;}////status = ProFeatureCreate(mdl_sel, elem_tree, NULL, 0, &feature, &errors);ProFeatureCreateOptions * opts = 0;status = ProArrayAlloc(1, sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts);//opts[0] = PRO_FEAT_CR_DEFINE_MISS_ELEMS;opts[0] = PRO_FEAT_CR_FIX_MODEL_ON_FAIL;//status = ProFeatureWithoptionsCreate(mdl_sel, elem_tree, opts, 0, &feature, &errors);//创建特征。注意creo版本status = ProFeatureCreate(mdl_sel, elem_tree, opts, 0, &feature, &errors);if (status != PRO_TK_NO_ERROR) {return status;}feature.type = PRO_POINT;feature.id = feature.id + 1;// 与手动选择id差1。  这里的feature 需要注意status = ProSelectionAlloc(NULL, &feature, &midsel);return status;}

现在获得了一个点和一条边

1.3 获得另一条边

 坐标轴方向不需确定,所以只要在获得任意一条边即可

方法:当前边-任意端点-端点的所有边-与当前边不相同的边

1.3.1获得端点

    status = ProSelectionModelitemGet(sel_11, &item);    status = ProGeomitemdataGet(&item, &geo_data);    status = ProLinedataGet(geo_data->data.p_curve_data, end1, end2);  //end1,end2 任选其一
1.3.2获得边
part = (ProPart)mdl; //mdlcurrentget()//status = ProGeometryAtPointFind(part,end1,&sel_p,&p_count);//获取某个点的几何体//获取线ProModelitem item_temp;ProGeomitemdata *p_data;Pro3dPnt  temp_3d1;Pro3dPnt  temp_3d2;for (int i = 0; i < p_count;i++){ProSelectionModelitemGet(sel_p[i], &item_temp);if (PRO_EDGE == item_temp.type ){ProGeomitemdataGet(&item_temp,&p_data);ProLinedataGet(p_data->data.p_curve_data,temp_3d1,temp_3d2);if (equal3dPoint(end1,temp_3d1) && !equal3dPoint(end2,temp_3d2)){//getProSelectionCopy(sel_p[i], &sel_22);return PRO_TK_NO_ERROR; }else if(equal3dPoint(end1, temp_3d2) && !equal3dPoint(end2, temp_3d1)){//getProSelectionCopy(sel_p[i], &sel_22);return PRO_TK_NO_ERROR;}else{//no}}}

对比函数

bool equal3dPoint(Pro3dPnt &point1, Pro3dPnt &point2){if (point1[0] == point2[0]){if (point1[1] == point2[1]){if (point1[2] == point2[2]){return true;}}}return false;}
1.3.3  添加坐标系

ProElement elem_tree, elem_type, elem_conts, elem_cont, elem_cont_ref;ProElement elem_axi1, elem_axi2;status = ProElementAlloc(PRO_E_FEATURE_TREE, &elem_tree);    int ivalue = PRO_FEAT_CSYS;    UsrElemtreeElementAdd(PRO_E_FEATURE_TYPE, elem_tree, &ivalue, PRO_VALUE_TYPE_INT, &elem_type);     //     status = ProElementAlloc(PRO_E_CSYS_ORIGIN_CONSTRS, &elem_conts);    if (status != PRO_TK_NO_ERROR) { return; }    status = ProElemtreeElementAdd(elem_tree, NULL, elem_conts);    if (status != PRO_TK_NO_ERROR) { return; }    //    status = ProElementAlloc(PRO_E_CSYS_ORIGIN_CONSTR, &elem_cont);    if (status != PRO_TK_NO_ERROR) { return; }    status = ProElemtreeElementAdd(elem_conts, NULL, elem_cont);    if (status != PRO_TK_NO_ERROR) { return; }    //添加 原点参考    status = UsrElemtreeElementAdd(PRO_E_CSYS_ORIGIN_CONSTR_REF, elem_cont, &midsel, PRO_VALUE_TYPE_SELECTION, &elem_cont_ref);    if (status != PRO_TK_NO_ERROR) {        return;    }    /参考1    status = UsrElemtreeElementAdd(PRO_E_CSYS_ORIENTSELAXIS1_REF, elem_tree, &sel_11, PRO_VALUE_TYPE_SELECTION, &elem_axi1);    if (status != PRO_TK_NO_ERROR) {        return;    }    //参考2    status = UsrElemtreeElementAdd(PRO_E_CSYS_ORIENTSELAXIS2_REF, elem_tree, &sel_22, PRO_VALUE_TYPE_SELECTION, &elem_axi2);    if (status != PRO_TK_NO_ERROR) {        return;    }    //  基本模型属性     ProModelitem model_item;    ProSelection mdl_sel;    ProFeature feature;    ProErrorlist errors;    ProSolid solid;    ProMdl mdl;    //    status = ProMdlCurrentGet((ProMdl*)&solid);    if (status != PRO_TK_NO_ERROR) {        return;    }    status = ProMdlToModelitem(solid, &model_item);    if (status != PRO_TK_NO_ERROR) {        return;    }    status = ProSelectionAlloc(NULL, &model_item, &mdl_sel);    if (status != PRO_TK_NO_ERROR) {        return;    }    // 创建特征    //status = ProFeatureCreate(mdl_sel, elem_tree, NULL, 0, &feature, &errors);        ProFeatureCreateOptions * opts = 0;    status = ProArrayAlloc(1, sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts);    opts[0] = PRO_FEAT_CR_NO_OPTS;    status = ProFeatureWithoptionsCreate(mdl_sel, elem_tree, opts, 0, &feature, &errors);    status = ProElementFree(&elem_tree);    status = ProSelectionFree(&mdl_sel);




参考用:

int nSel ;ProSelection *sel_p;ProSelection *sel_1,*sel_2;ProSelection sel_11, sel_22;ProGeomitemdata * geo_data;ProModelitem item;ProFeature feature; //新点的//Pro3dPnt end1;Pro3dPnt end2;Pro3dPnt midpoint;

来源: pro_toolkit程序设计

 特征元素标识,        上级元素, 特征元素值,        特征元素类型,         特征元素ProError line::UsrElemtreeElementAdd(ProElemId id, ProElement parent, void * value, ProValueDataType type, ProElement *element){ProValueData value_data;ProValue pvalue;value_data.type = type;// type changeswitch (type){case PRO_VALUE_TYPE_INT:value_data.v.i = *(int *)value;break;case PRO_VALUE_TYPE_DOUBLE:value_data.v.d = *(double*)value;break;case PRO_VALUE_TYPE_POINTER:value_data.v.p = *(void**)value;break;case PRO_VALUE_TYPE_STRING:value_data.v.s = *(char**)value;break;case PRO_VALUE_TYPE_WSTRING:value_data.v.w = *(wchar_t**)value;break;case PRO_VALUE_TYPE_SELECTION:value_data.v.r = *(ProSelection*)value;break;case PRO_VALUE_TYPE_TRANSFORM:value_data.v.t = *(double***)value;break;case PRO_VALUE_TYPE_BOOLEAN:value_data.v.i = *(int*)value;break;}//status = ProElementAlloc(id, element);if (status != PRO_TK_NO_ERROR) {return status;}status = ProValueAlloc(&pvalue);if (status != PRO_TK_NO_ERROR) {return status;}status = ProValueDataSet(pvalue, &value_data);if (status != PRO_TK_NO_ERROR) {return status;}status = ProElementValueSet(*element, pvalue);if (status != PRO_TK_NO_ERROR) {return status;}//status = ProElemtreeElementAdd(parent, NULL, *element);if (status != PRO_TK_NO_ERROR) {return status;}return  status;}


1 0
原创粉丝点击