AutoLisp пытается выбрать LWPolyline, НО ТОЛЬКО ПРЯМОУГОЛЬНИКИ. Как я могу это сделать? - PullRequest
0 голосов
/ 05 мая 2020

Итак, я пытаюсь выбрать все объекты, которые являются прямоугольниками. Я пробовал этот (setq ss (ssget "X" '((0 . "RECTANG")))), но он, кажется, выделяет все полилинии, включая полигоны. Я попытался проверить вершины = 4, но затем он также выбирает ромбы. Как я мог реализовать такой код?

1 Ответ

1 голос
/ 05 мая 2020

Я был бы очень удивлен, если бы ваш текущий код, использующий список фильтров 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)
        )
    )
)
...