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

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

Подсчет блока с аттрибутами.

Ответ
Поиск в этой теме
Непрочитано 04.12.2006, 23:45 #1
Подсчет блока с аттрибутами.
Джек
 
Строительство
 
Нижний Новгород
Регистрация: 03.09.2003
Сообщений: 81

Привет всем!!!
Не ругайте за поиск - не нашел.
Можно подсчитать количество блоков с разными значениями атрибутов.
Т.е. имя блока один тот же , только значения разные.
Например на чертеже блок "переход" только значения аттребута у него 100х80 и 50х40.
И когда запускае прогу - она подсчитывала:
Переход 100х80 - 1 шт
Переход 50х40 - 1 шт.
Спасибо
Просмотров: 3335
 
Непрочитано 05.12.2006, 09:47
#2
ытя


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


_eattext (Tools -> Attribute Extraction)
ытя вне форума  
 
Непрочитано 05.12.2006, 12:27 Re: Подсчет блока с аттрибутами.
#3
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Джек
Привет всем!!!
Не ругайте за поиск - не нашел.
Можно подсчитать количество блоков с разными значениями атрибутов.
Т.е. имя блока один тот же , только значения разные.
Например на чертеже блок "переход" только значения аттребута у него 100х80 и 50х40.
И когда запускае прогу - она подсчитывала:
Переход 100х80 - 1 шт
Переход 50х40 - 1 шт.
Спасибо
Собрал на скорую руку, проверять некогда,
попробуй сам:

Код:
[Выделить все]
;; written by Tony Tanzillo
;; Список точечных пар атрибутов и их значений

(defun getatts (e / attlist)
  (while (= (cdr (assoc 0 (entget (setq e (entnext e))))) "ATTRIB")
    (setq attlist (cons	(cons (cdr (assoc 2 (entget e)))
			      (cdr (assoc 1
					  (entget
					    e
					  )
				   )
			      )
			)
			attlist
		  )
    )
  )
  (reverse attlist)
)

;; library function #51.  written by Fatty
;; Группировка одинаковыx одинаковых элементов
;; с подсчетом сумм элементов итерационным методом
;; аргументы - любые простые элементы (не списки и не NIL)
;; результат - список в виде субсписков, где первым
;; стоит элемент, вторым - сумма этого элемента в
;; в общем списке

  (defun group-by-value (lst / ret tmp)
  (while (car lst)
  (setq tmp (list (vl-remove-if-not (function (lambda (a)
			(equal a (car lst) 1e-12))) lst)))
  (setq ret (cons (car tmp) ret))
  (setq lst (vl-remove-if (function (lambda (a)
			(equal a (car lst) 1e-12))) lst))
  (setq tmp nil))
  (setq ret (mapcar (function (lambda (x)
		(list (car x) (length x)))) (reverse ret)))
    )

  ;; Подсчет количества атрибутов и группировка их
  ;; по одинаковым значениям из набора блоков

   (defun group-from-ss-by-value (ss tag sort / atts data en i uniq)
     (setq i -1)
     (repeat (sslength ss)
       (setq en (ssname ss (setq i (1+ i))))
       (setq atts (getatts en))
       (setq uniq (assoc tag atts))
       (setq data (cons (cdr uniq) data))
     )
     (if sort
     (vl-sort (group-by-value data)
	      (function	(lambda	(a b)
			  (< (car a) (car b))
			)
	      )
     )
       (group-by-value data)
   )
)

;; 		main part		;

(defun C:test()
  (setq bname (getstring t "\nEnter block name (case-non-sensitive): ")
	atag (strcase (getstring t "\nEnter tag to count (case-non-sensitive): ")))
  (if
  (setq ss (ssget (list (cons 0 "INSERT")
			(cons 2 bname)
			(cons 66 1))))
  (progn
    (setq output (group-from-ss-by-value ss atag T))
    (alert (vl-princ-to-string output)))
    (alert "Nothing selected")
  )
    (princ)
  )

; TesT : (C:test)
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 05.12.2006, 22:52
#4
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Fatty спасибо за лисп - но я не понял как он работает.
Мне бы хотелось секущей рамкой выделить объект
и прога подсчитывает значения отрибутов.
Блок у меня один "переход". :roll:
Джек вне форума  
 
Непрочитано 06.12.2006, 00:41
#5
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Джек
Fatty спасибо за лисп - но я не понял как он работает.
Мне бы хотелось секущей рамкой выделить объект
и прога подсчитывает значения отрибутов.
Блок у меня один "переход". :roll:
Тогда измени основную программу, хотя я против, когда
что-то пишется для одого конкретного значения, тем более
мне не известен таг (имя) атрибута
А выбирать можешь любым способом, рамкой тоже

Код:
[Выделить все]
;;       main part      ; 

(defun C:test() 
  (setq bname "переход" 
   atag (strcase (getstring  "\nИмя атрибута без учета регистра : "))) 
  (if 
  (setq ss (ssget (list (cons 0 "INSERT") 
         (cons 2 bname) 
         (cons 66 1)))) 
  (progn 
    (setq output (group-from-ss-by-value ss atag T)) 
    (alert (vl-princ-to-string output))) 
    (alert "Nothing selected") 
  ) 
    (princ) 
  ) 

; TesT : (C:test)
>'J'<
fixo вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подсчет блока с аттрибутами.