国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于VBA的牽引計(jì)算用坡度坡長(zhǎng)自動(dòng)提取

2023-11-06 01:37劉超湯人杰尹竹瑩
科技資訊 2023年20期
關(guān)鍵詞:豎線設(shè)計(jì)標(biāo)高坡長(zhǎng)

劉超 湯人杰 尹竹瑩

(中車(chē)株洲電力機(jī)車(chē)有限公司 湖南株洲 412001)

軌道交通車(chē)輛牽引計(jì)算需要使用線路的坡度和坡長(zhǎng)數(shù)據(jù)。傳統(tǒng)的提取方式為人工讀取CAD文件,將數(shù)據(jù)逐一錄入到Excel 中。在CAD 文件中,與整條線路相比,坡度坡長(zhǎng)數(shù)據(jù)的字體不大;相鄰數(shù)據(jù)間隔較大。若放大圖紙,一次讀取的數(shù)據(jù)較少,將大幅增加錄入時(shí)間;若不放大圖紙,某些數(shù)字容易讀錯(cuò),將直接影響牽引計(jì)算的精度。

基于VBA的CAD二次開(kāi)發(fā)功能,可以使用程序批量處理大量文檔數(shù)據(jù),已經(jīng)用于軟件及插件開(kāi)發(fā)[1-2]、圖紙繪制及修改[3-8]、數(shù)據(jù)提取[9-11]等。

為自動(dòng)提取坡度坡長(zhǎng)數(shù)據(jù),本文編寫(xiě)了VBA 程序。讀取設(shè)計(jì)坡度和設(shè)計(jì)標(biāo)高所在圖層的數(shù)據(jù),將其導(dǎo)出到Excel,排序后確定上行線、下行線和環(huán)線數(shù)據(jù),通過(guò)設(shè)計(jì)標(biāo)高得到坡度值的正負(fù)號(hào)。實(shí)際應(yīng)用結(jié)果驗(yàn)證了程序的有效性和可行性。

1 原始數(shù)據(jù)獲取

1.1 獲取設(shè)計(jì)坡度、設(shè)計(jì)標(biāo)高的圖層名稱(chēng)

通過(guò)InputBox( )得到手動(dòng)輸入的設(shè)計(jì)坡度、設(shè)計(jì)標(biāo)高圖層名稱(chēng)。

一張圖紙中可能同時(shí)存在上行線、下行線、環(huán)線,不同線路設(shè)計(jì)坡度、設(shè)計(jì)標(biāo)高所在圖層的名稱(chēng)可能不同,故需要判定是否包含多個(gè)圖層,若存在多個(gè)圖層,分離出每個(gè)圖層名稱(chēng)和圖層總數(shù)。

1.2 讀取設(shè)計(jì)坡度、設(shè)計(jì)標(biāo)高所在圖層的數(shù)據(jù)

對(duì)于設(shè)計(jì)標(biāo)高圖層的數(shù)據(jù),若圖層名稱(chēng)和設(shè)計(jì)標(biāo)高圖層名稱(chēng)相同、類(lèi)型為文本,則將字符串、坐標(biāo)保存到數(shù)組中,通過(guò)計(jì)數(shù)器變量實(shí)時(shí)更新總數(shù)。

設(shè)計(jì)坡度圖層中除了坡度和坡長(zhǎng)以外,還存在旋轉(zhuǎn)了90°的數(shù)據(jù),如圖1 所示,故除了圖層名稱(chēng)和類(lèi)型需滿(mǎn)足要求外,還需限定旋轉(zhuǎn)角度為0。

圖1 圖紙示例

設(shè)計(jì)坡度圖層中,每一段路程的起點(diǎn)和終點(diǎn)有一條豎線,如圖1 所示,讀取豎線的坐標(biāo),用于匹配坡度坡長(zhǎng)數(shù)據(jù)、更新起點(diǎn)站和終點(diǎn)站的坡長(zhǎng)。

本文使用的是中望CAD,文本、線條類(lèi)型分別為ZcadText和ZcadLine。不同類(lèi)型的對(duì)象的屬性不完全相同,故在獲取數(shù)據(jù)時(shí),滿(mǎn)足類(lèi)型相同后才判斷其他條件。

1.3 讀取起點(diǎn)站、終點(diǎn)站、設(shè)計(jì)坡度、設(shè)計(jì)標(biāo)高的坐標(biāo)

一般圖紙中起點(diǎn)站左邊、終點(diǎn)站右邊均存在少量線路數(shù)據(jù),故需要獲取起點(diǎn)站、終點(diǎn)站的坐標(biāo),用于標(biāo)記有用數(shù)據(jù)。

