明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 346|回复: 3

[提问] 有没有大神帮忙看一下此程序是什么原因报错

[复制链接]
发表于 2022-5-15 05:15 | 显示全部楼层 |阅读模式

选择线段时,按下空格键怎么会报错这种

程序内容如下:


(defun C:AC(/ en P1 P2 P3 P4 P5)
(COMMAND "UCS" "W")
(setvar "cmdecho" 0)
(setvar "cecolor" "1");改变当前颜色
(setvar "ORTHOMODE" 0);关闭正交
(if (null L)(setq L 2.0))
(if (null W)(setq W 2.0))
(if (null R)(setq R 0.5))
(while ;循环执行
(setq L11 L W11 W R11 R)
(setq T 0)

(while (/= T nil) ;循环设置参数
(princ "\n---绘制穿丝孔---")
(princ (strcat "\n当前设置[ 引线: " (rtos L 2 4) " MM "))
(princ (strcat "偏距: " (rtos W 2 4) " MM "))
(princ (strcat "半径: " (rtos R 2 4) " MM ] "))
(initget "LL WW RR")
(setq en(entsel "\n选择线段或[引线(LL) /偏距(WW) /半径(RR)]"))

(cond
((= en "LL");L
(progn
(setq L(getreal (strcat "\n引线:<" (rtos L 2 4) ">")))
(if (= nil L)(setq L L11))
)
)

((= en "WW");W
(progn
(setq W(getreal (strcat "\n偏距:<" (rtos W 2 4) ">")))
(if (= nil W)(setq W W11))
)
)

((= en "RR");R
(progn
(setq R(getreal (strcat "\n半径:<" (rtos R 2 4) ">")))
(if (= nil R)(setq R R11))
)
)

((/= en "LL")(/= en "WW")(/= en "RR")
(setq T nil)
)
);结束cond
);结束循环设置参数


(if (= en nil)(exit))

(setq e (car en))
(setq enn (entget (car en)))
(setq ol(cdr (assoc 0 enn)))

(if (= ol "LWPOLYLINE")
(progn
(setq n(fix (vlax-curve-getparamatpoint e
(vlax-curve-getclosestpointto e (cadr en)))));点选在多段线上的第几段
(setq n1(vlax-curve-getclosestpointto e (cadr en)));点选的点在多段线上的位置
(setq P1(vlax-curve-getpointatparam e n));第一个端点坐标
(setq P2(vlax-curve-getpointatparam e (1+ n)));第二个端点坐标
))

(if (= ol "LINE")
(progn
(setq n1(vlax-curve-getclosestpointto e (cadr en)));点选的点在多段线上的位置
(setq P1(cdr (assoc 10 enn)));第一个端点坐标
(setq P2(cdr (assoc 11 enn)));第二个端点坐标
))

(setq MI(polar P1 (angle P1 P2) (* 0.5 (distance P1 P2))));线段中点坐标

(setq P3 (getpoint "\n指定一侧上的点:"))

(setq A2 (distance P1 N1));第一点到点选的点的距离
(setq A3 (distance P2 N1));第二点到点选的点的距离

(if (> A2 A3)
(progn
(setq P2P P2)
(setq P1P P1)
(setq P1 P2P)
(setq P2 P1P)
)
)

(setq ang1 (atof (angtos (angle P1 P2) 0 4)));获取点选线段的倾斜角度

(setq ang2(anga P1 P3 MI));获取点夹角角度为

;判断象限
(if (and (> ang2 90 ) (< ang2 180)) (SETQ XX 1));第一象限
(if (and (> ang2 0  ) (< ang2 90 )) (SETQ XX 2));第二象限
(if (and (> ang2 270) (< ang2 360)) (SETQ XX 3));第三象限
(if (and (> ang2 180) (< ang2 270)) (SETQ XX 4));第四象限

(cond
((= XX 1);第一象限
(progn
(setq P4(polar P2 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) (* W -1)))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) (* L -1)))
))

((= XX 2);第二象限
(progn
(setq P4(polar P1 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) W))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) (* L -1)))
))

((= XX 3);第三象限
(progn
(setq P4(polar P1 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) W))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) L))
))

((= XX 4);第四象限
(progn
(setq P4(polar P2 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) (* W -1)))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) L))
))
)

(entmakex (list '(0 . "CIRCLE") (cons 10 P5) (cons 40 R)))
(princ "\n")
(princ "绘制完毕!")
);结束循环绘制
(princ)
)

