wzg356 发表于 2014-11-19 00:31:05

xy自由图框,测量、地质用得上

本帖最后由 wzg356 于 2014-11-19 00:46 编辑

;;;
;;;    命令:BGTK
;;;
;;;   在地形图上插入图框(包括坐标十字符号)
;;;
;;;    作者:凉开水   2005.09.25
;;;WZG356 改于20140916,完善出错处理及十字丝判断退出
;;;-----------------------------------------------------------------
;;;
(defun c:BGTK ( / newerr *olderror* x p1 p2 p3 p4 nx ny px1 px2 py1 py2 pyx pxy)

;自定义新的出错函数
    (defun newerr (msg)
      (mapcar 'eval sysvarlst);恢复变量设置
      (if *olderror* (setq *error* *olderror**olderror* nil)) ;_ 恢复*error*函数
      (if (not (member msg '(nil "函数被取消" ";错误:quit / exit abort")))
      (princ (strcat ";错误:" msg))
    )
)
;;系统设置
(command "undo" "be");;命令编组开始
(setq sysvarlst(mapcar (function (lambda (n) (list 'setvar n (getvar n))))
      '( "osmode" "cmdecho" "OSNAPCOORD" "dimzin" "plinewid" ))
);保存系统变量
(setq *olderror* *error*);保存出错函数
(setq*error* newerr);设置自定义出错函数

(setvar "cmdecho" 0);;;关闭命令响应
(setvar "OSNAPCOORD" 1);;;坐标数据优先级设为:键盘输入替代对象捕捉设置
(setvar "OSMODE" 687);;;改变捕捉模式
(setvar "dimzin" 0);;;不对主单位值作消零处理

(if (= (Tblsearch "style" "MY_ST") nil)
    (command "-style" "MY_ST" "宋体" 0 0.8 0 "n" "n");;;文字样式
)
(command "textstyle" "MY_ST")


    (princ "\n假定CAD中绘制比例为1:1千")
(if (not (setq x (getreal "\n输入出图比例,1代表1:1千,10代表1:1万,以此类推<1>: ")))(setq x 1.0))

;;;四角坐标点
(setq x (/ 1.0 x)
      pt1 (getpoint "\n指定第一角点: ")
      pt2 (getcorner pt1 "\n指定另一角点: ")
)
(if (> (car pt1) (car pt2))
    (if(> (cadr pt1) (cadr pt2))
      (setq p1 pt2
      p2 (list (car pt1) (cadr pt2))
      p3 pt1
      p4 (list (car pt2) (cadr pt1))
      )
      (setq p1 (list (car pt2) (cadr pt1))
      p2 pt1
      p3 (list (car pt1) (cadr pt2))
      p4 pt2
      )
    )
    (if(> (cadr pt1) (cadr pt2))
      (setq p1 (list (car pt1) (cadr pt2))
      p2 pt2
      p3 (list (car pt2) (cadr pt1))
      p4 pt1
      )
      (setq p1 pt1
      p2 (list (car pt2) (cadr pt1))
      p3 pt2
      p4 (list (car pt1) (cadr pt2))
      )
    )
)

(command "zoom" "w" (polar p1 (* pi 1.25) (* 2 (/ 20 x)))
          (polar p3 (* pi 0.25) (* 2 (/ 20 x)))
)

(command "rectang" p4 p2);;;画内框

;;;画外框
(command "pline" (list 0 0 0) "w" (/ 0.4 x) (/ 0.4 x) "");;;定义线宽
(command "pline" (list (-(car p1) (/ 10 x))(-(cadr p1) (/ 10 x)))
             (list (+(car p2) (/ 10 x))(-(cadr p2) (/ 10 x)))
                   (list (+(car p3) (/ 10 x))(+(cadr p3) (/ 10 x)))
                   (list (-(car p4) (/ 10 x))(+(cadr p4) (/ 10 x)))
   "c"
)

;;;画四角短线
(command "line" p1 (polar p1 (* pi 1) (/ 10 x)) "")
(command "line" p1 (polar p1 (* pi 1.5) (/ 10 x)) "")
(command "line" p2 (polar p2 (* pi 0) (/ 10 x)) "")
(command "line" p2 (polar p2 (* pi 1.5) (/ 10 x)) "")
(command "line" p3 (polar p3 (* pi 0) (/ 10 x)) "")
(command "line" p3 (polar p3 (* pi 0.5) (/ 10 x)) "")
(command "line" p4 (polar p4 (* pi 0.5) (/ 10 x)) "")
(command "line" p4 (polar p4 (* pi 1) (/ 10 x)) "")

;;;写四角坐标值

(command "text" "br" (polar p1 (* pi 1.687) (/ 5.78 x)) (/ 2.5 x) 0 (rtos (/ (car p1) 1000.0) 2 2))
(command "text" "bc" (polar p1 (* pi 1) (/ 5 x)) (/ 2.5 x) 0 (rtos (/ (cadr p1) 1000.0) 2 2))
(command "text" "br" (polar p2 (* pi 1.687) (/ 5.78 x)) (/ 2.5 x) 0 (rtos (/ (car p2) 1000.0) 2 2))
(command "text" "bc" (polar p2 (* pi 0) (/ 5 x)) (/ 2.5 x) 0 (rtos (/ (cadr p2) 1000.0) 2 2))
(command "text" "br" (polar p3 (* pi 0.2618) (/ 4.776 x)) (/ 2.5 x) 0 (rtos (/ (car p3) 1000.0) 2 2))
(command "text" "bc" (polar p3 (* pi 0) (/ 5 x)) (/ 2.5 x) 0 (rtos (/ (cadr p3) 1000.0) 2 2))
(command "text" "br" (polar p4 (* pi 0.2618) (/ 4.776 x)) (/ 2.5 x) 0 (rtos (/ (car p4) 1000.0) 2 2))
(command "text" "bc" (polar p4 (* pi 1) (/ 5 x)) (/ 2.5 x) 0 (rtos (/ (cadr p4) 1000.0) 2 2))

;;;坐标十字的行列数   
(setq nx (- (fix (/(car p2)(/ 100 x)))(fix (/( car p1)(/ 100 x))))
ny (- (fix (/(cadr p4)(/ 100 x)))(fix (/( cadr p1)(/ 100 x))))
)

   
   ;;;写内外框间坐标值
(if (>=nx 1)(progn
    (setq px1 (list (* (1+ (fix (/(car p1)(/ 100 x))))(/ 100 x))(cadr p1))
      px2 (list (* (1+ (fix (/(car p4)(/ 100 x))))(/ 100 x))(cadr p4)))
    (repeat nx
      (command "line" px1 (polar px1 (* pi 1.5) (/ 10 x)) "")
      (command "text" "br" (polar px1 (* pi 1.687) (/ 5.78 x)) (/ 2.5 x) 0 (rtos (/ (car px1) 1000.0) 2 2))
      (command "line" px2 (polar px2 (* pi 0.5) (/ 10 x)) "")
      (command "text" "br" (polar px2 (* pi 0.2618) (/ 4.776 x)) (/ 2.5 x) 0 (rtos (/ (car px2) 1000.0) 2 2))
      (setq px1 (list (+ (car px1)(/ 100 x))(cadr px1))
          px2 (list (+ (car px2)(/ 100 x))(cadr px2)))
)
))
(if (>=ny 1)(progn
(setq py1 (list (car p1)(* (1+ (fix (/(cadr p1)(/ 100 x))))(/ 100 x)))
      py2 (list (car p2)(* (1+ (fix (/(cadr p2)(/ 100 x))))(/ 100 x))))
(repeat ny
    (command "line" py1 (polar py1 (* pi 1) (/ 10 x)) "")
    (command "text" "bc" (polar py1 (* pi 1) (/ 5 x)) (/ 2.5 x) 0 (rtos (/ (cadr py1) 1000.0) 2 2))
    (command "line" py2 (polar py2 (* pi 0) (/ 10 x)) "")
    (command "text" "bc" (polar py2 (* pi 0) (/ 5 x)) (/ 2.5 x) 0 (rtos (/ (cadr py2) 1000.0) 2 2))
    (setq py1 (polar py1 (* pi 0.5) (/ 100 x))
      py2 (polar py2 (* pi 0.5) (/ 100 x))
    )
)
))

;;;画坐标十字
(if (or (>= nx 1) (>= ny 1))(progn
(setq pyx (list (* (1+ (fix (/(car p1)(/ 100 x))))(/ 100 x))
      (* (1+ (fix (/(cadr p1)(/ 100 x))))(/ 100 x))));;;起始十字位置
    (repeat ny
      (setq pxy pyx)
       (repeat nx
      (command "line" (polar pxy (* pi 1) (/ 5 x)) (polar pxy (* pi 0) (/ 5 x))"")
      (command "line" (polar pxy (* pi 0.5) (/ 5 x)) (polar pxy (* pi 1.5) (/ 5 x))"")
      (setq pxy (list (+ (car pxy)(/ 100 x))(cadr pxy)))
    )
    (setq pyx (list (car pyx)(+ (cadr pyx)(/ 100 x))))
)
))

;;恢复设置
    (command "_undo" "_e");;活动编组结束
(mapcar 'eval sysvarlst);恢复变量设置
(setq *error* *olderror*);;恢复出错函数
(setq*olderror* nil);;
(princ)
)
;;;
;;;-----------------------------------------------------------------
;;;

caogis 发表于 2015-8-31 19:11:30

地质平面图有用吧

caogis 发表于 2015-8-31 19:14:18

在作地质平面图时有大作用

hehaidizhi 发表于 2019-6-14 16:21:13

有错误啊,支持什么版本cad?
页: [1]
查看完整版本: xy自由图框,测量、地质用得上