Lisp表示圆角半径。
我目前有一个lisp例程,将圆角半径设置为用户为命令输入的值。例如,f0是:我想知道是否有办法编写代码,以便对任何输入(即f325.2)进行半径325.2的圆角。目前,它仅以5为间隔从0到50定义,但由于其编写方式,我必须单独定义每个函数。 您将不得不错误地捕获命令行并分离丢失的命令。然后运行F R rad。另一种选择是使用F25绘制圆角,然后有一些Lisp程序的地方拾取圆角并输入325.5 all done。
这可能是一个很好的惯例
(DEFUN C:DYF (/ *ERROR* _PNT AT:GETSEL VL OV ENT PLST ELST GR SP)
;; DYNAMIC FILLET
;; ALAN J. THOMPSON, 03.07.11 / 03.09.11
(VL-LOAD-COM)
(DEFUN *ERROR* (MSG)
(REDRAW)
(AND VL (MAPCAR (FUNCTION SETVAR) VL OV))
(AND ELST (MAPCAR (FUNCTION REDRAW) ELST '(4 4)))
(IF (AND MSG (NOT (WCMATCH (STRCASE MSG) "*BREAK*,*CANCEL*,*QUIT*,")))
(PRINC (STRCAT "\NERROR: " MSG))
)
)
(DEFUN _PNT (P) (TRANS (LIST (CAR P) (CADR P)) 0 1))
(DEFUN AT:GETSEL (METH MSG FNC / ENT)
;; METH - SELECTION METHOD (ENTSEL, NENTSEL, NENTSELP)
;; MSG - MESSAGE TO DISPLAY (NIL FOR DEFAULT)
;; FNC - OPTIONAL FUNCTION TO APPLY TO SELECTED OBJECT
;; EX: (AT:GETSEL ENTSEL "\NSELECT ARC: " (LAMBDA (X) (EQ (CDR (ASSOC 0 (ENTGET (CAR X)))) "ARC")))
;; ALAN J. THOMPSON, 05.25.10
(SETVAR 'ERRNO 0)
(WHILE
(PROGN (SETQ ENT (METH (COND (MSG)
("\NSELECT OBJECT: ")
)
)
)
(COND ((EQ (GETVAR 'ERRNO) 7) (PRINC "\NMISSED, TRY AGAIN."))
((EQ (TYPE (CAR ENT)) 'ENAME)
(IF (AND FNC (NOT (FNC ENT)))
(PRINC "\NINVALID OBJECT!")
)
)
)
)
)
ENT
)
(IF (SETQ ENT
(CAR
(AT:GETSEL
ENTSEL
"\NSELECT ARC: "
(LAMBDA (X)
(IF (EQ "ARC" (CDR (ASSOC 0 (ENTGET (CAR X)))))
(VL-EVERY (FUNCTION (LAMBDA (P / SS)
(IF (SETQ SS (SSGET "_C" P P '((0 . "LINE"))))
(SETQ ELST (CONS (SSNAME SS 0) ELST))
)
)
)
(SETQ PLST (LIST (_PNT (VLAX-CURVE-GETSTARTPOINT (CAR X)))
(_PNT (VLAX-CURVE-GETENDPOINT (CAR X)))
)
)
)
)
)
)
)
)
(PROGN
(SETQ OV (MAPCAR (FUNCTION GETVAR) (SETQ VL '("CMDECHO" "FILLETRAD"))))
(WHILE
(PROGN
(SETQ GR (GRREAD T 15 0))
(COND
((EQ 5 (CAR GR))
(REDRAW)
(GRDRAW (SETQ SP (TRANS (VLAX-CURVE-GETSTARTPOINT ENT) 0 1)) (CADR GR) 1 -1)
(PRINC
(STRCAT "\RFILLET RADIUS: "
(RTOS (SETVAR 'FILLETRAD (DISTANCE SP (CADR GR))))
" "
)
)
(IF (VL-CMDF "_.FILLET" (LIST (CAR ELST) (CAR PLST)) (LIST (CADR ELST) (CADR PLST)))
(PROGN (ENTDEL ENT) (SETQ ENT (ENTLAST)))
T
)
)
)
)
)
)
)
(*ERROR* NIL)
(PRINC)
)
请看这里的示例。 李,我的问题是,就像我键入F1123.45的帖子一样,它知道这是一个“未知命令”,没有Lisp程序!但可以以某种方式剥离1123.45并继续运行fillet命令,正如我之前提到的,我不知道如何处理顶级Autocad错误陷阱。你有什么想法吗。会打开一个潘多拉盒子的捷径。
嗨,Al,正如我在另一个论坛的链接帖子中所指出的,我的代码将圆角半径值(如1123.45)中的小数点转换为创建自定义命令(如F1123-45)。 李非常感谢你的帮助!你的帖子和网站对我学习如何编写lisp和visual lisp程序非常有帮助。
不客气! 再多一点。李需要你的帮助,就快到了。它跳转到defun,但只是不执行“Fillet”命令。如果您能提供任何帮助,我们将不胜感激。
; A command line fillet with the desired radius without pressing the R option.
; By Alan H October 2015
; Enter any number after F say F4.5 this will return a Unknown command which is trapped and checked
; to see if the first character is a F and the radius then follows.
; F is checked as a Fabsdf would give an error as it has no number following the F.
(vl-load-com)
(defun filletfunction (objReactor Errorstr)
(setq ahval (car Errorstr))
(if (= (strcase (substr ahval 1 1)) "F")
(progn
(setq rad (atof (substr ahval 2)))
(if (> rad 0.0) ; returns 0.0 if alpha character
(progn
(setvar "Filletrad" rad)
(vla-sendcommand (vla-get-activedocument(vlax-get-acad-object)) "Fillet " )
)
(princ "No radius")
)
)
)
)
; Starts here
(setq Reactor-Put (vlr-command-reactor nil '((:vlr-unknownCommand . filletfunction))))
嗨,Al,
您不能在reactor回调函数中使用命令-您需要使用vla sendcommand来调用fillet命令后处理。
李 谢谢李,我不使用反应堆,我知道这需要一些方法来停止回拨,然后运行一个命令多一点的作业。
上面的代码现在适用于0+范围,唯一的问题是f0.45小数点被解释为列表中的一个点,因此会破坏半径输入。
李有什么想法吗。
页:
[1]
2