Тема: Подсчет количества блоков в чертеже

Люди помогите!
Необходима программа считающая количество вставок блока определенного имени в modelspace

Re: Подсчет количества блоков в чертеже

вообще есть в 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

Re: Подсчет количества блоков в чертеже

Вот простенькая функция. Тыкаете в блок и она выводит, его название и количество одноименных блоков на чертеже.

(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

Можно в принципе немного доработать и сделать чтобы выдавала полный список блоков с их количеством.

Re: Подсчет количества блоков в чертеже

Чуть подправил. Так лучше...

(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

Re: Подсчет количества блоков в чертеже

Есть щтатное средство. Quick select на правой кнопке мыши. Выбери Блок по параметру  Name Пoлучишь количество вставок

Re: Подсчет количества блоков в чертеже

> Но
времени это занимает намного больше. Тем более что при выборе опции Block Reference названия блоков к сожалению не появляются в выпадающем меню и их надо набирать вручную...

Re: Подсчет количества блоков в чертеже

Зачем набивать имя блока? Вызови  List и скопируй. Другое штатное средство, покороче, команда Blockreplace. Замени свой блок на любой из списка, прочитай результат и сделай  Undo. А то можно подумать, что без Лиспа автокад беспомощный.

Re: Подсчет количества блоков в чертеже

Как то видел программку, которая выводит количество всех вхождений каждого блокоа в чертеж, но не смог сразу найти. Написал свой вариант:

(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") надо убрать.

Re: Подсчет количества блоков в чертеже

Мдя.. Маленькое ограничение: имя блока НЕ должно содержать Space

Re: Подсчет количества блоков в чертеже

А я, тут, застрял между Vova и Fantomas... beee   Неудобно, как-то... wink
В Acad`е довольно давно, живет Filter, там есть и Выбор блоков из списка(по Fantomas`у), и жизнь без Лисба (по Vova)...
Довольно крутой, продвинутый инструмент...
А QuickSelect, мне тоже чего-то не запал, хотя иногда тоже супер... В общем, смотря какая задача...

Re: Подсчет количества блоков в чертеже

> Jura
Filter безусловно хорош, но опять же надо настраивать, а для постоянных задач, типа подсчета количества розеток, выключателей или еще какой ерунды на поэтажном плане это нормальный вариант.
Я сам расширенные данные вношу, и получаю практически сразу почти полную смету по оборудованию и спецификацию. Но когда то такой ерундой пользовался, уже забыл где лежит, пришлось переписать.

> VK
Есть и такая штука, правда там столько "мусора" вылезает, что заколебешься оттуда "полезные" блоки выскребать. Если чертежи относительно "чистые", типа машиностроительных, то еще ничего. А если архтектурные, которые перед этим прошли через 10 субподрядчиков, то с блоками "каша", и Purge не поможет чтобы разобраться. Так что по мне лучше в "свое" тыкнуть и чтобы посчитало...

Re: Подсчет количества блоков в чертеже

> Fantmas
Sorry, к счастью, я далек от архитектуры smile

Re: Подсчет количества блоков в чертеже

Как то писал, пару утилит для подсчёта слов и букв в чертеже (кто то просил - не помню уже, кто). Переделал для подсчёта вставок блоков. Взять можно здесь:
ftp://212.49.104.18/Pub/Developing/Auto … lCount.zip (8.3kb)
исходники прилагаются, но тем, кто не собирается модифицировать/оптимизировать (там есть что - часть функций очень старые), рекомендую пользоваться компилированым VLX'ом. Недоделаны некоторые мелочи, например, нет указания на то, что первоначальный выбор может быть пустым. О замеченных ошибках сообщайте или сами правьте.
Примечания: Версия - бета - за последствия не отвечаю!
FTP - "качалки" и "сильно умные" браузеры не поддерживает.

Re: Подсчет количества блоков в чертеже

как то писал, может подойдёт:

(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

Re: Подсчет количества блоков в чертеже

> 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

Re: Подсчет количества блоков в чертеже

Совсем забыл - на FTP лучше входить не по ссылке на файл, а по ссылке на директорию, а там уже выбитать файл и копировать его в локальную папку (политики безопасности). Т.е., входить по ссылке: ftp://212.49.104.18/Pub/Developing/AutoLisp/

Re: Подсчет количества блоков в чертеже

Cпасибо (отдельное FANTMAS!)
Отлично работает програмулька. Оформил дополнение выдает почти полную спецификацию! Сэкономил кучу времени. В области архитектуры всякие фильтры становятся ужасно скучными после 100 ой одноименной операции.
Для (Vova) всякие лишние движения убивают дико время, однако спасибо и Вам за совет, но действительно есть штатные средства, которые не столь мобильны и быстры, особенно в очень загруженных (архитектурных чертежах)

Re: Подсчет количества блоков в чертеже

Что я не понял как работать с этой программой...
какая командо то ?

Re: Подсчет количества блоков в чертеже

Ну ладно, ещо одно штатное средство из экспрессов BCOUNT

Re: Подсчет количества блоков в чертеже

> PEAHUMATOP
О какой из программ идёт речь? Здесь опубликовано 3 программы и одна ссылка (скорее - утилиты). Если вопрос про ту, что по ссылке, то при загрузке она пишет:
Type: "PL:BlCount" in the command string for begining.
что означает:
Набери: "PL:BlCount" в командной строке для начала.
естественно, без кавычек.

Re: Подсчет количества блоков в чертеже

Речь идет о последней программе в топик с полным контекстом.

Re: Подсчет количества блоков в чертеже

команда BCOUNT если установлен Express Tools

Re: Подсчет количества блоков в чертеже

Все эти программки - детство. Решать серьезные задачи никак не смогут.

Re: Подсчет количества блоков в чертеже

> 3dcad
и в этом месте поставь ссылку на свою магическую спецификацию! Чтобы все поняли что ты очень крут...

Re: Подсчет количества блоков в чертеже

Ну, ты же у меня "умничка".