PDMS二次开发(六)——ATTA目录树顺序检查功能实现讲解

一、前言

上一次元件顺序检查功能里没有包括ATTA,这次增加了以下两个小功能:

  1. ATTA 元件类型目录树顺序检查功能;
  2. ATTA 元件类型元件偏离管道中心线或连接点检查功能;

二、检查的原理

2.1 界面增加了一个选项

在这里插入图片描述

2.2 ATTA目录树顺序检查

ATTA目录树顺序检查的原理示意图如图1所示,处理起来不如元件方便,因为元件list可以从Branch对象的属性NPDESC里读取(如图2),然后执行遍历操作,而ATTA不在NPDESC(List of non primary offspring)1里,所以只能去Branch的member数组里求得元件list(如图3),但是这个list又不包含元件之间的直管段对象ileave
在这里插入图片描述
图1
在这里插入图片描述
图2
在这里插入图片描述
图3

研究这类问题实际就是解空间几何题,先建立数学模型,然后求计算方法,这个问题有两种计算方法,第一种是最小二乘法拟合三维直线,第二种是向量法

最小二乘法拟合三维直线,是每次取当前ATTA的lpos(取apos也是一样的,同一个点),上一个元件的lpos,下一个元件的apos,三个点为一组,用最小二乘法进行拟合,如果在一条直线上,再把W,S,U坐标换算成X,Y,Z坐标系并计算坐标顺序是否正确,然后依次循环遍历每一个ATTA。

向量法,是每次取当前ATTA的lpos(取apos也是一样的,同一个点),与上一个元件的lpos计算向量A,与下一个元件的apos计算向量B,取当前ATTA所在的直管段(注意是直线管段不是整个Branch)的第一个元件的lpos和最后一个元件的apos,可以得到这节直管段的向量作为基准向量Base,求出A和B在Base方向上的投影向量A和B,如果A和B方向相同且与Base相同,则顺序是OK的,然后依次循环遍历每一个ATTA。通过A和B与Base方向的比较还可以判断ATTA是否偏离管段中心线等等。

主要原理就是这样,还有很多细节不赘述了,我最开始用最小二乘法拟合三维直线做,后来发现拟合的计算量偏大,而且坐标换算比较繁琐,还要判断方向正负七七八八的很多细枝末节,于是重新琢磨搞了个向量计算的方法,计算量小了很多,而且不用判断什么东西南北中发白了,从AVEVA的help挖掘出了一个Aveva.Pdms.Maths.Geometry库,跟你把点坐标、向量的方向和值计算都封装好了。

D3PointD3Vector都是由Aveva.Pdms.Maths.Geometry库提供的类。

//第一步:三个点坐标格式化为小数点后四位
TBrItemPoint startPoint = new TBrItemPoint(strat_pos.X.ToString("#0.0000"),strat_pos.Y.ToString("#0.0000"),strat_pos.Z.ToString("#0.0000"));
TBrItemPoint currPoint = new TBrItemPoint(cur_apos.X.ToString("#0.0000"),cur_apos.Y.ToString("#0.0000"),cur_apos.Z.ToString("#0.0000"));
TBrItemPoint nextPoint = new TBrItemPoint(next_apos.X.ToString("#0.0000"),next_apos.Y.ToString("#0.0000"),next_apos.Z.ToString("#0.0000"));

//第二步:声明三个点坐标
D3Point D3startPoint = D3Point.Create(startPoint.X, startPoint.Y, startPoint.Z);  //线段起点
D3Point D3currPoint = D3Point.Create(currPoint.X, currPoint.Y, currPoint.Z);
D3Point D3nextPoint = D3Point.Create(nextPoint.X, nextPoint.Y, nextPoint.Z);   //线段终点
                    
//第三步:声明三个向量
D3Vector D3SlopeSC = D3Vector.Create(D3startPoint, D3currPoint);     //起点到元件
D3Vector D3SlopeCN = D3Vector.Create(D3currPoint, D3nextPoint);      //元件到终点
D3Vector D3SlopeBase = D3Vector.Create(D3startPoint, D3nextPoint);   //起点到终点的向量作为基准向量

//计算叉乘值:(a,b,c)×(x,y,z)=(bz-cy,cx-az,ay-bx)
double[] SlopeA = { currPoint.X - startPoint.X, currPoint.Y - startPoint.Y, currPoint.Z - startPoint.Z };
double[] SlopeB = { nextPoint.X - currPoint.X, nextPoint.Y - currPoint.Y, nextPoint.Z - currPoint.Z };
double chacheng1 = SlopeA[1] * SlopeB[2] - SlopeA[2] * SlopeB[1];
double chacheng2 = SlopeA[2] * SlopeB[0] - SlopeA[0] * SlopeB[2];
double chacheng3 = SlopeA[0] * SlopeB[1] - SlopeA[1] * SlopeB[0];
double[] crossValue = { chacheng1, chacheng2, chacheng3 };

//第四步:计算向量SC和CD在Base上的投影向量的长度,判断方向相同还是相反
D3Vector D3SlopeSCOntoBase = D3SlopeSC.ProjectOntoLine(D3SlopeBase);
D3Vector D3SlopeCNOntoBase = D3SlopeCN.ProjectOntoLine(D3SlopeBase);

double LengthSCOntoBase = D3SlopeSCOntoBase.Magnitude();
double LengthCNOntoBase = D3SlopeCNOntoBase.Magnitude();
double LengthBase = D3SlopeBase.Magnitude();                                     

//基准向量
bool dirParallelSCBasebyCNBase = D3SlopeSCOntoBase.Parallel(D3SlopeCNOntoBase);  //SC投影向量与CN投影向量的平行判断
bool dirParallelSCBasebyBase = D3SlopeSCOntoBase.Parallel(D3SlopeBase);          //SC投影向量与Base向量的平行判断

然后就可以开始判断和计算了,例如 crossValue-{0,0,0}则两个向量平行。

2.3 ATTA偏离检查

我计算的是A到A的距离,当然有时候我们也可以认为偏离是指相对于管道中心线垂直方向的偏离,水平方向的不算偏离,那就计算垂直方向的直角边长度即可。
在这里插入图片描述

2.4 ATTA入侵元件检查

ATTA有时候会移动到与元件交叉的位置(目录树位置是正确的),例如对一些弯头做管架的时候,管架生根的平面实际上切入了元件所占的空间位置,也是通过点的位置来判断即可,当初做这个功能是因为有工程师反应有少数ATTA在这种位置时出图会报错,原因不明,于是做了这个检查,有没有实际用处我也不知道~
在这里插入图片描述

三、检查结果预览窗口

在这里插入图片描述


  1. 《Data Model Reference Manual》 ↩︎

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangcns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值