【NX】NX二次开发中判断曲线高度是否相同

在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自带的函数。
欢迎交流与讨论,欢迎留言或者私信我寻求帮助,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值