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

> 3dcad
Я не у тебя умничка - я сам по себе.
А теперь вопроса на форуме, почему бы не воспользоваться лиспом написанным специально для нас товарищем Биллом Крамером в 1994 году, она в текстовое окно пишит все вставленные блоки и сколько раз они вставленны, считаются также блоки вложенные до бесконечности в другие - другими словами выполняет то, чем так гордиться товарищ 3dcad.
Вот линк:
http://xarch.tu-graz.ac.at/autocad/code … ounter.lsp

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

Для Умника:
" Гордиться" пишется: гордится (что делает?).
По поводу программы Крамера 1994г.
Воспользовался ссылкой. Скачал.  Протестировал. Вернее - до сих пор AutoCAD считает (уже 1 час 25 мин.). С одним (10-ю) многовложенными блоками - справился. А вот 3-х секционный 17-ти этажный дом с радиаторами, обвязкой - еще считает.
Далее: ну и что делать с тем, что он выдает?
1) Вручную создавать спецификацию?
2) Вручную подписывать выносками в соответствии со спецификацией элементы?
3) Вручную экспортировать в Excel?
Ну про длины труб и проводов - естественно и речи не идет.
Может быть, может быть.....
Это еще не все: помимо ваших блоков в чертеже есть еще лишняя сотня, тысяча блоков (особенно невидимых, а так же если файл экспортировался из ArchiCAD или какой другой программы, ну и.т.д.). Их никак не отфильтровать, кроме как ручками. Так, что - удачи.
Да, и спасибо за указанный пример. Приятно было протестировать что-то другое.

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

> 3dcad
Извини, ну не силен в "чистаписании", что тут поделаешь!
Пишит же человек:

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

Вот она и считает - при этом совершенно бесплатно :)
А для коммерческой версии или для себя алгоритм нужно переработать.
Создать спецификацию или выноски - это дело техники, равно как и посчитать длину линий расположенных на разных слоях или с приатаченными дополнительными данными.
А что касается экселя - тут совсем просто - как указал товарищ Эдуард - все пишется в файл столбцы через табуляцию строки через \n и файлу дается расширение xls - и такой файл экселем открывается как родной - вот и весь экспорт!
что касается всяких хромых архикадов - тут уже задача очень специфическая, решать которую многим просто не нужно...

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

Для Умника:
"Дело техники" - для тех кто в этом соображает.
Ну и осталось самую малость - научить проектировщиков всем перечисленным вами действиям.
Я не спорю - изготовить автомобиль (да хоть кофемолку) своими руками можно, но людям удобнее, когда это можно купить, а то времени как-то не хватает на все и своими руками.

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

> 3dcad
Здается мне, что ты, товарищ 3dcad, лукавишь: создал значит я чертеж, вставил программно кучу блоков, и через минуту получил:
Block a10 is inserted 10000 times in the current drawing.
Block a9 is inserted 20000 times in the current drawing.
Block a8 is inserted 40000 times in the current drawing.
Block a7 is inserted 50000 times in the current drawing.
Block a6 is inserted 50000 times in the current drawing.
Block a5 is inserted 80000 times in the current drawing.
Block a4 is inserted 140000 times in the current drawing.
Block a3 is inserted 280000 times in the current drawing.
Block a2 is inserted 490000 times in the current drawing.
Block a1 is inserted 480000 times in the current drawing.
другими словами - более полутора миллионов блоков часть из них с глубиной вложения от 2 до 9, общий вес файла - более 5 мегов.
Ты случайно не на трофейной дедушкиной кампутере тестировал?

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

возможно разница не в количестве блоков, а в их разнообразии.... Может программе удобно считать количество вхождений блока, но не количесвто самих разных блоков. вот думаю если сделать а1...до а1000000 тогда и разговор будет другой.
P.s. это как вариант решения нестыковки ваших данных.

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

Могу выслать свой проектный файл. Евойный размер: 8.8 МБт. 108 тысяч примитивов.
Но, там не только блоки в голом виде, а вся архитектура так же.
Ну, а компьютер P-IV, 1ГБт оперативки, Radeon 9600.

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