(defun anga(PT1 PT2 PT3)  ;已知PT1 PT2 PT3 三点,求三点夹角A角度
(setq ang(- (angle PT1 PT3) (angle PT2 PT3)))
(if (> ang (* 2.0 pi)) (setq ang(- (* 2.0 pi) ang)))
(setq ang(atof (angtos ang 0 4)))
)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-5-15 05:32 | 显示全部楼层
(defun c:ac(/ *error* oldort os6 en P1 P2 P3 P4 P5)
(defun *error*(msg)    ;;==错误处理
(if oldort(setvar "orthomode" oldort))
(if os6(setvar "cecolor" os6))
(setvar "cmdecho" 1)
(princ "\n命令取消。"))

(command "UCS" "W")
(setvar "cmdecho" 0)
(setq os6 (getvar "cecolor"))  ;保存当前图层的颜色值
(setvar "cecolor" "1");改变当前颜色
(setq oldort (getvar "orthomode"))
(setvar "ORTHOMODE" 0);关闭正交
(if (null L)(setq L 2.0))
(if (null W)(setq W 2.0))
(if (null R)(setq R 0.5))
(while ;循环执行
(setq L11 L W11 W R11 R)
(setq T 0)

(while (/= T nil) ;循环设置参数
(princ "\n---绘制穿丝孔---")
(princ (strcat "\n当前设置[ 引线: " (rtos L 2 4) " MM "))
(princ (strcat "偏距: " (rtos W 2 4) " MM "))
(princ (strcat "半径: " (rtos R 2 4) " MM ] "))
(initget "LL WW RR")
(setq en(entsel "\n选择线段或[引线(LL) /偏距(WW) /半径(RR)]"))

(cond
((= en "LL");L
(progn
(setq L(getreal (strcat "\n引线:<" (rtos L 2 4) ">")))
(if (= nil L)(setq L L11))
)
)

((= en "WW");W
(progn
(setq W(getreal (strcat "\n偏距:<" (rtos W 2 4) ">")))
(if (= nil W)(setq W W11))
)
)

((= en "RR");R
(progn
(setq R(getreal (strcat "\n半径:<" (rtos R 2 4) ">")))
(if (= nil R)(setq R R11))
)
)

((/= en "LL")(/= en "WW")(/= en "RR")
(setq T nil)
)
);结束cond
);结束循环设置参数


(if (= en nil)(exit))

(setq e (car en))
(setq enn (entget (car en)))
(setq ol(cdr (assoc 0 enn)))

(if (= ol "LWPOLYLINE")
(progn
(setq n(fix (vlax-curve-getparamatpoint e
(vlax-curve-getclosestpointto e (cadr en)))));点选在多段线上的第几段
(setq n1(vlax-curve-getclosestpointto e (cadr en)));点选的点在多段线上的位置
(setq P1(vlax-curve-getpointatparam e n));第一个端点坐标
(setq P2(vlax-curve-getpointatparam e (1+ n)));第二个端点坐标
))

(if (= ol "LINE")
(progn
(setq n1(vlax-curve-getclosestpointto e (cadr en)));点选的点在多段线上的位置
(setq P1(cdr (assoc 10 enn)));第一个端点坐标
(setq P2(cdr (assoc 11 enn)));第二个端点坐标
))

(setq MI(polar P1 (angle P1 P2) (* 0.5 (distance P1 P2))));线段中点坐标

(setq P3 (getpoint "\n指定一侧上的点:"))

(setq A2 (distance P1 N1));第一点到点选的点的距离
(setq A3 (distance P2 N1));第二点到点选的点的距离

(if (> A2 A3)
(progn
(setq P2P P2)
(setq P1P P1)
(setq P1 P2P)
(setq P2 P1P)
)
)

(setq ang1 (atof (angtos (angle P1 P2) 0 4)));获取点选线段的倾斜角度

(setq ang2(anga P1 P3 MI));获取点夹角角度为

;判断象限
(if (and (> ang2 90 ) (< ang2 180)) (SETQ XX 1));第一象限
(if (and (> ang2 0  ) (< ang2 90 )) (SETQ XX 2));第二象限
(if (and (> ang2 270) (< ang2 360)) (SETQ XX 3));第三象限
(if (and (> ang2 180) (< ang2 270)) (SETQ XX 4));第四象限

(cond
((= XX 1);第一象限
(progn
(setq P4(polar P2 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) (* W -1)))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) (* L -1)))
))

((= XX 2);第二象限
(progn
(setq P4(polar P1 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) W))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) (* L -1)))
))

((= XX 3);第三象限
(progn
(setq P4(polar P1 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) W))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) L))
))

((= XX 4);第四象限
(progn
(setq P4(polar P2 (* pi (/ (angtof (rtos ang1) 0) (angtof (rtos 180) 0))) (* W -1)))
(setq P5(polar P4 (* pi (/ (angtof (rtos (+ 270 ang1)) 0) (angtof (rtos 180) 0))) L))
))
)

(entmakex (list '(0 . "CIRCLE") (cons 10 P5) (cons 40 R)))
(princ "\n")
(princ "绘制完毕!")
);结束循环绘制
(setvar "cecolor" os6)
(setvar "orthomode" oldort)
(setvar "cmdecho" 1)
(princ)
)

(defun anga(PT1 PT2 PT3)  ;已知PT1 PT2 PT3 三点,求三点夹角A角度
(setq ang(- (angle PT1 PT3) (angle PT2 PT3)))
(if (> ang (* 2.0 pi)) (setq ang(- (* 2.0 pi) ang)))
(setq ang(atof (angtos ang 0 4)))
)

评分

参与人数 1明经币 +1 收起 理由
bssurvey + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-15 05:25 | 显示全部楼层
这是因为按下空格,是非正常退出,但你没有定义非正常退出的错误处理。
 楼主| 发表于 2022-5-15 05:28 | 显示全部楼层
qazxswk 发表于 2022-5-15 05:25
这是因为按下空格,是非正常退出,但你没有定义非正常退出的错误处理。

找到原因了 是CAD环境的原因 跟程序没关系
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 22:13 , Processed in 0.335821 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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