请帮助:)Lisp检测
大家好。我一直在试图找到一个lisp,它可以检测指定图层的多段线是否位于另一个指定图层的多段线内。我想检查图层(图层1、图层2和图层3….)下的闭合多段线是否正确位于第4层下的闭合多段线内。
我希望有人明白我说的话。我在AutoCAD中所能做的最好的事情就是创建宏,而这是无法做到的 你好
确保在屏幕上完全看到选定多段线的边界,否则程序可能会失败或无法检测到所有多段线对象。
(defun c:test (/ sn ss dis div s in l)
(princ "\nPick a closed polyline :")
(if (setq s (ssget "_+.:S:E" '((0 . "*POLYLINE") (8 . "Layer4") (-4 . "&=") (70 . 1))))
(progn
(setq sn(ssname s 0)
dis (/ (vlax-curve-getdistatparam
sn
(fix (vlax-curve-getendparam sn))
)
100.
)
div dis
)
(repeat 100
(setq l (cons (vlax-curve-getpointatdist sn dis) l))
(setq dis (+ div dis))
)
(if (setq
ss (ssget "_WP"
l
'((0 . "*POLYLINE") (8 . "Layer1,Layer2,Layer3"))
)
)
(sssetfirst nil ss)
)
)
)
(princ)
)
那是法斯特·塔瓦特。
虽然程序很好,但如果第1层、第2层或第3层下的任何多段线不完全在第4层内,是否可能提示错误消息?
试试这个:
(defun c:test (/ lays fnd sn ss dis div s lst lay l)
;; Tharwat - 07.Dec.2016 ;;
(princ "\nPick on closed polyline :")
(if (setq lays "Layer1,Layer2,Layer3"
fnd0
s (ssget "_+.:S:E"
'((0 . "*POLYLINE") (8 . "Layer4") (-4 . "&=") (70 . 1))
)
)
(progn
(setq sn(ssname s 0)
dis (/ (vlax-curve-getdistatparam
sn
(fix (vlax-curve-getendparam sn))
)
100.
)
div dis
)
(repeat 100
(setq l (cons (vlax-curve-getpointatdist sn dis) l))
(setq dis (+ div dis))
)
(if (setq
ss (ssget "_WP" l (list '(0 . "*POLYLINE") (cons 8 lays)))
)
(while (and (/= fnd 3)
(setq sn (ssname ss 0))
)
(and (wcmatch (setq lay (cdr (assoc 8 (entget sn)))) lays)
(not (member lay lst))
(setq lst (cons lay lst))
(setq fnd (length lst))
)
(ssdel sn ss)
)
)
(cond
((= fnd 3) (princ "\nAll layers are found "))
((>= fnd 1)
(princ
(strcat
"\nPolylines' layers ["
(vl-string-right-trim
","
(apply 'strcat (mapcar '(lambda (u) (strcat u ",")) lst))
)
"]."
)
)
)
((princ "\nNo polylines found on specified layers <!>"))
)
)
)
(princ)
)(vl-load-com)
效果很好!非常感谢。
一个简单的问题是,我如何将“选择对象:”更改为“选择对象:”因为我将只选择一个对象
使用entsel/entsel代替ssget,并修改一半代码。 显然,有一种方法可以抑制默认的ssget提示(但我认为它在BricsCAD中效果不好)。
(prompt ...)
(setvar 'nomutt 1)
(ssget ...)
(setvar 'nomutt 0)
我还有一个问题,当(Layer1,Layer2,Layer3)下的一条或多条多段线位于Layer4之上时,我希望将其视为在多段线内。如果它在外面,它只会将其排除在外。
页:
[1]