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

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

подсчет динамических блоков

Ответ
Поиск в этой теме
Непрочитано 06.02.2008, 12:38
подсчет динамических блоков
AAI
 
Регистрация: 06.02.2008
Сообщений: 23

Всем привет!
Помогите пожалуйста найти решение на такую проблему - в динамическом блоке создано несколько visibility states. Необходимо подсчитать на плане количество блоков с каждым типом отображения.
Пользовался поиском - смог найти только как считатется общее количество динамических блоков.
Просмотров: 28437
 
Непрочитано 16.06.2008, 02:23
#21
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Выбери стиль таблицы Стандарт, и она создастся сама. Кстати команда _eattext (Извлечение атрибутов) была до 2007 када. С 2008 команда выросла до _dataextraction (Извлечение данных). В 2009 стал работать корректно. Это особенно заметно, если создете доп. столбцы и производите математические операции с извлекаемыми параметрами.
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 11.10.2010, 15:32
#22
Kostalom


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


Добрый день. У меня есть просьба, если конечно вы сможете помочь.
Как можно организовать подсчет дин. блоков. При условии что блок имеет несколько видимостей, и каждая из видимостей может маркироватся соответственно по заданной шкале (например С6, С10,.... С6/2, 10/2,...6/3, 10/3....). Для наглядности прикладываю файл, данное решение схем подойдет с небольшими оформленчискими изменениями всем электрикам проектантам (необходимые параметры обозначены красным). Также если вообще есть возможность делать автоматический подчет типа и длин кабелей (по параметру 3х2,5 и тп..).
Вложения
Тип файла: dwg
DWG 2007
Схема.dwg (199.7 Кб, 1932 просмотров)
Kostalom вне форума  
 
Непрочитано 11.10.2010, 17:40
#23
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Kostalom, Твои динамические блоки считаются так: (blockcount "Видимость" nil) Функции брать из поста #10. Кабели считали здесь: Нужно посчитать кабель
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 11.10.2010 в 18:00.
VVA вне форума  
 
Непрочитано 12.10.2010, 10:55
#24
Kostalom


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


2 VVA да спасибо прога работает, но у меня стоит более сложная задача. Каждая видимость блока имеет еще один параметр по которому впринцепе и нужно производить подсчет. Етот параметр (например С6, С10,.... С6/2, 10/2,...6/3, 10/3....) в файле написан как Мтехт, но можна его добавить и как атрибут в дин блок. Либо же несчитать дин блоки а считать количество С6, С10.... в самом Мтехт. Я просто незнаю что проще организовать на Лиспе????
Kostalom вне форума  
 
Непрочитано 12.10.2010, 13:09
#25
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Удобнее, когда параметр будет добавлен как атрибут блока. У тебя есть текст: С60N-C10 Его нужно считать как С60 или С10 ?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 12.10.2010, 13:55
#26
Kostalom


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


нет интересует только С10, причем етот текст может менятся в зависимости от модели автомата соответственно первая буква может быть (В, С, D,), а цифра после буквы может быть (6, 10, 16, 20, 25, 32, 40, 50, 63, 80, 100, 125) после етой цифры возможен префикс /2 или /3. Пример: С6, С6/2, С6/3 или так В16, В16/2 и тд. Но суть что там может быть много вариантов. Былобы хорошо еслибы подсчет велся по видимости + по тому что написано в атрибуте конкретной видимости, тоисть сверялся текст с атрибута и количество одинаковых записей в атрибуте выводилось ввиде списка типа: 1) видимость; 2) текст в атрибуте; 3) количество. Ну и космос былбы еслиб все ето записывалось в текстовый файл например. Но так как команду будут использовать несколько раз подряд то чтоб все данные записывались в один и тотже файл, какбы продолжая запись, и перед каждым таким отчетом спрашивало как его (отчет) назвать. А ну и чтоб етот подсчет производился в заданой области чертежа.

Во хотелки какие , извените уж, просто действительно очень нужно по работе

Последний раз редактировалось Kostalom, 12.10.2010 в 14:17.
Kostalom вне форума  
 