每條線路最左側(cè)會(huì)有注釋?zhuān)鐖D1 中的“設(shè)計(jì)坡度”和“設(shè)計(jì)標(biāo)高”。獲取“設(shè)計(jì)坡度”和“設(shè)計(jì)標(biāo)高”的坐標(biāo),用于分離每條線路的數(shù)據(jù)。

圖紙中文字可能存在空格,如“設(shè) 計(jì) 標(biāo) 高”,故對(duì)于文本類(lèi)型的對(duì)象,需要對(duì)每個(gè)字符進(jìn)行匹配,同時(shí)滿(mǎn)足時(shí)將坐標(biāo)存儲(chǔ)于數(shù)組中。

2 豎線數(shù)據(jù)處理

若圖紙只有一條線路,默認(rèn)為上行線;若包含環(huán)線且終點(diǎn)站在環(huán)線上,默認(rèn)環(huán)線位于上行線或下行線的右側(cè)。

2.1 創(chuàng)建Excel文件并寫(xiě)入數(shù)據(jù)

CAD VBA 讀取數(shù)據(jù)的原則是根據(jù)數(shù)據(jù)放置的先后順序,則讀取的數(shù)據(jù)不一定按照橫坐標(biāo)從小到大的順序排列,本文借助Excel 對(duì)其進(jìn)行排序。通過(guò)CAD VBA 新建Excel 文件,新增3 個(gè)空白工作簿,分別保存坡度坡長(zhǎng)、標(biāo)高、豎線的數(shù)據(jù)。

寫(xiě)入數(shù)據(jù)時(shí),先將保存在數(shù)組中的變量賦值給Variant變量,再賦值給Excel,將無(wú)用的數(shù)據(jù)清除。

2.2 分離豎線的上行線和下行線數(shù)據(jù)

將豎線的橫坐標(biāo)按照升序進(jìn)行排序,調(diào)整豎線的起點(diǎn)和終點(diǎn),始終滿(mǎn)足起點(diǎn)的縱坐標(biāo)小于終點(diǎn)的縱坐標(biāo)。

圖2 為每條線路的標(biāo)注,一般設(shè)計(jì)標(biāo)高和設(shè)計(jì)坡度不在兩端,則兩條線路之間的距離大于豎線的長(zhǎng)度。此外,同一條線路的豎線的長(zhǎng)度不一定相同,可能存在細(xì)微偏差,如圖3所示。

圖2 圖紙標(biāo)注示例

圖3 上行線和下行線劃分

記橫坐標(biāo)最小的豎線V0的起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)分別為(xst,yst)和(xed,yed),長(zhǎng)度為l0。以V0為基準(zhǔn),將y≥yed+l0的豎線標(biāo)記為上行線,此時(shí)上行線標(biāo)志位flag_sxx=1;y≤yst-l0的豎線標(biāo)記為下行線,下行線標(biāo)志位flag_xxx=1;yed-l0≤y≤yst+l0的豎線標(biāo)記為中線,如圖3所示。

(1)若flag_sxx=1 且flag_xxx=1,則同時(shí)存在上行線、下行線和環(huán)線,此時(shí)不更新標(biāo)記。

(2)若flag_sxx=1且flag_xxx=0,則存在一條線路在上方,默認(rèn)縱坐標(biāo)大的線路為上行線,將中線改為下行線。

(3)除上述情況外,將中線改為上行線。

更新標(biāo)記后,進(jìn)行以下處理。

(1)按照標(biāo)記升序的原則進(jìn)行排序。

(2)對(duì)于相鄰、橫坐標(biāo)之差小于1 的豎線,刪除其中一條。

(3)確定上行線和下行線的分界點(diǎn)和分界線,見(jiàn)圖4。

圖4 上行線和下行線分界線

分界線縱坐標(biāo)表達(dá)式為ysx=(ysxx0+yxxx0)/2,ysxx0、yxxx0分別為上行線第一條豎線起點(diǎn)縱坐標(biāo)和下行線第一條豎線終點(diǎn)縱坐標(biāo)。若圖紙中只有一條線路,則ysx=0。

通過(guò)分界點(diǎn)確定下行線數(shù)據(jù)個(gè)數(shù),可能存在個(gè)別上行線豎線偏離其他豎線,被判定為下行線的情況,故假定下行線數(shù)據(jù)個(gè)數(shù)大于3個(gè)時(shí)才計(jì)算分界線。

2.3 分離豎線中的環(huán)線數(shù)據(jù)

若存在環(huán)線,環(huán)線數(shù)據(jù)位于上行線或下行線數(shù)據(jù)中,則存在一個(gè)“設(shè)計(jì)坡度”的橫坐標(biāo)xzy滿(mǎn)足(xzy-xxx0)(xzy-xxxk)<0,其中xxx0、xxxk分別為上行線或下行線的起點(diǎn)和終點(diǎn)的橫坐標(biāo),設(shè)定該橫坐標(biāo)xzy為環(huán)線的分界線。

