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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp

Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp

Ответ
Поиск в этой теме
Непрочитано 02.06.2010, 12:06 #1
Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp
zaraki_kenpachi
 
Регистрация: 02.06.2010
Сообщений: 4

Доброго времени суток, гуру AutoLispa. Сильно не ругайтесь если что не так сделал, я в программирвоании на лиспе ламер.
Обясню сначала глобальную задачу: работаю я в AutoCAD Electrical 2010. Начретил в нем структурную схему системы с блоками автокада Elictrical, которые имеют ряд нужных мне атрибутов (TAG1, DESK1...номера по каталогам и т.д.)
С помощью проги на лиспе хочу для начала сформировать перечень элементов схемы, куда бы автоматически забивались 2 значения атрибутов (TAG1 - позиционное обозначение блока, Desk1 - описание блока).
Для этого лисповская прога должна автоматически перебирать все блоки на чертеже (я их для этого вынес специально в отдельный слой, если найдете какой то другой способ идентификации, подскажите), потом извлекать нужные мне атрибуты и записывать их в нужную мне таблицу.

Формирования списка блоков, лежащих в определнном слое я победил, не могу теперь из каждого блока (из сформированного списка) вытащить нужные мне атрибуты.

Пробовал сначала сделать это обычными лисповскими функциями типа entget, cdr, assoc, но через них он вытаскивает лишь атрибуты вроде имени блока, масштаба по осям X Y Z, и т.п., а мои (нужные мне (пользовательские) атрибуты) как буд-то не видит.

