许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  PDMS二次开发(六):ATTA目录树顺序检查功能实现讲解

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

阅读数 7
点赞 0
article_banner

一、前言

上一次元件顺序检查功能里没有包括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在这种位置时出图会报错,原因不明,于是做了这个检查,有没有实际用处我也不知道~
在这里插入图片描述

三、检查结果预览窗口

在这里插入图片描述


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空