Непрочитано 12.10.2010, 15:14
#27
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Kostalom Посмотреть сообщение
Былобы хорошо еслибы подсчет велся по видимости + по тому что написано в атрибуте конкретной видимости
пример в студию
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 12.10.2010, 16:53
#28
Kostalom


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


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



Да и еще может таким путем:
был бы очень признателен если подскажете как сделать следущее
у меня есть 10 (15 или 20) строчек мультитекста (в каждом мультитексте есть хоть один "enter"). Я специально вставляю перед необходимыми мне фрагментами какойнибудь редко встречающийся символ, к примеру собачку перед началом марки кабеля, значок долара перед длиной
выделяю к примеру 10 строк мультитекста (кол-во строк может быть разным ). Преобразую это в 10 строковых переменых. Далее работаем с каждой переменной. Ищем собачку, после нахождения таковой считываем следущие 5 символов и проводим проверку на макру кабеля (наример "*****"="ВВГнд") если да то прибавляем к сумме ВВГнд то что находиться за значком"$".
Конечно нужно ещё делать проверку на совпадение сечения кабеля, ну это я думаю смогу сам сделать, мне главное подать начало, так как лисп очень большоооой а времени на разборку нету
Вложения
Тип файла: dwg
DWG 2007
Схема.dwg (300.9 Кб, 1906 просмотров)

Последний раз редактировалось Kostalom, 13.10.2010 в 09:43.
Kostalom вне форума  
 
