在NX二次开发中,并没有直接的函数判断两条曲线是否重合,那么我们自己有没有办法判断两条曲线是否重合呢,自然是有的,那么首先我们得定义一下什么叫做重合,几乎重合的曲线算重合吗,这里就涉及到一个容忍度的问题。
我这里采用一个并不是严格判断重合的办法,但是日常用问题不大。

思路就是对两条曲线分别采样,当采样点的距离接近的时候认为两条曲线重合,否则认为不重合,注意因为曲线的方向可能不同,所以要正反两个方向采样,只要有一个方向满足条件,则认为两条曲线重合,具体代码如下,仅供参考。
//author:autumoon
//邮箱:9506@163.com
//日期:2023-07-06 
bool IsTwoCurvesCoincide(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;
	bool bPosTest = true;
	for (double dSamplePos = 0.0; dSamplePos < 1.0; dSamplePos += dSampleProp)
	{
		AUTUMOONNXCurve::AskCurveProps(ipCurveF->Tag(), dSamplePos, &ptF1, &vecF1);
		AUTUMOONNXCurve::AskCurveProps(ipCurveS->Tag(), dSamplePos, &ptS1, &vecS1);
		if (ptF1.Distance(ptS1) > dTolerance || !vecF1.IsParallel(vecS1, dTolerance))
		{
			bPosTest = false;
			break;
		}
	}
	bool bNegTest = true;
	if (!bPosTest)
	{
		for (double dSamplePos = 0.0; dSamplePos < 1.0; dSamplePos += dSampleProp)
		{
			AUTUMOONNXCurve::AskCurveProps(ipCurveF->Tag(), 1.0 - dSamplePos, &ptF1, &vecF1);
			AUTUMOONNXCurve::AskCurveProps(ipCurveS->Tag(), dSamplePos, &ptS1, &vecS1);
			if (ptF1.Distance(ptS1) > dTolerance || !vecF1.IsParallel(vecS1, dTolerance))
			{
				bNegTest = false;
				break;
			}
		}
	}
	return bPosTest || bNegTest;
} 
项目原因部分不重要的代码实现无法公开,可以自己考虑实现,或者查阅资料,调用UG自带的函数。
欢迎交流与讨论。



















