• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

    劉超 湯人杰 尹竹瑩

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

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

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

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

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

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

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

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

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

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

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

    圖1 圖紙示例

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

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

    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è)會有注釋,如圖1 中的“設(shè)計(jì)坡度”和“設(shè)計(jì)標(biāo)高”。獲取“設(shè)計(jì)坡度”和“設(shè)計(jì)標(biāo)高”的坐標(biāo),用于分離每條線路的數(shù)據(jù)。

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

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

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

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

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

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

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

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

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

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

    圖3 上行線和下行線劃分

    記橫坐標(biāo)最小的豎線V0的起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)分別為(xst,yst)和(xed,yed),長度為l0。以V0為基準(zhǔn),將y≥yed+l0的豎線標(biāo)記為上行線,此時上行線標(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,則同時存在上行線、下行線和環(huán)線,此時不更新標(biāo)記。

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

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

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

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

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

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

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

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

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

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

    若存在環(huán)線,環(huán)線數(shù)據(jù)位于上行線或下行線數(shù)據(jù)中,則存在一個“設(shè)計(jì)坡度”的橫坐標(biāo)xzy滿足(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ù)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    如圖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)站路段

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

    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盤根目錄。

    6 實(shí)例測試

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

    圖9 輸入對話框

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

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

    圖11 原始圖紙

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

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

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

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

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

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

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

    7 結(jié)語

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

    猜你喜歡
    豎線設(shè)計(jì)標(biāo)高坡長
    可自動消除NG豎線缺陷的Mura檢測機(jī)設(shè)計(jì)探究
    地邊截水地物對黑土區(qū)小流域坡長因子計(jì)算的影響
    影響場地設(shè)計(jì)標(biāo)高調(diào)整的關(guān)鍵因素研究
    懸澆過程中主梁標(biāo)高變更對連續(xù)梁橋受力性能的影響分析
    TFT-LCD彩膜工藝宏觀缺陷自動化修補(bǔ)的探究
    坡長對貴州喀斯特區(qū)黃壤坡耕地土壤侵蝕的影響
    象形文字走走看
    象形文字走走看
    淺析大型場地平整和土方填挖施工
    流域分布式坡長不確定性的初步分析
    博白县| 彩票| 丹东市| 郸城县| 临武县| 喜德县| 南岸区| 安康市| 商洛市| 温州市| 辉南县| 土默特右旗| 新龙县| 伊吾县| 普定县| 弥勒县| 英德市| 津市市| 湖南省| 京山县| 宜黄县| 锡林浩特市| 乐业县| 甘孜| 鹤庆县| 乌海市| 通渭县| 祁东县| 万载县| 潞城市| 越西县| 会宁县| 冕宁县| 琼中| 宁远县| 苍溪县| 梅河口市| 方城县| 达尔| 漳州市| 潞西市|