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)
)
这(未经测试)
(defun c:xlins ( / p )
(setq p (getpoint "\nPick or specify point : "))
(if p
(command "_.XLINE" "_H" "_non" p "_V" "_non" p "")
)
(princ)
)
谢谢,但不幸的是,我不知道该把它粘贴到哪里。我有一个宏按钮,它加载lisp例程,然后根据我单击的两个宏按钮中的哪一个启动XLINEV45命令或XLINEH45命令。请告知,谢谢。 你们可以把代码复制粘贴到记事本中,并将文件保存为“xlins.lsp”。。。然后将lisp加载到CAD会话中(将文件复制并粘贴到CAD界面或使用APLOAD命令)。。。加载lisp后,只需键入不带引号的“xlins”:xlins,然后只需选取点。。。应创建构造线(xline)。。。你也可以像之前发布的Lisp一样创建第三个宏按钮^C^CXLIN 谢谢你的帮助,但我目前有第三个按钮,执行相同的功能,并试图消除它。 我似乎通过忽略一些代码行来实现它。
(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]