方法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 cons
status = ProElementAlloc(PRO_E_DPOINT_PLA_CONSTRAINTS, &elem_pla_cons);
status = ProElemtreeElementAdd(elem_point, NULL, elem_pla_cons);
//pla con
status = ProElementAlloc(PRO_E_DPOINT_PLA_CONSTRAINT, &elem_pla_con);
status = ProElemtreeElementAdd(elem_pla_cons, NULL, elem_pla_con);
//pla ref sel_1
UsrElemtreeElementAdd(PRO_E_DPOINT_PLA_CONSTR_REF, elem_pla_con, sel_1, PRO_VALUE_TYPE_SELECTION, &elem_pla_ref);
//pla type
ivalue = PRO_DTMPNT_CONSTR_TYPE_ON;
UsrElemtreeElementAdd(PRO_E_DPOINT_PLA_CONSTR_TYPE, elem_pla_con, &ivalue, PRO_VALUE_TYPE_INT, &elem_pla_type);
//dim cons
status = ProElementAlloc(PRO_E_DPOINT_DIM_CONSTRAINTS, &elem_dim_cons);
status = ProElemtreeElementAdd(elem_point, NULL, elem_dim_cons);
//dim con
status = 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 type int
ivalue = 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 double
double 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))
{
//get
ProSelectionCopy(sel_p[i], &sel_22);
return PRO_TK_NO_ERROR;
}
else if(equal3dPoint(end1, temp_3d2) && !equal3dPoint(end2, temp_3d1))
{
//get
ProSelectionCopy(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 change
switch (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;
}