將上行線和下行線中橫坐標(biāo)大于xzy的豎線標(biāo)記為環(huán)線。

3 標(biāo)高數(shù)據(jù)處理

3.1 分離上行線、下行線和環(huán)線數(shù)據(jù)

通過(guò)ysx將標(biāo)高數(shù)據(jù)標(biāo)記為上行線和下行線,然后按照標(biāo)記升序進(jìn)行排序,確定上行線和下行線的分界點(diǎn);通過(guò)xzy標(biāo)記標(biāo)高環(huán)線數(shù)據(jù)。

相鄰標(biāo)高數(shù)據(jù),若滿(mǎn)足標(biāo)高值、橫坐標(biāo)和縱坐標(biāo)之差的絕對(duì)值小于1,則刪除其中一個(gè)標(biāo)高數(shù)據(jù)。圖5是環(huán)線分界線圖。

圖5 環(huán)線分界線

3.2 刪除偏離豎線較遠(yuǎn)的標(biāo)高數(shù)據(jù)

可能存在位于兩條豎線之間的標(biāo)高值,如圖6 所示。一條豎線對(duì)應(yīng)一個(gè)標(biāo)高數(shù)據(jù),對(duì)于第k個(gè)標(biāo)高數(shù)據(jù),從第k-n條豎線開(kāi)始判斷,若標(biāo)高的橫坐標(biāo)和豎線的橫坐標(biāo)之差的絕對(duì)值大于10,清除該行的標(biāo)高數(shù)據(jù)。n為第k個(gè)標(biāo)高數(shù)據(jù)之前被清空數(shù)據(jù)的標(biāo)高的總數(shù),每清空一個(gè)標(biāo)高數(shù)據(jù)時(shí)通過(guò)n=n+1更新n值。所有的標(biāo)高數(shù)據(jù)均核對(duì)后,將清空形成的空白行刪除。

圖6 冗余的標(biāo)高數(shù)據(jù)

4 坡度坡長(zhǎng)數(shù)據(jù)處理

4.1 分離上行線、下行線和環(huán)線數(shù)據(jù)

和標(biāo)高數(shù)據(jù)的處理方式相同,通過(guò)ysx和xzy標(biāo)記上行線、下行線和環(huán)線。排序后確定上行線和下行線的分界點(diǎn)。

4.2 匹配標(biāo)高和坡度坡長(zhǎng)

將坡度坡長(zhǎng)數(shù)據(jù)放到左側(cè)最近的標(biāo)高數(shù)據(jù)所在行,以圖6為例,將坡度值-2、坡長(zhǎng)值430及坐標(biāo)放到標(biāo)高11.64所在行。

由于同一組坡度坡長(zhǎng)未合并到同一行,對(duì)于第n個(gè)坡度坡長(zhǎng),從第Roundup(n/2)個(gè)標(biāo)高數(shù)據(jù)開(kāi)始遍歷,當(dāng)坡度或坡長(zhǎng)的橫坐標(biāo)介于第m個(gè)和m+1個(gè)標(biāo)高的橫坐標(biāo)之間時(shí),將第n個(gè)坡度坡長(zhǎng)放在第m個(gè)標(biāo)高數(shù)據(jù)所在行,滿(mǎn)足先坡度后坡長(zhǎng);然后通過(guò)標(biāo)高值確定坡度的正負(fù)號(hào),若第m個(gè)標(biāo)高值大于第m+1個(gè)標(biāo)高值,則坡度符號(hào)為正,否則為負(fù)。

5 更新坡度坡長(zhǎng)數(shù)據(jù)

5.1 確定起點(diǎn)站和終點(diǎn)站位置

只考慮兩種站點(diǎn)標(biāo)注方式,第一種如圖7所示,每個(gè)站點(diǎn)標(biāo)注了相鄰站點(diǎn)的名稱(chēng)。

圖7 站點(diǎn)標(biāo)注

第二種只標(biāo)注每個(gè)站點(diǎn)的名稱(chēng)。站點(diǎn)個(gè)數(shù)為奇數(shù)時(shí),以中間站為真實(shí)站點(diǎn);為偶數(shù)個(gè)時(shí),對(duì)于起點(diǎn)站,以橫坐標(biāo)較小的為真實(shí)站點(diǎn);對(duì)于終點(diǎn)站,以橫坐標(biāo)較大的為真實(shí)站點(diǎn)。

5.2 更新起點(diǎn)站和終點(diǎn)站坡長(zhǎng)

如圖8所示,以起點(diǎn)站為例,起點(diǎn)站到右側(cè)豎線的距離表達(dá)式為d=p(xn+1-xqdz)/(xn+1-xn),p為坡度值,xqdz、xn、xn+1分別為起點(diǎn)站、第n條豎線、第n+1條豎線的橫坐標(biāo)。

