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

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

Слияние слоев с сохранением цвета объектов слоя

Ответ
Поиск в этой теме
Непрочитано 01.04.2010, 12:19 #1
Слияние слоев с сохранением цвета объектов слоя
sasha_lif
 
Дизайнер-конструктор
 
Kiev
Регистрация: 29.05.2004
Сообщений: 1,179

скачал морские животные в dwg

В файле имеется куча слоев, каждый слой имеет свой цвет, как закинуть все объекты на нулевой слой, при этом переопределив цвет объектов из ByLayer (для каждого слоя свой) в прямое задание номера этого цвета.

Т.е все объекты должны стать на нулевом слое, но цвет всех объектов должен остаться тот-же

В принципе наверно поможет
LISP. Нормализация блоков текущего файла.
Но там чуть не то.
__________________
Kiev, Ukraine
Просмотров: 14175
 
Непрочитано 01.04.2010, 15:05
#2
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Уже была очень похожая тема http://forum.dwg.ru/showthread.php?t...C+%F1%EB%EE%E8,
но закончилась, похоже, ничем.
Команда laymrg цвета не сохраняет.

Можно считать это топик-ап, но это интересная практическая параллель с темой http://forum.dwg.ru/showthread.php?t=47192.
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 02.04.2010, 11:37
#3
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


АлексЮстасу, так просто закинуть все на один слой не проблема, проблема, как при этом сохранить цвета!
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 02.04.2010, 13:40
#4
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Цитата:
Сообщение от sasha_lif Посмотреть сообщение
АлексЮстасу, так просто закинуть все на один слой не проблема, проблема, как при этом сохранить цвета!
Вижу три принципиальных пути:
1. Не пользоваться этим "преимуществом Автокада" - описанием свойств "по слою", а сразу использовать "прямое" описание свойств. Но это дискуссионно.
2. Попробовать кинуть файл в сторонний продукт, который не имеет описания "по слою" или способен читать описание "по слою" как "прямое". И с прямым описанием и сохранить обратно. Первое, что приходит в голову - MicroStation, но нужно пробовать. Может быть, более опытные подскажут другой продукт.
3. Найти или создать специальную программку слияния слоев (в ToolPack такого нет?), в которой будет опция сохранять не только цвет, но и стили линий и веса.

Попробовал...
Открыл в MicroStation, сохранил в dgn 7-й версии, где не было описания "по слою", сохранил в dwg, открыл в Автокаде:
- потерял стили линий.
- цвета и веса сохранились, и стали описаны прямо.
Теперь нужно сделать пурж и аудит, и можно сливать слои.

Само собой, что при сохранении в старой (7-й) версии могут потеряться современные навороты типа динамических блоков или т.п. Так что нужно быть внимательным.

Последний раз редактировалось АлексЮстасу, 02.04.2010 в 14:06.
АлексЮстасу вне форума  
 
Непрочитано 02.04.2010, 13:56
#5
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Упрощенно.
Смотрим и запоминаем цвет конкретного слоя. С помощью "Быстрого выбора" выбираем объекты на этом слое и в свойствах меняем цвет "ПоСлою" на цвет слоя.
Profan вне форума  
 
Непрочитано 02.04.2010, 14:05
#6
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Цитата:
Сообщение от Profan Посмотреть сообщение
Упрощенно.
Смотрим и запоминаем цвет конкретного слоя. С помощью "Быстрого выбора" выбираем объекты на этом слое и в свойствах меняем цвет "ПоСлою" на цвет слоя.
и так 300-500 раз - по числу слоев...
АлексЮстасу вне форума  
 
Непрочитано 02.04.2010, 14:08
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Это алгоритм для лиспа...
Profan вне форума  
 
Непрочитано 02.04.2010, 15:00
1 | #8
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Вот в общем-то, набросал. Так?
Код:
[Выделить все]
(defun test (/ ss n ent col M-vla_Layers lay)
  (setq	ss	     (ssget "_X")
	n	     0
	M-vla_Layers
		     (vla-get-Layers
		       (vla-get-ActiveDocument (vlax-get-acad-object))
		     )
  )
  (while (setq ent (ssname ss n))
    (setq ent (vlax-ename->vla-object ent)
	  lay (vla-get-Layer ent)
	  col (vla-get-Color (vla-item M-vla_Layers lay))
	  n   (1+ n)
    )
    (vla-put-Layer ent "0")
    (vla-put-Color ent col)
  )
  (princ)
)
Makswell вне форума  
 
