解斌,朱大勇,郝煜
(1.武漢市勘測(cè)設(shè)計(jì)研究院,湖北武漢 430022;2.天津市勘察院,天津 300191)
AutoDesk公司的AutoCAD軟件,以其杰出的圖形編輯和處理能力得到了廣泛應(yīng)用。在應(yīng)用中,常常需要結(jié)合專業(yè)情況將圖形繪制功能進(jìn)行擴(kuò)充,僅靠Auto-CAD自身的功能,難以滿足應(yīng)用中對(duì)效率的需求。在筆者的工作中,常常需要對(duì)房屋分成平面示意圖中的房屋邊長(zhǎng)進(jìn)行標(biāo)注。雖然AutoCAD提供了長(zhǎng)度的標(biāo)注功能,但是手工對(duì)每條邊進(jìn)行標(biāo)注,不僅耗時(shí),而且標(biāo)注位置難以精確控制,也無(wú)法形成統(tǒng)一的標(biāo)準(zhǔn)。
本文對(duì)邊長(zhǎng)自動(dòng)標(biāo)注的方法進(jìn)行了闡述。經(jīng)該方法生成的標(biāo)注滿足以下幾個(gè)特點(diǎn):①標(biāo)注垂直于所標(biāo)注邊長(zhǎng);②連續(xù)共線的多線統(tǒng)一標(biāo)注;③所有標(biāo)注到標(biāo)注邊長(zhǎng)的垂距相等;④標(biāo)注點(diǎn)位于標(biāo)注邊長(zhǎng)的中心;⑤標(biāo)注文字已標(biāo)注點(diǎn)位中心居中對(duì)齊。
ObjectARX是一種開發(fā)AutoCAD應(yīng)用程序的工具,它以C++為編程語(yǔ)言,采用先進(jìn)的面向?qū)ο蟮木幊淘?,提供可與AutoCAD直接交互的開發(fā)環(huán)境,能使用戶方便快捷地開發(fā)出高效簡(jiǎn)潔的AutoCAD應(yīng)用程序。其主要特點(diǎn)如下:
(1)能對(duì)AutoCAD的所有事務(wù)進(jìn)行完整的、先進(jìn)的、面向?qū)ο蟮脑O(shè)計(jì)與開發(fā),相比其他二次開發(fā)工具其速度更快、集成度更高、穩(wěn)定性更強(qiáng)。
(2)ObjectARX包含的動(dòng)態(tài)鏈接庫(kù)與AutoCAD在同一地址空間運(yùn)行并能直接利用AutoCAD核心數(shù)據(jù)結(jié)構(gòu)和代碼,使二次開發(fā)者可以充分利用AutoCAD的開放結(jié)構(gòu),直接訪問AutoCAD數(shù)據(jù)庫(kù)結(jié)構(gòu)、圖形系統(tǒng)以及CAD幾何造型核心,以實(shí)時(shí)擴(kuò)展AutoCAD的功能,創(chuàng)建能全面享受AutoCAD固有命令的新命令。
(3)ObjectARX可以按需要加載應(yīng)用程序,并可以在同一水平上與Windows系統(tǒng)集成,甚至與其他Windows應(yīng)用程序?qū)崿F(xiàn)交互操作。
使用ObjectARX開發(fā)技術(shù),可以創(chuàng)建快速、高效、緊湊的AutoCAD程序,使ARX應(yīng)用程序不僅具有交互性、綜合性,而且還具有智能性。應(yīng)用ObjectARX技術(shù)生成的ARX應(yīng)用程序充分體現(xiàn)了ObjectARX技術(shù)的優(yōu)點(diǎn),同時(shí)還可在不同的操作系統(tǒng)中移植。
(1)自動(dòng)標(biāo)注基本過(guò)程
第一步:手工點(diǎn)選待標(biāo)注的閉合多邊形。
第二步,計(jì)算標(biāo)注點(diǎn)相對(duì)標(biāo)注邊的方向值。標(biāo)注點(diǎn)在直線左邊,則相對(duì)方向值為90°,否則取270°。
第三步:逐個(gè)標(biāo)注邊長(zhǎng)。根據(jù)邊的兩個(gè)端點(diǎn)及第二步計(jì)算的標(biāo)注方向值,計(jì)算標(biāo)注點(diǎn),并加入標(biāo)記到AutoCAD的圖形空間。
(2)計(jì)算標(biāo)注點(diǎn)相對(duì)方向
標(biāo)注點(diǎn)的相對(duì)方向,指的是標(biāo)注點(diǎn)相對(duì)于所標(biāo)注的線段的旋轉(zhuǎn)角。如圖1所示,閉合多邊形起點(diǎn)為a,止點(diǎn)為b,p1,p2為多邊形中待標(biāo)注的線段。如標(biāo)注在多邊形外部,則相對(duì)方向?yàn)?0°,反之如標(biāo)注在內(nèi)部,相對(duì)方向則為270°。
算法過(guò)程如下:
第一步:取閉合多邊形第一點(diǎn)和第二點(diǎn),并以其中點(diǎn)為基點(diǎn)用極坐標(biāo)方法解算出與之相交90°、距離為0.5 m的標(biāo)注點(diǎn)坐標(biāo)。
第二步:取第一步計(jì)算的坐標(biāo)點(diǎn),判斷其是否在標(biāo)注多邊形的內(nèi)部。如該點(diǎn)坐標(biāo)滿足注記的條件,則相對(duì)方向?yàn)?0°,反之取270°。
圖1 標(biāo)注點(diǎn)相對(duì)方向示意圖
(3)點(diǎn)鏈的旋轉(zhuǎn)與多余點(diǎn)的刪除
在實(shí)際繪圖過(guò)程中,會(huì)出現(xiàn)相鄰多點(diǎn)共線的情況,這時(shí)候要求把這些共線的點(diǎn)合并為一條邊來(lái)注記。為了簡(jiǎn)化操作,必須避免起始點(diǎn)和終止點(diǎn)以及它們的相鄰點(diǎn)產(chǎn)生三點(diǎn)或多點(diǎn)共線的情況。一方面需要對(duì)多邊形的點(diǎn)鏈進(jìn)行旋轉(zhuǎn),務(wù)必使起始點(diǎn)處不出現(xiàn)三點(diǎn)及多點(diǎn)共線的情況。另一方面僅需保留多點(diǎn)共線時(shí)的端點(diǎn),刪除中間點(diǎn)。我們把前后兩條邊不共線的點(diǎn)叫做拐點(diǎn)。點(diǎn)鏈的旋轉(zhuǎn)實(shí)際上是從起始點(diǎn)開始,找到第一個(gè)拐點(diǎn),并以其作為點(diǎn)鏈的起始點(diǎn),其操作過(guò)程只是改變點(diǎn)在點(diǎn)鏈中的位置。共線冗余點(diǎn)的刪除會(huì)改變點(diǎn)鏈的大小,實(shí)現(xiàn)過(guò)程中為了不改變?cè)紙D形,對(duì)多邊形注記時(shí)首先復(fù)制多邊形點(diǎn)鏈,然后對(duì)復(fù)制的點(diǎn)鏈進(jìn)行旋轉(zhuǎn)和刪除操作。
(4)逐邊計(jì)算標(biāo)注點(diǎn)并注記
標(biāo)注點(diǎn)的計(jì)算采用極坐標(biāo)方法,利用ObjectARX提供的API函數(shù)acutPolar來(lái)實(shí)現(xiàn)。其函數(shù)原型如下:
第一個(gè)參數(shù)表示基準(zhǔn)點(diǎn),第二個(gè)參數(shù)表示兩點(diǎn)連線的方位角,第三個(gè)參數(shù)表示兩點(diǎn)之間的距離,第四個(gè)參數(shù)表示待求點(diǎn)?;鶞?zhǔn)點(diǎn)一般取線段兩端點(diǎn)的中點(diǎn),方位角取線段的方位角與相對(duì)方向之和,距離一般取注記高度的一半。
標(biāo)注點(diǎn)計(jì)算出來(lái)后,便在標(biāo)注點(diǎn)處插入標(biāo)注。下面是具體實(shí)現(xiàn)的代碼:
acedCommand(RTSTR,"._dimaligned",RTPOINT,pt1,RTPOINT,pt2,RTPOINT,pt3,0);
參數(shù)pt1,pt2是標(biāo)注線段的兩個(gè)端點(diǎn),pt3是標(biāo)注點(diǎn)坐標(biāo)。acedCommand是一個(gè)API函數(shù),其參數(shù)由一串參數(shù)類型及其值組成,并以0作為結(jié)束。如圖2和圖3是實(shí)際標(biāo)注效果圖。
圖2 在房屋輪廓外標(biāo)注效果圖
圖3 在房屋輪廓內(nèi)標(biāo)注效果圖
本文詳細(xì)介紹了AutoCAD平臺(tái)下多邊形邊長(zhǎng)自動(dòng)標(biāo)注實(shí)現(xiàn)的方法,并利用VC.NET 2002和Object-ARX 2005作為開發(fā)工具,實(shí)現(xiàn)了該方法,給出了應(yīng)用實(shí)例。通過(guò)實(shí)踐表明,該方法有較強(qiáng)的針對(duì)性和實(shí)用性,提高了房屋分成平面示意圖的生產(chǎn)效率。
[1] 李長(zhǎng)勛.AutoCAD ObjectARX程序開發(fā)技術(shù)[M].北京:國(guó)防工業(yè)出版社,2005
[2] Harvey M.Deitel,Paul J.Deitel著.郭凱,蔡飛譯.VC++.NET高級(jí)編程[M].北京:清華大學(xué)出版社,2004
[3] 張晉西.Visula Basic與AutoCAD二次開發(fā)[M].北京:清華大學(xué)出版社,2002
[4] 張帆.ObjectARX開發(fā)實(shí)例教程[M].北京智帆高科科技有限公司,2007
[5] Charles McAuley著.李世國(guó),潘建忠,平雪良譯.Programming AutoCAD 2000 Using ObjectARX[M].北京:機(jī)械工業(yè)出版社,2000
[6] 李冠億.深居淺出AutoCAD二次開發(fā)開發(fā)基礎(chǔ).2010