Я был бы очень удивлен, если бы ваш текущий код, использующий список фильтров ssget
'((0 . "RECTANG"))
, должен был вообще что-либо выбирать, поскольку RECTANG
не является допустимым типом объекта для группы DXF 0.
В AutoCAD стандартная команда RECTANG
фактически создает 2D-полилинии, тип объекта (группа 0 DXF) - LWPOLYLINE
. Таким образом, ваш список фильтров ssget
должен начинаться:
(ssget "_X" '((0 . "LWPOLYLINE")))
Мы можем дополнительно отфильтровать этот выбор, чтобы выбрать только 2D-полилинии с 4 вершинами, используя:
(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4)))
И мы можем фильтровать для замкнутых полилиний с 4 вершинами, используя:
(ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1)))
Однако невозможно сузить выбор дальше, используя только список фильтров ssget
, поэтому для целевых прямоугольников вы необходимо перебрать выбор, возвращенный приведенным выше выражением, и удалить все непрямые полилинии. angular.
Вы можете написать такую функцию следующим образом:
(defun selrectang ( / a b c d e i s )
(if (setq s (ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1))))
(progn
(repeat (setq i (sslength s))
(setq i (1- i)
e (ssname s i)
)
(mapcar 'set '(a b c d) (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e))))
(if
(not
(and
(equal (distance a b) (distance c d) 1e-8)
(equal (distance b c) (distance a d) 1e-8)
(equal (distance a c) (distance b d) 1e-8)
)
)
(ssdel e s)
)
)
(if (< 0 (sslength s)) s)
)
)
)