姚 方, 王雪林, 李 迅
(上海江南長興造船有限責任公司, 上海 201913)
空間形體的表面在平面上攤平,這個過程稱為展開。構成形體的表面可以分為2類:球面、圓環(huán)面等表面不能攤平的不可展曲面;平面、柱面、錐面等表面可以攤平的可展曲面。對于不可展曲面,常將它們分割成若干部分,把每個部分看作為可展直紋曲面并將其近似地展開。以下可展直紋曲面簡稱為曲面。
在船舶生產設計中經(jīng)常會遇到需要得到曲面展開圖的情況,比如錨臺、側推、曲面開孔等放樣下料時,在工裝設計中也會遇到求曲面零件展開圖的情況,雖然在Tribon系統(tǒng)中可對曲面板架自動展開,但需要經(jīng)過一系列的工程配置和曲面建模工作,繁瑣且不適合于工裝設計等非船工程。此時若有一種輕量級的插件直接在AutoCAD中運行能得到所需的結果,無疑會給設計工作帶來極大方便。雖然很多大型成熟軟件如TRIBON、CATIA、UG、PROE、SolidWorks、Rhino等均擁有曲面展開功能,但關于曲面展開的公開算法卻并不多見。Tribon M3中運用的NURBS曲面對于輕量級的曲面展開算法而言并不適用,而一些軟件則不能很好地根據(jù)已有詳細設計圖紙中的曲線建模,只能近似建模,使得建模精度不易控制。若直接在AutoCAD中使用三角線法手動放樣展開曲面,也可得到較為精確的展開圖,但求每條直線實長的過程需要大量的重復計算和繪圖操作,枯燥耗時且容易出錯。為此,根據(jù)放樣展開基本原理對AutoCAD軟件進行二次開發(fā),實現(xiàn)自動批量求直線實長的功能,使用三角線法編程展開曲面而不借用其他圖形庫使得算法輕量簡單,展開精度可控并可達到生產設計要求,可以幫助設計人員較為快速地繪制曲面展開圖。
幾乎所有的曲面展開方法都是以近似的方式展開,采用三角線法,將曲面板分成近似于平面并且互相聯(lián)系的三角面(3邊組合成穩(wěn)定的三角形),再把所有的三角面攤平組合后展開得到所需要下料的零件。圖1為待展開曲面圖,將曲面板劃分成近似于平面并且相互聯(lián)系的三角面,得到圖2所示圖形,然后將空間方向的一個三角面旋轉角度放置到一個平面上,從而得出這個三角形真實形狀尺寸,而后逐個將三角形放置在這個平面上就可以得到曲面的近似展開圖。三角面劃分越多,所展開的零件越精細,但工作量也顯著增大,因此,編寫程序將面板劃分為非常細小的三角面,通過計算機高速運算后得到展開零件。
圖1 待展開曲面
圖2 三角面劃分
在幾何畫法中,可以通過1條直線段(以下將直線段簡稱為直線)的主視圖和俯視圖得到直線的實長。主視圖中直線的高與俯視圖直線作為1個直角三角形的2條直角邊,該直角三角形的斜邊即原直線的實長。
如圖3所示,同一組配對直線內line 1的首尾端點坐標分別為(x1,yZ1)和(x2,yZ2),line 1'的首尾端點坐標分別為(x1,yF1)和(x2,yF2)。根據(jù)幾何畫法中求直線實長的原理:
line 1的高為
a=|yZ1-yZ2|
line 1的長度為
所以直線實長為
圖3 求直線實長方法
根據(jù)此方法可通過一個三角形的主視圖和俯視圖求出該三角形三條邊的實長,即空間三角形攤平在平面上的形狀。如圖4所示,選這3條邊任意1條作為展開基準(即基準邊),基準邊的端點作為畫圓弧的圓心點,再以其他2條邊的實長作為半徑畫弧求出交點后連接交點和基準邊端點,得到的圖形就是三角面的實際外形尺寸。
圖4 求三角形實形方法
如圖5所示,將曲面沿直母線劃分為若干個三角形,三角形頂點位于曲面頂點或邊緣。然后求出所有三角形實形,并在平面上依序組合,就得到了曲面的展開圖。三角形劃分的越多,所得到的展開圖就越精確。
圖5 沿直母線劃分三角形
如圖6所示,首先要有曲面的主視圖和俯視圖,并且分界明顯,如果為其他視圖關系則旋轉成主視圖和俯視圖。根據(jù)直母線劃分三角形,三角形要求上下對應,所有直線顏色相同。
圖6 原始圖形要求
AutoCAD為二次開發(fā)提供了3種方式,分別是VBA腳本、AutoLisp腳本和ObjectARX庫,其中:VBA腳本逐漸沒落并在高版本中被拋棄;AutoLisp腳本不太適合處理復雜問題;ObjectARX庫最為強大,可以訪問部分VBA腳本和AutoLisp腳本無法訪問的對象,需要C++編程語言支撐。由于曲面展開過程中涉及較復雜的數(shù)據(jù)結構和運算,在此使用C++編程語言基于ObjectARX庫對AutoCAD進行二次開發(fā)較為方便高效,根據(jù)文章第2部分編寫AutoCAD自動批量求直線實長的程序,程序流程圖如圖7所示。
圖7 程序流程圖
(1) 拾取用戶所選的直線。
long nLength;
ads_name ssLines;
struct resbuf eb1;
wchar_t sbuf1[10] = {0};
eb1.restype=0; //實體名
lstrcpy(sbuf1,_T("LINE"));
eb1.resval.rstring=sbuf1;
eb1.rbnext=NULL;
acdbHostApplicationServices()->workingDatabase();
acutPrintf(_T(" Select lines: "));
int stat = acedSSGet(NULL,NULL,NULL,&eb1,ssLines);
if ((stat == RTERROR)||(stat == RTCAN))
{
acutPrintf(_T(" User select canceled. "));
return;
}
acedSSLength(ssLines, &nLength);
if (nLength %2 != 0) //判斷所選擇的直線的數(shù)目是否為偶數(shù)
{
acutPrintf(_T(" Error! Line Number is not even number. "));
return;
}
(2) 將兩端點x坐標均相等且顏色相同的直線配對存放。
typedef struct _PAIR_LINE //配對成功的2條線
{
AcGePoint3d pt1; //Line1 存放主視圖直線
AcGePoint3d pt2;
AcGePoint3d pt3; //Line2 存放俯視圖直線
AcGePoint3d pt4;
}PAIR_LINE,*PPAIR_LINE;
(3) 從配對好的直線組中找出三角形存放于三角形結構體。
typedef struct _TRANGLE //三組線組成的三角形
{
int nId; //nId表示三角形序號
bool bCenter; //用來指示當前三角形是否曾經(jīng)為中心三角形
PAIR_LINE pl1; //配對成功的3組線
PAIR_LINE pl2;
PAIR_LINE pl3;
AcGePoint3d pt1; //主視圖中三角形的3個點
AcGePoint3d pt2;
AcGePoint3d pt3;
AcGePoint3d pt4; //俯視圖中三角形的3個點
AcGePoint3d pt5;
AcGePoint3d pt6;
}TRANGLE,*PTRANGLE;
每次以當前三角形為中心,依據(jù)公共邊構建三角形樹:
typedef struct _TRANGLE_TREE //構建三角形樹,繪三角形時遍歷
{
TRANGLE stTrangleNode; //當前三角形
struct _TRANGLE_TREE* ptt[3]; //與當前三角形共一條邊的三角形
_TRANGLE_TREE()
{
for ( int i = 0 ; i < 3 ; i ++ )
{
ptt[i] = NULL;
}
}
}TRANGLE_TREE,*PTRANGLE_TREE;
(4) 依據(jù)繪圖基點和三角形樹逐個計算真實三角形頂點坐標。
typedef struct _REAL_TRANGLE //真實三角形
{
int nId; //三角形ID,與相應原三角形的ID相等
bool bReady; //頂點坐標是否已經(jīng)計算完畢
bool bDrawed; //是否已經(jīng)繪圖
bool bCenter; //是否曾經(jīng)作為中心三角形
double tb1; //3條邊實長
double tb2;
double tb3;
AcGePoint3d pt1; //3個頂點的坐標
AcGePoint3d pt2;
AcGePoint3d pt3;
_REAL_TRANGLE()
{
tb1 = 0.0;
tb2 = 0.0;
tb3 = 0.0;
}
}REAL_TRANGLE,*PREAL_TRANGLE;
需要注意的是,遍歷三角形樹計算真實三角形時(見圖8),下面的三角形為當前三角形,以當前三角形為中心去遍歷計算具有公共邊的三角形時,若以圖8中水平邊為公共邊,分別以兩端點和兩邊長畫圓求交點,實際上會得到2個交點,這時用AutoCAD自帶的IntersectWith函數(shù)得到圓的2個交點后應該去掉與當前三角形同一側的頂點。
圖8 遍歷三角形樹
(5) 調用CAD函數(shù)繪圖,將實體添加到圖形數(shù)據(jù)庫中的模型空間繪制出來。
將源代碼通過Visual Studio編譯器編譯生成.arx插件,在AutoCAD中使用ap命令加載插件,輸入注冊的CAD命令運行。如圖9所示,選中主視圖和俯視圖中的所有三角形,然后確定繪圖基點,程序自動繪制出展開圖。
圖9 某船型錨臺半邊圖形展開
根據(jù)三角線法展開原理,對AutoCAD進行二次開發(fā),實現(xiàn)批量自動求直線實長的功能,經(jīng)測試,在錨臺、側推、曲面開孔放樣下料中均可行。在實際應用中,對比原完全手動展開曲面的方式,可以節(jié)省約80%的工作量,并且確保了直線實長的準確性。需要注意的是,由于程序將3個頂點x坐標均相等的三角形判定為1組三角形,即同一個真實的三角形在主視圖和俯視圖中的投影, 并輔以直線顏色的判斷,故劃分三角形時不要使得三角形的邊呈鉛垂狀態(tài),對于類似錨臺的環(huán)形曲面,本文示例則根據(jù)對稱性只放樣一半曲面,放樣完成后再根據(jù)對稱性補全。對于復雜的不可展曲面,需要手動分割成幾塊以便近似處理,否則展開圖會出現(xiàn)裂縫。
在很長一段時間里,設計人員總是依據(jù)放樣原理進行手工放樣,不僅耗時而且設計人員的經(jīng)驗技藝難以傳承下來,設計停留在經(jīng)驗階段而無法邁向更高階段,工作效率難以整體性提升。若將經(jīng)驗技藝升級為程序化、知識庫化、系統(tǒng)化,則無疑有助于整體工作效率的穩(wěn)定提升,三角線法程序化展開曲面正是一種嘗試。
[1] 宋延杭, 王川, 李永宣. ObjectARX實用指南——AutoCAD二次開發(fā)[M] . 北京:人民郵電出版社, 1999.
[2] 徐榮璋, 劉曉毅, 陳軍. 曲面展開方法的發(fā)展現(xiàn)狀[J].模具技術, 2002(5):15-18.
[3] 余勇. 船舶曲面分段外板重構及其展開技術研究[D] . 鎮(zhèn)江: 江蘇科技大學, 2016.
[4] 潘煒, 吳慧, 李鐵瑞,等. 基于曲面展開的自由曲面網(wǎng)格劃分[J] . 浙江大學學報(工學版), 2016,50(10):1973-1979.
[5] 羅振華, 蔣芬, 蔣威. 針對不可展曲面的近似展開方法淺析[J] . 科技創(chuàng)新導報, 2014(30):51.
[6] 蔣威. 不可展曲面的近似展開及其應用[D] . 上海: 復旦大學, 2013.
[7] 肖雄, 黃朝炎, 胡勇,等. 三維曲面船體外板數(shù)學展開方法研究[J] . 船舶工程, 2013, 42(1):74-77.
[8] 閻佩佳, 薛卓, 張育丹. 復雜曲面展開[J]. 科技致富向導, 2012(14):366.