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

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

Подсчет и сортировка блоков на текущем слое. Помогите отредактировать.

Ответ
Поиск в этой теме
Непрочитано 23.03.2010, 15:08 #1
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать.
Kortes
 
Регистрация: 16.03.2010
Сообщений: 8

Есть код найденный на соседнем по тематике сайте. В саму тему с этим кодом вопрос написал, но ответа нет. Решил попросить помощи тут. Итак:
1. Как сделать чтобы имена динамических блоков брались "эффективные", а не что-то вида U*....
2. На выходи получить файл в расширение xls. Чтобы было по столбцам, например Наименование блока в одном столбце, а кол-во в другом. Простая замена строки с <(setq fil (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_blk.txt"))> на <(setq fil (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_blk.xls"))> не помагает так как нет разделения по столбцам, все пишется в один столбец. Насколько я понимаю нужно разделение табуляцией в получаемом файле, но как это сделать я не знаю. Только учусь . Bcount и все варианты ее замены, мелькавшие на форуме просмотрел, но они мне не очень подходят т.к. мне нужно считать блоки именно на "жестко" определенном слое. Заранее благодарю за помощь.

Код:
[Выделить все]
;*******list_blk.lsp *********************************
;       Подсчет и сортировка блоков на текущем слое.
;       Автор Владимир Громов.
;
(defun C:LIST_BLK
      ( / echo lay zag inf tn tk fil fl ss1 ss ssn1 pp pp1 n spo spisok
          ssn e eo ko spt sp1 sp2 )
      (setq echo (getvar "CMDECHO"))
      (setvar "CMDECHO" 0)
      (setq lay (getvar "CLAYER"))
      (setq zag (strcat "\n  ПОДСЧЕТ И СОРТИРОВКА БЛОКОВ НА СЛОЕ " "'" lay "'" ".\n"))
      (setq inf (getstring T "\n Информация (КИПЫ, Спецка, Кабели ): "))
      (princ "\n Выбор объектов.")
      (setq tn (getpoint " Первый угол рамки: "))
      (setq tk (getcorner tn "\n Второй угол рамки: "))
      (setq fil (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_blk.txt"))
      (if (not (findfile fil))
          (progn
          (setq fl (open fil "w"))
          (princ zag fl)
          (close fl)
      ))
           (princ "\n\nСОРТИРОВКА И ВЫБОРКА.\n")
           (princ inf)(princ "\n")
           (setq ss1 (ssget "_W" tn tk))
(if ss1
    (progn
           (setq ss (ssadd))                    ;Пустой набор
           (setq ssn1 (sslength ss1) n 0)       ;Количество примитивов
         (repeat ssn1
           (setq pp (ssname ss1 n))             ;Имена примитивов
           (setq pp1 (entget pp))               ;Данные примитива с именем pp
           (cond
           ((and (= (cdr (assoc 8 pp1)) lay) (= (cdr (assoc 0 pp1)) "INSERT")) (ssadd
pp ss) ;Набор БЛОКОВ
           ))
           (setq n (+ n 1))
         )
         (if ss
           (progn
           (setq spo nil spisok nil)
           (setq fl (open fil "a"))
           (princ "\n" fl)
           (princ inf fl)
           (princ "\n  -----------------------------------------------" fl)
           (close fl)
           (princ "\nОбщий список блоков: \n")
           (setq ssn (sslength ss) n 0)
           (repeat ssn
                   (setq e (ssname ss n))
                   (setq eo (cdr (assoc 2 (entget e))))
                   (princ eo)
                   (princ " ")
                   (setq spo (cons eo spo))
                   (setq n (+ n 1))
           )
         ))
           (setq spo (acad_strlsort spo))
           (princ "\n")
           (princ spo)
           (setq ko (length spo))
           (princ "\n  Всего установлено блоков: ")
           (princ ko)
           (princ "\n")
           (setq fl (open fil "a"))
           (princ "\n  Всего установлено блоков: " fl)
           (princ ko fl)
           (princ "\n" fl)
           (close fl)
           (setq n 0 k 0 spt nil)
     (if ko
         (progn
                 (princ "\n  Количество блоков типа: ")
                 (setq fl (open fil "a"))
                 (princ "\n  Количество блоков типа: " fl)
                 (close fl)
         (while spo
             (setq k 0 spisok nil)
             (setq spt spo)
             (setq sp1 (nth k spt))
             (repeat ko
                (setq sp2 (nth k spt))
                (if (= sp2 sp1)
                    (progn
                    (setq spisok (cons sp2 spisok))
                    (setq spo (vl-remove sp2 spo))
                ))
             (setq k (+ k 1))
             )
            (princ "\n ")
            (princ sp1) (princ " - ")
            (princ (length spisok))
            (setq fl (open fil "a"))
            (princ "\n     " fl)
            (princ sp1 fl)
            (cond
            ((= (strlen sp1) 1) (princ "      -  " fl))
            ((= (strlen sp1) 2) (princ "     -  " fl))
            ((= (strlen sp1) 3) (princ "    -  " fl))
            ((= (strlen sp1) 4) (princ "   -  " fl))
            ((= (strlen sp1) 5) (princ "  -  " fl))
            ((> (strlen sp1) 5) (princ "  -  " fl))
            )
            (princ (length spisok) fl)
            (close fl)
            (if (= spt nil) (setq ko nil))
         )
            (setq fl (open fil "a"))
            (princ "\n" fl)
            (close fl)
     ))
     (princ "\n Информация записана в файл: ") (princ fil)
    )
    (progn
    (princ "\n Нет выбранных блоков!")
    (alert "\n Нет выбранных блоков!")
    (princ)
    )
)
      (princ "\n ВЫБОРКА ЗАКОНЧЕНА.")
      (setvar "CMDECHO" echo)
      (princ)
)
Просмотров: 7813
 
Непрочитано 23.03.2010, 15:28
#2
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,153


посмотри похожую тему снизу - Подсчет простых и динамических блоков
Nike вне форума  
 
Непрочитано 23.03.2010, 15:47
1 | #3
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Это моя программа. На caduser.ru я крайне редко захожу теперь - после того, как ликвидировали autocad.ru.
По существу: Excel я плохо знаю, так что доделать (переделать) программу не смогу.
Profan вне форума  
 
Автор темы   Непрочитано 23.03.2010, 15:55
#4
Kortes


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


Nike -> Благодарю за ответ. Но SelSim смотрел не подходит. Просмотрел все аналогичные темы по данному вопросу, просто так бы размещать тему не стал. Дело в том что тот же SelSim хорош.. но он не выводит информацию в файл. А также мне необходимо на определенном непосредственно в лисп слое посчитать ВСЕ существующие блоки (что подправить чтобы подсчет велся на определенном слое в данном коде я уже разобрался). И получить на выходе в excel таблицу, что-то типо:

ИМЯ БЛОКА....КОЛИЧЕСТВО
блок 1 .............n штук
блок 2 .............n штук
и т.д.

Profan -> Огромное спасибо Вам за данный код. Разобраться как считать динамические блоки по "эффективному" имени можете подсказать? С Excel разберусь следующим этапом. Буду пытаться решать задачу постепенно :-)

Последний раз редактировалось Kortes, 23.03.2010 в 16:02.
Kortes вне форума  
 
Непрочитано 23.03.2010, 16:11
#5
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,153


Цитата:
Сообщение от Kortes Посмотреть сообщение
SelSim хорош.. но он не выводит информацию в файл.
SelSim выделяет нужные тебе объекты. Экспорт их наименований и количества в файл можно вторым действием, нужно поискать - может уже есть решение.

А штатное "Извлечение данных" чем не устраивает?
Nike вне форума  
 
Непрочитано 23.03.2010, 16:12
#6
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,578
<phrase 1=


Kortes, а команду _dataextraction принципиально не рассматриваем??
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 23.03.2010, 16:19
#7
Kortes


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


zenon. команду _dataextraction конешно рассматривал и на данный момент ей и пользуюсь. Но это не удобно. Много времени уходит на лишние телодвижения. Через лисп гораздо удобней и быстрее.
Kortes вне форума  
 
Непрочитано 23.03.2010, 22:46
#8
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Kortes Посмотреть сообщение
zenon. команду _dataextraction конешно рассматривал и на данный момент ей и пользуюсь. Но это не удобно. Много времени уходит на лишние телодвижения. Через лисп гораздо удобней и быстрее.
Нашел в своем загашнике
Посотри может пойдет


Код:
[Выделить все]
;by Fatty T.O.H. ()2005 * all rights removed
(defun C:CBL (/ block_data block_list layer block_name obj_list ss str total)
  
;;local defuns
  
 (defun subtotals ( lst / output) 
   (mapcar 
      (function (lambda (x / a)
         (setq output 
            (if (setq a (assoc x output)) 
                (subst (cons x (1+ (cdr a))) a output) 
                (cons (cons x 1) output) 
            ) 
         ) 
      )
      )
      lst
   )
  output
)


(defun list_to_file (filename lst / filedesc)
  (if (setq filedesc (open filename
                                    (if (findfile filename)
                                      "A"
                                      "W"
                                    ) 
                              ) 
              ) 

         (progn
         (foreach line lst
           (write-line line filedesc)
         ) 
         (close filedesc)
        )
  ) 
)
  
;;================= main part ================;;
  
(while (and
(setq layer (getstring T "\nEnter Layer Name To Count Blocks On: "))
(not (tblsearch "LAYER" layer)))
  (alert "Wrong layer name!\nTry again..."))
  
(if 
(setq ss (ssget "_X" (list
		       (cons 0 "INSERT")
		       (cons 8 layer)
		       (cons 410 (getvar "CTAB"))))
      )

  (progn
    
  (setq	obj_list
	 (mapcar 'vlax-ename->vla-object
		 (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
		 )
	)

  (foreach block_obj obj_list
		      (setq block_name
			  (if
			     (vlax-property-available-p block_obj 'EffectiveName)
			(vla-get-effectivename block_obj)
			(vla-get-name block_obj)
			)
		      )
			(setq block_list (cons block_name block_list))
		    )

(setq block_data (subtotals block_list)
      total	 (itoa (apply '+
			      (mapcar 'cdr block_data)
			      )
		       )
      block_data (mapcar 'cons
			 (mapcar 'car block_data)
			 (mapcar 'itoa
				 (mapcar 'cdr block_data)
				 )
			 )
      
      block_data (append (list (cons "Block Name" "Count")) block_data)
      block_data (append (list (cons "Layer:" layer)) block_data)
      block_data (append block_data (list (cons "Total Blocks:" total))
			 )
      block_data (mapcar (function (lambda(x)(strcat (car x) "," (cdr x))))
	block_data		 
      )
      )

(list_to_file (strcat "C:\\BlocksOn" layer ".csv") block_data) 

)
)
  (princ)
)
~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 24.03.2010, 09:47
#9
Kortes


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


Цитата:
Нашел в своем загашнике
Посотри может пойдет
Не выходит. Говорит: ; ошибка: no function definition: nil
.
Kortes вне форума  
 
Непрочитано 24.03.2010, 13:17
#10
VVA

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


Kortes, В теме по ссылке из #2 была ссылка на еще одну тему. Там есть готовое решение. подсчет динамических блоков
Можно и доработать программу Владимира Громова. Нужно просто сохранять не в txt, а в csv формате.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.03.2010, 16:26
#11
Kortes


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


VVA, Спасибо за ответ. Попробовал сохранить в формате csv, всеравно он имя блока и их кол-во забивает в один столбец. По поводу решения в соседней теме. Я его там не нашел :-(. blockcount не умеет считать по определенному слою. Для меня это важно. Т.к. получая чертежи от смежников там столько мусора и непонятно каких блоков, причем каждый раз при новом полученном задании один и тот же блок может называться по разному в идентичных чертежах. Черт их знает как они там работают :-) ). Выход либо искать по определенному слою, либо программно прописать какие именно блоки подвергаются обсчету.
Kortes вне форума  
 
Непрочитано 24.03.2010, 16:30
#12
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,153


Kortes, ты вообще что считаешь и для чего? Обязательно ли тебе экспорт делать, или достаточно информации в текстовом окне AutoCAD? Давай пример чертежа!
Nike вне форума  
 
Непрочитано 24.03.2010, 17:05
#13
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Kortes Посмотреть сообщение
Не выходит. Говорит: ; ошибка: no function definition: nil
.
У меня работает, только что отсюда скопировал
и проверил
Только добавь в начале кода:
Код:
[Выделить все]
(vl-load-com)
(defun C:CBL (....
~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 24.03.2010, 17:19
#14
Kortes


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


Олег (jr.), Спасибо заработало. Но все равно получаю в исходном файле все в одном столбце. например в А1 -> имя блока, количество. Может эксель надо настроить чтобы он понимал "," как разделитель? Если да то как.
Kortes вне форума  
 
Непрочитано 24.03.2010, 22:14
#15
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 418


Если не понимает "," поставь вместо неё ";" здесь:
Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
block_data (mapcar (function (lambda(x)(strcat (car x) "," (cdr x))))
ытя вне форума  
 
Непрочитано 24.03.2010, 23:45
1 | #16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Kortes Посмотреть сообщение
Олег (jr.), Спасибо заработало. Но все равно получаю в исходном файле все в одном столбце. например в А1 -> имя блока, количество. Может эксель надо настроить чтобы он понимал "," как разделитель? Если да то как.
Вот почему не люблю CSV
Попробуй вместо запятой "\t" или ";"
ытя знает что говорит

~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 26.03.2010, 12:43
#17
Kortes


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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Вот почему не люблю CSV
Попробуй вместо запятой "\t" или ";"
ытя знает что говорит

~'J'~
Всем огромное спасибо все получилось :-). Есть только один вопросик. Почему подсчет происходит только когда находишся непосредственно в модели? Если находясь в листе произвожу подсчет, то считает не корректно. Даже находясь в листе "проваливаюсь" сквозь лист в модель - считает не корректно. Мелочь это, но всеже интересует пачему так :-)
Kortes вне форума  
 
Непрочитано 26.03.2010, 18:46
#18
VVA

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


Цитата:
Сообщение от Kortes Посмотреть сообщение
Если находясь в листе произвожу подсчет, то считает не корректно. Даже находясь в листе "проваливаюсь" сквозь лист в модель - считает не корректно.
Из-за этого
Цитата:
(if
(setq ss (ssget "_X" (list
(cons 0 "INSERT")
(cons 8 layer)
(cons 410 (getvar "CTAB"))))
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подсчет и сортировка блоков на текущем слое. Помогите отредактировать.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчет динамических блоков AAI Программирование 37 25.06.2012 15:05
Подсчет простых и динамических блоков gizmo_zx Программирование 12 08.09.2010 16:04
Помогите. Программа отображения каталогизированного списка блоков. --Илья-- Программирование 18 02.12.2009 11:25
Подсчет количества блоков на чертеже Stalker AutoCAD 6 15.01.2009 08:07
Подсчет количества блоков juri AutoCAD 9 10.10.2004 20:06