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

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

Редактирование атрибутов блока (скрытых и постоянных)

Ответ
Поиск в этой теме
Непрочитано 17.10.2007, 15:56 #1
Редактирование атрибутов блока (скрытых и постоянных)
TheBuTeK
 
преподавание
 
Москваград
Регистрация: 28.09.2005
Сообщений: 131

Возможно ли как-то программно изменить значение скрытых и постоянных атрибутов блоков?
Обращаюсь к блоку и в упор не вижу их, хотя они там есть. Приведенный код находит видимые атрибуты.
Код:
[Выделить все]
(setq CBloсk (entlast))
(setq test1 (vlax-ename->vla-object cbloсk))
(while (setq item (entnext cbloсk))(progn
     (if (= (cdr (assoc 0 (entget item))) "ATTRIB")(progn 
          (setq att (entget item))
          (SetQ ListL1 (cdr(assoc 2 att)))
               ));_if_progn
));_while_progn
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
Просмотров: 6597
 
Непрочитано 17.10.2007, 16:57
#2
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/forum/printtopic.php?t=15784
http://my.opera.com/kpblc/blog/show....68?cid=3672098 (поиск по слову _kpblc-block-attr-get-pointer-mask) Оно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.10.2007, 17:16
#3
VVA

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


А так
Код:
[Выделить все]
(defun get-all-atts (obj)

  (if (and obj
	   (eq :vlax-true (vla-get-HasAttributes obj))
	   (vlax-property-available-p obj 'Hasattributes)
	   
      )
    (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)
		  )
	  )
	)
      )
    )
  )
)
Пример
Код:
[Выделить все]
(setq CBloсk (entlast))
(setq test1 (vlax-ename->vla-object cbloсk))
(get-all-atts test1)
VVA вне форума  
 
Непрочитано 17.10.2007, 17:17
#4
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Код:
[Выделить все]
 
(setq block-name
       (vla-get-name
         (vlax-ename->vla-object (car (entsel "Укажите блок:")))
       ) ;_ end of vla-get-name
) ;_ end of setq
(defun get-atr-block (block-name / lst-ent-name)
  (vlax-for item
                 (vla-item
                   (vla-get-blocks
                     (vla-get-activedocument (vlax-get-acad-object))
                   ) ;_ end of vla-get-blocks
                   block-name
                 ) ;_ end of vla-item
    (cond
      ((= (vla-get-objectname item) "AcDbBlockReference")
       (setq lst-ent-name
              (append lst-ent-name
                      (get-atr-block (vla-get-name item))
              ) ;_ end of append
       ) ;_ end of setq
      )
      ((= (vla-get-objectname item) "AcDbAttributeDefinition")
       (setq lst-ent-name
              (cons (vla-get-TextString item) lst-ent-name)
       ) ;_ end of setq
      )
      (t nil)
    ) ;_ end of cond
  ) ;_ end of vlax-for
  lst-ent-name
) ;_ end of defun
;;;(get-atr-block block-name)
CB вне форума  
 
Автор темы   Непрочитано 17.10.2007, 17:20
#5
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Как всегда безукоризненно!
Косяк мой заключался в том, что я тупо вытаскивал атрибуты с помощью vla-getattributes, а надо было бы vla-getconstantattributes!
В грандиозном труде Николая Николаевича эта функция не описана, будем учиться читать между строк!
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Автор темы   Непрочитано 05.02.2008, 11:54
#6
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Уважаемые гуру, поясните ламеру относительно вызова функции уважаемого VVA.

Такой вызов исправно выдает атрибуты и их тэги в виде списка точечных пар.

Код:
[Выделить все]
(defun att08 ()
(setq CBloсk (entlast))
(setq test1 (vlax-ename->vla-object cbloсk))
(get-all-atts test1)
)
А вот такой вызов приводит к ошибке со следующим сообщением:
error: An error has occurred inside the *error* functionbad
argument type: VLA-OBJECT nil

