请教LISP的问题。

发言者:lqcc (207.34.202.2)
时  间:1999年12月18日 08:50:07
发信站:ABBS 自由建筑论坛 (www.abbs.com.cn)

我编了个LISP,是画总平是标坐标用的,觉得还好用,但是有个怪问题,一直也想不通,实在放心不下,整天看这里,见这里有那么多高手,想起来可以问问大家。这个LISP标坐标是只能用SHIFT+右键来捕捉,不能用OSMAP来设,每个点都只能SHIFT+右键来抓,不然就只能标出两个0,而且以后这张图就再也不能用这个LISP了,只能把这个图插到新图去,才能用,怪!!!,我对LISP了解不多,只是试写一个,我怎么也看不出问题,请各位帮忙看看。
源头文件:
zbbz.lsp

;;;
;;; 标注时是按当前的UCS的,但是数值还是 WCS 的,

;;; 不用转换到 WCS。

;============================== 开始 ==============================

(defun c:zbbz ()

;============================== 设置 ==============================

(setq 字高 (getvar "textsize"))
(setq old_dimzin (getvar "dimzin"))
(setvar "dimzin" 1)
(setq 精度 3)
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(标注)
)


;====================== 取起点的位置及数值 ======================
(defun 标注()
(setq 标注点 (getpoint "\n点取标注点:"))
(if 标注点 (继续) (退出))
)

(defun 继续()
(setq 绝对标注点 (trans 标注点 1 0))
(setq x_坐标值 (rtos (car 绝对标注点) 2 精度))
(setq y_坐标值 (rtos (nth 1 绝对标注点) 2 精度))


;=================== 取标注引线位置及长度和角度 ===================

(setq 临时起点 (getpoint 标注点 "\n点取标注位置:"))
(setq 引线长度 (distance 标注点 临时起点))
(setq 临时角度 (atof (angtos (angle 标注点 临时起点 ) 0 3)))

;================= 检查标注引线的角度并设为标准值 =================

(if (or (<= 临时角度 15) (>= 临时角度 345)) (setq 标准角度 0))
(if (and (< 临时角度 37.5) (> 临时角度 15)) (setq 标准角度 30))
(if (and (<= 临时角度 52.5) (>= 临时角度 37.5)) (setq 标准角度 45))
(if (and (< 临时角度 67.5) (> 临时角度 52.5)) (setq 标准角度 60))
(if (and (< 临时角度 105) (>= 临时角度 67.5)) (setq 标准角度 90))
(if (and (< 临时角度 127.5) (> 临时角度 105)) (setq 标准角度 120))
(if (and (<= 临时角度 141) (>= 临时角度 127.5)) (setq 标准角度 135))
(if (and (< 临时角度 165) (> 临时角度 141)) (setq 标准角度 150))
(if (and (<= 临时角度 195) (>= 临时角度 165)) (setq 标准角度 180))
(if (and (< 临时角度 217.5) (> 临时角度 195)) (setq 标准角度 210))
(if (and (<= 临时角度 232.5) (>= 临时角度 217.5)) (setq 标准角度 225))
(if (and (< 临时角度 255) (> 临时角度 237.5)) (setq 标准角度 240))
(if (and (<= 临时角度 285) (>= 临时角度 255)) (setq 标准角度 270))
(if (and (< 临时角度 307.5) (> 临时角度 285)) (setq 标准角度 300))
(if (and (<= 临时角度 322.5) (>= 临时角度 307.5)) (setq 标准角度 315))
(if (and (< 临时角度 345) (> 临时角度 322.5)) (setq 标准角度 330))


;======================= 设标注引线终点的位置 =======================

(setq 起点 (polar 标注点 (angtof (itoa 标准角度) 0) 引线长度))

;===================== 设标注线终点的位置及方向 ===================

(setq x_字符数 (strlen x_坐标值))
(setq y_字符数 (strlen y_坐标值))
(if (> x_字符数 y_字符数)
(setq 坐标字符数 x_字符数)
(setq 坐标字符数 y_字符数)
)

(setq 坐标字符长 (* 坐标字符数 字高))
(if (and (< 标准角度 270) (> 标准角度 90))
(setq 标注方向 180)
(setq 标注方向 0)
)

(if (= 标注方向 180)
(setq 终点 (list (- (car 起点) 坐标字符长) (nth 1 起点)))
(setq 终点 (list (+ (car 起点) 坐标字符长) (nth 1 起点)))
)


;======================== 设标注数字的起点 ========================

(if (= 标注方向 0) (setq 文字开始点 起点) (setq 文字开始点 终点))
(setq 起点_x (list (car 文字开始点)
(+ (nth 1 文字开始点) (/ 字高 3.5))))
(setq 起点_y (list (car 文字开始点)
(- (nth 1 文字开始点) 字高 (/ 字高 3.5))))

;======================= 使两个坐标字符等长 =======================

(setq 相差字符数 (abs(- x_字符数 y_字符数)))
(setq 补充空格数 "")
(repeat 相差字符数 (setq 补充空格数 (strcat 补充空格数 " ")))
(if (= 相差字符数 0)
(setq x_c (strcat "Y=" x_坐标值) y_c (strcat "X=" y_坐标值)))

(if (and (/= l 0) (> x_字符数 y_字符数))
(setq x_c (strcat "Y=" x_坐标值)
y_c (strcat "X=" 补充空格数 y_坐标值)))

(if (and (/= l 0) (< x_字符数 y_字符数))
(setq x_c (strcat "Y=" 补充空格数 x_坐标值)
y_c (strcat "X=" y_坐标值)))


;============================= 标注 ===============================

(command "line" 标注点 起点 终点)
(command "")
(command "text" 起点_x 字高 "0" y_c)
(command "text" 起点_y 字高 "0" x_c)
(标注)
)

;============================== 还原 ==============================

(defun 退出()
(setvar "osmode" old_osmode)
(setvar "dimzin" old_dimzin)
(setvar "cmdecho" 1)
(princ)
)


;============================== 结束 ==============================



回复以上发言

您的姓名:
发言主题:
发言内容:

您的主页:
主页标题:
链接图片: