陳茂勇 陳 飛
(上海外高橋造船有限公司 設計一所 上海200137)
外板展開圖(Shell Expansion,以下簡稱SE)是船舶設計中最主要的結構圖之一,反映了船體外板的結構形式、板規布置和分段劃分等重要內容。傳統手工外板展開的主要工作在于反復地求取各縱向構件與肋骨線交點在SE上的坐標,亦即反復量取各肋骨線在不同交點處的曲線長度(區間圍長)。這種具備明確規則、單一且耗時的重復性工作,完全可由計算機程序來完成。AutoCAD作為通用的繪圖軟件,提供了強大豐富的基礎繪圖功能,但對諸多專業領域的支持仍顯不足。故此,需對AutoCAD進行二次開發,借助程序實現船體外板的自動展開。
目前,已有同行嘗試利用程序來輔助進行外板展開,但仍存在一些不足。主要體現在:
(1)肋骨型線的圖層需嚴格命名[1],對數據源的適用性要求較高,且圖層名攜帶的信息量有限;
(2)程序對肋骨型線的識別不夠智能,需手動按順序選擇對象來保證展開的準確性[2];
(3)展開過程中仍需較多的手工干預[3],自動化程度不理想;
(4)不具備展開線的標準化功能。
對此,本文探討了一種新的外板自動展開技術,較好地解決了上述不足。
船舶設計中外板的展開是一種近似展開,即橫向展開、縱向不展開。因此,船體外板上任意一點在展開后,沿船長方向的坐標保持不變,而沿船寬方向的坐標與該點在肋骨線上距中心線的曲線長度有關(如圖1所示)。通常,SE是以肋骨型線圖(Frame Lines,以下簡稱FL)為基礎繪制而成。

圖1 肋骨型線圖和外板展開圖
AutoCAD為工程設計人員提供了諸多二次開發途徑,其內嵌的AutoLISP/Visual LISP編程語言[4],實用且易學,在此被用作外板自動展開程序的二次開發工具。
為便于后文敘述,先定義兩個概念:
(1)肋骨線 泛指船體外板曲面上處于肋位面內的任意構件線、板縫線或其他虛擬線。
(2)縱線 泛指船體外板曲面上與肋骨線相交的任意構件線、板縫線或其他虛擬線。
船體型線由兩者共同組成。
根據近似展開原理,要將FL展開成SE,關鍵在于獲取FL上縱線和肋骨線的交點,并計算出對應點在SE上的坐標。因此,程序需具備如下三個基本功能:
(1) 自動識別FL上的縱線和肋骨線;
(2) 自動獲取縱線和肋骨線在FL上的交點;
(3) 自動計算交點在SE上對應的坐標。
此外,為減少展開過程中的手工干預,程序設計時增加如下兩個重要的輔助功能:
(1) 自動提取平底線和平邊線;
(2) 自動完成展開線的標準化。
實現自動展開的前提在于如何使程序“認識”并區分FL上的縱線和肋骨線。其中,肋骨線的肋位號識別是關鍵,它決定了SE上各點的橫坐標。AutoCAD中普通的曲線圖形上不包含肋位號信息,因而需要采用特定的方式對其進行編號,使之與對應的肋位號相互關聯。
本程序通過賦予圖元擴展數據的方法來實現與肋位號的關聯。AutoCAD中每個曲線對象都是一個圖元,圖元的擴展數據隨文檔保存,不因編輯等操作而丟失。被賦予擴展數據的型線將具備一種額外的自定義屬性,使其可以被程序“認識”并從復雜圖形中篩選出來。擴展數據的使用,不會對圖形造成任何可見的改變,但能被方便地編輯、查看和讀取。
按上文分析,程序設計流程如下頁圖2所示,后文將以主要程序代碼來進行介紹。