Поправка-извинение: Сделал файлу Purge. После этого - программа посчитала, не зависла. Так, что по работоспособности программы - все нормально.

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

> 3dcad
после audit, полагаю, было бы тоже самое...

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

Тютюнников (2004-08-11 21:36:59) в первой строке указал команду, которую не заметили. Наберите Eattext и выводится вся инфа по блокам хоть своего, хоть другого гертежа

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

Почему VB дает бред в количестве
вхождений 1 пишет 125.
что делать???

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

Народ, мне нужна програмка чтобы подсчитывать кол-во слов в автокаде, подскажите где можно скачать
заранее благодарен

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

А что приведённое выше не годится? Вот еще вариант. Сначала выбираем примитивы на слоях где нужно считать блоки (просто для выбора слоёв), потом выбираем рамочкой область где нужно считать и программа выводит репортаж на текстовый экран. Репортаж потом можно скинуть в Exel.

(defun c:blcx(/ blSet blList nameList listLen outList exFlag oldExFlag
           exPath exApp exWorkbook exFileexSheets exSheet curId
           newFile curCell curVal)
  (vl-load-com)
  (princ "\n*** Select entities on wanted layers *** ")
  (setq laySet(ssget)
    dxfList(mapcar
         'entget
           (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex laySet))))
    dxfList(mapcar
         '(lambda(x)(assoc 8 x))dxfList)
    filList '()
    ); end setq
  (foreach lst dxfList
    (if(not(member(cdr lst)(mapcar 'cdr filList)))
      (setq filList(append filList(list lst)))
      ); end if
    ); end foreach
  (princ "\n******* Layers List for Blocks Counting ******* \n")
  (foreach lay filList
    (princ(strcat "\n"(cdr lay)))
    ); end of foreach
  (princ "\n********************************************** ")
  (textscr)
  (setq filList(append '((-4 . "<OR"))filList)
    filList(append filList '((-4 . "OR>")))
    filList(append '((0 . "INSERT"))filList)
    ); end setq
        
  (princ "\n*** Specify selection set by frame selection *** ")
  (if
    (setq blSet(ssget filList))
    (progn
      (setq blList(mapcar 'vlax-ename->vla-object
                    (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex blSet))))
        nameList(vl-sort (mapcar'(lambda(X)(vla-get-Name x)) blList) '<)
        listLen(length nameList)
        ); end setq
      (while nameList
  (setq outList (cons(cons(car nameList)
           (- listLen(setq listLen(length (setq nameList
       (vl-remove(car nameList) nameList))))))outList)
        ); end setq
  ) ; end while
      (princ "\n********** BLOCK COUNTING REPORT ************\n ")
      (foreach item outList
    (princ(strcat "\n" (car item)" "(itoa(cdr item))))
    ); end foreach
      (princ "\n \n************* END OF REPORT *****************")
      (textscr)
      (if(not exFlag)(setq exFlag "N"))
      (setq oldExFlag exFlag)
      (initget "Y N")
      (setq exFlag
         (getkword
        (strcat "\n\n*** Save report to MS Excel file? [Y/N] <"exFlag">: ")))
      (if(null exFlag)(setq exFlag oldExFlag))
      (if(= exFlag "Y")
    (progn
       (if (setq  exPath(getfiled "Save Text File As"
           (strcat (getvar "dwgprefix")(substr (getvar "dwgname") 1
        (- (strlen (getvar "dwgname")) 4)) ".xls")"xls" 33); end getfiled
            ); end setq
         (progn
    (setq exApp(vlax-create-object "Excel.Application"))
    (if(null exApp)
      (progn
        (alert "Error. Can't start MS Excel.")
        (quit)
        ); end progn
        ); end if
     (setq exWorkbook
               (vlax-get-property exApp "Workbooks")
           exFile
               (vlax-invoke-method exWorkbook "Add")
           exSheets
               (vlax-get-property exFile "Worksheets")
               exSheet
               (vlax-get-property exSheets "Item" "Sheet1")
           curRow 2
    ); end setq
      (repeat(length outList)
        (setq curId(strcat "B"(itoa curRow))
          curCell(vlax-variant-value
                 (vlax-invoke-method exSheet "Evaluate" curId))
          curVal(car(nth(- curRow 2) outList))
          ); end setq
          (vlax-put-property curCell  "Formula" curVal)
        (vlax-release-object curCell)
        (setq curId(strcat "C"(itoa curRow))
          curCell(vlax-variant-value
                 (vlax-invoke-method exSheet "Evaluate" curId))
          curVal(itoa(cdr(nth(- curRow 2) outList)))
          ); end setq
          (vlax-put-property curCell  "Formula" curVal)
        (vlax-release-object curCell)
        (setq curRow(1+ curRow))
        ); end repeat
      (vlax-invoke-method exFile "SaveAs" exPath nil nil nil nil nil nil)
      (vlax-invoke-method exFile "Close" nil)
      (vlax-invoke-method exApp "Quit")
    (mapcar(function(lambda(x)
           (if
         (and x(not(vlax-object-released-p x)))
         (vlax-release-object x)
         )
           ))
    (list curCell exSheet exSheets exFile exWorkbook exApp)
    )
    (setq curCell nil
          exSheet nil
          exSheets nil
          exFile nil
      exWorkbook nil
      exApp nil); end setq
    (gc)
    (princ(strcat"\n*** The file was successfully saved in: " exPath))
    ); end progn
         (princ "\n*** Excel file was not created! *** ")
         ); end if
       ); end progn
      ); end if
    ); end progn
    (princ "\n*** Nothing blocks selected! ***")
  ); end if
      (princ)
      ); end of BLCX

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

а можно вопрос? как это все работает?

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

куда этоттекст вбивать?

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

> Валера
1) Созранить в файле с расширением *.lsp.
2) Загрузить с помощью Tools>AutoLISP>Load (там же можно поставить в автозагрузку)
3)Вызывать как обычную команду BLCX из командной строки, далее следовать инструкциям:
- выбрать любые примитивы на нужных слоях (для выбора слоёв где будет осуществлятся подсчёт блоков)
- выбрать область где будет осуществлятся подсчет
- после вывода репортажа о количествах в текстовом экране
выбрать сохранять репортаж в MS Excel или нет.

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

Всё прекрасно, но кто нибудь пояснит почему вместо имени блока (которое видно в окне свойств) отображается нечто типа "*U430",
одно ясно, такая ботва только с динамическими блоками, это вообще решимо? А то всем выше предложеным кодам нет применения.

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

> Walkmax
Все дин.блоки программно (в группе 2 DXF-представления либо по vla-get-name) имеют вид анонимных блоков. Для гарантированного получения имени надо использовать либо vla-get-effectivename, либо лезьть в дебри дополнительных данных.

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

Спасибо за внимание со стороны гуру. Есть ещё один вопрос касающийся той-же тематитки. В чертеже присутствует множество разных блоков с стандартным набором атрибутов (одинаковые имена но разные значения), некоторые из блоков имеют определённые динамические параметры. Так вот какая странность, при формировании спецификации посредством функции извлечения данных генерируется отчёт в двух таблицах (*.xlsx и autocadTable) к таблице *.xlsx претензий нет, а вот в родной autocadTable начинаются глюки, некоторые из ячеек относящихся к строкам динамических блоков пустые, принудительное заполнение не приводит ни к чему, после обновления содержимое опять проподает. Это что за фокус?

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

Подсчет блоков, в том числе и динамических здесь
http://dwg.ru/f/showthread.php?t=9084

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

Почему-то не могу в Visual Lisp найти упоминания функции vla-get-effectivename.

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

> Sergey_M
Она есть в документации по Visual Basic

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

Честно говоря, поиск (vla-get-effectivename) в Visual Basic тоже ничего не дал, но может, плохо ищу. Все равно, спасибо. Если не сложно, где еще можно посмотреть описание.

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

> Sergey_M
1.Запускаешь Автокад.
2. В командной строке набираешь VLIDE
3. В окрывшемся окне жмешь F6(консоль VLISP)
4. В консоле (там где _$) набираешь vla-get-EffectiveName
5. Жмешь Ctrl+F1

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

> Sergey_M
Посмотри http://www.cad.dp.ua/stats/vla_doc.php  - там пользительнейшая инфа.