Код:
[Выделить все]
(defun att08 ()
(setq CBlock (entsel "Выберите блок:"))
(setq test1 (vlax-ename->vla-object cblock))
(get-all-atts CBlock)
)
Разве функции entlast и entsel не дают результат одного и того же типа? Если нет, то в чем разница?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 05.02.2008, 12:00
#7
Кулик Алексей aka kpblc
Moderator

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


Нет, не одного и того же:
entlast -> возвращает ename-указатель на последний созданный примитив
entget -> возвращает список, состоящий из указателя и точки, куда ткнул юзер.
Для работы сделай так:
Код:
[Выделить все]
(defun att08 ()
(setq CBlock (car (entsel "Выберите блок:")))
(setq test1 (vlax-ename->vla-object cblock))
(get-all-atts CBlock)
)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.02.2008, 13:16
#8
VVA

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


В get-all-atts надо передавать не CBlock, а test1
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.02.2008, 13:18
#9
VVA

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


Я бы сейчас еще и в if'е строчки поменял местами
Код:
[Выделить все]
(if (and obj
    (vlax-property-available-p obj 'Hasattributes)
    (eq :vlax-true (vla-get-HasAttributes obj))
      )
...
*** Добавлено
Взять функции _dwgru-conv-ent-to-ename и _dwgru-conv-ent-to-vla
то можно записать так
Код:
[Выделить все]
 
(defun att08 ()
(get-all-atts (_dwgru-conv-ent-to-vla (entsel "Выберите блок:")))
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 05.02.2008 в 13:35.
VVA вне форума  
 
Автор темы   Непрочитано 06.02.2008, 13:43
#10
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


А что дает эта замена?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Автор темы   Непрочитано 06.02.2008, 13:59
#11
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


В развитие темы:
На выходе получается список вида '(("1" . 1) ("3" . 4) ("4" . 5) ("2" . 3)).
Можно ли его одним оператором упорядочить по возрастанию первого элемента точечной пары?
Что-нибудь типа:
Код:
[Выделить все]
(vl-sort '(("1" . 1) ("3" . 4) ("4" . 5) ("2" . 3)) (function (lambda (e1) (<(car e1)))))
Или же необходимо организовать отдельный цикл для сортировки?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 06.02.2008, 14:12
#12
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
_$ (setq lst '(("1" . 1) ("3" . 4) ("4" . 5) ("2" . 3)))
(("1" . 1) ("3" . 4) ("4" . 5) ("2" . 3))
_$ (vl-sort lst '(lambda (a b) (< (car a) (car b))))
(("1" . 1) ("2" . 3) ("3" . 4) ("4" . 5))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.02.2008, 14:13
#13
VVA

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


#10 Так правильней с точки зрения проверки
#11
Код:
[Выделить все]
(setq lst '(("1" . 1) ("3" . 4) ("4" . 5) ("2" . 3)))
(vl-sort lst '(lambda(x y)(< (car x)(car y))))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.02.2008, 14:15
#14
VVA

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


У Алексея сегодня интернет быстрее
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.02.2008, 14:19
#15
VVA

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


Еще замечу, что такая сортировка сортирует строки как строки, т.е
Код:
[Выделить все]
(setq lst '(("11" . 1) ("3" . 4)("1" . 1) ("4" . 5) ("2" . 3)))
(vl-sort lst '(lambda(x y)(< (car x)(car y))))
вернет
(("1" . 1) ("11" . 1) ("2" . 3) ("3" . 4) ("4" . 5))
Т.е сначала единицы ("1" и "11") потом двойки и т.д.
Если надо сортировать строки как числа (чтобы "11" было в конце), то тут нужен немного иной подход
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 06.02.2008, 14:23
#16
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Спасибо, получилось!
Атрибуты пронумерованы 01, 02, 03 .... 11, 12, дабы не возникала необходимость мучаться с подобным преобразованием.
По сути необходимо проводить упорядочивание не самих названий атрибутов, а результата их конвертации в числа, что вдобавок сделать не всегда получится..
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 06.02.2008, 14:25
#17
Кулик Алексей aka kpblc
Moderator

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


> VVA : В таком случае без DwgRuLispLib уже будет тяжко обойтись...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.02.2008, 15:08
#18
VVA

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


#17 Согласен
Цитата:
По сути необходимо проводить упорядочивание не самих названий атрибутов, а результата их конвертации в числа, что вдобавок сделать не всегда получится..
Как говорят в Одессе "У нас их всегда есть .."
Сама функция
Код:
[Выделить все]
;;Published http://www.theswamp.org/index.php?topic=16564.0
;;By VVA --  05.20.07 mods by CAB
;;Usage (SortStringWithNumberAsNumber '("A9" "A1" "A10" "B11" "B2" "B05") nil)
;;With ignore case (SortStringWithNumberAsNumber '("A9" "A1" "A10" "B11" "B2" "B05") t)
;;  CAB added Ignore Case Flag as an argument
;;Return ("A1" "A9" "A10" "B2" "B05" "B11") 
(defun SortStringWithNumberAsNumber (ListOfString IgnoreCase / NorStrs count)
;;;Function Normalize (add 0 befor number) number in string
;;; Count normalize symbols set in variable count
;;; CAB added count as an argument
  (defun NormalizeNumberInString (str count / ch i pat ret buf)
    (setq i   0
          pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
          ret ""
    ) ;_ end of setq
    (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")
      (if (vl-position ch pat)
        (progn
          (setq buf ch) ;_ end of setq
          (while
            (vl-position (setq ch (substr str (setq i (1+ i)) 1)) pat)
             (setq buf (strcat buf ch))
          ) ;_ end of while
          (while (< (strlen buf) count) (setq buf (strcat "0" buf)))
          (setq ret (strcat ret buf))
        ) ;_ end of progn
      ) ;_ end of if
      (setq ret (strcat ret ch))
    ) ;_ end of while
    ret
  ) ;_ end of defun
  ;;-------------------------------------------------
  ;;  function to Count the longest number in string 
  ;;  CAB added to get the correct COUNT
  (defun getcount (lst / count pat)
    (setq count 0)
    (setq pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
    (mapcar
      '(lambda (str / i maxlen ch)
         (setq i 0 maxlen 0)
         (while (/= (setq ch (substr str (setq i (1+ i)) 1)) "")
           (if (vl-position ch pat) ; number
             (setq maxlen (1+ maxlen))
             (setq count  (max count maxlen) maxlen 0)
           )
         )
  (setq count  (max count maxlen)) ;_<<< ADD 21.06.2007 by 
       )
      Lst
    )
    count
  )
  ;;===============================================
  (setq count   (GetCount ListOfString)
        NorStrs (mapcar '(lambda (x) (NormalizeNumberInString x count))
                        ListOfString)
  )
  (and IgnoreCase (setq NorStrs (mapcar 'strcase NorStrs)))
  (mapcar '(lambda (x) (nth x ListOfString)) (vl-sort-i NorStrs '<))
) ;_ end of defun
И примерчик использования
Код:
[Выделить все]
(setq lst '(("11" . 1) ("3" . 4)("1" . 1) ("4" . 5) ("2" . 3)))
(mapcar '(lambda(x)(assoc x lst))
(SortStringWithNumberAsNumber (mapcar 'car lst) t)
 )
Результат
(("1" . 1) ("2" . 3) ("3" . 4) ("4" . 5) ("11" . 1))
Как видно, "11" на своем месте

PS Наверное надо будет оформить как библиотечную ф-цию

PPS
Цитата:
Атрибуты пронумерованы 01, 02, 03
Теперь в этом нет необходимости
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Редактирование атрибутов блока (скрытых и постоянных)

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь атрибутов блока с ячейками таблицы serg01 AutoCAD 29 24.09.2021 18:15
Назначение свойств атрибутов блока без attsync Кулик Алексей aka kpblc Программирование 9 15.08.2017 06:32
изменение свойств атрибутов блока elena_din AutoCAD 8 12.12.2005 14:16
Редактирование блока Nata AutoCAD 11 15.06.2004 08:48