Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

Подсчет блоков в AutoCad2006

Ответ
Поиск в этой теме
Непрочитано 17.11.2006, 11:13
Подсчет блоков в AutoCad2006
Natan
 
Самара
Регистрация: 16.11.2006
Сообщений: 3

Подскажите возможно ли как нибудь подсчитать количество блоков используемых на чертеже в система Автокад2006. Если да то как это можно сделать? Очень былобы удобно при составлении спецификации. :idea:
Просмотров: 19662
 
Непрочитано 16.07.2007, 15:21
#21
Ander822


 
Регистрация: 16.07.2007
Minsk
Сообщений: 84


Цитата:
Сообщение от Кулик Алексей aka kpblc
Так... А вот теперь вопросы
- учитывать ли "родителя"?
- что делать с дин.блоками?
- что делаем с внешними ссылками?

Раодителей можно учесть отдельным пунктом. А что касаетя дин. блоков, то неплохо было бы считать кол-во подблоков на текущий момент. Внешние ссылки пока трогать не будем.
Ander822 вне форума  
 
Непрочитано 16.07.2007, 16:26
#22
Ander822


 
Регистрация: 16.07.2007
Minsk
Сообщений: 84


Мне лично понравилось, как работает извлечение атрибутов, но плохо что нельзя выяснить какие подблоки входят в блок.
Ander822 вне форума  
 
Непрочитано 16.07.2007, 16:28
#23
Кулик Алексей aka kpblc
Moderator

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