Непрочитано 02.04.2010, 15:34
#9
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Цитата:
Сообщение от Makswell Посмотреть сообщение
Вот в общем-то, набросал. Так?
Делает!
Только стили и веса не сохраняет.
И переделывает вообще все - и в невидимых, и в замороженных слоях.
И хорошо бы дать возможность указать слой, в который сливает.
АлексЮстасу вне форума  
 
Непрочитано 02.04.2010, 15:39
#10
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


На блокированных слоях затыкается. Но ведь это только тест.
Profan вне форума  
 
Непрочитано 02.04.2010, 15:56
#11
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Про стили, веса, невидимые и замороженные вроде ничего не говорили.
АлексЮстасу, давай тогда чётко и по порядку опиши, что требуется, а что не требуется. Думаю можно будет это реализовать.

PS Но это уже скорее всего будет в понедельник. Надо отдыхать.
Makswell вне форума  
 
Непрочитано 02.04.2010, 16:00
#12
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Тогда и про блоки не забудь.
Profan вне форума  
 
Непрочитано 02.04.2010, 16:21
#13
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Цитата:
Сообщение от Makswell Посмотреть сообщение
Про стили, веса, невидимые и замороженные вроде ничего не говорили.
АлексЮстасу, давай тогда чётко и по порядку опиши, что требуется, а что не требуется. Думаю можно будет это реализовать.
Здесь укора не было, и быть не могло в принципе

Тема, вообще-то не моя, я в группе советующих...

Поэтому мое сугубо частное мнение:
- обрабатывать элементы только из активных слоев;
- назначать и стили линий, и веса тоже;
- указать, в какой слой переложить.
Дискуссионно: если какое-то свойство совпадает с описанием в слое, в который перекладывается, то сделать это свойство у элементов тоже по слою.

Назвать лисп, например, "merge_layer", но это Вам виднее.

Товарищи с большим опытом, наверное подсказали бы лучше.
Profan - лучше напишет про блоки, я еще не понял, что имелось в виду.

Последний раз редактировалось АлексЮстасу, 02.04.2010 в 16:30.
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 02.04.2010, 18:08
#14
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


Makswell, Спсибо, рыбки из #1 успешно преобразованы
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 05.04.2010, 00:13
#15
Кулик Алексей aka kpblc
Moderator

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


Если еще интересно, то вот один вариант (особо не гонял). Внутри блоков объекты, свойства которым установлены в ByBlock, не меняются.

Код:
[Выделить все]
(vl-load-com)

