測量lisp小程式

2021-08-13 22:52:25 字數 4861 閱讀 1774

讀取座標文字檔案,標出點位與點號,高程(屬性塊)

(defun c:plot_point

();;;座標展點

(if(not

(tblsearch

"block"

"block_point"))

(write_block))

(setq osmode_old (getvar

"osmode"))

(setvar

"osmode"

0)(setvar

"attdia"

0);;;設定塊的屬性由命令列輸入

(setq file (getfiled

"選定點位資料檔案"

"d:/"

"txt"

0))(setq f (open file "r"))

(setvar

"cmdecho"

0)(setq s (read-line f))

(while

(/= s "000")

(setq pn (substr s 17

4))(setq x (atof

(substr s 37

10)))

(setq y (atof

(substr s 21

10)))

(setq h (atof

(substr s 53

10)) h (rtos h 2

2))(command

"_insert"

"block_point"

(list x y)11

0 pn h "")

(setq s (read-line f))

)(close file)

(setvar

"cmdecho"

1)(setvar

"osmode" osmode_old)

)(defun write_block ()

;;;建立乙個名為block_point的塊

(command

"_attdef"

"""no"

"點號"

""'(1

0.5)

1"")

(setq e1

(entlast))

(command

"_attdef"

"""height"

"高程"

""'(1

-1.5)

1"")

(command

"line"

'(10)

'(50)

"")(command

"point"

'(00))

(setq e2

(entnext e1) e3

(entnext e2) e4

(entnext e3))

(setq ss (ssadd))

(ssadd e1 ss)

(ssadd e2 ss)

(ssadd e3 ss)

(ssadd e4 ss)

(command

"_block"

"block_point"

'(00) ss "")

(entdel e1)

(entdel e2)

(entdel e3)

(entdel e4)

)

(捕捉兩個已知點,輸入與第乙個點的距離)

(defun c:insert_point

()(setq osmode (getvar

"osmode"))

(setvar

"osmode"

9);;;只捕捉端點和節點

(setq pt1

(getpoint

"輸入第乙個點"))

(setq pt2

(getpoint

"輸入第二個點" pt1))

(setvar

"osmode"

0)(setq dist (getdist

"輸入與第乙個點的距離,同向為正,反向為負" pt1))

(setq d (distance pt1 pt2))

(setq lambda1

(/ dist (- d dist)))

;;;lambda為ap:pb的比值,方便用定比分點公式

(setq x (/

(+(car pt1)

(* lambda1

(car pt2)))

(1+ lambda1)))

(setq y (/

(+(cadr pt1)

(* lambda1

(cadr pt2)))

(1+ lambda1)))

(command

"point"

(list x y))

(setvar

"osmode" osmode)

)

(捕捉兩個已知點,輸入與第乙個點的距離以及到連線的垂距)

(defun c:verticle_dist

()(setq osmode (getvar

"osmode"))

(setvar

"osmode"

16393)

;;;只捕捉端點和節點

(setq pt1

(getpoint

"輸入第乙個點"))

(setq pt2

(getpoint

"輸入第二個點" pt1))

(setvar

"osmode"

0)(setq l (getdist

"輸入與第乙個點沿線的距離,同向為正,反向為負" pt1))

(setq h (getdist

"輸入到連線的垂距,逆時針為正,順時針為負"))

(setq x0

(car pt1) y0

(cadr pt1))

;;;運用直角座標變換公式

(setq theta (angle pt1 pt2))

(setq x (+

(*(cos theta) l)

(*(sin theta)

(-0 h)) x0))

(setq y (+

(*(sin theta) l)

(*(cos theta) h) y0))

(command

"point"

(list x y))

(setvar

"osmode" osmode)

)

(捕捉兩個已知點,輸入兩個距離)

(defun c:dist_intersect

(/ b a c)

(setq osmode (getvar

"osmode"))

(setvar

"osmode"

16393)

;;;只捕捉端點和節點

(setq pt1

(getpoint

"輸入第乙個點"))

(setq pt2

(getpoint

"輸入第二個點" pt1))

(setvar

"osmode"

0)(setq b (getdist

"輸入與第乙個點的距離" pt1))

(setq a (getdist

"輸入與第二個點的距離" pt2))

(setq c (distance pt1 pt2))

(setq l (/

(+(* b b)

(* c c)

(* a (-

0 a)))

(*2 c)))

(setq h (sqrt

(-(* b b)

(* l l))))

(setq x0

(car pt1) y0

(cadr pt1))

;;;運用直角座標變換公式

(setq theta (angle pt1 pt2))

(setq x (+

(*(cos theta) l)

(*(sin theta)

(-0 h)) x0))

(setq y (+

(*(sin theta) l)

(*(cos theta) h) y0))

(command

"point"

(list x y))

(setvar

"osmode" osmode)

)

(defun c:areapl

()(setq lyr (getstring

"輸入圖層名:\n"))

(setq ss (ssget

"x"(list

(cons

8 lyr)

(cons

0"lw*"))))

(setq len (sslength ss))

(setq i 0)

(if ss

(progn

(command

"area"

"a""o")

(while

(< i len)

(setq ent (ssname ss i))

(command ent)

(setq i (1+ i)) ))

)(command

"""")

(setq s (getvar

"area"))

(princ

"面積:")

(princ s)

(princ)

)

lisp實戰文庫 LISP經典程式

一 繪製地形圖符號 1.點狀符號 對於點狀符號 其位置固定 數量較多 且一般都帶有一定的標註 可逐個製作屬性塊圖元 單獨插入。2.線狀符號 利用autocad 中強大的線型定義。3.面狀符號 由充填符號在面域內按一定的排列方式組合而成。目前auto cad 在建築設計 工程施工放樣得到廣泛應用 au...

lisp程式繪製大樹 LISP 樹

可以從cons單元構建樹的資料結構,如清單列表。為了實現樹形結構,則必須設計功能,將遍歷cons 單元,在特定的順序,例如,前序,順序和後序的二進位制樹。樹列表的列表 讓我們考慮由cons單元的樹狀結構,形成列出的清單如下 1 2 3 4 5 6 它可以表示為 lisp樹的功能 雖然多數時候仍需要根...

Lisp小程式,大作用,不該放棄!

從聽說autolisp到現在已經20年了,學了一點點,可惜中間沒能堅持下來,放棄了!今天在畫圖,圖紙是從revit轉成dwg的,其中有些文字的朝向是錯誤的,如果手工旋轉很是費事,於是想寫個小程式來完成,可惜很久沒有啟動visual studio了,況且使用的autocad版本為2008,之前沒有針對...