圖2 程序設計流程
為提升程序自動化程度,這里引入工程項的概念。將外板展開過程中所需的各項固定輸入條件寫入到一個文本文件,作為工程項保存。在開始或繼續一個工程前,先選擇對應的工程項,輸入條件將被讀取到AutoCAD內存空間,作為全局變量供程序隨時調用。工程項的設置,既避免了反復手動選擇對象或輸入各項參數的麻煩,還能使程序在不同項目間快速切換。
工程項主要包括肋距配置、FL/SE坐標原點定義和主尺度等相關參數。肋距配置是其中較為關鍵的一項,它決定了型線上各點展開后的X坐標。肋距配置同樣被寫入到文本文件,格式如圖3所示。

圖3 肋距配置文件
編寫一個簡單的肋距解析程序,只要給定肋位號,就可得到點在SE中X坐標。例如,求#54肋位的X坐標,計算公式為x=50×800+(FR-50)×860,將54代入公式中的FR即可。示例代碼如下:

坐標原點的定義,使程序能夠準確讀取型線交點的坐標并在指定位置進行外板展開。
主尺度的定義,使程序能夠根據型寬、型深和船長等數據將視圖縮放到特定的范圍。利用SSGET函數,將擴展數據作為過濾條件,程序可自動選擇該范圍內符合條件的型線;再配合VL-SORT函數,將肋位號作為對比條件對選擇集中的型線(主要是肋骨線)進行排序,即可省去手動依次選擇型線的操作。
肋骨線以肋位號來編號,下面的代碼可將包含肋位號的擴展數據添加到肋骨線上:


實現了肋位號的讀取,只要配合肋距解析程序,就可求得FL上任意型線交點在SE上對應的X坐標。
同理,每條縱線亦可被編號。對上述代碼稍作修改,將擴展數據注冊標記″FR″更改為 ″LL″,將數據類型代碼1040更改為1000即可實現。與肋位線編號不同的是,縱線的編號更加隨意,編號可以是 ″L1″、 ″UPPER DECK″或 ″20400 A/B″等。因為這種隨意性,程序可實現縱線的全自動編號,如″SL9000″、 ″SL9001″……依次遞增。程序自動識別已編號的縱線,忽略未編號的縱線,這樣可避免“一鍵”展開過程中無關曲線帶來的干擾,降低了程序對FL的適用性要求。
相比于利用圖層名等定義型線編號,上述方法不但不需修改FL的圖層名,還能使型線攜帶更多有助于外板準確展開的附加信息。比如, 當FL中的#20~#115肋骨線在某一段完全重合,經過此段肋骨線的縱線起始肋位為#25,終止肋位為#110。如果僅憑與肋骨線的交點來展開,該縱線將在#20~#115肋位之間展開,超出實際區間。此時,可以在該縱線的擴展數據中再增加一組限定肋位區間的特定數據,程序在檢測到這組數據時,該縱線將只在限定的肋位區間展開。
欲獲取肋骨線的區間圍長,先要確定該區間的起點和終點。AutoCAD中的曲線均有方向性,程序中需增加對曲線方向的判斷。假設肋骨線靠近FL坐標原點(中心線與基線交點)的端點為起點,則縱線與肋骨線的交點為終點。起點是確定的,終點需要求解。
為避免求解過程中的手工干預,提高自動化程度,程序設置了三個逐級嵌套的遍歷過程(求解流程見圖4)。

圖4 交點求解流程
(1)通過識別型線的編號,可獲取所有縱線的集合。遍歷縱線集合,得到與任意一條縱線相交的肋骨線集合。示例代碼如下:

(2)遍歷肋骨線集合,獲取任意縱線與肋骨線的交點集合。單個縱線與肋骨線的交點由下方代碼求得:

SE從中縱剖線開始展開,其上任意點的Y坐標為FL對應點處肋骨線區間圍長加上肋骨線最低點到基線的距離。以圖1中的P1點為例,肋骨線最低點到基線的距離為H1,P1處肋骨線區間圍長為L1,則展開后對應點P1′的Y坐標為H1+L1。對于P2′,肋骨線最低點到基線的距離為0,其Y坐標為L2。
通過上文分析,已分別求得SE上點的X、Y坐標,將這些點有序連接起來,即可實現外板展開。
1.6.1 肋骨線展開
肋骨線展開后為一條直線段,因此,只要給出已知的起點P_S′和終點P_E′,即可生成肋骨展開線。最簡單的方法是使用COMMAND函數來執行畫直線的命令:

