摘要:介紹利用AutoCAD內(nèi)嵌語言AutoLISP的數(shù)據(jù)庫操作函數(shù),實現(xiàn)測量坐標系與施工坐標的換算問題,并附上換算程序。
關鍵詞:AutoCAD;Au toLISP;坐標系統(tǒng)換算
一 、問題的提出
總圖設計人員為便于設計,常常根據(jù)場地情況采用施工坐標系,以便使新設計建筑物的軸線平行于施工坐標軸。施工坐標系與測量坐標系的坐標換算公式:
由AB換為XY
X =X o +Ac osR O+BsinR O
Y= Y o 一As inR O+BcosR O
由 XY 換 為AB
A= ( X 一XO)cosR O一(Y一YO)sinR O
B= ( X一 XO)sinR O+(Y一YO)cosR O
式中,Xo, Y。為施工坐標系原點在測量坐標系中的“坐標,R。為施工坐標系統(tǒng)A軸正方向與測量坐標系統(tǒng)X軸正方向的夾角,如圖1,圖1(a)中為正值,圖1(b)中為負值。
二、 平面坐標的換算
AutoCAD得以在世界范圍內(nèi)流行的重要因素之一,是它的開放性,它將二次開發(fā)權(quán)交給了用戶,并提供了許多開發(fā)工具,特別是內(nèi)嵌的AutoLISP
語言簡單易學,且功能強大。筆者就是利用AutoLISP編程來簡化坐標系統(tǒng)換算的。下面介紹給大家,程序如下:
(de fun c :x ths(/ald f m n o 禪wx 1Y O
(set qa l (ge tdi st” n輸人0V ’”):“)
x1( get d ist ” n 輸人 X o:”)
yl( g etd ist ” n 輸 人 YO:”)
n(g etd ist” n(X ,Y E A,B= 1)(A,B==>X,Y
=2)}1}):”)
o(ss get ") C) w(l ist 0 0 )p (ilstyl x l)
d(f ix a l) a l (‘ (一 al d ) 10 0)f(fixa l)m(* 1 00
(一alf) )
al( +d (/ f 60 .0) (/ m 3 6 00.0))
) (斌 = nn il) (se tqn 1 ))
(if (/ =n 1 )
(por gn
(set qa l (‘ 一 1 al ) )
(co mm an d" orta te 'o' "w a l" mo ve 'o'"w p "
zoom'"e )
)
(command"m oved'"p w 'ortate'o'"w a l"zood'
ne)
) (princ)
)
在程序運行時,首先要求輸人兩坐標系統(tǒng)間的夾角Ro,角度按60進制輸人。按下來要求輸人Xo, Yo,只將它們的值輸人即可。此程序能夠完成兩個坐標系統(tǒng)的相互換算,按提示選擇字符1,2就行(缺省為1)。提示中的(X,Y =>A ,B )表示由測量坐標系統(tǒng)換算成施工坐標系統(tǒng);(A,B=>X,川表示由施工坐標系統(tǒng)換算成測量坐標系統(tǒng)。
三、高程的換算
高程的換算需要如下程序:
(de fun c :chtext(/a la 2b lb 2b 3b 4b 5b 8c lc 2c 3
pl sl s2 s3 w)
(set qp l(g e td ist” 、n兩高程系統(tǒng)間高差是多
少?:‘今
w(g ets trin g n 輸 人 要 處理 高程數(shù)據(jù)
的層名:")w(strcease w)
s3(g eti nt" n 處 理 后 高 程保 留的小數(shù)位
數(shù):'1)
) (se tq a l ( s s g e t" X "(l ist(c ons0" text")(c ons8w )))
a2 (sslength al)n 0)
(erp eat a2
(set qb l(s sna me al n ) b2(entgetbl ) b3(cdr
(, 1 b2))
b4( cd r( , 10 b 2 )) b 8 (a sci ib 3) b 5
(cdr(, 7 b2)
)
(if (4-b8 57)
(por gn
(set qc l (a tof be ) s2 (fix cl )s l (一 cl s2 )
(if (/ =s l0 )
(por gn (e n tde lb l ) (s e tqc 2 ( +c 1p l)
c3(rt osc2 2 s3 ))
(co mm and "l aye ''" 9 'w "” "te xt" "9 'b5
b410c3
)
)(setq n(+n 1))
高程 的 換 算需要如下程序:
(de fun c :chtext(/a la 2b lb 2b 3b 4b 5b 8c lc 2c 3
pl sl s2 s3 w)
(set qp l(g e td ist” 、n兩高程系統(tǒng)間高差是多
少?:‘今
w(g ets trin g n 輸 人 要 處理 高程數(shù)據(jù)
的層名:")w(strcease w)
s3(g eti nt" n 處 理 后 高 程保 留的小數(shù)位
數(shù):'1)
) (se tq a l ( s s g e t" X "(l ist(c ons0" text")(c ons8w )))
a2 (sslength al)n 0)
(erp eat a2
(set qb l(s sna me al n ) b2(entgetbl ) b3(cdr
(, 1 b2))
b4( cd r( , 10 b 2 )) b 8 (a sci ib 3) b 5
(cdr(, 7 b2))
)
)
)
(if (4-b8 57)
) (re dra w) ( p r i nc )
)
此程序首先要求輸人兩個坐標系統(tǒng)間的高差值,然后要求輸人高程數(shù)據(jù)所在的層名,最后要求輸人高程處理后要保留的小數(shù)位數(shù),一般情況下,控制點名由字母開頭并與控制點高程處于同一層。值得說明的是怎樣解決控制點名與控制點高程的判斷問題。大家知道,數(shù)字與字母的ASCII碼不同,本程序就利用這一點來解決這一問題的。只要判斷出得到的TEXT實體第一個字符的ASCII碼,即可分辨出是控制點名,還是控制點高程。分辨之后再分別處理,對控制點名不做處理,對控制點高程,先將實體從圖中刪除,然后再重新在原位置寫上換算后的高程?刂泣c若用自然數(shù)命名,本程序也能分辨出來。其方法是:先將所取得的高程字符用atof函數(shù)轉(zhuǎn)換成實數(shù),然后再用fix函數(shù)取整。若此實數(shù)與取整后的差值為0,則說明此數(shù)字是控制點名,不做處理。
四、結(jié)束語
上述的平面坐標及高程換算程序,雖然是為換算控制點坐標而編寫的,但它們的用途不只于此。利用它們,可將不同坐標系的圖紙互相換算。在換算過程中不需任何計算,只需做出選擇,按提示輸人夾角Ro,X o,Y 。以及坐標系間的高差,即可完成圖紙的坐標系換算。