天天看點

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

目錄

  • 一、前言
  • 二、檢查的原理
    • 2.1 界面增加了一個選項
    • 2.2 ATTA目錄樹順序檢查
    • 2.3 ATTA偏離檢查
    • 2.4 ATTA入侵元件檢查
  • 三、檢查結果預覽視窗

一、前言

上一次元件順序檢查功能裡沒有包括ATTA,這次增加了以下兩個小功能:

  1. ATTA 元件類型目錄樹順序檢查功能;
  2. ATTA 元件類型元件偏離管道中心線或連接配接點檢查功能;

二、檢查的原理

2.1 界面增加了一個選項

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

2.2 ATTA目錄樹順序檢查

ATTA目錄樹順序檢查的原理示意圖如圖1所示,處理起來不如元件友善,因為元件list可以從Branch對象的屬性NPDESC裡讀取(如圖2),然後執行周遊操作,而ATTA不在NPDESC(List of non primary offspring)1裡,是以隻能去Branch的member數組裡求得元件list(如圖3),但是這個list又不包含元件之間的直管段對象ileave。

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

圖1

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

圖2

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

圖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庫,跟你把點坐标、向量的方向和值計算都封裝好了。

D3Point和D3Vector都是由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’的距離,當然有時候我們也可以認為偏離是指相對于管道中心線垂直方向的偏離,水準方向的不算偏離,那就計算垂直方向的直角邊長度即可。

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

2.4 ATTA入侵元件檢查

ATTA有時候會移動到與元件交叉的位置(目錄樹位置是正确的),例如對一些彎頭做管架的時候,管架生根的平面實際上切入了元件所占的空間位置,也是通過點的位置來判斷即可,當初做這個功能是因為有工程師反應有少數ATTA在這種位置時出圖會報錯,原因不明,于是做了這個檢查,有沒有實際用處我也不知道~

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗

三、檢查結果預覽視窗

PDMS二次開發(六)——ATTA目錄樹順序檢查功能實作講解一、前言二、檢查的原理三、檢查結果預覽視窗
  1. 《Data Model Reference Manual》 ↩︎

繼續閱讀