1.6.2 縱線展開
縱線展開是外板展開的主要內容,一般使用多段線繪制。假設某條縱線經由上述分析得到的交點集合為points,其中包括p1,p2…pn共n個交點。程序通過生成圖元內部組碼來新建多段線,代碼如下:

需要指出的是,在FL中,船體中心線和甲板線也屬于縱線范疇,可由程序自動展開。前者展開后為中縱剖線,后者展開后為甲板邊線。因此,兩者應同樣被賦予縱線編號。船體首尾處的線型變化較大,增加FL上的肋骨線密度,可使縱線展開后更加光順。
1.6.3 提取平底線和平邊線
程序可實現自動提取平底線和平邊線。事實上,平底線和平邊線在FL上有其對應的虛擬縱線。前者為沿基線的直線段,后者為沿船體半寬的垂向直線段。在FL中繪制出這兩條虛擬縱線并進行編號,即可由程序自動展開。不過,該方法的不足之處在于,這兩條虛擬縱線的準確展開對型線精度要求極高,利用常規的FL展開后,往往不能得到令人滿意的光順線型。
解決這個問題的關鍵在于降低型線精度對縱線展開的影響,此處使用另一種方法來實現。以平底線為例,平底線在FL中與肋骨線的交點均位于基線上,且交點必定為肋骨線(二維多段線)上的一個節點。因此,只要提取出每條肋骨線與基線重合段最靠近舷側的節點,轉換成SE上對應的點,并連接成多段線即可。換而言之,各肋骨線的節點中,Y坐標為0,且X坐標絕對值最大的就是平底線在FL上所對應的節點。依此思路,問題即變為分析FL中肋骨線的節點坐標。為降低對FL的線型精度要求,可設置一個適當的允差T(如0.1)。假設肋骨線節點的Y坐標絕對值不大于T,則斷定該點位于基線上(參考如下代碼)。


其中fr_lst為按肋位號排序的肋骨線集合,可通過分析肋骨線的擴展數據得到。程序的運行結果為平底線在FL上對應的點集,經由程序轉換成SE上的點集并連接成線,即為平底線。平邊線可由類似方法提取。
至此,外板展開的主要內容已完全由程序實現。為減少后續手工干預,可由程序對展開線進行標準化設置,使之符合企業的繪圖標準,包括圖層、顏色、線型、線寬等內容。以圖層設置為例,假設在繪圖標準中,縱桁結構在圖面上的標注名稱為*GIRDER*,其圖層名為LAYER5,普通縱骨展開線的圖層名為LAYER1。用戶可將*GIRDER*作為該縱桁編號,程序通過識別縱線的擴展數據,自動將編號包含*GIRDER*的縱線展開歸入到LAYER5圖層,其余則歸入LAYER1圖層。示例代碼如下:

同理,將繪圖標準中的顏色、線型、線寬等設置與型線編號進行關聯后,可由程序自動完成對應標準化設置。
提升,還能有效避免展開過程中可能產生的誤差和錯誤。在實際開發中,AutoLISP編程語言配合DCL(對話控制語言)可以展現友好的交互式界面,提升程序易用性。限于篇幅,文中所示的程序代碼多經過簡化,在此僅作為自動展開技術的載體而呈現。
上文借助對程序的解析,完整地闡述了外板自動展開技術,實現快速展開的目標。該技術經若干舊船型試應用和實船項目正式應用,其可靠性得到了有效驗證。在具備完整FL的前提下,進行項目的必要配置和型線編號可在30 min內完成,而其后的外板展開過程只需約1 min便可完成。相比于傳統的手工展開,外板自動展開不但在效率上呈數量級