(defun c:move2layer (/               *error*         obj_acad        adoc            fun_layer-status-save
                     fun_layer-status-restore        file            handle          dcl_id          dcl_res
                     layers          layer_lst       in_block        dest_layer      frozen          layeroff
                     ent_settings    layer_status
                     )

  (defun fun_layer-status-save (/ res)
    (vlax-for item (vla-get-layers adoc)
      (if (not (wcmatch (vla-get-name item) "*|*"))
        (setq res (cons
                    (mapcar
                      (function
                        (lambda (x)
                          (cons x (vlax-get-property item x))
                          ) ;_ end of lambda
                        ) ;_ end of function
                      '("name" "color" "lineweight" "linetype" "freeze" "layeron" "lock")
                      ) ;_ end of mapcar
                    res
                    ) ;_ 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 if
      ) ;_ end of vlax-for
    res
    ) ;_ end of defun

  (defun fun_layer-status-restore (lst / layer)
    (foreach item lst
      (setq layer (vla-item layers (cdr (assoc "name" item))))
      (foreach prop (vl-remove-if (function (lambda (x) (= (car x) "name"))) item)
        (vl-catch-all-apply
          (function
            (lambda ()
              (vlax-put-property item (car prop) (cdr prop))
              ) ;_ end of lambda
            ) ;_ end of function
          ) ;_ end of vl-catch-all-apply
        ) ;_ end of foreach
      ) ;_ end of foreach
    ) ;_ end of defun

  (defun *error* (msg)
    (fun_layer-status-restore layer_status)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (setq obj_acad (vlax-get-acad-object)))))
  (setq layers (vla-get-layers adoc)
        handle (open (setq file
                            (strcat (vl-string-right-trim "\\" (vla-get-tempfilepath (vla-get-files (vla-get-preferences obj_acad))))
                                    "\\dlg.dcl"
                                    ) ;_ end of strcat
                           ) ;_ end of setq
                     "w"
                     ) ;_ end of open
        ) ;_ end of setq
  (foreach item '("dlg: dialog{label=\"Move to layer v.0.1\";"
                  ":popup_list{key=\"dest_layer\";label=\"Помещать в слой\";}"
                  ":toggle{key=\"in_block\";label=\"Обрабатывать внутри блоков\";}"
                  ":toggle{key=\"frozen\";label=\"Обрабатывать замороженные слои\";}"
                  ":toggle{key=\"layeroff\";label=\"Обрабатывать выключенные слои\";}"
                  "ok_cancel;"
                  "}"
                  )
    (write-line item handle)
    ) ;_ end of foreach
  (close handle)
  (setq dcl_id (load_dialog file))
  (new_dialog "dlg" dcl_id)
  (start_list "dest_layer" 3)
  (mapcar 'add_list
          (setq layer_lst
                 (vl-sort
                   (mapcar
                     (function
                       (lambda (x)
                         (cdr (assoc "name" x))
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (setq layer_status (fun_layer-status-save))
                     ) ;_ end of mapcar
                   '<
                   ) ;_ end of vl-sort
                ) ;_ end of setq
          ) ;_ end of mapcar
  (end_list)
  (foreach item '("dest_layer" "in_block" "frozen" "layeroff")
    (action_tile item (strcat "(setq " item " $value)"))
    (set_tile item "0")
    (eval (read (strcat "(setq " item "\"0\")")))
    ) ;_ end of foreach
  (action_tile "Accept" "(done_dialog 1)")
  (action_tile "Cancel" "(done_dialog 0)")
  (setq dcl_res (start_dialog))
  (unload_dialog dcl_id)
  (if (= dcl_res 1)
    (progn
      (setq dest_layer (nth (atoi dest_layer) layer_lst)
            in_block   (= in_block "1")
            frozen     (= frozen "1")
            layeroff   (= layeroff "1")
            ) ;_ end of setq
      (vlax-for blk_def (vla-get-blocks adoc)
        (if (and (equal (vla-get-isxref blk_def) :vlax-false)
                 (or (equal (vla-get-islayout blk_def) :vlax-true)
                     (and (equal (vla-get-islayout blk_def) :vlax-false)
                          in_block
                          ) ;_ end of and
                     ) ;_ end of or
                 ) ;_ end of and
          (vlax-for ent blk_def
            (setq ent_settings (mapcar
                                 (function
                                   (lambda (x / tmp)
                                     (cons (car x)
                                           (if (= (setq tmp (vlax-get-property ent (car x))) (cdr x))
                                             (vlax-get-property (vla-item layers (vla-get-layer ent)) (car x))
                                             tmp
                                             ) ;_ end of if
                                           ) ;_ end of cons
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                                 '(("color" . 256)
                                   ("lineweight" . -1)
                                   ("linetype" . "ByLayer")
                                   )
                                 ) ;_ end of mapcar
                  ent_layer    (car (vl-remove-if-not
                                      (function
                                        (lambda (x)
                                          (= (cdr (assoc "name" x)) (vla-get-layer ent))
                                          ) ;_ end of lambda
                                        ) ;_ end of function
                                      layer_status
                                      ) ;_ end of vl-remove-if-not
                                    ) ;_ end of car
                  ) ;_ end of setq
            (if (or (equal (cdr (assoc "layeron" ent_layer)) :vlax-true)
                    (equal (cdr (assoc "freeze" ent_layer)) :vlax-false)
                    (and layeroff
                         (equal (cdr (assoc "layeron" ent_layer)) :vlax-false)
                         ) ;_ end of and
                    (and freeze
                         (equal (cdr (assoc "freeze" ent_layer)) :vlax-true)
                         ) ;_ end of and
                    ) ;_ end of or
              (progn
                (vla-put-layer ent dest_layer)
                (vla-put-color ent (cdr (assoc "color" ent_settings)))
                (vla-put-lineweight ent (cdr (assoc "lineweight" ent_settings)))
                (vla-put-linetype ent (cdr (assoc "linetype" ent_settings)))
                ) ;_ end of progn
              ) ;_ end of if
            ) ;_ end of vlax-for
          ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of progn
    ) ;_ end of if
  (fun_layer-status-restore layer_status)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Вложения
Тип файла: lsp move2layer.LSP (7.4 Кб, 304 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2010, 03:21
#16
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Сработало. И стала мощнее. И с окном приятнее пользоваться.

Все-таки с точки зрения привычного для всех, кто пользуется описанием свойств "по слою", следовало бы, наверное, делать свойства у элементов "по слою", а не "прямо", если какое-то свойство совпадет с описанием свойств нового слоя. Или как?
АлексЮстасу вне форума  
 
Непрочитано 05.04.2010, 10:33
#17
Кулик Алексей aka kpblc
Moderator

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


Нет уж, "умерла так умерла"
P.S. Если честно, то просто нет времени (и особого желания) на переделку.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2010, 10:47
#18
LSN


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


В G-tools такое есть. Сохраняет типы линии, веса и цвета при слиянии слоев. Только разом все слои на определенный слой перенести нельзя, нужно выбирать по очереди исходный слой и целевой.
LSN на форуме  
 
Непрочитано 06.04.2013, 16:59
#19
off

геодезист
 
Регистрация: 11.11.2006
Ростов-на-Дону
Сообщений: 95
<phrase 1= Отправить сообщение для off с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если еще интересно, то вот один вариант (особо не гонял). Внутри блоков объекты, свойства которым установлены в ByBlock, не меняются.
А как убрать окошко с параметрами чтобы можно было включить выполнение программы в макрос?
off вне форума  
 
Непрочитано 06.04.2013, 17:19
#20
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,074


Цитата:
Сообщение от off Посмотреть сообщение
А как убрать окошко с параметрами чтобы можно было включить выполнение программы в макрос?
Тире перед названием программы не поможет?
АлексЮстасу вне форума  
 
Непрочитано 06.04.2013, 17:22
#21
off

геодезист
 
Регистрация: 11.11.2006
Ростов-на-Дону
Сообщений: 95
<phrase 1= Отправить сообщение для off с помощью Skype™


Нет. Тире вроде только со стандартными командами работает и то не со всеми.
off вне форума  
 
Непрочитано 06.04.2013, 19:31
#22
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


Цитата:
Сообщение от sasha_lif Посмотреть сообщение
скачал морские животные в dwg

В файле имеется куча слоев, каждый слой имеет свой цвет, как закинуть все объекты на нулевой слой, при этом переопределив цвет объектов из ByLayer (для каждого слоя свой) в прямое задание номера этого цвета.

Т.е все объекты должны стать на нулевом слое, но цвет всех объектов должен остаться тот-же

В принципе наверно поможет
LISP. Нормализация блоков текущего файла.
Но там чуть не то.
в имеющемся файле объекты раскрашены "по слою"?
Хмурый вне форума  
 
Непрочитано 06.04.2013, 19:33
#23
off

геодезист
 
Регистрация: 11.11.2006
Ростов-на-Дону
Сообщений: 95
<phrase 1= Отправить сообщение для off с помощью Skype™


Да.
Нашел http://forum.dwg.ru/showpost.php?p=887012&postcount=6. Но там есть выбор объектов. Сейчас заставлю его работать в скрипте и проблема будет решена.

Последний раз редактировалось off, 06.04.2013 в 19:42.
off вне форума  
 
Непрочитано 06.04.2013, 20:25
#24
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


off, ага. Ну, давай. Отпишись, как получится.
Хмурый вне форума  
 
Непрочитано 06.04.2013, 20:45
#25
off

геодезист
 
Регистрация: 11.11.2006
Ростов-на-Дону
Сообщений: 95
<phrase 1= Отправить сообщение для off с помощью Skype™


Сделал. Переносит примитивы в 0 сохраняя свойства. Выполняется несколько раз Purge чтобы очистить от всякого мусора. Далее хочу прописать туда вставку атрибута значение которого будет браться из имени файла. Не знаю получится ли.
Вложения
Тип файла: rar Преобразование.rar (341 байт, 123 просмотров)
off вне форума  
 
Непрочитано 08.04.2013, 16:41
#26
off

геодезист
 
Регистрация: 11.11.2006
Ростов-на-Дону
Сообщений: 95
<phrase 1= Отправить сообщение для off с помощью Skype™


Добавил очистку proxy объектов, предварительно в настройках отключив оповещение об их наличии в чертеже. Т.к. это тормозило работу. Текущий слой выставил в 0, чтобы ненужные слои не использовали эту лазейку. Промежуточный вариант
Код:
[Выделить все]
(load "olay.lsp")
(load "ExplodeProxy2007.arx")
EXPLODEALLPROXY REMOVEALLPROXY _AUDIT _Y _CLAYER 0 olay _all  _-Purge _A  _N _-Purge _A  _N _-Purge _A  _N _-Purge _A  _N _-Purge _A  _N
_SAVEAS 2000 (strcat "GOTOVO\\" (getvar "DWGNAME"))
_QUIT
Пытаюсь добавить еще имя файла в значение атрибута с и использованием команды -attdef. Но не знаю как. Может кто подскажет?
off вне форума  
 
Непрочитано 17.02.2014, 18:53
#27
pentaone


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


off, а как заставить ваш код работать? Что-то ни как не пойму
pentaone вне форума  
 
Непрочитано 17.02.2014, 19:53
#28
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


Цитата:
Сообщение от pentaone Посмотреть сообщение
off, а как заставить ваш код работать? Что-то ни как не пойму
В поиск "как использовать lisp"
__________________
Век живи, век учись - ...
Bull вне форума  
 
Непрочитано 18.02.2014, 08:01
#29
off

геодезист
 
Регистрация: 11.11.2006
Ростов-на-Дону
Сообщений: 95
<phrase 1= Отправить сообщение для off с помощью Skype™


Цитата:
Сообщение от pentaone Посмотреть сообщение
off, а как заставить ваш код работать? Что-то ни как не пойму
Это не lisp, это сценарий. Он используется для обработки группы файлов. Для этого нужно взять лисп на который идет ссылка в #23, взять содержимое архива из еще одного архива. В нем содержится файл сценария и bat файл для его запуска. Я складывал преобразуемые файлы в одну папку со всем этим набором и запускал bat. Создавалась новая папка в которую попадали преобразованные файлы. Если у вас файл один, то заморачиваться не стоит - просто используйте лисп из #23 обычным способом.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от off Посмотреть сообщение
Текущий слой выставил в 0, чтобы ненужные слои не использовали эту лазейку.
После просмотра результата (спустя некоторое время) обнаружил там лишние текстовые и размерные стили ( тоже были текущими и сохранились. Так что если кто будет пользоваться в дальнейшем надо и это прописать (чтобы текущий стиль текста и размерный стиль выставлялись в Стандарт).
off вне форума  
 
Непрочитано 21.09.2017, 08:00
#30
no_ideas


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если еще интересно, то вот один вариант (особо не гонял). Внутри блоков объекты, свойства которым установлены в ByBlock, не меняются.
Добрый день. Отличный лисп. А не подскажите как его можно оптимизировать? Чтобы по умолчанию все три галки стояли, и был выбран другой слой, отличный от 0.
no_ideas вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Слияние слоев с сохранением цвета объектов слоя

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета слоя при переходе из модели в лист milamu AutoCAD 32 09.07.2022 00:20
Для чего нужны фильтры слоев?Как ими пользоваться? Aysulu AutoCAD 43 17.04.2019 10:59
Unreconciled new layers при Xref Red Nova AutoCAD 17 10.01.2019 13:00
Проблемма с изменением цвета слоя tarasn3230 AutoCAD 24 26.11.2009 18:06
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35