📄 pgz.lsp
字号:
;(autoload "pgz" '("pc1" "pw1" "pw" "pc" "zb" "pg1" "pgz"))
;PC 计算机计算坡度标高1:0.2
;PC1 计算机计算坡度标高1:100
;PW PPC计算坡度标高1:0.2
;PW1 PPC计算坡度标高1:100
;zb 计算机标坐标1:0.2
;Pgz 计算点距离与北向夹角1:100
;Pg1 计算点距离与北向夹角1:0.2
(defun mid(pt1 pt2 ) ;计算两点之中点的功能函数
(setq pt (mapcar '+ pt1 pt2 ))
(setq pt (mapcar '/ pt '(2 2 2)))
)
(defun c:pc1 ( / gd1 bg bd M cl1 cl e p0 p1 p2 p3 x1 y1 x2 y2 x3 y3 c1 c2 c3 d a)
(setq osm (getvar"osmode"))
(setvar "osmode" 679)
(setq gd1 (getreal "指定标注文字高度<250>:>"))
(if (= gd1 nil) (setq gd1 250))
(setq bg (getreal "指定基准标高<-4.520>:>"))
(if (= bg nil) (setq bg -4.520))
;(setq bd (getreal "指定坡度<0.01>:>"))
(if (= bd nil) (setq bd 0.01))
(initget 1)
(SETQ M 1)
(WHILE M
(SETQ CL1 (ENTSEL"\n选择第一条直线 "))
(cond
((not cl1 ) (prompt"\n 没有发现实体"))
((/="LINE"(cdr (assoc 0 (setq e(entget (car cl1))))))
(prompt"\n 所选不是直线")
)
(t (prompt"找到了第一条直线")
(setq m nil) ;退出循环
)
)
)
;(setq cl (ssget (nth 0 (cdr cl1))));取得第一条直线的实体数据
;(SETQ CL2 (ENTSEL"\n选择第二条直线"))
;if (ssmemb (car cl2) cl )
;(princ"\n选择重复,重新选择")
;取得第一直线两端点的坐标
(setq p1 (cdr (assoc 10 e )) p2 (cdr (assoc 11 e )))
;计算两端中点坐标
(setq p3 (mid p1 p2 ))
(while(setq p0 (getpoint"\n选择一个点"))
;Request distance from a point(p0) to a line(p1 p2).
(setq x1 (car p1)
y1 (cadr p1)
x2 (car p2)
y2 (cadr p2)
c1 (- y2 y1)
c2 (- x1 x2)
c3 (- (* x2 y1) (* x1 y2))
)
(setq d (/ (+ (* c1 (car p0)) (* c2 (cadr p0)) c3) (sqrt (+ (* c1 c1) (* c2 c2))) ))
(setq d (/ d 1000))
(setq x3 (/ (- (* (* c2 c2) (car p0)) (* (* c1 c2) (cadr p0)) (* c1 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq y3 (/ (- (* (* c1 c1) (cadr p0)) (* (* c1 c2) (car p0)) (* c2 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq p3 ( list x3 y3 0 ))
(setq d (+ bg (* bd (- 0 d))))
(setq d (rtos d 2 3))
(entmake (list
'(0 . "text")
'(62 . 6)
'(8 . "斜高")
(list 10 (+ (car p0) gd1) (car(cdr p0)) )
(cons 40 gd1)
(cons 1 ( strcat "" d))
'(50 . 0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 5)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (+ (car p0) gd1) ( + (car(cdr p0)) ( / gd1 3) ) )
'(210 0.0 0.0 1.0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 2)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (car p3) (cadr p3) 0)
'(210 0.0 0.0 1.0)
)
)
;(command "line" p0 p3 "")
(Princ "\n ok") )
(setvar "osmode" osm)
(princ)
)
(defun c:pw1 ( / gd1 bg bd p1 p2 p0 p3 x1 y1 x2 y2 x3 y3 c1 c2 c3 d )
(setq osm (getvar"osmode"))
(setvar "osmode" 679)
(setq gd1 (getreal "指定标注文字高度<250>:>"))
(if (= gd1 nil) (setq gd1 250))
(setq bg (getreal "指定基准标高<-4.520>:>"))
(if (= bg nil) (setq bg -4.520))
;(setq bd (getreal "指定坡度<0.01>:>"))
(if (= bd nil) (setq bd 0.01))
(initget 1)
;(setq cl (ssget (nth 0 (cdr cl1))));取得第一条直线的实体数据
;(SETQ CL2 (ENTSEL"\n选择第二条直线"))
;if (ssmemb (car cl2) cl )
;(princ"\n选择重复,重新选择")
;取得第一直线两端点的坐标
(setq p1 (getpoint"\n选择直线一个点"))
(setq p2 (getpoint p1 "\n选择直线另一个点"))
(setvar "osmode" 167)
(while(setq p0 (getpoint"\n选择一个点"))
;Request distance from a point(p0) to a line(p1 p2).
(setq x1 (car p1)
y1 (cadr p1)
x2 (car p2)
y2 (cadr p2)
c1 (- y2 y1)
c2 (- x1 x2)
c3 (- (* x2 y1) (* x1 y2))
)
(setq d (/ (+ (* c1 (car p0)) (* c2 (cadr p0)) c3) (sqrt (+ (* c1 c1) (* c2 c2))) ))
(setq d (/ d 1000))
(setq x3 (/ (- (* (* c2 c2) (car p0)) (* (* c1 c2) (cadr p0)) (* c1 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq y3 (/ (- (* (* c1 c1) (cadr p0)) (* (* c1 c2) (car p0)) (* c2 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq p3 ( list x3 y3 0 ))
(setq d (+ bg (* bd (- 0 d))))
(setq d (rtos d 2 3))
(entmake (list
'(0 . "text")
'(62 . 6)
'(8 . "斜高")
(list 10 (+ (car p0) gd1) (car(cdr p0)) )
(cons 40 gd1)
(cons 1 ( strcat "" d))
'(50 . 0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 5)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (+ (car p0) gd1) ( + (car(cdr p0)) ( / gd1 3) ) )
'(210 0.0 0.0 1.0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 2)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (car p3) (cadr p3) 0)
'(210 0.0 0.0 1.0)
)
)
;(command "line" p0 p3 "")
(Princ "\n ok") )
(setvar "osmode" osm)
(princ)
)
(defun c:pw ( / gd1 bg bd p1 p2 p0 p3 x1 y1 x2 y2 x3 y3 c1 c2 c3 d )
(setq osm (getvar"osmode"))
(setvar "osmode" 679)
(setq gd1 (getreal "指定标注文字高度<0.51>:>"))
(if (= gd1 nil) (setq gd1 0.51))
(setq bg (getreal "指定基准标高<-4.520>:>"))
(if (= bg nil) (setq bg -4.520))
;(setq bd (getreal "指定坡度<0.01>:>"))
(if (= bd nil) (setq bd 0.01))
(initget 1)
;(setq cl (ssget (nth 0 (cdr cl1))));取得第一条直线的实体数据
;(SETQ CL2 (ENTSEL"\n选择第二条直线"))
;if (ssmemb (car cl2) cl )
;(princ"\n选择重复,重新选择")
;取得第一直线两端点的坐标
(setq p1 (getpoint"\n选择直线一个点"))
(setq p2 (getpoint p1 "\n选择直线另一个点"))
(setvar "osmode" 167)
(while(setq p0 (getpoint"\n选择一个点"))
;Request distance from a point(p0) to a line(p1 p2).
(setq x1 (car p1)
y1 (cadr p1)
x2 (car p2)
y2 (cadr p2)
c1 (- y2 y1)
c2 (- x1 x2)
c3 (- (* x2 y1) (* x1 y2))
)
(setq d (/ (+ (* c1 (car p0)) (* c2 (cadr p0)) c3) (sqrt (+ (* c1 c1) (* c2 c2))) ))
(setq x3 (/ (- (* (* c2 c2) (car p0)) (* (* c1 c2) (cadr p0)) (* c1 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq y3 (/ (- (* (* c1 c1) (cadr p0)) (* (* c1 c2) (car p0)) (* c2 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq p3 ( list x3 y3 0 ))
(setq d (+ bg (* bd (- 0 d))))
(setq d (rtos d 2 3))
(entmake (list
'(0 . "text")
'(62 . 6)
'(8 . "斜高")
(list 10 (+ (car p0) gd1) (car(cdr p0)) )
(cons 40 gd1)
(cons 1 ( strcat "" d))
'(50 . 0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 5)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (+ (car p0) gd1) ( + (car(cdr p0)) ( / gd1 3) ) )
'(210 0.0 0.0 1.0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 2)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (car p3) (cadr p3) 0)
'(210 0.0 0.0 1.0)
)
)
;(command "line" p0 p3 "")
(Princ "\n ok") )
(setvar "osmode" osm)
(princ)
)
(defun c:pc ( / gd1 bg bd M cl1 cl e p0 p1 p2 p3 x1 y1 x2 y2 x3 y3 c1 c2 c3 d a)
(setq osm (getvar"osmode"))
(setvar "osmode" 679)
(setq gd1 (getreal "指定标注文字高度<0.50>:>"))
(if (= gd1 nil) (setq gd1 0.50))
(setq bg (getreal "指定基准标高<-4.520>:>"))
(if (= bg nil) (setq bg -4.520))
;(setq bd (getreal "指定坡度<0.01>:>"))
(if (= bd nil) (setq bd 0.01))
(initget 1)
(SETQ M 1)
(WHILE M
(SETQ CL1 (ENTSEL"\n选择第一条直线 "))
(cond
((not cl1 ) (prompt"\n 没有发现实体"))
((/="LINE"(cdr (assoc 0 (setq e(entget (car cl1))))))
(prompt"\n 所选不是直线")
)
(t (prompt"找到了第一条直线")
(setq m nil) ;退出循环
)
)
)
;(setq cl (ssget (nth 0 (cdr cl1))));取得第一条直线的实体数据
;(SETQ CL2 (ENTSEL"\n选择第二条直线"))
;if (ssmemb (car cl2) cl )
;(princ"\n选择重复,重新选择")
;取得第一直线两端点的坐标
(setq p1 (cdr (assoc 10 e )) p2 (cdr (assoc 11 e )))
;计算两端中点坐标
(setq p3 (mid p1 p2 ))
(while(setq p0 (getpoint"\n选择一个点"))
;Request distance from a point(p0) to a line(p1 p2).
(setq x1 (car p1)
y1 (cadr p1)
x2 (car p2)
y2 (cadr p2)
c1 (- y2 y1)
c2 (- x1 x2)
c3 (- (* x2 y1) (* x1 y2))
)
(setq d (/ (+ (* c1 (car p0)) (* c2 (cadr p0)) c3) (sqrt (+ (* c1 c1) (* c2 c2))) ))
(setq x3 (/ (- (* (* c2 c2) (car p0)) (* (* c1 c2) (cadr p0)) (* c1 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq y3 (/ (- (* (* c1 c1) (cadr p0)) (* (* c1 c2) (car p0)) (* c2 c3)) (+ (* c1 c1) (* c2 c2)) ))
(setq p3 ( list x3 y3 0 ))
(setq d (+ bg (* bd (- 0 d))))
(setq d (rtos d 2 3))
(entmake (list
'(0 . "text")
'(62 . 6)
'(8 . "斜高")
(list 10 (+ (car p0) gd1) (car(cdr p0)) )
(cons 40 gd1)
(cons 1 ( strcat "" d))
'(50 . 0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 5)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (+ (car p0) gd1) ( + (car(cdr p0)) ( / gd1 3) ) )
'(210 0.0 0.0 1.0)
)
)
(entmake (list
'(0 . "LINE")
'(62 . 2)
'(67 . 0)
'(8 . "距离")
(list 10 (car p0) (cadr p0) 0)
(list 11 (car p3) (cadr p3) 0)
'(210 0.0 0.0 1.0)
)
)
;(command "line" p0 p3 "")
(Princ "\n ok") )
(setvar "osmode" osm)
(princ)
)
(defun C:zb( / zb gd cld osm )
(setq osm (getvar"osmode"))
(setvar "osmode" 167)
(setq gd1 (getreal "指定标注文字高度<0.60>:>"))
(if (= gd nil) (setq gd 0.60))
(while (setq zb (getpoint "指定坐标点:"))
(setq cld(getpoint zb "指定文字插入点:"))
(entmake (list
'(0 . "LINE")
'(62 . 5)
'(67 . 0)
'(8 . "坐标")
(list 10 (car zb) (cadr zb) 0)
(list 11 (car cld) (cadr cld) 0)
'(210 0.0 0.0 1.0)
)
)
(entmake (list
'(0 . "text")
(list 10 (+ (car cld) gd) (car(cdr cld)) )
(cons 40 gd)
(cons 1 ( strcat "X=" (rtos (cadr zb) 2 3)))
'(50 . 0)
)
)
(entmake (list
'(0 . "text")
(list 10 (+ (car cld) gd)
(- (car(cdr cld)) (+ gd (/ gd 3)) )
)
(cons 40 gd)
(cons 1 (strcat "Y="(rtos (car zb) 2 3)))
'(50 . 0)
)
)
)
(setvar "osmode" osm)
(princ)
)
;标注距离 角度命令 jj
(defun c:pg1(/ gd1 jd r p1 p2 a b )
;保存环境变量
(setq os (getvar "osmode"))
;(setq cm (getvar "cmdecho"))
;设置环境变量
(setvar "osmode" 37)
;(setvar "cmdecho" 0)
;依次读取两条直线点
(setq gd1 (getreal "指定标注文字高度<0.60>:>"))
(if (= gd1 nil) (setq gd1 0.6))
(setq jd (getreal "指定标注角度方向逆时针1 顺时针0 <顺时针0>:>"))
(if (= jd nil) (setq jd 0))
(setq p1 (getpoint"\n选择第一个点"))
(initget 1)
(while (setq p2 (getpoint p1 "\n选择第二个点"))
(if (> jd 0) (setq a(angtos (angle p1 p2) 1 4) ))
(if (= jd 0) (setq a(angtos (- 6.2831852 (angle p1 p2)) 1 4) ))
(setq b (rtos (/ (distance p1 p2) 1) 2 3))
(command "line" p1 p2 "")
(entmake (list
'(0 . "text")
'(62 . 5)
'(8 . "斜角")
(list 10 (+ (car p2) gd1) (car(cdr p2)) )
(cons 40 gd1)
(cons 1 ( strcat "" a))
'(50 . 0)
)
)
(entmake (list
'(0 . "text")
'(62 . 11) ;映射
'(8 . "斜角")
(list 10 (+ (car p2) gd1)
(- (car(cdr p2)) (+ gd1 (/ gd1 3)) )
)
(cons 40 gd1)
(cons 1 (strcat ">" b ))
'(50 . 0)
)
)
)
(setvar "osmode" os)
(princ)
)
;标注距离 角度命令 jj
(defun c:pgz(/ x y p1 p2 a b )
;保存环境变量
(setq os (getvar "osmode"))
(setq cm (getvar "cmdecho"))
;设置环境变量
(setvar "osmode" 679)
(setvar "cmdecho" 0)
;依次读取两条直线点
(setq d 250)
(setq x (getreal "指定标注文字高度<250>:>"))
(if (= x nil) (setq x 250))
(setq y (getreal "指定标注角度方向逆时针1 顺时针0 <顺时针0>:>"))
(if (= y nil) (setq y 0))
(initget 1)
(setq p1 (getpoint"\n选择第一个点"))
(initget 1)
(while (setq p2 (getpoint p1 "\n选择第二个点"))
(if (> y 0) (setq a(angtos (angle p1 p2) 1 4) ))
(if (= y 0) (setq a(angtos (- 6.2831852 (angle p1 p2)) 1 4) ))
(setq b (rtos (/ (distance p1 p2) 1000) 2 3))
(command "line" p1 p2 "")
(entmake (list
'(0 . "text")
'(62 . 12)
'(8 . "斜角")
(list 10 (+ (car p2) x) (car(cdr p2)) )
(cons 40 x)
(cons 1 ( strcat "" a))
'(50 . 0)
)
)
(entmake (list
'(0 . "text")
'(62 . 11) ;映射
'(8 . "斜角")
(list 10 (+ (car p2) x)
(- (car(cdr p2)) (+ x (/ x 3)) )
)
(cons 40 x)
(cons 1 (strcat ">" b ))
'(50 . 0)
)
)
)
(setvar "osmode" os)
(setvar "cmdecho" cm)
)
(princ "\nC:GSL1 has loaded")
(Princ "\n for symmetry line")
(princ)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -