明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1493|回复: 2

[提问] Lisp插件在WIN10系统下不能运行的问题

[复制链接]
发表于 2019-1-1 11:48 | 显示全部楼层 |阅读模式
这是一个标注节点桩号的程序,这个程序在WIN7系统下是正常的,但是WIN10系统下运行到一半就退出来了,请坛里的大神帮我看看是怎么回事吧,小弟在此先谢谢了

具体问题是这样的,运行JJ命令,在多段线上选区第一个点,输入第一个点的桩号,比如1000,然后选第二个点,输入第二个点的桩号,比如1200,然后再随便找一个点就可以标出这个点的桩号。现在WIN10系统下输入第二个点的桩号就退出了。

;;;标注节点桩号.by cocoorange 17.04.16
;;;--------------------------------------------------

;;小数点后数字加1
;strlen 以整数形式返回一个字符串中字符的个数
;atoi 将一个字符串转换成整数
;entmod 修改对象(图元)的定义数据
;itoa 将整数转换成字符串,并返回转换结果
;strcat 将多个字符串拼接成一个长字符串后返回
;subst 在表中搜索某旧项,并将表中出现的每一个旧项用新项代替,然后返回修改后所得的表
;substr返回字符串中的一个子字符串

;定义出错处理函数trap1
  (defun trap1 (errmsg)                 ;
    (setvar "osmode" 4143)  ;捕捉设置,出错之后重设捕捉
    (setvar "CMDECHO" 1)            ;打开回显
    (setq *error* temperr)
  )     ;错误处理函数
;;jj程序主体
(defun C:jj()
  (setq cmd_old (getvar "CMDECHO")) ;获取原始回显值
  (setq os_old (getvar "osmode")) ;获取原始捕捉值
  
  (setvar "CMDECHO" 0)          ;关闭回显
  
  (setq temperr *error*)
  (setq *error* trap1)
  
  (vl-load-com)
  (setvar "osmode" 0)
  (vl-cmdf "UCS" "")                            ;切换世界坐标系
  (setq el (car (entsel "\n选择桩号线:")))                ;entsel通过一个点选择一个图元,返回图元名称el
  (setvar "osmode" 4143)
  (setq ep1 (getpoint "\n选择桩号基准点1:"))              ;选择桩号基点
  (setq k1 (getreal "\n输入基点1桩号值:"))                ;输入基点桩号值
  (setq ep2 (getpoint "\n选择桩号基准点2:"))
  (setq k2 (getreal "\n输入基点2桩号值:"))
  (setvar "osmode" 0)
  (setq 1ep1 (vlax-curve-getClosestPointTo el ep1 nil))   ;
  (setq ep1dist1 (vlax-curve-getDistAtPoint el 1ep1))     ;
  (setq 2ep2 (vlax-curve-getClosestPointTo el ep2 nil))   ;
  (setq ep2dist2 (vlax-curve-getDistAtPoint el 2ep2))     ;
  (if (> (* (- k1 k2) (- ep1dist1 ep2dist2)) 0)           ;判断曲线方向与桩号方向是否一致
      (setq dpnum1 1.0)
      (setq dpnum1 -1.0)
  )  
  (prompt "\n正负判断结果dpnum1:")
  (prin1 dpnum1)

;设置通用常量
  (setq name1 (getvar "users1"))
  (setq txth1 (getvar "userr1"))
  (setq kname1 (getvar "users2"))
  (setq kacc1 (getvar "useri1"))
  (while   
    (progn
      (prompt "\n[节点名称(N)<")
      (prin1 name1)
      (prompt ">/文字高度(H)<")
      (prin1 txth1)
      (prompt ">/桩号前缀(Z)<")
      (prin1 kname1)
      (prompt ">/桩号精度(A)<")
      (prin1 kacc1)
      (prompt ">]:")
      (setq op1 (getstring)) ;输入选项
      (/= op1 "")
    )   
    (cond
      ((= op1 "n")
       (if (/= (setq name2 (getstring "\n输入节点名称:")) nil)
         (setq name1 name2)
       )
      )
      ((= op1 "h")
       (if (/= (setq txth2 (getreal "\n输入文字高度:")) nil)
         (setq txth1 txth2)
       )
      )
      ((= op1 "z")
       (if (/= (setq kname2 (getstring "\n输入桩号前缀:")) nil)
         (setq kname1 kname2)
       )
      )
      ((= op1 "a")
       (if (/= (setq kacc2 (getint "\n输入桩号精度:")) nil)
         (setq kacc1 kacc2)
       )
      )
      (T nil)
    )
  )
  (setvar "users1" name1)
  (setvar "userr1" txth1)
  (setvar "users2" kname1)
  (setvar "useri1" kacc1)
  
  ;循环标注节点
  (while                                             ;
    (progn
      (setvar "osmode" 4143)
      (setq dp1 (getpoint "\n选择节点定位点:"))              ;选择节点定位点
      (/= dp1 nil)
    )
    (setvar "osmode" 0)
    (setq 1dp1 (vlax-curve-getClosestPointTo el dp1 t))   ;节点与桩号线最近点
    (setq dp1dist1 (vlax-curve-getDistAtPoint el 1dp1))
        
    (princ "\n节点与基点桩号差值:")
    (princ (* dpnum1 (abs (- dp1dist1 ep1dist1))))
    (setq dp1k (+ k1 (* dpnum1 (- dp1dist1 ep1dist1))))   ;节点桩号值
    (princ "\n节点桩号:")
    (princ dp1k)
   
    ;;里程桩内容
    (setq dp1k2 (atof (rtos dp1k 2 kacc1)))     
    (setq k (fix (* 0.001 dp1k2))               ;千位及以上部分
          m (- dp1k2 (* k 1000.000))            ;百位及以下部分
    )               ;分别计算整数和小数部分
    (setq mstr (rtos m 2 kacc1))         ;将数字转换为字符串,保留kacc1位小数
    (if (= kacc1 0)
        (setq kacc3 (- kacc1 1))
        (setq kacc3 kacc1)      
    )
    (setq mstr2 (cond
                  ((= (+ kacc3 4) (strlen mstr)) mstr)
    ((= (+ kacc3 3) (strlen mstr)) (strcat "0" mstr))
    ((= (+ kacc3 2) (strlen mstr)) (strcat "00" mstr))   
  )
    )   
    (if (> (strlen mstr) 4)
        (setq mstr2 (vl-string-right-trim "." (vl-string-right-trim "0" mstr2)))
    )
    (setq dpstr3 (strcat kname1 (itoa k) "+" mstr2))
   
    ;;标注文字角度
    (setq dir1 (vlax-Curve-GetFirstDeriv el (vlax-Curve-GetParamatPoint el 1dp1)))   ;法线向量
    (setq ang1 (atan (/ (cadr dir1) (car dir1))))
    ;实时显示修订起点
   
    ;标注起始点
;    (setq dp2 (getpoint "\n选择标注起始点:"))
    ;新建节点名称文字,后续修改
    (entmake (list '(0 . "TEXT")
                    (cons 1 "节点名称")          ;默认值(字符串本身)
                   '(10 0 0 0)            ;第一对齐点(在OCS中)DXF:X值
                    (cons 40 3)       ;文字高度
                    (cons 50 0)        ;旋转角度,弧度表示
                    (cons 7 "smedi")      ;文字样式
                    (cons 41 0.7)         ;宽度因子
     '(11 0 0 0)
      (cons 72 0)
      (cons 73 1)
             )
    )
    (setq jdtxt1 (entget (entlast)))       ;新建文字定义为jdtxt1
    ;新建节点桩号文字,后续修改
    (entmake (list '(0 . "TEXT")
                    (cons 1 "节点桩号")          ;默认值(字符串本身)
                   '(10 0 0 0)            ;第一对齐点(在OCS中)DXF:X值
                    (cons 40 3)       ;文字高度
                    (cons 50 0)        ;旋转角度,弧度表示
                    (cons 7 "smedi")      ;文字样式
                    (cons 41 0.7)         ;宽度因子
     '(11 0 0 0)
      (cons 72 0)
      (cons 73 1)
             )
    )
    (setq zhtxt1 (entget (entlast)))       ;新建文字定义为jdtxt1
    (setq loop T)                      ;
    ;动态循环开始
    (while loop                        ;
      (setq code (grread T 4 1)        ;函数返回一个表,其中第一个元素说明输入类型的代码,第二个元素既可能是整数,又可能是点,这取决于输入的类型。
            mod  (car code)            ;输入类型代码
            dp2  (cadr code)           ;第二个元素既可能是整数,又可能是点,这取决于输入的类型
      )
      (cond (  (= 5 mod)                 ;;cond第一表达式
  
               ;生成文字标注
               ;节点名称修改
               (setq nameang1 (+ ang1 (atan 0.6 1.5)))  ;节点名称角度
               (setq namept1 (polar dp2 nameang1 (* (/ txth1 3.0) (sqrt (+ (* 1.5 1.5) (* 0.6 0.6))))));节点名称位置

               (setq jdtxt1 (subst (cons 1 name1) (assoc 1 jdtxt1) jdtxt1))  
               ;;修改文字内容
               (setq jdtxt1 (subst (cons 10 namept1) (assoc 10 jdtxt1) jdtxt1))  
               ;;修改文字坐标
        (setq jdtxt1 (subst (cons 11 namept1) (assoc 11 jdtxt1) jdtxt1))  
               ;;修改文字坐标
               (setq jdtxt1 (subst (cons 40 txth1) (assoc 40 jdtxt1) jdtxt1))  
               ;;修改文字高度
               (setq jdtxt1 (subst (cons 50 ang1) (assoc 50 jdtxt1) jdtxt1))  
               ;;修改文字角度
               ;;更新图元名列表
               (entmod jdtxt1)
      
               ;节点桩号修改
               (setq nameang2 (- ang1 (atan 3.5 1.5)))  ;节点桩号角度
               (setq zhpt1 (polar dp2 nameang2 (* (/ txth1 3.0) (sqrt (+ (* 1.5 1.5) (* 3.5 3.5))))));节点桩号位置
               ;(setq zhtxt1 (entget (entlast)))
               (setq zhtxt1 (subst (cons 1 dpstr3) (assoc 1 zhtxt1) zhtxt1))  
               ;;修改文字内容
               (setq zhtxt1 (subst (cons 10 zhpt1) (assoc 10 zhtxt1) zhtxt1))  
               ;;修改文字坐标
        (setq zhtxt1 (subst (cons 11 zhpt1) (assoc 11 zhtxt1) zhtxt1))  
               ;;修改文字坐标
               (setq zhtxt1 (subst (cons 40 txth1) (assoc 40 zhtxt1) zhtxt1))  
               ;;修改文字高度
               (setq zhtxt1 (subst (cons 50 ang1) (assoc 50 zhtxt1) zhtxt1))  
               ;;修改文字角度
               ;;更新图元名列表
               (entmod zhtxt1)
        
               ;画下划线
               ;节点名称
               (setq jdtxtbox1 (textbox jdtxt1))
               (setq jdtxtp1 (car jdtxtbox1))
               (setq jdtxtp3 (cadr jdtxtbox1))
               (setq jdtxtp2 (list (car jdtxtp3)(cadr jdtxtp1)))
               (setq jdtxtp4 (list (car jdtxtp1)(cadr jdtxtp3)))
  
               ;节点桩号
               (setq zhtxtbox1 (textbox zhtxt1))
               (setq zhtxtp1 (car zhtxtbox1))
               (setq zhtxtp3 (cadr zhtxtbox1))
               (setq zhtxtp2 (list (car zhtxtp3)(cadr zhtxtp1)))
               (setq zhtxtp4 (list (car zhtxtp1)(cadr zhtxtp3)))

               (redraw)                  ;如果不带参数调用 redraw 函数,它重画当前视口。如果调用它时提供了图元名,它将重画该指定图元。
               (grdraw dp1 dp2 3)        ;在当前视口中的两个点之间显示一条矢量线
               (grdraw dp2 (polar dp2 ang1
                                  (+ (max (distance jdtxtp1 jdtxtp2) (distance zhtxtp1 zhtxtp2))
         (* (/ txth1 3.0) 3)
      )
                        )
         3)        ;在当前视口中的两个点之间显示一条矢量线
            );(= 5 mod)结束
            
            ;;cond第二表达式,鼠标左键、右键退出画线
            (
               (or (= 25 mod) (= 3 mod))  ;
        (command "_line" dp1 dp2 "") ;画节点至标注起始点支线   
               (command "line" dp2 (polar dp2 ang1
                                          (+ (max (distance jdtxtp1 jdtxtp2)
                             (distance zhtxtp1 zhtxtp2)
                               )
                               (* (/ txth1 3.0) 3)
                                          )
                                ) ""
               )
        (setq loop nil)
            )
      );cond结束
    );loop while动态循环结束
    ;是否修改节点名称
    (setq op2 "N")
    (progn
      (prompt "\n是否修改节点名称?[是(Y)/否(N)]:<")
      (prin1 op2)
      (prompt ">")
      (setq op2 (getstring)) ;输入选项
    )   
    (if (= op2 "y") (setq name1 (getstring "\n输入新节点名称:")))
         
  )  ;while结束
  (setq *error* temperr)
  (vl-cmdf "UCS" "P")           ;返回前一个坐标系
  (setvar "osmode" 4143)   ;(setvar "osmode" os_old)获取原捕捉模式会出错,所以重新设置
  (setvar "CMDECHO" cmd_old)      ;恢复原回显设置
  (princ)
)
  





发表于 2019-1-2 09:54 | 显示全部楼层
看看是否是捕捉的问题?
 楼主| 发表于 2019-6-19 10:24 | 显示全部楼层
baitang36 发表于 2019-1-2 09:54
看看是否是捕捉的问题?

不是捕捉的问题,后来重装系统,重装CAD之后就好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-19 14:25 , Processed in 0.186677 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表