bool IsAdjCurve(const tag_t curveTAG1, const tag_t curveTAG2, double tol = 0.02);
int GetAdjCurveNum(tag_t curve_check, vector<tag_t> vecCurves, double tol = 0.02);
bool IsOpen(vector<tag_t> vecCurves, double tol = 0.02);
//判断两曲线是否是相邻曲线
bool IsAdjCurve(const tag_t curveTAG1, const tag_t curveTAG2, double tol)
{
//查两个对象的距离
double min_dist = 0;
double pt_on_ent1[3] = { 0 };
double pt_on_ent2[3] = { 0 };
double accuracy = 0;
UF_MODL_ask_minimum_dist_2(curveTAG1, curveTAG2, 0, NULL, 0, NULL, &min_dist, pt_on_ent1, pt_on_ent2, &accuracy);
//如果距离小于公差,则认为他们是相邻的曲线。
if (min_dist < tol)
{
return TRUE;
}
else
{
return FALSE;
}
}
//求相邻曲线的数量
int GetAdjCurveNum(tag_t curve_check, vector<tag_t> vecCurves, double tol)
{
int adjCurveNum = 0;
for (int i = 0; i < vecCurves.size(); i++)
{
if (vecCurves[i] == curve_check)
{
continue;
}
else
{
if (IsAdjCurve(vecCurves[i], curve_check))
{
adjCurveNum++;
}
}
}
return adjCurveNum;
}
//是否是开放曲线链
bool IsOpen(vector<tag_t> vecCurves, double tol)
{
//曲线集合一个元素的没有,返回FASLE
if (vecCurves.empty())
{
return FALSE;
}
int num_curves = 0;
BOOL bOpen = FALSE;
num_curves = vecCurves.size();
//根据曲线数量进行分类讨论做判断是不是开口式的
if (num_curves == 1) //曲线只有一条
{
double start[3] = { 0 };
double end[3] = { 0 };
//查曲线的两个端点
double limits[2] = { 0 };
UF_EVAL_p_t evaluator = NULL;
UF_EVAL_initialize(vecCurves[0], &evaluator);
UF_EVAL_ask_limits(evaluator, limits); //求曲线Limit区间
if (limits[0] > limits[1])
{
double temp;
temp = limits[0];
limits[0] = limits[1];
limits[1] = temp;
}//确保Limit区间必须是[低区间,高区间] 这种形式
UF_EVAL_evaluate(evaluator, 0, limits[0], start, NULL);
UF_EVAL_evaluate(evaluator, 0, limits[1], end, NULL);
if (evaluator)
{
UF_EVAL_free(evaluator); evaluator = NULL;
}
//算距离
double dist = 0;
UF_VEC3_distance(start, end, &dist);
if (dist < tol)
{
return FALSE;// 认为这两个点重合。即曲线闭合返回FALSE
}
else
{
return TRUE;
}
}
else //曲线有多条
{
//曲线闭合,则必定有两条的,没有则说明是开口的
for (int i = 0; i < num_curves; i++)
{
//求每一条直线相邻曲线的数量
int adjCurveNum = GetAdjCurveNum(vecCurves[i], vecCurves);
if (adjCurveNum <= 1)
{
return TRUE;
}
}
return FALSE;
}
}
【UG\NX二次开发】UF 判断曲线链开放或闭合
于 2024-03-13 09:03:51 首次发布