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

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

как перевести атрибут в слой блока?

Ответ
Поиск в этой теме
Непрочитано 08.01.2009, 20:48 #1
как перевести атрибут в слой блока?
GECK
 
инженер
 
сша
Регистрация: 15.11.2008
Сообщений: 28

как перевести атрибут в слой блока?
имею много разних блоков, в разных слоях, атрибуты у них тоже в разних слоях а мне нужно их все перевести в один слой.
бсе блоки разные, есть отзеркаленные,итд
Просмотров: 5425
 
Непрочитано 08.01.2009, 20:54
#2
Кулик Алексей aka kpblc
Moderator

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


Не понял - атрибуты (всех вхождений) надо перевести в слой, в котором лежит блок? И все?
Код:
[Выделить все]
(defun c:attr-to-layer (/ adoc lst:layers fun_conv-vla-to-list fun_conv-ent-to-vla)

  (defun fun_conv-ent-to-vla (ent_value)
    (cond
      ((= (type ent_value) 'vla-object) ent_value)
      ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
      ) ;_ end of cond
    ) ;_ end of defun

  (defun fun_conv-vla-to-list (value / res)
                              ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar 'fun_conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (fun_conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (fun_conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (member (type value) (list 'ename 'str 'vla-object))
            (setq value (fun_conv-ent-to-vla value))
            (and (= (type value) 'vla-object)
                 (vlax-property-available-p value 'count)
                 ) ;_ end of and
            ) ;_ end of and
       (vlax-for sub (fun_conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun


  (vl-load-com)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (foreach item (fun_conv-vla-to-list (vla-get-layers adoc))
    (if (not (wcmatch (strcase (vla-get-name item)) "*|*"))
      (progn
        (setq lst:layers (cons
                           (list item
                                 (cons "freeze" (vla-get-freeze item))
                                 (cons "lock" (vla-get-lock item))
                                 ) ;_ end of list
                           lst:layers
                           ) ;_ end of cons
              ) ;_ end of setq
        (foreach prop '("freeze" "lock")
          (vl-catch-all-apply
            (function
              (lambda ()
                (vlax-put-property item prop :vlax-false)
                ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of foreach
        ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of foreach
  (foreach blk_def (vl-remove-if
                     (function
                       (lambda (x)
                         (equal (vla-get-isxref x) :vlax-true)
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (fun_conv-vla-to-list (vla-get-blocks adoc))
                     ) ;_ end of vl-remove-if
    (foreach blk_ins (vl-remove-if-not
                       (function
                         (lambda (x)
                           (wcmatch (strcase (vla-get-objectname x)) "*BLOCKREF*")
                           ) ;_ end of lambda
                         ) ;_ end of function
                       (fun_conv-vla-to-list blk_def)
                       ) ;_ end of vl-remove-if-not
      (foreach attr (append
                      (fun_conv-vla-to-list (vla-getattributes blk_ins))
                      (fun_conv-vla-to-list (vla-getconstantattributes blk_ins))
                      ) ;_ end of append
        (vla-put-layer attr (vla-get-layer blk_ins))
        ) ;_ end of foreach
      ) ;_ end of foreach
    ) ;_ end of foreach
  (foreach item lst:layers
    (foreach prop (cdr item)
      (vl-catch-all-apply
        (function
          (lambda ()
            (vlax-put-property (car item) (car prop) (cdr prop))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of foreach
  (vla-regen adoc acallviewports)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 08.01.2009 в 21:54.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.01.2009, 17:07
#3
GECK

инженер
 
Регистрация: 15.11.2008
сша
Сообщений: 28


большое спасибо!
уже опробовал, пашет как часы.
GECK вне форума  
 
Непрочитано 10.01.2009, 15:28
#4
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Опа, а разве слой атрибута не одинаков для всех вхождений одного блока?
Sleekka вне форума  
 
Непрочитано 10.01.2009, 15:36
#5
Кулик Алексей aka kpblc
Moderator

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


Sleekka, да его запросто можно поменять!
Естественно, говорю про вхождения блоков...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.01.2009, 15:42
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Прикольно - не знал.
Sleekka вне форума  
 
Непрочитано 19.01.2009, 19:27
#7
PL


 
Регистрация: 23.11.2006
California
Сообщений: 4,750


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не понял - атрибуты (всех вхождений) надо перевести в слой, в котором лежит блок? И все?
а можно изменить код чтобы он слои не трогал, но всем атрибутам на чертеже менял цвет, например на 77 ?
PL вне форума  
 
Непрочитано 19.01.2009, 23:01
#8
Кулик Алексей aka kpblc
Moderator

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


Можно, конечно. Найди строку
Код:
[Выделить все]
(vla-put-layer attr (vla-get-layer blk_ins))
и замени ее на
Код:
[Выделить все]
(vla-put-color attr 77)
P.S. Писать универсальный код, если честно, лениво до ужаса.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.01.2009, 23:24
#9
PL


 
Регистрация: 23.11.2006
California
Сообщений: 4,750


Отлично, работает. Большое спасибо, Алексей. Удачи.
В этом коде ,по моему, есть проверка на замороженные/и др. слои с разморозкой снятием замка и последующим восстановлением. можно этот код выделить в отдельный?
PL вне форума  
 
Непрочитано 19.01.2009, 23:28
#10
Кулик Алексей aka kpblc
Moderator

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


Не проблема. А нужно ли?
Код разблокировки слоев:
Код:
[Выделить все]
(foreach item (fun_conv-vla-to-list (vla-get-layers adoc))
    (if (not (wcmatch (strcase (vla-get-name item)) "*|*"))
      (progn
        (setq lst:layers (cons
                           (list item
                                 (cons "freeze" (vla-get-freeze item))
                                 (cons "lock" (vla-get-lock item))
                                 ) ;_ end of list
                           lst:layers
                           ) ;_ end of cons
              ) ;_ end of setq
        (foreach prop '("freeze" "lock")
          (vl-catch-all-apply
            (function
              (lambda ()
                (vlax-put-property item prop :vlax-false)
                ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of foreach
        ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of foreach
Обратное возвращение:
Код:
[Выделить все]
(foreach item lst:layers
    (foreach prop (cdr item)
      (vl-catch-all-apply
        (function
          (lambda ()
            (vlax-put-property (car item) (car prop) (cdr prop))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of foreach
Учти, что вторая часть кода использует список, который формирует первая! Если сильно надо (и не горит), напомни - завтра сброшу эти обе части, выделенные в отдельные функции, с пояснениями и прочей лабудой.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.01.2009, 00:12
#11
PL


 
Регистрация: 23.11.2006
California
Сообщений: 4,750


Да надо. Здорово бы было. Ты мне давал отличный код по перекраске чертежа, подоснову делать, там осталось несколько вещей которые хотел подправить-одна из них атрибуты не перекрашивались, другая - код останавливался если слои на замке. Другие проблемы ,по моему, ты сказал трудно решаемы - такие как перекраска обьектов многократно вложенных блоках и перекраска обьектов АДТ.
PL вне форума  
 
Непрочитано 20.01.2009, 00:29
#12
Кулик Алексей aka kpblc
Moderator

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


Перекраску вложенных блоков по идее сделать можно. Но с ADT-шными объектами - глухо Завтра код добью и сделаю (если раньше никто не подключится )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.01.2009, 23:53
#13
Кулик Алексей aka kpblc
Moderator

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


Во, нарисовал работу со слоями. Особо не гонял.
P.S. А перекраску блоков обсуждали здесь
Вложения
Тип файла: lsp _dwgru-layer-status.LSP (5.4 Кб, 96 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.01.2009, 00:41
#14
PL


 
Регистрация: 23.11.2006
California
Сообщений: 4,750


Алексей-Огромное спасибо, надо переварить и потестировать. Про перекраску буду писать в нужной теме.
PL вне форума  
 
Непрочитано 21.01.2009, 18:18
#15
Кулик Алексей aka kpblc
Moderator

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


Если честно, там шло обсуждение "нормализации" блоков. Не совсем "перекраска", но похоже...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как перевести атрибут в слой блока?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
Как перевести объемный чертеж в плоский gress AutoCAD 10 25.05.2011 08:57
Вставка динамического блока - как изменить параметр? vanAvera Программирование 2 23.10.2008 13:39
Как изменить свойства атрибутов блока ALFMario AutoCAD 15 25.01.2008 00:42
Как отсканированное изображение перевести в формат AutoCad 2006 firger77 AutoCAD 1 20.12.2007 11:22