Schöck
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Как добавить в набор динамические блоки с определенными именем?

Autolisp. Как добавить в набор динамические блоки с определенными именем?

Ответ
Поиск в этой теме
Непрочитано 26.11.2015, 06:08 #1
Autolisp. Как добавить в набор динамические блоки с определенными именем?
vladimirr_b
 
Регистрация: 24.01.2012
Сообщений: 83

В чертеже есть динамический блок с именем "ramka_din". Когда этот блок был не динамическим, то добавление всех этих блоков в набор осуществлял следующим образом:

Код:
[Выделить все]
 (setq sdel (ssget "X" '((2 . "ramka_din") ))) 
После добавления в блок "ramka_din" параметра видимости, код перестал добавлять объекты в набор, так как в поле с dxf-кодом 2 стоит имя "*U75", а не "ramka_din" как раньше.
Как теперь добавлять в набор все блоки с именем "ramka_din"?
Просмотров: 3286
 
Непрочитано 26.11.2015, 06:26
1 | 1 #2
AndruxaZ


 
Регистрация: 07.05.2013
Сообщений: 45


Посмотри здесь http://www.lee-mac.com/effectivename.html
Ищи также темы "эффективное имя блока"

----- добавлено через ~46 мин. -----
Нашёл у себя вот такой код. Правда длинный
Код:
[Выделить все]
 (defun c:test ( / blk )
    (setq blk "Имя блока";Вписать нужное имя блока
	   )
    (if (tblsearch "block" blk)
        (sssetfirst nil (getblockselection blk))
        (princ (strcat "\n" blk " doesn't exist."))
    )
    (princ)
)

(defun getblockselection ( blk )
    (ssget "_X"
        (list '(0 . "INSERT")
            (cons 2
                (apply 'strcat
                    (cons blk
                        (mapcar '(lambda ( x ) (strcat ",`" x))
                            (LM:getanonymousreferences blk)
                        )
                    )
                )
            )
        )
    )
)

(defun LM:getanonymousreferences ( blk / ano def lst rec ref )
    (setq blk (strcase blk))
    (while (setq def (tblnext "block" (null def)))
        (if
            (and (= 1 (logand 1 (cdr (assoc 70 def))))
                (setq rec
                    (entget
                        (cdr
                            (assoc 330
                                (entget
                                    (tblobjname "block"
                                        (setq ano (cdr (assoc 2 def)))
                                    )
                                )
                            )
                        )
                    )
                )
            )
            (while
                (and
                    (not (member ano lst))
                    (setq ref (assoc 331 rec))
                )
                (if
                    (and
                        (entget (cdr ref))
                        (= blk (strcase (LM:al-effectivename (cdr ref))))
                    )
                    (setq lst (cons ano lst))
                )
                (setq rec (cdr (member (assoc 331 rec) rec)))
            )
        )
    )
    (reverse lst)
) ; end of defun
                        
;; Effective Block Name  -  Lee Mac
;; ent - [ent] Block Reference entity

(defun LM:al-effectivename ( ent / blk rep )
    (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
        (if
            (and
                (setq rep
                    (cdadr
                        (assoc -3
                            (entget
                                (cdr
                                    (assoc 330
                                        (entget
                                            (tblobjname "block" blk)
                                        )
                                    )
                                )
                               '("AcDbBlockRepBTag")
                            )
                        )
                    )
                )
                (setq rep (handent (cdr (assoc 1005 rep))))
            )
            (setq blk (cdr (assoc 2 (entget rep))))
        )
    )
    blk
) ; end of defun
AndruxaZ вне форума  
 
Непрочитано 26.11.2015, 09:23
1 | 1 #3
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Нашёл у себя вот такой код. Правда длинный
Вот так покороче будет. Только на выходе будет список Vla указателей.
Код:
[Выделить все]
 (vl-remove-if-not
 '(lambda (l1)
   (= (vla-get-EffectiveName l1) "ramka_din")
  )
 (mapcar
  'vlax-ename->vla-object
  (mapcar
   'cadr
   (ssnamex
    (ssget "_X"
	   (list (cons 0 "INSERT")
		 (cons 2 "ramka_din,`*U*")
	   )
    )
   )
  )
 )
)
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 26.11.2015, 12:14
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


Цитата:
Сообщение от ProPeller Посмотреть сообщение
Вот так покороче будет.
Разве этот код не выберет все анонимные блоки? смысл же в том чтоб отфильтровать не нужное на этапе выбора, а не по факту...
gomer вне форума  
 
Непрочитано 26.11.2015, 12:19
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,115


vl-remove-if и отфильтует...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.02.2016, 19:16
#6
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,546


Подниму старую тему.
Есть ли решение для фильтрации набора по имени дин. блока "на ходу", во время его формирования?
Для обычных блоков было удобно использовать что-то вроде
Код:
[Выделить все]
(setq ss (ssget "_:E" '((0 . "INSERT") (2 . "блок____")))))
В этом случае блоки с определенным именем выбираются путем поочередного указания на каждый из них. При этом наглядно видно, какие блоки выбираются, и сколько их выбрано. Можно ли придумать что-то подобное для динамических блоков?
Приведенные выше коды хорошо справляются с уже сформированными наборами, но формировать их надо "навалом", а фильтрация - после.

Есть идея получить "статические" имена всех экземпляров динблока типа (2 . "*U777") и сформировать на их основе фильтр для ssget с помощью <OR .... OR>, но это кажется извратом. Нет ли более вменяемого решения?
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 22.02.2016 в 19:27.
kp+ вне форума  
 
Непрочитано 22.02.2016, 19:17
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,115


И не обеспечат. Имена вхождений дин.блоков - анонимные блоки, и не факт что в набор будут попадать только нужные. Намного проще сначала запросить блоки, а потом отфильтровать нужные.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.02.2016, 21:42
1 | #8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,888
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от kp+ Посмотреть сообщение
Есть идея получить "статические" имена всех экземпляров динблока типа (2 . "*U777")
Как вариант Lisp. Выбор динамических блоков с атрибутам скопом. и Get Anonymous References
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.02.2016, 22:03
1 | #9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,115


Offtop: VVA, подобный номер прокатывает только если не учитывать дин.блоки, входящие в другие блоки (насколько я помню; сейчас проверить нет никакой возможности). Если вложенные блоки не требуются, то можно и указанными способами воспользоваться.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.02.2016, 10:08
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,888
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Кулик Алексей aka kpblc, Вполне возможно. Просто вспомнил, что "Эту булочку я уже где-то видел" (с)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.02.2016, 13:53
#11
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,546


Спасибо за разъяснения и ссылки. Вложенные блоки не требуются. Буду разбираться
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Как добавить в набор динамические блоки с определенными именем?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, существуют ли практические руководства по Lisp? vn LISP 261 26.11.2015 13:27
Помогите найти ошибку с Lisp "автонумерацией листов" tujn08 LISP 14 12.05.2015 17:20
Динамические блоки при копировании перестают быть динамическими. *Voland* Динамические блоки 11 04.07.2012 10:51
Глюк. Динамические блоки становится статическим! b_anton Динамические блоки 10 24.06.2008 16:27
HELP!!! Динамические блоки? Bdod Динамические блоки 13 07.04.2007 08:59