马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
我刚做了一个平行驱动直线的程序,可是在鼠标滑过一些文本实体时会出错,不知原因何在,请各位帮我分析一下。
程序代码:

- [FONT=courier new]
- (defun c:cs_px ( / ANGL ANGL1 ANGL2 ANGL3 DIS DISNEW LIN1 LIN2 LST1 LST2 P11 P12 P21 P22 PT PT0 PT1 biaoji PT2 PT3 ELST ENT JJ OS X ZG)
- ;;; (myerr)
- ;;; (varset "cmdecho" 0)
- ;;; (varset "osmode" 0)
- (while (and
- (princ "\n选择基准直线:")
- (car (setq lin2 (zntq '((0 . "line")))))
- (princ "\n选择要编辑的直线:")
- (car (setq lin1 (zntq '((0 . "line")))))
- (/= (cdr (assoc 5 (setq lst1 (entget (car lin1)))))
- (cdr (assoc 5 (setq lst2 (entget (car lin2)))))
- )
- )
- (setq pt (cadr lin1)
- lin1 (car lin1)
- lin2 (car lin2)
- os "end,mid,cen,nod,qua,int,ins,nea,appint,ext"
- p21 (cdr (assoc 10 lst2))
- p22 (cdr (assoc 11 lst2))
- angl2 (angle p21 p22)
- angl3 (+ angl2 (dtor 90.0))
- pt0 (polar pt angl3 10.0)
- pt1 (inters pt0 pt p21 p22 nil)
- dis (distance pt pt1)
- p11 (cdr (assoc 10 lst1))
- p12 (cdr (assoc 11 lst1))
- angl1 (angle p11 p12)
- angl (- angl2 angl1)
- biaoji t
- )
- (command "rotate" lin1 "" pt (rtod angl))
- (vl-cmdf "text" '(0 0 0) 5 0 "aaa")
- (setq ent (entlast)
- elst (entget ent)
- )
- ;;; (varset "osmode" 15359)
- (while biaoji
- (setq zg (/ (getvar "VIEWSIZE") 30.0)
- jj (* 0.5 zg)
- )
- (setq pt2 (cs_point 0 os))
- (cond
- ((= 5 (car pt2))
- (setq pt2 (cadr pt2))
- (setq pt3 (polar pt2 angl2 30.0)
- pt3 (inters pt1 pt pt2 pt3 nil) ;;;出错时,求出的交点为NIL
- dis (distance pt1 pt3)
- )
- (grdraw pt1 pt3 1)
- (grdraw pt2 pt3 1)
- ;;; (if (not (osnap pt2 (cs_os))
- ;;; )
- (setq dis (fix dis))
- ;;; )
- (setq elst (subst (cons 10 (mapcar '(lambda (x) (+ x jj)) pt2))
- (assoc 10 elst)
- elst
- )
- )
- (setq elst (subst (cons 40 zg) (assoc 40 elst) elst))
- (setq elst (subst (cons 1 (strcat "距离为:" (rtos dis)))
- (assoc 1 elst)
- elst
- )
- )
- (entmod elst)
- )
- ((= 3 (car pt2))
- (setq angl3 (angle pt1 pt3)
- pt3 (polar pt1 angl3 dis)
- )
- (command "move" lin1 "" pt pt3)
- (setq biaoji nil)
- )
- (t (setq biaoji nil))
- )
- )
- (entdel ent)
- ;;; (varset "osmode" 0)
- (redraw)
- )
- ;;; (restore)
- )
- [/FONT]
出错时,提示:
- [FONT=courier new]
- ; 错误: 参数类型错误: 二维/三维点: nil
- [/FONT]
复制代码
经过查找,问题在这里:

- [FONT=courier new]
- (setq pt3 (polar pt2 angl2 30.0)
- pt3 (inters pt1 pt pt2 pt3 nil) ;;;出错时,求出的交点为NIL
- dis (distance pt1 pt3)
- )
- [/FONT]
程序用到的一些函数:

- [FONT=courier new]
- (defun zntq (nam / pt ss_name biaoji ss)
- (setq biaoji t)
- (while biaoji
- (setq pt (grread t 4 2))
- (cond
- ((= 5 (car pt))
- (setq ss (ssget (cadr pt) nam))
- (if ss_name
- (redraw ss_name 4)
- )
- (setq ss_name nil)
- (if ss
- (progn
- (setq ss_name (ssname ss 0))
- (redraw ss_name 3)
- )
- )
- )
- ((= 3 (car pt))
- (setq ss (ssget (cadr pt) nam))
- (if ss_name
- (redraw ss_name 4)
- )
- (setq ss_name nil)
- (if ss
- (progn
- (setq ss_name (ssname ss 0))
- (redraw ss_name 3)
- )
- )
- (setq biaoji nil)
- )
- ((or (= (car pt) 25)
- (and (= (car pt) 2)
- (or (= (cadr pt) 13)
- (= (cadr pt) 32)
- )
- )
- )
- (if ss_name (redraw ss_name 4))
- (setq biaoji nil ss_name nil)
- )
- (t (princ))
- )
- )
- (if ss_name
- (redraw ss_name 4)
- )
- (list ss_name (cadr pt))
- )
- (defun rtod (dat /)
- (* 180.0 (/ dat pi))
- )
- (defun dtor (dat /)
- (* pi (/ dat 180.0))
- )
- (defun ptmark (pt / size jd ang)
- (setq size (/ (getvar "viewsize") 80.0))
- (setq jd 0)
- (repeat 8
- (setq ang (dtor jd))
- (grdraw pt (polar pt ang size) 3)
- (setq jd (+ jd 45))
- )
- (princ)
- )
- (defun cs_point (sb os / pt pt1)
- (setq pt (grread t 4 sb))
- (cond
- ((and
- (= (type os) 'str)
- (> (strlen os) 0)
- (= (type (cadr pt)) 'list)
- (setq pt1 (osnap (cadr pt) os))
- )
- (redraw)
- (ptmark pt1)
- (setq pt (list (car pt) pt1))
- )
- (t (redraw))
- )
- pt
- )
- [/FONT]
|