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

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

Применение готового lisp-а для динамических блоков

Ответ
Поиск в этой теме
Непрочитано 13.09.2016, 13:29 #1
Применение готового lisp-а для динамических блоков
Denver-22
 
Казань
Регистрация: 07.04.2010
Сообщений: 26

Активно применяется давно известный лисп - pickblocknum - для нумерации атрибутов внутри блока с ручным выбором последовательности нумерации, назначением префикса и суффикса.
Решил применить его к динамическому блоку с атрибутом. И облом.
Большая просьба помочь в корректировке лиспа, не меняя основную функцию лиспа (т.к. ВСЁ в нем устраивает):
- либо сделать универсальный лисп для выбора обычных и динамических блоков
- если первый вариант невозможен или сложен, то сделать отдельный лисп для выбора только динамических блоков.
Код:
[Выделить все]
 
(defun c:pbn (/ name tag pref suff num ss el)
  (while (= (setq name (getstring "\nИмя блока: ")) ""))
  (while (= (setq tag (getstring "\nТег: ")) ""))
  (setq tag (strcase tag))
  (setq pref (getstring "\nПрефикс: "))
  (setq suff (getstring "\nСуффикс: "))

  (if (null (setq num (getint "\nСтартовый номер: ")))
    (setq num 1)
  ) ;_  if

  (princ "\nБлоки > ")
  (if (setq ss (ssget (list '(0 . "INSERT") '(410 . "Model") (cons 2 name))))
    (while (> (sslength ss) 0)
      (setq ss (ssdel (setq el (ssname ss 0)) ss))
      ;; поиск нужного атрибута
      (while (and (/= (cdr (assoc 0 (entget el))) "SEQEND")
                  (/= (cdr (assoc 2 (entget el))) tag)
             ) ;_  or
        (setq el (entnext el))
      ) ;_  while
      ;;  если атрибут найден
      (if (= (cdr (assoc 2 (entget el))) tag)
        (progn
          (vla-put-textstring (vlax-ename->vla-object el) (strcat pref (rtos num 2 0) suff))
          (setq num (1+ num)) ;_ приращение номера
        ) ;_  progn
      ) ;_  if
    ) ;_  while
  ) ;_  if
  (princ)
) ;_  defun
(vl-load-com)

;;;(c:pickblocknum) ;_ автозапуск
Просмотров: 1129
 
Непрочитано 13.09.2016, 13:51
#2
Кулик Алексей aka kpblc
Moderator

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


Динамические блоки по имени не фильтруются. Вместо (setq ss (ssget (list '(0 . "INSERT") '(410 . "Model") (cons 2 name)))) придется использовать (setq ss (ssget (list '(0 . "INSERT") '(410 . "Model")))) и потом убирать объекты, у которых EffectiveName не совпадает со значением переменной name.

----- добавлено через 48 сек. -----
Второй вариант - искать на форуме ссылки по словам "набор динамических блоков", "выбор динамических блоков" и т.п.
__________________

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

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Второй вариант - искать на форуме ссылки по словам "набор динамических блоков", "выбор динамических блоков" и т.п.
Autolisp. Как добавить в набор динамические блоки с определенными именем?

----- добавлено через ~14 мин. -----
Цитата:
Сообщение от Denver-22 Посмотреть сообщение
сделать универсальный лисп для выбора обычных и динамических блоков
Код:
[Выделить все]
 
(defun c:pbn (/ name tag pref suff num ss el)
;;; Аналог pickblocknum для выбора обычных и динамических блоков
  (while (= (setq name (getstring "\nИмя блока: ")) ""))
  (while (= (setq tag (getstring "\nТег: ")) ""))
  (setq tag (strcase tag))
  (setq pref (getstring "\nПрефикс: "))
  (setq suff (getstring "\nСуффикс: "))

  (if (null (setq num (getint "\nСтартовый номер: ")))
    (setq num 1)
  ) ;_  if

  (princ "\nБлоки > ")
  (if
    (and
      (tblsearch "block" name)
      (setq ss (getblockselection name))
      )
    (while (> (sslength ss) 0)
      (setq ss (ssdel (setq el (ssname ss 0)) ss))
      ;; поиск нужного атрибута
      (while (and (/= (cdr (assoc 0 (entget el))) "SEQEND")
                  (/= (cdr (assoc 2 (entget el))) tag)
             ) ;_  or
        (setq el (entnext el))
      ) ;_  while
      ;;  если атрибут найден
      (if (= (cdr (assoc 2 (entget el))) tag)
        (progn
          (vla-put-textstring (vlax-ename->vla-object el) (strcat pref (rtos num 2 0) suff))
          (setq num (1+ num)) ;_ приращение номера
        ) ;_  progn
      ) ;_  if
    ) ;_  while
  ) ;_  if
  (princ)
) ;_  defun
(defun getblockselection ( blk )
    (ssget 
        (list '(0 . "INSERT")
	      '(410 . "Model")
            (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
(vl-load-com)
;;;(c:pickblocknum) ;_ автозапуск
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 14.09.2016 в 20:16. Причина: примечание
VVA вне форума  
 
Автор темы   Непрочитано 13.09.2016, 22:36
#4
Denver-22


 
Регистрация: 07.04.2010
Казань
Сообщений: 26


VVA, спасибо, но ваш вариант пронумеровывает все блоки в файле. А мой - требует выбора блоков и нумерует их в порядке выбора.
Кулик Алексей aka kpblc, сделал замену предложенной вами строкой. И - О ЧУДО!!! Пока всё работает. Огромное Вам спасибо!
Denver-22 вне форума  
 
Непрочитано 14.09.2016, 20:18
#5
VVA

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


Цитата:
Сообщение от Denver-22 Посмотреть сообщение
ваш вариант пронумеровывает все блоки в файле
обновил #3
Цитата:
Сообщение от Denver-22 Посмотреть сообщение
сделал замену предложенной вами строкой. И - О ЧУДО!!! Пока всё работает.
В этом случае запрос имени блока - лишнее
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 15.09.2016, 10:45
#6
Denver-22


 
Регистрация: 07.04.2010
Казань
Сообщений: 26


VVA, Теперь ваш код также отрабатывает как я хотел!
Т.к. в лиспе не разбираюсь, можете подсказать, чем принципиально отличается ваш вариант от моего изначального с модификацией от (setq ss (ssget (list '(0 . "INSERT") '(410 . "Model"))))? Так как этот модифицированный вариант работает и с обычными блоками, т.е. стал универсальным.
Denver-22 вне форума  
 
Непрочитано 15.09.2016, 15:32
#7
VVA

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


В моем варианте идет фильтрация по имени блока на этапе выбора объектов (используется имя блока, введенное на запрос "Имя блока"), как было и в прежнем варианте. Т.е блок с именем, отличным от указанного не будет выбран (будб он обычный или динамический)
Добавились некоторые нюансы обработки динамических блоков. Подробнее объяснять не буду
Цитата:
Сообщение от Denver-22 Посмотреть сообщение
Т.к. в лиспе не разбираюсь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Применение готового lisp-а для динамических блоков

Tekla Structures. Видеокурс. ЖЕЛЕЗОБЕТОН
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Руководство по созданию динамических блоков tanushka_ch Динамические блоки 20 25.11.2015 20:46
Сквозная нумерация динамических блоков zenon Программирование 212 02.09.2015 05:29
Можно ли из Excel импортировать свойства(значения параметров) динамических блоков? Мих Программирование 7 14.04.2012 21:41
Проблема вставки Динамических блоков Владимир М Программирование 11 12.09.2007 15:42