Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: 1958 от 01-03-2018, 02:59:26

Название: Набор ssget
Отправлено: 1958 от 01-03-2018, 02:59:26
Выбираю все блоки:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss_bl (ssget "_X" '((0 . "insert"))))
Как исключить добавление в набор ss_bl блоков, расположенных на отключенных, замороженных слоях?
Название: Re: Набор ssget
Отправлено: Александр Ривилис от 01-03-2018, 10:10:05
Как исключить добавление в набор ss_bl блоков, расположенных на отключенных, замороженных слоях?
Нужно добавить в фильтр выбора только слои, которые включены и незаморожены, или наоборот в фильтре использовать отрицание  (-4 . "<NOT") (8 . "имя отключенного или замороженного слоя") (-4 . "NOT>") и добавлять только отключенные и замороженные слои.
Название: Re: Набор ssget
Отправлено: 1958 от 01-03-2018, 10:57:32
Нужно добавить в фильтр выбора только слои, которые включены и незаморожены, или наоборот в фильтре использовать отрицание  (-4 . "<NOT") (8 . "имя отключенного или замороженного слоя") (-4 . "NOT>") и добавлять только отключенные и замороженные слои.
Это понятно. Смысл моего вопроса в другом - может можно указать как-то, что в набор не включаются объекты отключенных  слоев. Как их программно "вычислить"? Какой у них признак?
Название: Re: Набор ssget
Отправлено: Александр Ривилис от 01-03-2018, 11:03:43
может можно указать как-то, что в набор не включаются объекты отключенных  слоев.
Нельзя. Нет такого признака. Если бы было можно, то я бы так сразу и ответил.
Название: Re: Набор ssget
Отправлено: Alex.gomel от 01-03-2018, 13:46:59
А если подойти к решению задачи несколько иначе использовав ssget "_CP"? В качестве аргументов - координаты диагонали экрана после выполнения команды "zoom" "all".
Название: Re: Набор ssget
Отправлено: Александр Ривилис от 01-03-2018, 13:58:57
А если подойти к решению задачи несколько иначе использовав ssget "_CP"? В качестве аргументов - координаты диагонали экрана после выполнения команды "zoom" "all".
Теоретически можно. Практически не вижу смысла. Думаю, что отобрать выключенные/замороженные слои и добавить их в фильтр выбора будет быстрее, чем _ZOOM _ALL, который приводит к регенерации чертежа. Ну и для корректности после завершения программы вид нужно восстановить...
Название: Re: Набор ssget
Отправлено: 1958 от 01-03-2018, 16:04:02
А если подойти к решению задачи несколько иначе использовав ssget "_CP"? В качестве аргументов - координаты диагонали экрана после выполнения команды "zoom" "all".
Хороший вариант. Что-то я про него забыл. :)
Ну и для корректности после завершения программы вид нужно восстановить...
В принципе я и предполагал потом сделать зуммирование на все объекты (или почти на все). У меня задача: заменить одни блоки на другие, если сопоставления нет, то старые блоки остаются, но обводятся (помечаются) красным кружком для принятия дальнейшего решения по замене вручную наиболее подходящим по смыслу боком (элементом).
Название: Re: Набор ssget
Отправлено: BearDyugin от 03-03-2018, 16:19:00
Думаю, что отобрать выключенные/замороженные слои и добавить их в фильтр выбора будет быстрее,
Как бы я согласен, что полезнее давать удочку а не рыбы...
Но я чувствую себя неловко, что прихожу сюда только с вопросами, поэтому набросал этот вариант, вдруг пригодится ТС
Код - Auto/Visual Lisp [Выбрать]
  1. (setq adoc (vla-get-activedocument
  2.              (vlax-get-acad-object)
  3.            )      
  4. )
  5. (vlax-for item (vla-get-layers
  6.                  adoc
  7.                )
  8.   (or
  9.     (eq (vla-get-freeze item) :vlax-true)
  10.     (eq (vla-get-layerOn item) :vlax-false)
  11.     (eq (vla-get-lock item) :vlax-true)
  12.     (setq Layers_name
  13.            (cons
  14.              (cons 8 (vla-get-name item))
  15.                  Layers_name
  16.            )
  17.     )
  18.   )
  19. )
  20. (setq ss_bl (ssget "_X"
  21.                    (append '((0 . "insert") (-4 . "<or"))
  22.                            Layers_name
  23.                            '((-4 . "or>"))
  24.                    )
  25.             )
  26. )
