jason_a 发表于 2022-7-5 17:07:30

IF函数

我目前有一个lisp例程,只有在其路径内的特定层上检测到45度斜接线时,才会创建十字线构造线。若我在屏幕上的任何地方点击,它并没有检测到和斜接线相交,它将根本不会创建一条构造线。因此,我想合并一个IF函数或类似的东西,它将允许lisp例程在没有斜接线的情况下像正常的构造线命令一样执行。任何帮助都将不胜感激。
 
谢谢
杰森
 

(defun c:xlineV45 ( / *error* ucsf p xli ss el pp )

(vl-load-com)

(defun *error* ( m )
   (if (eq el (entlast))
   (entdel xli)
   )
   (if ucsf
   (command "_.UCS" "_P")
   )
   (if m
   (prompt m)
   )
   (princ)
)

(if (= 0 (getvar 'worlducs))
   (progn
   (command "_.UCS" "_W")
   (setq ucsf t)
   )
)
(setq p (getpoint "\nPick or specify point : "))
(setq xli
   (entmakex
   (list
       '(0 . "XLINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbXline")
       (cons 10 p)
       '(11 0.0 1.0 0.0)
   )
   )
)
(setq ss (ssget "_A" '((0 . "LINE") (8 . "45"))))
(setq el (entlast))
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   (if (setq pp (vlax-invoke (vlax-ename->vla-object xli) 'intersectwith (vlax-ename->vla-object e) acextendnone))
   (entmake
       (list
         '(0 . "XLINE")
         '(100 . "AcDbEntity")
         '(100 . "AcDbXline")
         (cons 10 pp)
         '(11 1.0 0.0 0.0)
       )
   )
   )
)
(*error* nil)
)

(defun c:xlineH45 ( / *error* ucsf p xli ss el pp )

(vl-load-com)

(defun *error* ( m )
   (if (eq el (entlast))
   (entdel xli)
   )
   (if ucsf
   (command "_.UCS" "_P")
   )
   (if m
   (prompt m)
   )
   (princ)
)

(if (= 0 (getvar 'worlducs))
   (progn
   (command "_.UCS" "_W")
   (setq ucsf t)
   )
)
(setq p (getpoint "\nPick or specify point : "))
(setq xli
   (entmakex
   (list
       '(0 . "XLINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbXline")
       (cons 10 p)
       '(11 1.0 0.0 0.0)
   )
   )
)
(setq ss (ssget "_A" '((0 . "LINE") (8 . "45"))))
(setq el (entlast))
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   (if (setq pp (vlax-invoke (vlax-ename->vla-object xli) 'intersectwith (vlax-ename->vla-object e) acextendnone))
   (entmake
       (list
         '(0 . "XLINE")
         '(100 . "AcDbEntity")
         '(100 . "AcDbXline")
         (cons 10 pp)
         '(11 0.0 1.0 0.0)
       )
   )
   )
)
(*error* nil)
)

marko_ribar 发表于 2022-7-5 17:28:37

这(未经测试)
 

(defun c:xlins ( / p )
(setq p (getpoint "\nPick or specify point : "))
(if p
   (command "_.XLINE" "_H" "_non" p "_V" "_non" p "")
)
(princ)
)

jason_a 发表于 2022-7-5 17:36:24

谢谢,但不幸的是,我不知道该把它粘贴到哪里。我有一个宏按钮,它加载lisp例程,然后根据我单击的两个宏按钮中的哪一个启动XLINEV45命令或XLINEH45命令。请告知,谢谢。

marko_ribar 发表于 2022-7-5 17:53:30

你们可以把代码复制粘贴到记事本中,并将文件保存为“xlins.lsp”。。。然后将lisp加载到CAD会话中(将文件复制并粘贴到CAD界面或使用APLOAD命令)。。。加载lisp后,只需键入不带引号的“xlins”:xlins,然后只需选取点。。。应创建构造线(xline)。。。你也可以像之前发布的Lisp一样创建第三个宏按钮^C^CXLIN

jason_a 发表于 2022-7-5 18:04:27

谢谢你的帮助,但我目前有第三个按钮,执行相同的功能,并试图消除它。

jason_a 发表于 2022-7-5 18:17:50

我似乎通过忽略一些代码行来实现它。
 
 

(defun c:xlineV45 ( / *error* ucsf p xli ss el pp )

(vl-load-com)

;(defun *error* ( m )
;    (if (eq el (entlast))
;      (entdel xli)
;    )
;    (if ucsf
;      (command "_.UCS" "_P")
;    )
;    (if m
;      (prompt m)
;    )
;    (princ)
;)

(if (= 0 (getvar 'worlducs))
   (progn
   (command "_.UCS" "_W")
   (setq ucsf t)
   )
)
(setq p (getpoint "\nPick or specify point : "))
(setq xli
   (entmakex
   (list
       '(0 . "XLINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbXline")
       (cons 10 p)
       '(11 0.0 1.0 0.0)
   )
   )
)
(setq ss (ssget "_A" '((0 . "LINE") (8 . "45"))))
(setq el (entlast))
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   (if (setq pp (vlax-invoke (vlax-ename->vla-object xli) 'intersectwith (vlax-ename->vla-object e) acextendnone))
   (entmake
       (list
         '(0 . "XLINE")
         '(100 . "AcDbEntity")
         '(100 . "AcDbXline")
         (cons 10 pp)
         '(11 1.0 0.0 0.0)
       )
   )
   )
)
(*error* nil)
)

(defun c:xlineH45 ( / *error* ucsf p xli ss el pp )

(vl-load-com)

;(defun *error* ( m )
;    (if (eq el (entlast))
;      (entdel xli)
;    )
;    (if ucsf
;      (command "_.UCS" "_P")
;    )
;    (if m
;      (prompt m)
;    )
;    (princ)
;)

(if (= 0 (getvar 'worlducs))
   (progn
   (command "_.UCS" "_W")
   (setq ucsf t)
   )
)
(setq p (getpoint "\nPick or specify point : "))
(setq xli
   (entmakex
   (list
       '(0 . "XLINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbXline")
       (cons 10 p)
       '(11 1.0 0.0 0.0)
   )
   )
)
(setq ss (ssget "_A" '((0 . "LINE") (8 . "45"))))
(setq el (entlast))
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   (if (setq pp (vlax-invoke (vlax-ename->vla-object xli) 'intersectwith (vlax-ename->vla-object e) acextendnone))
   (entmake
       (list
         '(0 . "XLINE")
         '(100 . "AcDbEntity")
         '(100 . "AcDbXline")
         (cons 10 pp)
         '(11 0.0 1.0 0.0)
       )
   )
   )
)
(*error* nil)
)
页: [1]
查看完整版本: IF函数