在NX二次开发中,并没有直接的函数判断两条曲线高度是否相同,那么我们自己有没有办法判断两条曲线高度是否相同呢,自然是有的,那么首先我们得定义一下什么叫做高度相同,高度几乎相同的算吗,这里就涉及到一个容忍度的问题,精度问题,默认给了0.001。
我这里采用一个并不是严格判断高度是否相同的办法,但是日常用问题不大。
基本思路为对曲线进行采样,要求采样点在同一个高度,默认为z值相同,考虑到方向问题,提供了重载函数,如果方向不同,则以向量乘积为参考。
//author:autumoon
//邮箱:9506@163.com
//日期:2023-07-06
bool IsTwoCurvesSameHeight(Curve *ipCurveF, Curve *ipCurveS, int inSamplePtCount /*= 5*/, double dTolerance /*= 0.001*/)
{
if (ipCurveF == nullptr || ipCurveS == nullptr || inSamplePtCount < 2 || dTolerance < 0.0)
{
return false;
}
double dSampleProp = 1.0 / (inSamplePtCount - 1);
AUTUMOONMathPoint3d ptF1, ptS1;
AUTUMOONMathVector3d vecF1, vecS1;
double dHeight = 0.0;
const AUTUMOONMathVector3d& vecZ = AUTUMOONMathVector3d::ZVector();
//任意一点的高度不同,则返回false
for (double dSamplePos = 0.0; dSamplePos < 1.0; dSamplePos += dSampleProp)
{
AUTUMOONNXCurve::AskCurveProps(ipCurveF->Tag(), dSamplePos, &ptF1, &vecF1);
AUTUMOONNXCurve::AskCurveProps(ipCurveS->Tag(), dSamplePos, &ptS1, &vecS1);
//不垂直于z轴,返回false
if (vecF1 * vecZ > 0.001 || vecS1 * vecZ > 0.001)
{
return false;
}
//初次获取高度,即使高度正好为0也不影响
if (fabs(dHeight) < 0.001)
{
dHeight = ptF1.Z;
if (fabs(ptF1.Z - ptS1.Z) > 0.001)
{
return false;
}
}
else
{
if (fabs(ptF1.Z - dHeight) > 0.001 || fabs(ptS1.Z - dHeight) > 0.001)
{
return false;
}
}
}
return true;
}
bool IsTwoCurvesSameHeight(Curve *ipCurveF, Curve *ipCurveS, const AUTUMOONMathVector3d& ivecZ, int inSamplePtCount /*= 5*/, double dTolerance /*= 0.001*/)
{
if (ipCurveF == nullptr || ipCurveS == nullptr || inSamplePtCount < 2 || dTolerance < 0.0)
{
return false;
}
double dSampleProp = 1.0 / (inSamplePtCount - 1);
AUTUMOONMathPoint3d ptF1, ptS1;
AUTUMOONMathVector3d vecF1, vecS1;
double dHeight = 0.0;
const AUTUMOONMathVector3d& vecZ = ivecZ;
//任意一点的高度不同,则返回false
for (double dSamplePos = 0.0; dSamplePos < 1.0; dSamplePos += dSampleProp)
{
AUTUMOONNXCurve::AskCurveProps(ipCurveF->Tag(), dSamplePos, &ptF1, &vecF1);
AUTUMOONNXCurve::AskCurveProps(ipCurveS->Tag(), dSamplePos, &ptS1, &vecS1);
//初次获取高度,即使高度正好为0也不影响
if (fabs(dHeight) < 0.001)
{
dHeight = ptF1.AsVector() * vecZ;
if (fabs(ptS1.AsVector() * vecZ - dHeight) > 0.001)
{
return false;
}
}
else
{
if (fabs(ptF1.AsVector() * vecZ - dHeight) > 0.001 || fabs(ptS1.AsVector() * ivecZ - dHeight) > 0.001)
{
return false;
}
}
}
return true;
}
项目原因部分不重要的代码实现无法公开,可以自己考虑实现,或者查阅资料,调用UG自带的函数。
欢迎交流与讨论,欢迎留言或者私信我寻求帮助,谢谢。