元素樹-創建特徵-在一個邊的中點創建一個座標系

方法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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章