Название: Re: Набор ssget
Отправлено: Александр Ривилис от 03-03-2018, 16:38:49
поэтому набросал этот вариант
Про заблокированные слои он не спрашивал...
Название: Re: Набор ssget
Отправлено: BearDyugin от 03-03-2018, 16:43:21
Про заблокированные слои он не спрашивал...
Да, но мне показалось что это он просто забыл или не подумал об этом, так оно как-то логичнее, хотя... ТС виднее, если что уберёт эту строчку.
Название: Re: Набор ssget
Отправлено: 1958 от 04-03-2018, 16:45:03
Пока обошелся таким вариантом:
Код - Auto/Visual Lisp [Выбрать]
  1.  (vl-cmdf "_.zoom" "_w" (getvar "extmax") (getvar "extmin"))
  2.  (setq ss_bl (ssget "_c" (getvar "extmax") (getvar "extmin") '((0 . "insert"))))
Название: Re: Набор ssget
Отправлено: Алексей Кулик от 05-03-2018, 07:52:26
Можно сделать по-другому: выбирать объекты и одновременно отфильтровать "невидимые". Сам недавно с подобной задачей столкнулся, когда обрабатывал пространство модели неактивного документа.
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. (defun fun_is-ent-visible (doc ent / layer) ;|
  3. *    Проверяет, видим ли примитив (BlockRef)
  4. *    Параметры вызова:
  5.   doc    указатель на документ примитива
  6.   ent    собственно примитив
  7. |;
  8.   (and (equal (vla-get-visible ent) :vlax-true)
  9.        (cond ((= (type
  10.                    (setq layer (vl-catch-all-apply (function (lambda () (vla-item (vla-get-layers doc) (vla-get-layer ent))))))
  11.                    ) ;_ end of type
  12.                  'vla-object
  13.                  ) ;_ end of =
  14.               (and (equal (vla-get-layeron layer) :vlax-true) (equal (vla-get-freeze layer) :vlax-false))
  15.               )
  16.              ((/= (type layer) 'vla-object) t)
  17.              ) ;_ end of cond
  18.        ) ;_ end of and
  19.   ) ;_ end of defun
  20.  
  21. (defun get-model-space (/ lst)
  22.   (vlax-for ent (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
  23.     (if (and (wcmatch (strcase (vla-get-objectname ent)) "*BLOCKREF*") (fun_is-ent-visible ent))
  24.       (setq lst (cons ent lst))
  25.       ) ;_ end of if
  26.     ) ;_ end of vlax-for
  27.   lst
  28.   ) ;_ end of defun
  29.  
  30. (defun get-all-spaces (/ lst)
  31.   (vlax-for blk_def (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  32.     (if (equal (vla-get-islayout blk_def) :vlax-true)
  33.       (vlax-for ent blk_def
  34.         (vlax-for ent (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
  35.           (if (and (wcmatch (strcase (vla-get-objectname ent)) "*BLOCKREF*") (fun_is-ent-visible ent))
  36.             (setq lst (cons ent lst))
  37.             ) ;_ end of if
  38.           ) ;_ end of vlax-for
  39.         ) ;_ end of vlax-for
  40.       ) ;_ end of if
  41.     ) ;_ end of vlax-for
  42.   lst
  43.   ) ;_ end of defun
P.S. Код особо не проверял, за исключением fun_is-ent-visible.
Название: Re: Набор ssget
Отправлено: Матвей от 28-06-2019, 15:15:15
Существует ли какое-нибудь правило, согласно которому элементы попадают в набор?
Для примера возьмем примитивы типа текст, расположенные в одну строку.
Если я выбираю каждый элемент отдельно (например слева направо ), то они попадают в набор в том порядке, в котором я их выбрал. А если я выбираю их за один раз (при помощи рамки), то их порядок в наборе хаотичен. Так и должно быть, и есть ли способ управлять этим?
Название: Re: Набор ssget
Отправлено: Александр Ривилис от 28-06-2019, 16:47:17
Так и должно быть, и есть ли способ управлять этим?
Так и должно быть.
Название: Re: Набор ssget
Отправлено: Матвей от 28-06-2019, 17:18:57
есть ли способ управлять этим?
Название: Re: Набор ssget
Отправлено: Александр Ривилис от 28-06-2019, 17:22:27
есть ли способ управлять этим?

Нет. Только последовательный выбор.
Название: Re: Набор ssget
Отправлено: Alex.gomel от 29-06-2019, 09:46:19
После выбора рамкой, в таком случае приходиться дополнительно сортировать примитивы по координатам точки вставки например (или координатам середины диагонали контейнера, или центроида). Сортировку можно организовать любую - слева направо, сверху вниз, по часовой стрелке и т.д.
Название: Re: Набор ssget
Отправлено: Матвей от 01-07-2019, 11:04:03
Спасибо за идею. Получилось так:

Код - Auto/Visual Lisp [Выбрать]
  1. (setq SSText (ssget '((0 . "TEXT,MTEXT"))))
  2. (setq i 0)
  3. (repeat (sslength SSText)
  4.   (setq string
  5.      (append
  6.        string
  7.        (list
  8.          (append
  9.            (list (cdr (assoc 10 (entget (ssname SSText i))))
  10.              (vlax-get (vlax-ename->vla-object (ssname SSText i))
  11.                    'TextString
  12.              )
  13.            )
  14.          )
  15.        )
  16.      )
  17.   )
  18.   (setq i (1+ i))
  19. )
  20.  
  21. (setq string (vl-sort string
  22.               '(lambda (a b)
  23.              (if (= (cadar a) (cadar b))
  24.                (< (caar a) (caar b))
  25.                (> (cadar a) (cadar b))
  26.              )
  27.                )
  28.          )
  29. )
  30.  
  31. (setq i 0)
  32. (repeat (sslength SSText)
  33.   (setq SortString (append SortString (cdr (nth i string))))
  34.   (setq i (1+ i))
  35. )
Название: Re: Набор ssget
Отправлено: Алексей Кулик от 01-07-2019, 11:41:35
ИМХО можно покороче. Фильтрацию не трогаю:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun t1 (/ selset)
  2.   (if (= (type (setq selset (vl-catch-all-apply (function (lambda () (ssget '((0 . "*TEXT"))))))))
  3.          'pickset
  4.          ) ;_ end of =
  5.     (mapcar (function
  6.               (lambda (x)
  7.                 (setq x (vlax-ename->vla-object x))
  8.                 (list (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint x))) (vla-get-textstring x))
  9.                 ) ;_ end of lambda
  10.               ) ;_ end of function
  11.             ((lambda (/ tab item)
  12.                (repeat (setq tab  nil
  13.                              item (sslength selset)
  14.                              ) ;_ end setq
  15.                  (setq tab (cons (ssname selset (setq item (1- item))) tab))
  16.                  ) ;_ end of repeat
  17.                ) ;_ end of lambda
  18.              )
  19.             ) ;_ end of mapcar
  20.     ) ;_ end of if
  21.   ) ;_ end of defun
  22.