broncos15 发表于 2022-7-5 16:17:22

Lisp表示圆角半径。

我目前有一个lisp例程,将圆角半径设置为用户为命令输入的值。例如,f0是:
 
 
我想知道是否有办法编写代码,以便对任何输入(即f325.2)进行半径325.2的圆角。目前,它仅以5为间隔从0到50定义,但由于其编写方式,我必须单独定义每个函数。

BIGAL 发表于 2022-7-5 16:21:11

您将不得不错误地捕获命令行并分离丢失的命令。然后运行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)
)

Lee Mac 发表于 2022-7-5 16:24:31

请看这里的示例。

BIGAL 发表于 2022-7-5 16:27:22

李,我的问题是,就像我键入F1123.45的帖子一样,它知道这是一个“未知命令”,没有Lisp程序!但可以以某种方式剥离1123.45并继续运行fillet命令,正如我之前提到的,我不知道如何处理顶级Autocad错误陷阱。你有什么想法吗。会打开一个潘多拉盒子的捷径。

Lee Mac 发表于 2022-7-5 16:31:09

 
嗨,Al,正如我在另一个论坛的链接帖子中所指出的,我的代码将圆角半径值(如1123.45)中的小数点转换为创建自定义命令(如F1123-45)。

broncos15 发表于 2022-7-5 16:35:13

李非常感谢你的帮助!你的帖子和网站对我学习如何编写lisp和visual lisp程序非常有帮助。

Lee Mac 发表于 2022-7-5 16:37:15

 
不客气!

BIGAL 发表于 2022-7-5 16:42:30

再多一点。李需要你的帮助,就快到了。它跳转到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))))

Lee Mac 发表于 2022-7-5 16:42:59

嗨,Al,
 
您不能在reactor回调函数中使用命令-您需要使用vla sendcommand来调用fillet命令后处理。
 

BIGAL 发表于 2022-7-5 16:46:47

谢谢李,我不使用反应堆,我知道这需要一些方法来停止回拨,然后运行一个命令多一点的作业。
 
上面的代码现在适用于0+范围,唯一的问题是f0.45小数点被解释为列表中的一个点,因此会破坏半径输入。
 
李有什么想法吗。
页: [1] 2
查看完整版本: Lisp表示圆角半径。