- ;;我写的打缺口程式为什么有时会出错?
- ;;该程式是用来将线、圆、弧打上缺口,缺口大小与个数由用户输入,
- ;;但是在使用过程中,当用户输入的个数太多时,经常会发生所生成的缺口
- ;;不是用户输入的大小,并且位置也不正确,请大家帮我分析一下此程式,谢谢!
- ;;这个程式是用在镭射切割图形方面的,这个缺口,
- ;;专有名词叫"桥位元",就是镭射按照图形切割时,
- ;;桥位元的地方就不要切,目的是防止图形中闭合部分掉下去,
- ;;举例:我画一个100x100的方框,先炸开它,输入命令bk,默认的半断宽度为6mm,
- ;;若是直线,默认的半断的个数是1个,若为圆,默认的半断是3,我先选直线,
- ;;输入2个、3个、4个、等,都能正确的打上缺口,但是若输入的缺口个数过多,
- ;;则会出现所打的缺口不在我所想要的位置,此时再选其他的线、圆等,
- ;;都会出现所打的缺口不是6mmm,并且不在要求的位置,但是开新档后,
- ;;一切又恢复正确,另外我还写了一个程式是用来恢复这个缺口的,
- ;;我现在检查了bk.lsp的所有参数,但就是找不出为什么会出错
- (defun C:BK (/ HOLDECHO HOLDOSMODE HOLDCL QBLL AA
- QI QCCC CBB AAB BB ST QED AD
- DD AJ XAA AED ANG SPT ANS ANE
- ANG PT PT1 ACCC ARC_1 ARC_L
- )
- (setq HOLDECHO (getvar "cmdecho"))
- (setvar "cmdecho" 0)
- (command "_.undo" "group")
- (setq HOLDOSMODE (getvar "osmode"))
- (setq HOLDCL (getvar "clayer"))
- (setvar "osmode" 0)
- (setq QBL (getdist (strcat "\n 请输入缺口尺寸:<6>: ")))
- (if (= QBL NIL)
- (setq QBL 6.0)
- )
- (setq AA (ssget '((0 . "line,circle,arc"))))
- (setq QI 0
- QCCC 1
- QCC NIL
- CBB 1
- CB NIL
- ACCC 1
- ACC NIL
- )
- (if (/= NIL AA)
- (repeat (sslength AA)
- (setq AAB (ssname AA QI))
- (redraw AAB 3)
- (setq BB (cdr (assoc 0 (entget AAB))))
- (setvar "clayer" (cdr (assoc 8 (entget AAB))))
- (cond
- ((= BB "LINE")
- (setq ST (cdr (assoc 11 (entget AAB))))
- (setq QED (cdr (assoc 10 (entget AAB))))
- (setq AD (distance ST QED)
- DD (angle ST QED)
- )
- (if (< QBL AD)
- (progn
- (while (or (= QCC NIL) (> (* QCC QBL) AD))
- (setq QCC
- (getint
- (strcat "\n 输入直线缺口个数 :<" (rtos QCCC) ">: ")
- )
- )
- (if (= QCC NIL)
- (setq QCC QCCC)
- (setq QCCC QCC)
- )
- )
- (setq AJ (/ (- AD (* QBL QCC)) (+ QCC 1)))
- (setq XAA (polar ST DD (+ AJ QBL)))
- (entdel AAB)
- (command "_.line" ST (polar ST DD AJ) "")
- (repeat QCC (command "_.copy" (entlast) "" ST XAA))
- )
- )
- )
- ((= BB "CIRCLE")
- (setq ST (cdr (assoc 10 (entget AAB))))
- (setq AED (cdr (assoc 40 (entget AAB))))
- (if (< QBL (* pi 2 AED))
- (progn
- (while (or (= CB NIL) (> (* CB QBL) (* pi 2 AED)))
- (setq
- CB
- (getint
- (strcat "\n 输入圆上缺口个数 :<" (rtos CBB) ">: ")
- )
- )
- (if (= CB NIL)
- (setq CB CBB)
- (setq CBB CB)
- )
- )
- (setq AJ (/ (- (* pi 2 AED) (* QBL CB)) CB))
- (setq ANG (/ AJ AED 2.0))
- (if
- (>= (distance (polar ST (- ANG) AED) (polar ST ANG AED))
- 0.0001
- )
- (progn
- (entdel AAB)
- (command "_.arc"
- (polar ST (- ANG) AED)
- (polar ST 0 AED)
- (polar ST ANG AED)
- )
- (if (> CB 1)
- (command "_.array" (entlast) "" "p" ST CB "" "")
- )
- )
- )
- )
- )
- )
- ((= BB "ARC")
- (setq ST (cdr (assoc 10 (entget AAB))))
- (setq AED (cdr (assoc 40 (entget AAB))))
- (setq SPT (polar ST (cdr (assoc 50 (entget AAB))) AED))
- (setq ANS (cdr (assoc 50 (entget AAB))))
- (setq ANE (cdr (assoc 51 (entget AAB))))
- (if (> ANE ANS)
- (setq ANG (- ANE ANS))
- (setq ANG (+ ANE (- (* 2 pi) ANS)))
- )
- (setq ARC_L (* AED ANG))
- (if (< QBL ARC_L)
- (progn
- (while (or (= ACC NIL) (> (* ACC QBL) ARC_L))
- (setq ACC
- (getint
- (strcat "\n 输入弧线缺口个数 :<" (rtos ACCC) ">: ")
- )
- )
- (if (= ACC NIL)
- (setq ACC ACCC)
- (setq ACCC ACC)
- )
- )
- (setq ARC_1 (/ (- ARC_L (* QBL ACC)) (1+ ACC) AED))
- (entdel AAB)
- (command "_.arc" "c" ST SPT "A" (/ (* ARC_1 180) pi))
- (command "_.ARRAY"
- (entlast)
- ""
- "P"
- ST
- (1+ ACC)
- (/ (* (- (/ ARC_L AED) ARC_1) 180) pi)
- ""
- )
- )
- )
- )
- )
- (setq QI (1+ QI))
- )
- )
- (setvar "clayer" HOLDCL)
- (setvar "osmode" HOLDOSMODE)
- (command "_.undo" "end")
- (setvar "cmdecho" HOLDECHO)
- (princ)
- )
|