Не думаю, что такое надо. Если считаются блоки, так и считаться должны именно они. Другой вопрос с внешними ссылками и блоками копирования-вставки, но их и "отследить" проще.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.09.2019, 21:11
#24
allar8


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(defun c:blockcount (/ adoc selset res name)
(vl-load-com)
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(if (setq selset (ssget '((0 . "INSERT"))))
(progn
(foreach blk
(mapcar 'vlax-ename->vla-object
(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
) ;_ end of mapcar
(setq name (cond
((and (vlax-property-available-p blk 'isdynamicblock)
(= (vla-get-isdynamicblock blk) :vlax-true)
) ;_ end of and
(vla-get-effectivename blk)
)
(t (vla-get-name blk))
) ;_ end of cond
) ;_ end of setq
(if (member name (mapcar 'car res))
(setq res (subst (cons name (1+ (cdr (assoc name res))))
(assoc name res)
res
) ;_ end of subst
) ;_ end of setq
(setq res (append res (list (cons name 1))))
) ;_ end of if
) ;_ end of foreach
(princ "\nИмя\tКоличество")
(foreach item res
(princ (strcat "\n" (car item) "\t" (vl-princ-to-string (cdr item))))
) ;_ end of foreach
(princ)
) ;_ end of progn
) ;_ end of if
) ;_ end of defun
А можно как нить результат программы не выводить в командную строку, а загнать полученное значение кол-ва блоков в пользовательскую переменную например user1,
по аналогии как это сделано в строчке (setvar "user1" (length (layoutlist))) для записи кол-ва лайотов в переменную user1
allar8 вне форума  
 
Непрочитано 29.09.2019, 21:13
#25
Кулик Алексей aka kpblc
Moderator

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


А на фига, прошу прощения? Какова конечная цель?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.09.2019, 21:17
#26
allar8


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А на фига, прошу прощения? Какова конечная цель?
в рамке в графе "листов" хочу иметь автоматизированное кол-во форматок в модели). Форматка - это дин блок. Подсчитав их кол-во с помощью вашей программы и загнав в переменную user1 можно получить автоматизированное поле кол-ва рамок в модели,
Все остальное для автоматизации я знаю как сделать, осталось только записать кол-во рамок в переменную user1

Последний раз редактировалось allar8, 29.09.2019 в 21:23.
allar8 вне форума  
 
Непрочитано 29.09.2019, 23:01
1 | #27
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


код
Цитата:
Сообщение от allar8 Посмотреть сообщение
(princ (strcat "\n" (car item) "\t" (vl-princ-to-string (cdr item))))
выводит в комстроку имя блока (car item) и количество в строковом виде (vl-princ-to-string (cdr item)). Вместо вывода в комстроку проверяйте имя блока через if и если это динблок рамки - заносите в "User1" количество.
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 07:06
#28
allar8


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
выводит в комстроку имя блока (car item) и количество в строковом виде (vl-princ-to-string (cdr item)). Вместо вывода в комстроку проверяйте имя блока через if и если это динблок рамки - заносите в "User1" количество.
не понял зачем проверять какое то условие, если уже есть результат. Нужно только результат загнать в user1

----- добавлено через ~1 ч. -----
Цитата:
Сообщение от allar8 Посмотреть сообщение
Нужно только результат загнать в user1
Ура получилось (setvar "useri1" (cdr item))
Всем спасибо!
allar8 вне форума  
 
Непрочитано 30.09.2019, 09:35
#29
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Цитата:
Сообщение от allar8 Посмотреть сообщение
не понял зачем проверять какое то условие, если уже есть результат. Нужно только результат загнать в user1
по коду Алексея не вижу, чтобы там производилась какая то селекция блоков по имени. Или в пространстве модели кроме
Цитата:
Сообщение от allar8 Посмотреть сообщение
автоматизированное кол-во форматок в модели). Форматка - это дин блок.
больше вставок блоков нет?
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 09:38
#30
allar8


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
по коду Алексея не вижу, чтобы там производилась какая то селекция блоков по имени. Или в пространстве модели кроме
Это я знаю как сделать
Нужен был только загон в переменную user1
Правда для полной автоматизации не хватает еще одного штриха
как выбрать все объекты лиспом?
(command "_AI_SELALL") - не работает
allar8 вне форума  
 
Непрочитано 30.09.2019, 09:40
1 | #31
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,337


_SELECT _all
Хмурый вне форума  
 
Непрочитано 30.09.2019, 09:48
1 | #32
allar8


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


Цитата:
Сообщение от Хмурый Посмотреть сообщение
_SELECT _all
работает, но после выполнения (command "_SELECT" "_all") диалог не прекращается. Как прекратить диалог и оставить выбранные объекты?

Последний раз редактировалось allar8, 30.09.2019 в 10:14.
allar8 вне форума  
 
Непрочитано 30.09.2019, 10:13
#33
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Цитата:
Сообщение от allar8 Посмотреть сообщение
при открытии файла запускать этот лисп
почему только при открытии? Пользователь добавил/удалил форматки и закрыл файл - и вся автоматизация счетчика лесом, информация в useri некорректна, а если будет открыта на компе без данной надстройки - то и не обновиться..
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 10:16
#34
allar8


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
почему только при открытии? Пользователь добавил/удалил форматки и закрыл файл - и вся автоматизация счетчика лесом, информация в useri некорректна, а если будет открыта на компе без данной надстройки - то и не обновиться..
Готовое решение опишу позже. Но сейчас остался штрих с выбором всего лиспом
(command "_SELECT" "_all") диалог не прекращается. Как прекратить диалог и оставить выбранные объекты?
allar8 вне форума  
 
Непрочитано 30.09.2019, 10:35
#35
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Цитата:
Сообщение от allar8 Посмотреть сообщение
(command "_SELECT" "_all") диалог не прекращается. Как прекратить диалог и оставить выбранные объекты?
что дальше будет делаться с этим выделением? Почему нельзя получить через ssget с соответствующим ключем?
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 10:53
#36
allar8


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
что дальше будет делаться с этим выделением?
дальше вот:
Код:
[Выделить все]
(defun mfunc(/ selset) (if (setq selset (ssget '((8 . "Формат")))) (sssetfirst selset selset)))
(mfunc)
(defun mfunc(/ selset) (if (setq selset (ssget '((0 . "Insert")))) (sssetfirst selset selset)))
(mfunc)
Т.е. из всего выбранного выбираю свои рамки без диалога
Потом модифицированный blockcount с вашей подсказкой для записи в переменную useri1

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Почему нельзя получить через ssget с соответствующим ключем?
Не знаю что это, т.к. опыта маловато. Если подскажете буду благодарен
allar8 вне форума  
 
Непрочитано 30.09.2019, 11:11
1 | #37
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Если были бы идеальные пользователи, которые на слое "Формат" размещали бы исключительно блоки форматок, то все ваши метания в одну строку кода умещаются)
Код:
[Выделить все]
 (setvar "useri1" (sslength (ssget "_X" '((0 . "INSERT") (8 . "Формат")))))
правда при отсутствии блоков форматов или слоя вылетит ошибка, так как ssget вернет nil. Поэтому в две строчки все таки придется с контролем на nil.

но поскольку идеальных пользователей не существует, то придется пройти по полученному набору вставок блоков
Код:
[Выделить все]
 (ssget "_X" '((0 . "INSERT") (8 . "Формат")))
и посчитать, сколько среди них динамических блоков с именем форматки.

Последний раз редактировалось Сергей812, 30.09.2019 в 11:17. Причина: орфография
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 11:17
#38
allar8


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
(setvar "useri1" (sslength (ssget "_X" '((0 . "INSERT") (8 . "Формат")))))
Супер, то что надо. Спасибо огромное!
Все элегантно и красиво! Вам респект!
allar8 вне форума  
 
Непрочитано 30.09.2019, 11:53
#39
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


Цитата:
Сообщение от allar8 Посмотреть сообщение
Все элегантно и красиво!
но неработоспособно в реальных условиях: на слое "Формат" проектировщик влепит левые блоки, перенесет вставки блоков форматок на другой слой (все чисто случайно, так как голова занята совершенно другими проблемами в данный момент). Работоспособно - получить вставки блоков без учета слоя:
Код:
[Выделить все]
 (ssget "_X" '((0 . "INSERT")))
и
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и посчитать, сколько среди них динамических блоков с именем форматки.
Сергей812 вне форума  
 
Непрочитано 30.09.2019, 12:00
#40
allar8


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
но неработоспособно в реальных условиях: на слое "Формат" проектировщик влепит левые блоки, перенесет вставки блоков форматок на другой слой (все чисто случайно, так как голова занята совершенно другими проблемами в данный момент)
Это согласен, но слой тут пришил из-за того что у дин блоков нужный dxf код имени блока не является таковым
(2 . "*U12")

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Работоспособно - получить вставки блоков без учета слоя:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и посчитать, сколько среди них динамических блоков с именем форматки.
По имени блока было бы ваще супер. Но как это сделать с дин блоком?
allar8 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Подсчет блоков в AutoCad2006

Размещение рекламы