Набор ssget

Автор Тема: Набор ssget  (Прочитано 899 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Набор ssget
« : 01-03-2018, 02:59:26 »
Выбираю все блоки:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ss_bl (ssget "_X" '((0 . "insert"))))
Как исключить добавление в набор ss_bl блоков, расположенных на отключенных, замороженных слоях?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 8807
  • Карма: 1091
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Набор ssget
« Ответ #1 : 01-03-2018, 10:10:05 »
Как исключить добавление в набор ss_bl блоков, расположенных на отключенных, замороженных слоях?
Нужно добавить в фильтр выбора только слои, которые включены и незаморожены, или наоборот в фильтре использовать отрицание  (-4 . "<NOT") (8 . "имя отключенного или замороженного слоя") (-4 . "NOT>") и добавлять только отключенные и замороженные слои.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Набор ssget
« Ответ #2 : 01-03-2018, 10:57:32 »
Нужно добавить в фильтр выбора только слои, которые включены и незаморожены, или наоборот в фильтре использовать отрицание  (-4 . "<NOT") (8 . "имя отключенного или замороженного слоя") (-4 . "NOT>") и добавлять только отключенные и замороженные слои.
Это понятно. Смысл моего вопроса в другом - может можно указать как-то, что в набор не включаются объекты отключенных  слоев. Как их программно "вычислить"? Какой у них признак?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 8807
  • Карма: 1091
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Набор ssget
« Ответ #3 : 01-03-2018, 11:03:43 »
может можно указать как-то, что в набор не включаются объекты отключенных  слоев.
Нельзя. Нет такого признака. Если бы было можно, то я бы так сразу и ответил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение 1958 01-03-2018, 17:03:19

Оффлайн Alex.gomel

  • ADN OPEN
  • Сообщений: 6
  • Карма: 1
Re: Набор ssget
« Ответ #4 : 01-03-2018, 13:46:59 »
А если подойти к решению задачи несколько иначе использовав ssget "_CP"? В качестве аргументов - координаты диагонали экрана после выполнения команды "zoom" "all".

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 8807
  • Карма: 1091
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Набор ssget
« Ответ #5 : 01-03-2018, 13:58:57 »
А если подойти к решению задачи несколько иначе использовав ssget "_CP"? В качестве аргументов - координаты диагонали экрана после выполнения команды "zoom" "all".
Теоретически можно. Практически не вижу смысла. Думаю, что отобрать выключенные/замороженные слои и добавить их в фильтр выбора будет быстрее, чем _ZOOM _ALL, который приводит к регенерации чертежа. Ну и для корректности после завершения программы вид нужно восстановить...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Набор ssget
« Ответ #6 : 01-03-2018, 16:04:02 »
А если подойти к решению задачи несколько иначе использовав ssget "_CP"? В качестве аргументов - координаты диагонали экрана после выполнения команды "zoom" "all".
Хороший вариант. Что-то я про него забыл. :)
Ну и для корректности после завершения программы вид нужно восстановить...
В принципе я и предполагал потом сделать зуммирование на все объекты (или почти на все). У меня задача: заменить одни блоки на другие, если сопоставления нет, то старые блоки остаются, но обводятся (помечаются) красным кружком для принятия дальнейшего решения по замене вручную наиболее подходящим по смыслу боком (элементом).

Оффлайн BearDyugin

  • ADN Club
  • ***
  • Сообщений: 240
  • Карма: 18
  • Геодезист
Re: Набор ssget
« Ответ #7 : 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. )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 8807
  • Карма: 1091
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Набор ssget
« Ответ #8 : 03-03-2018, 16:38:49 »
поэтому набросал этот вариант
Про заблокированные слои он не спрашивал...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyugin

  • ADN Club
  • ***
  • Сообщений: 240
  • Карма: 18
  • Геодезист
Re: Набор ssget
« Ответ #9 : 03-03-2018, 16:43:21 »
Про заблокированные слои он не спрашивал...
Да, но мне показалось что это он просто забыл или не подумал об этом, так оно как-то логичнее, хотя... ТС виднее, если что уберёт эту строчку.

Оффлайн 1958Автор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Набор ssget
« Ответ #10 : 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"))))

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 776
  • Карма: 122
Re: Набор ssget
« Ответ #11 : 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.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!