Сегодня прочитал про ActiveX в книге Полещука Н. но разобраться до конца не могу. Написал вот таку прогу
Код:
[Выделить все]
(defun C:USERLINE ()
(vl-load-com)
(setq block_nab (ssget "_X" '(( 8 . "syms"))))
  (if (= block_nab nil)
  (alert "Чертеж не содержит объектов для заполнения перечня элементов")
)
(setq block_len (sslength block_nab))
(setq i 0)
    (repeat block_len
    (setq block_i (ssname block_nab i))
    (setq blockactX_i (vlax-ename->vla-object block_i))
    (setq blockatt_i (vlax-safearray->list (vlax-variant-value (vla-getattributes blockactX_i))))
    (vlax-dump-object blockactX_i T)
    (setq i (1+ i))
    )
 
)
1. Подскажите как дальше получить нужное мне значение атрибута.
2. Что значит HasAttributes (RO) = -1?

Заранее спасибо.

Последний раз редактировалось zaraki_kenpachi, 02.06.2010 в 13:19.
Просмотров: 15552
 
Непрочитано 02.06.2010, 12:34
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,686
Отправить сообщение для Do$ с помощью Skype™


А чем _.dataextraction не устраивает?
Do$ вне форума  
 
Автор темы   Непрочитано 02.06.2010, 13:13
#3
zaraki_kenpachi


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


Это ведь команда автокада, и при ее запуске вылазит диалоговое окно автокад и каждый раз, когда изменится один атрибут хотя бы одного блока, придется выполнять 8 шагов для формирования таблицы (ну может меньше, если настроить файл шаблона). Если вы знаете способ как запрограмить все эти шаги в лиспе, поделитесь.
К тому же не устраивает графическое предстваление выводимой таблицы (толщины линий ячеек, размеры ячеек не соответсвуют форме перечня элементов (ПЭ) по ГОСТ 21.1101). Т.е. каждый раз придется опять настраивать вручную.
К тому же предполагается (в дальнейшем) что прога на лиспе будет строить таблицу ПЭ в обределенной области чертежа и переносить эту таблицу автоматически (если не влезет на формат А3) на другой чертеж, создавая его в новом файле. (не знаю возможно это или нет вообще).
Еще есть проблема: когда заполняю строку описание при вставке блока AutoCad Electrical в диалоговом окне Вставить/редактирвоать компонент , он (автокад) автоматически делает все буквы заглавными, и в таблицу через команду _.dataextraction тоже выводит заглавные буквы, опять же не по ГОСТу, хотелось бы исправить это с помощью лиспа (если опять же возможно), либо как то отключить это из автокада.
zaraki_kenpachi вне форума  
 
Непрочитано 02.06.2010, 13:42
#4
VVA

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


zaraki_kenpachi,
Может это поможет:
1. Как сделать спецификацию с помощью _dataextraction? AutoCAD 2009-2010
2. Почему игнорируется _-ATTEXT и "Извлечение данных из атрибутов (метод низкого уровня)" - название из справки по Автокаду. Выдержку вложил ввиде pdf. Формируется по твоим кратериям текстовый (cdf, sdf) файл. Далее куда угодно - Access, Exel или читать файл лиспом
3.
Цитата:
не могу теперь из каждого блока (из сформированного списка) вытащить нужные мне атрибуты
В этом лиспе опубликованы функции get-all-atts и mip-block-setattr-bylist И других аналогов полно.
Вложения
Тип файла: pdf acad_attext.pdf (101.4 Кб, 1066 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.06.2010, 15:52
#5
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


zaraki_kenpachi, попробуй так:
Код:
[Выделить все]
(defun c:userline ()
  (setq block_nab (ssget "_X" '((8 . "syms"))))
  (if (= block_nab nil)
    (alert "Чертеж не содержит объектов для заполнения перечня элементов"
    ) ;_ конец alert
  ) ;_ конец if
  (setq block_len (sslength block_nab))
  (setq i 0)
  (repeat block_len
    (setq block_i (ssname block_nab i))
    (while
      (eq (cdr (assoc 0 (entget (setq block_i (entnext block_i)))))
	  "ATTRIB"
      ) ;_ конец eq
       (progn
	 (setq bbll_i (entget block_i))
	 (if (eq (cdr (assoc 2 bbll_i))
		 "ИМЯ АТРИБУТА, ЗАДАННОЕ ПОЛЬЗОВАТЕЛЕМ-TAG1 или DESK1"
	     ) ;_ конец eq
	   (ДЕЛАЙ ЧТО НУЖНО, применив (assoc 1 bbll_i))
	 ) ;_ конец if
       ) ;_ конец progn
    ) ;_ конец while
    (setq i (1+ i))
  ) ;_ конец repeat
) ;_ конец defun

Последний раз редактировалось E-degtyarev, 02.06.2010 в 15:59.
E-degtyarev вне форума  
 
Непрочитано 02.06.2010, 17:14
#6
VVA

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


Еще для коллекции
Требуется регистрация
Global Attribute Editor & Extractor
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.06.2010, 07:00
#7
zaraki_kenpachi


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


E-degtyarev, задумка хорошая, мне очень понравилась, но вот трабл в следующем: когда пишу в коде вот так:
Код:
[Выделить все]
(repeat block_len
    (setq block_i (ssname block_nab i))
    (setq ew (entget block_i))
    (print ew)
в командной строке выдает:
Код:
[Выделить все]
((-1 . <Имя объекта: 7ed59080>) (0 . "INSERT") (330 . <Имя объекта: 7ee75cf8>) 
(5 . "1850") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "SYMS") (100 . 
"AcDbBlockReference") (66 . 1) (2 . "МОНИТОР") (10 254.904 172.425 0.0) (41 . 
1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) 
(210 0.0 0.0 1.0))
Т.е. получается, что как буд-то у переменной block_i нет поля "ATTRIB", но как такое может быть, ведь это блок автокадаи когда заходишь в его свойства в автокаде, там есть атрибуты, их имена, значения.

Пробовал вместо "ATTRIB" вставить "AcDbBlockReference" (думал, что это субсписок), но все равно не получилось ничего хорошего.

Хех...не понимаю я еще многого в Лиспе.
zaraki_kenpachi вне форума  
 
Непрочитано 03.06.2010, 08:38
#8
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showthread.php?t=22653 ?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.06.2010, 09:16
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,686
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от zaraki_kenpachi Посмотреть сообщение
Т.е. получается, что как буд-то у переменной block_i нет поля "ATTRIB", но как такое может быть, ведь это блок автокадаи когда заходишь в его свойства в автокаде, там есть атрибуты, их имена, значения.
"ATTRIB" - это не поле, это тип объекта. В переменной block_i сохраняется ename блока, если этот блок содержит атрибут, то выражение: (entnext block_i) вернет как раз ename объекта типа "ATTRIB". Попробуй вместо этого (setq ew (entget block_i)) написать (setq ew (entget (entnext block_i)))
Do$ вне форума  
 
Непрочитано 03.06.2010, 09:27
#10
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


zaraki_kenpachi, по всей видимости сейчас гуру форума порвут меня в лоскуты, но все же посмотри фрагмент кода программы, которая заменяет в штампах чертежа (блоки с именем "osn_nadp1n") значения атрибутов, имеющих имена "FIRMA" и "FIRMA2" с ОАО на ООО НТЦ и с РАССВЕТ на ЗАКАТ соответстввенно.
Работает реально, никаких нареканий не было.
Тебе нужно просто извлечь значения атрибутов, т.е. функцию entmod использовать не нужно. А взамен этого значение атрибута присвоить переменной. (setq xxxxx (cdr (assoc 1 bbll))) или затолкать в список или еще куда...

Код:
[Выделить все]
(defun prs1 ()
  (setq fr_ma1 "  ОАО  ")
  (setq fr_ma2 "  \"РАССВЕТ\"  ")
)
(defun prs2 ()
  (setq fr_ma1 "ООО \"НТЦ")
  (setq fr_ma2 "ЗАКАТ\"")
)
(defun firma (/ dcl_id)
  (setq dcl_id (load_dialog "firma.dcl"))
  (if (not (new_dialog "firma" dcl_id))
    (exit)
    (progn
      (action_tile "OAO" "(prs1)(done_dialog)")
      (action_tile "NTZ" "(prs2)(done_dialog)")
    )
  )
  (start_dialog)
)
(firma)
(setq e (ssget "X" '((0 . "insert")(2 . "osn_nadp1n"))))
(setq ee (sslength e)) 
(setq sk 0)
(repeat ee
  (setq bl (ssname e sk))
(while (eq (cdr (assoc 0 (entget (setq bl (entnext bl)))))
	   "ATTRIB"
       )
  (progn
    (setq bbll (entget bl))
    (if	(eq (cdr (assoc 2 bbll)) "FIRMA")
      (entmod (subst (cons 1 fr_ma1) (assoc 1 bbll) bbll))
    )
    (if	(eq (cdr (assoc 2 bbll)) "FIRMA2")
      (entmod (subst (cons 1 fr_ma2) (assoc 1 bbll) bbll))
    )
  )
)
(setq sk (+ 1 sk))
)

Последний раз редактировалось E-degtyarev, 03.06.2010 в 10:57.
E-degtyarev вне форума  
 
Непрочитано 03.06.2010, 10:14
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,686
Отправить сообщение для Do$ с помощью Skype™


А где файл firma.DCL?
Do$ вне форума  
 
Непрочитано 03.06.2010, 10:21
#12
VVA

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


zaraki_kenpachi, Ты ссылки в постах читаешь? В частности #4 после цитаты и #8? Все уже давно написано. Зачем велосипед изобретать?
Из #4 Пример вынес сюда
Код:
[Выделить все]
(defun get-all-atts (obj)
    ;;;Use (get-all-atts (car(entsel "\nSelect block:")))
    ;;;Returs list  (("TAG1" . "Value1")("TAG2" . "Value2") ...)
(vl-load-com)
    (if (= (type obj) 'ENAME)
		(setq obj (vlax-ename->vla-object obj)))
  (if (and obj
           (vlax-property-available-p obj 'Hasattributes)
	   (eq :vlax-true (vla-get-HasAttributes obj))
      )
    (vl-catch-all-apply
      (function
	(lambda	()
	  (mapcar (function (lambda (x)
			      (cons (vla-get-TagString x)
				    (vla-get-TextString x)
			      )
			    )
		  )
		  (append (vlax-invoke obj 'Getattributes)
			  (vlax-invoke obj 'Getconstantattributes)
		  )
	  )
	)
      )
    )
  )
)
;;; Пример использования
(get-all-atts (car(entsel "\nSelect block:")))
Задать атрибутам TAG1 и DESK1 выбранного блока указанные значения
Код:
[Выделить все]
 (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)))))
(defun mip-block-setattr-bylist (obj att_list / txt lst)
;; obj - Ename or Vla object of block
;; att_list - list ((Tag_Name1 . Value1)(Tag_Name2 . Value2) ...)
;;                 Tag_Name - string
;;                    Value - string
  
(vl-load-com)
(if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
(setq att_list (mapcar '(lambda(x)(cons (strcase (mip-conv-to-str(car x)))(mip-conv-to-str(cdr x)))) att_list))
  (if (and obj
           (not(vlax-erased-p obj))
           (= (vla-get-ObjectName obj) "AcDbBlockReference")
	   (eq :vlax-true (vla-get-HasAttributes obj))
	   (vlax-property-available-p obj 'Hasattributes)
	   (vlax-write-enabled-p obj)
      )
    (vl-catch-all-apply
      (function
	(lambda	()
          (foreach at (vlax-invoke obj 'Getattributes)
            (if (setq lst (assoc(strcase(vla-get-TagString at)) att_list))
              (vla-put-TextString at (cdr lst))
            )
            )
          )
        )
      )
    )
  )
;;;Пример использования
(defun C:TEST ( )
  (setq tag1 "TAG1") ;_ таг 1-го атрибута
  (setq tag2 "DESK1") ;_ таг 2-го атрибута
  (setq str1 (getstring "\nВведите значение для атрибута TAG1: "))
  (setq str2 (getstring "\nВведите значение для атрибута DESK1: "))
  (if (setq blk (car(entsel "\nВыбери блок :")))
    (mip-block-setattr-bylist blk (list (cons tag1 str1)(cons tag2 str2)))
    )
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.06.2010, 10:44
#13
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Do$, DCL файл простейший, например такой.

Код:
[Выделить все]
firma:dialog {
                label = "Замена названия фирмы";
 : button {
             label = "Рассвет";
             key = "OAO";
             }
: button {
             label = "Закат";
             key = "NTZ";
             }
           
cancel_button;
}
E-degtyarev вне форума  
 
Автор темы   Непрочитано 03.06.2010, 12:40
#14
zaraki_kenpachi


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


VVA, да читаю... я все перешарил, что мне предлагали.
Я изучаю Лисп одну неделю... вы даете мне коды, я их по пол дня расшифровываю, чтобы понять что за функции там написаны и что они делают.

Спасибо всем большое, особенно VVA и E-degtyarev.
Поставленную задачу решил ,как раз через функцию get-all-atts .
Наконец то понял как ей пользоваться.
только вызывал я ее просто как (get-all-atts block_i)
Теперь буду двигаться дальше.

________________________

Ай да я мозК
zaraki_kenpachi вне форума  
 
Непрочитано 14.10.2010, 14:14
#15
Сергей Богатов


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


Если задача только в том чтобы сделать перечень элементов, то в Autocad Electrical есть отчёты (с настройкой нужной формы). Помимо перечня элементов там ещё куча различных отчётов на все(практически) случаи проектной жизни
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 16.02.2011, 14:18
#16
IamI


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


Цитата:
Сообщение от Сергей Богатов Посмотреть сообщение
Если задача только в том чтобы сделать перечень элементов, то в Autocad Electrical есть отчёты (с настройкой нужной формы). Помимо перечня элементов там ещё куча различных отчётов на все(практически) случаи проектной жизни
Но ведь отчет нельзя динамически изменять в ту или иную сторону. Тут как быть?
IamI вне форума  
 
Непрочитано 19.02.2011, 15:30
#17
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,092


создавать каждый раз заново, делов -то. только форму настроить так, чтобы в сгенерированной таблице уже ничего не приходилось менять вручную
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массовое редактирование свойств атрибутов блоков kgb Программирование 10 11.10.2019 15:57
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
AutoCAD 2007. Вставка блоков О_о vaca AutoCAD 3 25.12.2009 15:01
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59
прошу помощи AUTOCAD Electrical bag AutoCAD 13 24.05.2005 19:08