圖8 起點(diǎn)站路段

對(duì)于起點(diǎn)站,直接更新第n個(gè)標(biāo)高所在行的坡長(zhǎng)值;對(duì)于終點(diǎn)站,在第n個(gè)和第n+1 個(gè)標(biāo)高之間插入空白行,此時(shí)空白行為第n+1個(gè)數(shù)據(jù),將第n行賦給第n+1行,更新第n個(gè)和第n+1個(gè)坡長(zhǎng)值。

5.3 將環(huán)線標(biāo)記為上行線和下行線

若存在環(huán)線,默認(rèn)終點(diǎn)站左側(cè)的數(shù)據(jù)屬于上行線,右側(cè)數(shù)據(jù)屬于下行線。按照上行線/下行線、環(huán)線進(jìn)行排序,排序后下行線數(shù)據(jù)順序?yàn)橄拳h(huán)線再主線,按照橫坐標(biāo)從大到小的順序?qū)χ骶€進(jìn)行排序。保存提取的數(shù)據(jù)默認(rèn)保存在D盤(pán)根目錄。

6 實(shí)例測(cè)試

以某項(xiàng)目為例,無(wú)環(huán)線,上行線和下行線分別單獨(dú)放在一張圖紙中。程序運(yùn)行后,彈出4個(gè)對(duì)話框,分別要求手動(dòng)輸入坡度圖層、標(biāo)高圖層、起點(diǎn)站名稱(chēng)、終點(diǎn)站名稱(chēng),如圖9所示。

圖9 輸入對(duì)話框

4個(gè)對(duì)話框均輸入后,程序自動(dòng)運(yùn)行,輸出的部分結(jié)果如圖10 所示,原始圖紙如圖11 所示。坡度值、坡長(zhǎng)值滿(mǎn)足要求,坡度的正負(fù)號(hào)符合要求。

圖10 提取的部分?jǐn)?shù)據(jù)

圖11 原始圖紙

該圖紙中存在個(gè)別坡度坡長(zhǎng)數(shù)據(jù)的圖層為0,如圖12所示,程序讀取的結(jié)果如圖13所示。

圖12 坡度坡長(zhǎng)異常數(shù)據(jù)

圖13 坡度坡長(zhǎng)異常數(shù)據(jù)提取結(jié)果

該路段不在兩端,坡度坡長(zhǎng)數(shù)據(jù)為空,標(biāo)高不為空,設(shè)計(jì)人員可以通過(guò)標(biāo)高值快速找到異常數(shù)據(jù)的位置。

以包含環(huán)線的項(xiàng)目的圖紙進(jìn)行測(cè)試,部分結(jié)果如圖14 所示。上行線最后一條豎線沒(méi)有對(duì)應(yīng)的坡度坡長(zhǎng)值,和實(shí)際相符。

圖14 環(huán)線提取結(jié)果

由上述結(jié)果可知,程序提取結(jié)果滿(mǎn)足要求。

7 結(jié)語(yǔ)

為了自動(dòng)從CAD 圖紙中提取線路的坡度坡長(zhǎng)數(shù)據(jù),編寫(xiě)了VBA 程序,只需人工輸入起點(diǎn)站和終點(diǎn)站名稱(chēng)、坡度坡長(zhǎng)和標(biāo)高所在圖層,操作簡(jiǎn)單。測(cè)試結(jié)果表明:由程序提取的坡度坡長(zhǎng)的準(zhǔn)確性滿(mǎn)足要求;與傳統(tǒng)方法相比,大幅減少了數(shù)據(jù)錄入的時(shí)間。

猜你喜歡
豎線設(shè)計(jì)標(biāo)高坡長(zhǎng)
可自動(dòng)消除NG豎線缺陷的Mura檢測(cè)機(jī)設(shè)計(jì)探究
地邊截水地物對(duì)黑土區(qū)小流域坡長(zhǎng)因子計(jì)算的影響
影響場(chǎng)地設(shè)計(jì)標(biāo)高調(diào)整的關(guān)鍵因素研究
懸澆過(guò)程中主梁標(biāo)高變更對(duì)連續(xù)梁橋受力性能的影響分析
TFT-LCD彩膜工藝宏觀缺陷自動(dòng)化修補(bǔ)的探究
坡長(zhǎng)對(duì)貴州喀斯特區(qū)黃壤坡耕地土壤侵蝕的影響
象形文字走走看
淺析大型場(chǎng)地平整和土方填挖施工
流域分布式坡長(zhǎng)不確定性的初步分析
坡長(zhǎng)對(duì)水土流失影響的研究現(xiàn)狀及展望