Тема: Подсчет количества блоков в чертеже
Люди помогите!
Необходима программа считающая количество вставок блока определенного имени в modelspace
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Autodesk → AutoCAD → Подсчет количества блоков в чертеже
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Люди помогите!
Необходима программа считающая количество вставок блока определенного имени в modelspace
вообще есть в Tools->Attribute Axtraction
но можно и на Бейсике(VBA), который а Автокаде
Выводит все имена и количество блоков
Sub ShowBlockNumber()
Dim oBl As AcadBlock
For Each oBl In ThisDrawing.Blocks
Debug.Print oBl.Name, oBl.Count
Next
End Sub
конкретное имя блока->> надо форму, техстбокс для задания имени, его как параметр надо передать в подпрограмму - NameBlok
Sub blockNumber(ByVal NameBlok As String)
Dim i As Long, oBl As AcadBlock
For Each oBl In ThisDrawing.Blocks ' перебирает все блоки
If NameBlok = oBl.Name Then ' если имя совпало с заданным
Debug.Print oBl.Name, oBl.Count
End If
Next
End Sub
Вот простенькая функция. Тыкаете в блок и она выводит, его название и количество одноименных блоков на чертеже.
(defun c:bcount (/ dxfList blName Count) (setq dxfList(entget(car(entsel "*** Select sample block ")))) (terpri) (if(= "INSERT"(cdr(assoc 0 dxfList))) (progn (setq blName(cdr(assoc 2 dxfList)) Count(sslength(ssget "_X"(list(assoc 2 dxfList)))) ); end setq (princ(strcat "*** Block name: " blName "\n*** Blocks in drawing: " (itoa Count))) );end progn (princ "*** Nothing blocks selected! ") ); end if (princ) ); end bstat
Можно в принципе немного доработать и сделать чтобы выдавала полный список блоков с их количеством.
Чуть подправил. Так лучше...
(defun c:bcount (/ curEnt dxfList blName Count) (if (setq curEnt(entsel "*** Select sample block ")) (progn (setq dxfList(entget(car curEnt))) (terpri) (if(= "INSERT"(cdr(assoc 0 dxfList))) (progn (setq blName(cdr(assoc 2 dxfList)) Count(sslength(ssget "_X" (list(assoc 2 dxfList)))) ); end setq (princ(strcat "*** Block name: " blName "\n*** Blocks in drawing: "(itoa Count))) );end progn (princ "\n*** This don't block!\n ") ); end if ); end progn (princ "\n*** Nothing selected!\n ") ); end if (princ) ); end bstat
Есть щтатное средство. Quick select на правой кнопке мыши. Выбери Блок по параметру Name Пoлучишь количество вставок
> Но
времени это занимает намного больше. Тем более что при выборе опции Block Reference названия блоков к сожалению не появляются в выпадающем меню и их надо набирать вручную...
Зачем набивать имя блока? Вызови List и скопируй. Другое штатное средство, покороче, команда Blockreplace. Замени свой блок на любой из списка, прочитай результат и сделай Undo. А то можно подумать, что без Лиспа автокад беспомощный.
Как то видел программку, которая выводит количество всех вхождений каждого блокоа в чертеж, но не смог сразу найти. Написал свой вариант:
(defun block_number (/ ss bname) (princ "\nБлоки - Вхождения\n") (vlax-for block (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (setq bname (vla-get-name block)) (if (wcmatch bname "~*Space*") (princ (strcat bname " - " (if (setq ss (ssget "_X" (list '(0 . "insert") (cons 2 bname) '(410 . "Model")))) (rtos (sslength ss) 2 0) "0" ) ;_ if "\n" ) ;_ strcat ) ;_ princ ) ;_ if ) ;_ vlax-for (princ) ) ;_ defun (block_number) ;_ автозапуск
Если надо чтоб считала не только в модели - то '(410 . "Model") надо убрать.
Мдя.. Маленькое ограничение: имя блока НЕ должно содержать Space
А я, тут, застрял между Vova и Fantomas... Неудобно, как-то...
В Acad`е довольно давно, живет Filter, там есть и Выбор блоков из списка(по Fantomas`у), и жизнь без Лисба (по Vova)...
Довольно крутой, продвинутый инструмент...
А QuickSelect, мне тоже чего-то не запал, хотя иногда тоже супер... В общем, смотря какая задача...
> Jura
Filter безусловно хорош, но опять же надо настраивать, а для постоянных задач, типа подсчета количества розеток, выключателей или еще какой ерунды на поэтажном плане это нормальный вариант.
Я сам расширенные данные вношу, и получаю практически сразу почти полную смету по оборудованию и спецификацию. Но когда то такой ерундой пользовался, уже забыл где лежит, пришлось переписать.
> VK
Есть и такая штука, правда там столько "мусора" вылезает, что заколебешься оттуда "полезные" блоки выскребать. Если чертежи относительно "чистые", типа машиностроительных, то еще ничего. А если архтектурные, которые перед этим прошли через 10 субподрядчиков, то с блоками "каша", и Purge не поможет чтобы разобраться. Так что по мне лучше в "свое" тыкнуть и чтобы посчитало...
> Fantmas
Sorry, к счастью, я далек от архитектуры
Как то писал, пару утилит для подсчёта слов и букв в чертеже (кто то просил - не помню уже, кто). Переделал для подсчёта вставок блоков. Взять можно здесь:
ftp://212.49.104.18/Pub/Developing/Auto … lCount.zip (8.3kb)
исходники прилагаются, но тем, кто не собирается модифицировать/оптимизировать (там есть что - часть функций очень старые), рекомендую пользоваться компилированым VLX'ом. Недоделаны некоторые мелочи, например, нет указания на то, что первоначальный выбор может быть пустым. О замеченных ошибках сообщайте или сами правьте.
Примечания: Версия - бета - за последствия не отвечаю!
FTP - "качалки" и "сильно умные" браузеры не поддерживает.
как то писал, может подойдёт:
(defun C:BLCOUNT ( / FILEPATH FILE_NAME INSLIST INSNAMES INSS LEN OUTPUT) (if (setq INSS (ssget '((0 . "INSERT")))) (progn (setq INSLIST (vl-remove-if-not 'atom (mapcar 'cadr (ssnamex (ssget '((0 . "INSERT"))))))) (setq INSNAMES (vl-sort (mapcar '(lambda (X) (cdr (assoc 2 (entget X)))) INSLIST) '<)) (setq LEN (length INSNAMES)) (while INSNAMES (setq OUTPUT (cons (cons (car INSNAMES) (- LEN (setq LEN (length (setq INSNAMES (vl-remove (car INSNAMES) INSNAMES)))))) OUTPUT) ) ;_ end of setq ) ;_ end of while (setq OUTPUT (reverse OUTPUT)) (if (setq FILEPATH (getfiled "Save Text File As" (strcat (getvar "dwgprefix") (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4)) ".txt") "txt" 33 ) ;_ end of getfiled ) ;_ end of setq (if (setq FILE_NAME (open FILEPATH "w")) (progn (mapcar '(lambda (X) (write-line (strcat (car X) " " (itoa (cdr X))) FILE_NAME)) OUTPUT) (close FILE_NAME) (startapp "NOTEPAD" FILEPATH) ) ;_ end of progn (vlax-invoke-method (vlax-get-or-create-object "WScript.Shell") "Popup" (strcat "File: [" FILEPATH "] is busy!") 0 "Warning" 16) ) ;_ end of if ) ;_ end of if ) ;_ end of progn ) ;_ end of if (princ) ) ;_ end of defun
> DMS
положил покуроченный вариант :)
надо так:
(defun C:BLCOUNT ( / FILEPATH FILE_NAME INSLIST INSNAMES INSS LEN OUTPUT) (if (setq INSS (ssget '((0 . "INSERT")))) (progn (setq INSLIST (vl-remove-if-not 'atom (mapcar 'cadr (ssnamex INSS)))) (setq INSNAMES (vl-sort (mapcar '(lambda (X) (cdr (assoc 2 (entget X)))) INSLIST) '<)) (setq LEN (length INSNAMES)) (while INSNAMES (setq OUTPUT (cons (cons (car INSNAMES) (- LEN (setq LEN (length (setq INSNAMES (vl-remove (car INSNAMES) INSNAMES)))))) OUTPUT) ) ;_ end of setq ) ;_ end of while (setq OUTPUT (reverse OUTPUT)) (if (setq FILEPATH (getfiled "Save Text File As" (strcat (getvar "dwgprefix") (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4)) ".txt") "txt" 33 ) ;_ end of getfiled ) ;_ end of setq (if (setq FILE_NAME (open FILEPATH "w")) (progn (mapcar '(lambda (X) (write-line (strcat (car X) " " (itoa (cdr X))) FILE_NAME)) OUTPUT) (close FILE_NAME) (startapp "NOTEPAD" FILEPATH) ) ;_ end of progn (vlax-invoke-method (vlax-get-or-create-object "WScript.Shell") "Popup" (strcat "File: [" FILEPATH "] is busy!") 0 "Warning" 16) ) ;_ end of if ) ;_ end of if ) ;_ end of progn ) ;_ end of if (princ) ) ;_ end of defun
Совсем забыл - на FTP лучше входить не по ссылке на файл, а по ссылке на директорию, а там уже выбитать файл и копировать его в локальную папку (политики безопасности). Т.е., входить по ссылке: ftp://212.49.104.18/Pub/Developing/AutoLisp/
Cпасибо (отдельное FANTMAS!)
Отлично работает програмулька. Оформил дополнение выдает почти полную спецификацию! Сэкономил кучу времени. В области архитектуры всякие фильтры становятся ужасно скучными после 100 ой одноименной операции.
Для (Vova) всякие лишние движения убивают дико время, однако спасибо и Вам за совет, но действительно есть штатные средства, которые не столь мобильны и быстры, особенно в очень загруженных (архитектурных чертежах)
Что я не понял как работать с этой программой...
какая командо то ?
Ну ладно, ещо одно штатное средство из экспрессов BCOUNT
> PEAHUMATOP
О какой из программ идёт речь? Здесь опубликовано 3 программы и одна ссылка (скорее - утилиты). Если вопрос про ту, что по ссылке, то при загрузке она пишет:
Type: "PL:BlCount" in the command string for begining.
что означает:
Набери: "PL:BlCount" в командной строке для начала.
естественно, без кавычек.
Речь идет о последней программе в топик с полным контекстом.
команда BCOUNT если установлен Express Tools
Все эти программки - детство. Решать серьезные задачи никак не смогут.
> 3dcad
и в этом месте поставь ссылку на свою магическую спецификацию! Чтобы все поняли что ты очень крут...
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Autodesk → AutoCAD → Подсчет количества блоков в чертеже
Форум работает на PunBB, при поддержке Informer Technologies, Inc