Непрочитано 18.10.2010, 09:59
#29
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Kostalom, Посмотри эту тему посты #106 #108
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.02.2011, 14:02
#30
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Вариант функции подсчета свойств динамических блоков с группировкой по указанному динамическому свойству
Код:
[Выделить все]
(defun blockcount1 (DynPropetyName              IgnoreBlockNamePattern
                    CountProp     /             adoc
                    selset        res           name
                    dynProp       lst           nameX
                   )
;;;Подсчет динамических блоков по имени и значению динамического свойства
;;; http://dwg.ru/f/showthread.php?t=17333
;;;DynPropetyName - метка свойства (видимость и т.п.), строка - "Видимость"
;;;             или nil - считать по именам блоков
;;;             или список строк, если свойств несколько  - ("Марка балки" "Обозначение" "Профиль")
;;; IgnoreBlockNamePattern - строка, шаблон игнорируемых имен блоков или nil - все блоки
;;;                   Шаблон задается строкой, аналогично шаблону функции wcmatch
;;;                   Несколько шаблонов разделяются запятой
;;;                   Безразлична к регистру букв
;;;                   "A$C*,*НЕТ*,МАР*" - будут пропущены блоки с именами, начинающимися на A$C и МАР
;;;                   а тек же блоки, в имени которых есть сочетание НЕТ
;;;                  Шаблон для динамических блоков применяется к эффективному имени!!!
  ;;                   Примеры нескольких шаблонов
;;;                 "#* - исключить блоки, начинающиеся с цифры
;;;                 "#Бл* - исключить блоки, начинающиеся с цифры и следующие буквы которых БЛ (1Блок 2БЛОК и т.п.)
;;;                 "Формат" - исключить блок с именем формат
;;;                Возвращает список списков точечных пар, состоящих из
;;;                -  Имени блока и имени свойства, разделенных символом "|"
;;;                - количества
;;;                Пример
;;;               (("1Двутавр Широкополочный|25Ш1" . 2) ("Уголок равнополочный|50x5" . 3) ("Швеллер П|10П" . 1))
;;;  CountProp - динамическое свойство для суммирования или nil - счетчик  
  ;; Или список нескольких свойств
;;;Пример вызова:
;;; (blockcount1 nil nil nil)
;;; (blockcount1 "Видимость" nil nil)
;;; (blockcount1 '("Марка балки" "Обозначение" "Профиль") "A$C*,#*" nil) ;_Игнорировать блоки, начинающиеся с A$C и цифры
;;; (blockcount1 '("Марка балки" "Обозначение" "Профиль") "A$C*" nil)  ;_Игнорировать блоки, начинающиеся с A$C

  (defun _getvalue ()
    (cond
      ((and
         (= (type CountProp) 'Str)
         (numberp (GetDynamicBlockPropertyNameValue blk Countprop))
       ) ;_ end of and
       (GetDynamicBlockPropertyNameValue blk Countprop)
      )
      (1)
    ) ;_ end of cond
  ) ;_ end of defun
  (vl-load-com)
  (setq IgnoreBlockNamePattern
         (strcase
           (mip-conv-to-str IgnoreBlockNamePattern)
         ) ;_ end of strcase
  ) ;_ end of setq
  (if (= (type DynPropetyName) 'STR)
    (setq DynPropetyName (list DynPropetyName))
  ) ;_ end of if
  (setq DynPropetyName (mapcar 'mip-conv-to-str DynPropetyName))
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (setq selset (ssget '((0 . "INSERT"))))
    (progn
      (foreach blk
               (mapcar
                 'vlax-ename->vla-object
                 (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
               ) ;_ end of mapcar 
        (setq
          name (cond
                 ((and (vlax-property-available-p blk 'isdynamicblock)
                       (= (vla-get-isdynamicblock blk) :vlax-true)
                  ) ;_ end of and
                  (if (and DynPropetyName
                           (listp DynPropetyName)
                      ) ;_ end of and
                    (setq
                      DynProp (mapcar
                                '(lambda (X)
                                   (GetDynamicBlockPropertyNameValue
                                     blk
                                     X
                                   ) ;_ end of GetDynamicBlockPropertyNameValue
                                 ) ;_ end of lambda
                                DynPropetyName
                              ) ;_ end of mapcar
                    ) ;_ end of setq
                    (setq DynProp '("дин. блок"))
                  ) ;_ end of if
                  (vla-get-effectivename blk)
                 )
                 (t
                  (setq DynProp '("обычный блок"))
                  (vla-get-name blk)
                 )
               ) ;_ end of cond 
        ) ;_ end of setq
        (setq DynProp (vl-remove-if 'null DynProp))
        (if (not (wcmatch (strcase name) IgnoreBlockNamePattern))
          (foreach DynP DynProp
            (setq nameX (strcat name "|" (mip-conv-to-str DynP)))
            (if (member nameX (mapcar 'car res))
              (setq res
                     (subst (cons nameX
                                  (+ (_getvalue) (cdr (assoc nameX res)))
                            ) ;_ end of cons
                            (assoc nameX res)
                            res
                     ) ;_ end of subst
              ) ;_ end of setq
              (setq res (append res (list (cons nameX (_getvalue)))))
            ) ;_ end of if
          ) ;_ end of foreach DynP
        ) ;_ end of if
      ) ;_ end of foreach Blk
      (setq
        name (mapcar '(lambda (x / p1 txt)
                        (list
                          (setq p1 (substr (setq txt (car x))
                                           1
                                           (vl-string-position 124 txt)
                                   ) ;_ end of substr
                          ) ;_ end of setq
                          (substr (vl-string-left-trim p1 txt) 2)
                          (mip-conv-to-str (cdr x))
                        ) ;_ end of list
                      ) ;_ end of lambda
                     res
             ) ;_ end of mapcar
      ) ;_ end of setq
      (setq name (cons (list "Имя" "Значение" "Количество") name))
      (setq lst (mapcar '(lambda (a) (apply 'max (mapcar 'strlen a)))
                        (apply 'mapcar (cons 'list name))
                ) ;_ end of mapcar
      ) ;_ end of setq
      (setq name (mapcar '(lambda (zz)
                            (mapcar '(lambda (txt cnt)
                                       (setq cnt (+ cnt 3))
                                       (while (< (strlen txt) cnt)
                                         (setq txt (strcat txt " "))
                                       ) ;_ end of while
                                     ) ;_ end of lambda
                                    zz
                                    lst
                            ) ;_ end of mapcar
                          ) ;_ end of lambda
                         name
                 ) ;_ end of mapcar
      ) ;_ end of setq
      (foreach item name
        (terpri)
        (mapcar 'princ item)
      ) ;_ end of foreach 
      (terpri)
      (princ)
    ) ;_ end of progn 
  ) ;_ end of if
  (terpri)
  res
) ;_ end of defun
;;; подсчет динамических блоков
;;;Опубликовано  http://dwg.ru/f/showthread.php?t=17333
;;;Возвращает список всех свойст динамического блока в виде списка
;;;((Имя_свойства Текущее_значение Vla_объект_свойства)...)

(defun GetDynamicBlockPropertyList (obj / lstProperties tmp)
;;; obj - vla-object  
;;; Returns a list of all the properties of a dynamic block in a list
;;; ((Property_name current_value Vla_object_of_properties )...)  

  ;;Возвращает список всех свойст динамического блока в виде списка 
                                                  ;((Имя_свойства Текущее_значение Vla_объект_свойства)...) 
  ;; obj - Vla-указатель дин блока (vla-object) 
  ;;Пример 
  ;;(GetDynamicBlockPropertyList (vlax-ename->vla-object(car(entsel "\nВыбeри дин блок:")))) 
  ;;(("Видимость" "Канализация" #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 15246fe4>) 
  ;;   ("Угол" 0.115395 #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 15240fe4>) ...) 

  (if (and (vlax-property-available-p obj "IsDynamicBlock")
           (= (vla-get-isdynamicblock obj) :vlax-true)
           (setq
             tmp (vlax-variant-value (vla-getdynamicblockproperties obj))
           ) ;_ end of setq
           (>= (vlax-safearray-get-u-bound tmp 1) 0)
           (setq lstProperties (vlax-safearray->list tmp))
      ) ;_ end of and
    (progn
      (mapcar '(lambda (x)
                 (list (vla-get-propertyname X)
                       (vlax-variant-value (vla-get-value X))
                       x
                 ) ;_ end of list
               ) ;_ end of lambda
              lstProperties
      ) ;_ end of mapcar
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
;; obj - Vla-указатель дин блока (vla-object)
;; PropertyName - имя свойства (string)
(defun GetDynamicBlockPropertyNameValue (obj PropertyName / Plist)
  (and
    (setq PropertyName (strcase PropertyName))
    (setq Plist (GetDynamicBlockPropertyList obj))
    (setq Plist (car (vl-remove-if-not
                       '(lambda (x)
                          (= (strcase (car x)) PropertyName)
                        ) ;_ end of lambda
                       Plist
                     ) ;_ end of vl-remove-if-not
                ) ;_ end of car
    ) ;_ end of setq
  ) ;_ end of and
  (cadr Plist)
) ;_ end of defun
(defun mip-conv-to-str (dat)
  (cond ((= (type dat) 'INT) (setq dat (itoa dat)))
        ((= (type dat) 'REAL) (setq dat (rtos dat 2 12)))
        ((null dat) (setq dat ""))
        (t (setq dat (vl-princ-to-string dat)))
  ) ;_ end of cond
) ;_ end of defun
Для файла примера, приведенном в этом посте
вызов функции будет выглядеть так
Код:
[Выделить все]
(blockcount1
 "Distance"    ;_группировать по дин свойству "Distance"
  nil              ;_ включая все блоки
 "Distance1") ;_суммировать значение дин свойства "Distance1"
Пример ввиде команды c выводом в excell
Код:
[Выделить все]
 
(defun C:TEST (/ lst)
  (and
    (setq lst
           (blockcount1 "Distance" nil "Distance1") 
    ) ;_ end of setq
    (setq
      lst (mapcar '(lambda (x)
                     (append (str-str-lst (car x) "|") (list (cdr x)))
                   ) ;_ end of lambda
                  lst
          ) ;_ end of mapcar
    ) ;_ end of setq
    (xls lst '("Имя" "Свойство" "Количество") nil nil)
  ) ;_ end of and
) ;_ end of defun
Функцию xls брать из поста #14
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.01.2012, 13:43
#31
Rainbow.dgw

САПР
 
Регистрация: 26.12.2011
Москва
Сообщений: 16
<phrase 1=


VVA, почему-то после отработки программы дублируется результат еще и в строчку. Как это убрать, подскажите, пожалуйста.
Вложения
Тип файла: dwg
DWG 2004
Test blockcount.dwg (88.0 Кб, 1827 просмотров)
Rainbow.dgw вне форума  
 
Непрочитано 16.01.2012, 19:42
1 | #32
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Rainbow.dgw,
1. Программу из какого поста используешь?
2. Ищи строчку
Код:
[Выделить все]
(mapcar 'princ item)
и закоментарь ее (поставь в начале строки ; (точка с запятой))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.01.2012, 12:24
#33
Rainbow.dgw

САПР
 
Регистрация: 26.12.2011
Москва
Сообщений: 16
<phrase 1=


VVA, использую программу выложенную 20.03.2008, 14:34.
Строчку нашла и закомментировала, правда результат не тот. Мне наоборот хотелось, чтоб данные остались, которые выводятся в виде таблички, а не в строчку.
И еще один вопрос, для вызова комманды (blockcount '("Марка балки" "Обозначение" "Профиль") "A$C*") есть какая-то более короткая запись вызывающей функции?
Rainbow.dgw вне форума  
 
Непрочитано 17.01.2012, 14:40
#34
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Rainbow.dgw Посмотреть сообщение
чтоб данные остались, которые выводятся в виде таблички, а не в строчку
В строчку выводится возврат функции (для дальнейшего использования)
Цитата:
Сообщение от Rainbow.dgw Посмотреть сообщение
есть какая-то более короткая запись вызывающей функции?
Ее нетрудно самому написать
В виде функции
Код:
[Выделить все]
(defun myblockcount ()(blockcount '("Марка балки" "Обозначение" "Профиль") "A$C*")(princ))
Вызывать (myblockcount)
В виде команды
Код:
[Выделить все]
(defun C:myblockcount ()(blockcount '("Марка балки" "Обозначение" "Профиль") "A$C*")(princ))
Здесь же и решена проблема №1 (обрати внимание на (princ) )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.01.2012, 10:40
#35
Rainbow.dgw

САПР
 
Регистрация: 26.12.2011
Москва
Сообщений: 16
<phrase 1=


VVA, покажите, пожалуйста, как и куда добавить.
Я добавляю сама работает через командрую строку, но когда вызываю через кнопку на панели выдает ошибу "Команда: (myblockcount) ; ошибка: no function definition: BLOCKCOUNT"
Rainbow.dgw вне форума  
 
Непрочитано 24.01.2012, 11:55
#36
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


1. Функции myblockcount и blockcount должны быть описаны в одном файле lsp. Пусть для примера его имя будет myblockcount.lsp
2. Файл должен находится в путях доступа Автокада
3. Кнопка:
Код:
[Выделить все]
^C^C(if (null myblockcount)(load "myblockcount.lsp"))(myblockcount)
PS. пишу по памяти без проверки, но должно работать
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.01.2012, 14:31
#37
Rainbow.dgw

САПР
 
Регистрация: 26.12.2011
Москва
Сообщений: 16
<phrase 1=


VVA, спасибо большое.
Rainbow.dgw вне форума  
 
Автор темы   Непрочитано 25.06.2012, 15:05
#38
AAI


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


Кодом из #10 не считается блок. Выдает общее количество блоков без разделение на видимости.
Что не так, подскажите пожалуйста.

Проблема локализована. В блоке переименован visibility на visibility1.
Вложения
Тип файла: dwg
DWG 2007
22_Эвакуационный указатель.dwg (745.2 Кб, 1881 просмотров)

Последний раз редактировалось AAI, 25.06.2012 в 15:27.
AAI вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > подсчет динамических блоков

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сквозная нумерация динамических блоков zenon Программирование 214 28.08.2020 08:45
Руководство по созданию динамических блоков tanushka_ch Динамические блоки 20 25.11.2015 20:46
Проблема вставки Динамических блоков Владимир М Программирование 11 12.09.2007 15:42
Игра -Пятнашки- С использованием динамических блоков Gig Динамические блоки 1 11.12.2006 10:32
Библиотека динамических блоков Коробейников Алексей Динамические блоки 2 05.04.2005 16:08