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

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

Подсчет количества блоков

Ответ
Поиск в этой теме
Непрочитано 17.07.2008, 12:16 #1
Подсчет количества блоков
Seryj_Wolk
 
Инженер-электрик
 
Псков
Регистрация: 04.03.2008
Сообщений: 59

Знаю что таких тем уже хватает, но изучив их, то что нужно найти не смог. Нашел по ссылке в этой теме лисп:
Код:
[Выделить все]
(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
Может кто-нить подкорректировать его так, чтобы при тыканьи в блок не только подсчитывалось количество блоков данного типа, но и еще они бы выделялись. Буду очень признателен
Просмотров: 12363
 
Непрочитано 17.07.2008, 12:37
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Код:
[Выделить все]
(defun c:bcount (/ a b)
 (print "*** Select sample block ")
 (if (setq a (ssget "_+.:S" '((0 . "INSERT"))))
  (progn (sssetfirst
          nil
          (setq
           b (ssget "_x"
                    (list (setq a (assoc 2 (entget (cadar (ssnamex a))))))
             ) ;_  ssget
          ) ;_  setq
         ) ;_  sssetfirst
         (princ (strcat "*** Block name: \""
                        (cdr a)
                        "\"\n*** Blocks in drawing: "
                        (itoa (sslength b))
                ) ;_  strcat
         ) ;_  princ
  ) ;_  progn
 ) ;_  if
 (princ)
)
Елпанов Евгений вне форума  
 
Непрочитано 17.07.2008, 12:52
#3
Кулик Алексей aka kpblc
Moderator

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


Оба лиспа не совсем правильно будут обрабатывать дин.блоки - там методика получения имени другая.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2008, 13:00
#4
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Оба лиспа не совсем правильно будут обрабатывать дин.блоки - там методика получения имени другая.
так задача была добавить выделение блоков в готовую программу, что я и сделал...
PS. Если пытаться обработать все случаи - это слишком много времени. Пример - связанные чертежи, возможно не загруженные...
Елпанов Евгений вне форума  
 
Непрочитано 17.07.2008, 13:09
#5
Кулик Алексей aka kpblc
Moderator

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


Вариант не гонял вообще:<...> Код удален как нерабочий
P.S. Не обрабатывает вложенные блоки; исключает внешние ссылки; должна проверять дин.блоки независимо от их состояния. Работает только в том пространстве (модели / листа), в котором лежит "тыкнутый" объект.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 17.07.2008 в 13:53.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2008, 13:28
#6
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Благодарю всех кто отозвался.
2 Елпанов Евгений: именно то что нужно, еще раз блогадарю
2 Кулик Алексей aka kpblc: У меня в основном простые блоки, не динамические и лисп поэтому простенький. А вот твой чего то у меня не работает или он только для динамических?
Seryj_Wolk вне форума  
 
Непрочитано 17.07.2008, 13:36
#7
Кулик Алексей aka kpblc
Moderator

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


Seryj_Wolk, прошу прощения, исправил код.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2008, 13:40
#8
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


2 Елпанов Евгений
Можешь еще подправить чтобы результат выводился немного в другом виде.
Сейчас выводится так:
Блок: "Штепсельная розетка двухполюсная с защитным контактом скрытой установки"
Всего блоков: 29

А хотелось бы так:
Штепсельная розетка двухполюсная с защитным контактом скрытой установки: 29
Seryj_Wolk вне форума  
 
Автор темы   Непрочитано 17.07.2008, 13:42
#9
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Seryj_Wolk, прошу прощения, исправил код.
Тоже самое.
Вот что пишет.
Команда: bcount-by-pick
Укажите блок <Отмена> : ; ошибка: слишком мало фактических параметров
Команда:
Seryj_Wolk вне форума  
 
Непрочитано 17.07.2008, 13:53
#10
Кулик Алексей aka kpblc
Moderator

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


Тот код снес. Исправленный вариант:
Код:
[Выделить все]
(defun c:bcount-by-pick (/ ent selset name fun_get-name def)

  (defun fun_get-name (ent)
    (cond
      ((vlax-property-available-p ent 'effectivename)
       (vla-get-effectivename ent)
       )
      ((vlax-property-available-p ent 'name) (vla-get-name ent))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)
  (if
    (and
      (= (type (setq
                 ent (vl-catch-all-apply
                       '(lambda () (car (entsel "\nУкажите блок <Отмена> : ")))
                       ) ;_ end of vl-catch-all-apply
                 ) ;_ end of setq
               ) ;_ end of type
         'ename
         ) ;_ end of =
      (= (cdr (assoc 0 (entget ent))) "INSERT")
      (setq ent (vlax-ename->vla-object ent))
      (setq
        def
         (vla-item
           (vla-get-blocks
             (vla-get-activedocument (vlax-get-acad-object))
             ) ;_ end of vla-get-blocks
           (fun_get-name ent)
           ) ;_ end of vla-item
        ) ;_ end of setq
      (setq name (fun_get-name ent))
      (equal (vla-get-isxref def) :vlax-false)
      ) ;_ end of and
     (progn
       (setq selset (ssadd))
       (vlax-for sub (vla-objectidtoobject
                       (vla-get-activedocument (vlax-get-acad-object))
                       (vla-get-ownerid ent)
                       ) ;_ end of vla-ObjectIDToObject
         (if (= (strcase (fun_get-name sub)) (strcase name))
           (setq selset (ssadd (vlax-vla-object->ename sub) selset))
           ) ;_ end of if
         ) ;_ end of vlax-for
       (if selset
         (progn
           (princ (strcat "\nНормальное имя блока : "
                          (fun_get-name ent)
                          "\nКоличество блоков в текущем пространстве : "
                          (vl-princ-to-string (sslength selset))
                          ) ;_ end of strcat
                  ) ;_ end of princ
           (sssetfirst selset selset)
           ) ;_ end of progn
         ) ;_ end of if
       ) ;_ end of progn
     ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2008, 13:56
#11
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


А ты их сам не проверяешь чтоли?
Команда: bcount-by-pick
Укажите блок <Отмена> : ; ошибка: неверный тип аргумента: stringp nil
Команда:
Seryj_Wolk вне форума  
 
Непрочитано 17.07.2008, 13:58
#12
VVA

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


Есть еще тема подсчет динамических блоков (простые считаются тоже)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.07.2008, 13:59
#13
Кулик Алексей aka kpblc
Moderator

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


Seryj_Wolk, последний код я прогнал раз 20, наверное - считал все что надо и выделял. AutoCAD 2006 Eng + SP1 (из состава ADT 2006).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2008, 14:20
#14
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


У меня тоже 2006, но видишь какой результат...
Seryj_Wolk вне форума  
 
Непрочитано 17.07.2008, 14:26
#15
Кулик Алексей aka kpblc
Moderator

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


Все, ясно. Я, блин, добрая душа, проверял только на файлах, где были только блоки. Поэтому там все работало. Такой вариант прогони.
Код:
[Выделить все]
(defun c:bcount-by-pick (/ ent selset name fun_get-name def)

  (defun fun_get-name (ent)
    (cond
      ((vlax-property-available-p ent 'effectivename)
       (vla-get-effectivename ent)
       )
      ((vlax-property-available-p ent 'name) (vla-get-name ent))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)
  (if
    (and
      (= (type (setq
                 ent (vl-catch-all-apply
                       '(lambda () (car (entsel "\nУкажите блок <Отмена> : ")))
                       ) ;_ end of vl-catch-all-apply
                 ) ;_ end of setq
               ) ;_ end of type
         'ename
         ) ;_ end of =
      (= (cdr (assoc 0 (entget ent))) "INSERT")
      (setq ent (vlax-ename->vla-object ent))
      (setq
        def
         (vla-item
           (vla-get-blocks
             (vla-get-activedocument (vlax-get-acad-object))
             ) ;_ end of vla-get-blocks
           (fun_get-name ent)
           ) ;_ end of vla-item
        ) ;_ end of setq
      (setq name (fun_get-name ent))
      (equal (vla-get-isxref def) :vlax-false)
      ) ;_ end of and
     (progn
       (setq selset (ssadd))
       (vlax-for sub (vla-objectidtoobject
                       (vla-get-activedocument (vlax-get-acad-object))
                       (vla-get-ownerid ent)
                       ) ;_ end of vla-ObjectIDToObject
         (if (and (fun_get-name sub)
                  (= (strcase (fun_get-name sub)) (strcase name))
                  ) ;_ end of and
           (setq selset (ssadd (vlax-vla-object->ename sub) selset))
           ) ;_ end of if
         ) ;_ end of vlax-for
       (if selset
         (progn
           (princ (strcat "\nНормальное имя блока : "
                          (fun_get-name ent)
                          "\nКоличество блоков в текущем пространстве : "
                          (vl-princ-to-string (sslength selset))
                          ) ;_ end of strcat
                  ) ;_ end of princ
           (sssetfirst selset selset)
           ) ;_ end of progn
         ) ;_ end of if
       ) ;_ end of progn
     ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2008, 14:34
#16
Aragorn

Продажа навыков и умений
 
Регистрация: 20.11.2004
Сибирь
Сообщений: 2,405


Частая ошибка при подсчете блоков - это подсчет дублирующихся блоков (2 или больше блоков в одной или близкой точке, которые визуально не отличишь). Вроде комманда overkill долэна с этим справляться, но иногда не получается. Поэтому я бы в лисп добавил проверку на дублирование блоков в одной точке и их удаление.
Aragorn вне форума  
 
Непрочитано 17.07.2008, 14:39
#17
Кулик Алексей aka kpblc
Moderator

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


С какой точностью сравнивать?
P.S. И что делать с дубликатами? И проверять атрибуты или нет? А слои, которым принадлежат блоки? А если блоки сделаны "не по слою 0, остальные настройки не ByBlock"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2008, 14:45
#18
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Вот, теперь все работает, благодарю. Только, единственно, что я подкарректировал, это чтобы результат выводился в виде
Имя блока: число элементов
для меня так удобнее.
По сравнению с тем лиспом (в нем, кстати я баг нашел неприятный )он работает медленнее, секунду-две где-то думает, а так все отлично.
А этот лисп будет считать любые блоки?
Seryj_Wolk вне форума  
 
Непрочитано 17.07.2008, 14:53
#19
Кулик Алексей aka kpblc
Moderator

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


Любые. Тормоза обусловлены лишним контролем. Код можно ускорить. Евгений мне в личке уже на массу лишнего указал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2008, 15:16
#20
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


пример моей программы, с обработкой дин блоков...
Код вычисления имени, позаимствовал из кода Алексея
(с меня при встрече)
Код:
[Выделить все]
(defun c:bcount (/ a b)
 (print "*** Select sample block ")
 (if (setq a (ssget "_+.:S" '((0 . "INSERT"))))
  (progn (sssetfirst
          nil
          (setq b
                (ssget
                 "_x"
                 (list
                  (cons 2
                        (setq
                         a (cond
                            ((vlax-property-available-p
                              (setq a (vlax-ename->vla-object (ssname a 0)))
                              'effectivename
                             ) ;_  vlax-property-available-p
                             (vla-get-effectivename a)
                            )
                            ((vlax-property-available-p a 'name) (vla-get-name a))
                            (t nil)
                           ) ;_  cond
                        ) ;_  setq
                  ) ;_  cons
                 ) ;_  list
                ) ;_  ssget
          ) ;_  setq
         ) ;_  sssetfirst
         (princ (strcat "*** Block name: \""
                        a
                        "\"\n*** Blocks in drawing: "
                        (itoa (sslength b))
                ) ;_  strcat
         ) ;_  princ
  ) ;_  progn
 ) ;_  if
 (princ)
)
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подсчет количества блоков

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет блоков в AutoCad2006 Natan AutoCAD 44 02.10.2019 12:32
подсчет динамических блоков AAI Программирование 37 25.06.2012 15:05
Изменить параметры у всех объектов внутри блоков 800x600 AutoCAD 5 25.03.2008 14:21
Подсчет количества блоков juri AutoCAD 9 10.10.2004 20:06