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

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

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

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

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

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

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

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

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


Уже была очень похожая тема 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,187
<phrase 1=


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

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


Цитата:
Сообщение от 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,030


Цитата:
Сообщение от 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,030


Цитата:
Сообщение от 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,030


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

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

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

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

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

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

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,187
<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
С.-Петербург
Сообщений: 39,787


Если еще интересно, то вот один вариант (особо не гонял). Внутри блоков объекты, свойства которым установлены в 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 Кб, 288 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2010, 03:21
#16
АлексЮстасу

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


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

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

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


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


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


В 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,030


Цитата:
Сообщение от off Посмотреть сообщение
А как убрать окошко с параметрами чтобы можно было включить выполнение программы в макрос?
Тире перед названием программы не поможет?
АлексЮстасу на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Слияние слоев с сохранением цвета объектов слоя

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета слоя при переходе из модели в лист 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