Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Павел55 от 03-09-2020, 10:19:31

Название: Объединение слоев
Отправлено: Павел55 от 03-09-2020, 10:19:31
Существует ли способ объединить слои, или нужно перебирать все объекты на слоях и переносить в другой слой, а этот удалять?
Название: Re: Объединение слоев
Отправлено: Александр Ривилис от 03-09-2020, 10:28:06
Существует ли способ объединить слои, или нужно перебирать все объекты на слоях и переносить в другой слой, а этот удалять?
Слой - это свойство примитива, а не какая-то отдельная сущность. И поэтому единственный способ - это изменить слой у примитива. Кстати, "перебрать все объекты на слоях" - это не вполне тривиальная операция в общем случае. Ведь объект (примитив) не обязательно прямо находится в пространстве модели/пространстве листа - он может входить в состав какого-нибудь блока, который еще куда-то вставлен.
Название: Re: Объединение слоев
Отправлено: Александр Ривилис от 03-09-2020, 11:01:01
Чтобы было понятнее можно использовать MGDDBG для анализа:

(https://live.staticflickr.com/65535/50300749116_d0dd6f6be5_o.png)

Здесь у меня окружность на слое TestLayer, еще одна окружность и отрезок внутри блока с именем "А" тоже на слое TestLayer и сам блок вставлен на слой TestLayer. Поэтому менять слой придётся у четырёх примитивов, два из которых внутри блока.
Название: Re: Объединение слоев
Отправлено: avc от 03-09-2020, 11:16:30
Кстати, "перебрать все объекты на слоях" - это не вполне тривиальная операция в общем случае.
Вроде бы тривиально. Достаточно перебрать всю таблицу блоков и все объекты внутри BTR. Это даже не рекурсия.
Или еще где-то в словарях могут быть ссылки на слои?
Возможно возникнут проблемы со слоями внешних ссылок - у них двойные имена и другая database.
Название: Re: Объединение слоев
Отправлено: Привалов Дмитрий от 03-09-2020, 11:18:04
Существует ли способ объединить слои, или нужно перебирать все объекты на слоях и переносить в другой слой, а этот удалять?

Уточни, какая задача главная?
Если главная задача, удалить слой, то необходимо, чтобы на слой не ссылались объекты.
Тогда изменить свойства LayerId у всех блоков и примитивах в них может оказаться недостаточно.

Удалению скорее всего могут помешать proxy, фильтры слоев и что-нибудь еще, что может ссылаться на слой.
Название: Re: Объединение слоев
Отправлено: Александр Ривилис от 03-09-2020, 11:19:46
Возможно возникнут проблемы со слоями внешних ссылок - у них двойные имена и другая database.
Ну это даже смысла нет обсуждать. Речь же идёт про изменение имени слоя...
Название: Re: Объединение слоев
Отправлено: Павел55 от 03-09-2020, 14:11:47
Уточни, какая задача главная?
Задача объединить слои, а именно, перенести все объекты из объединяемых слоев в один и удалить остальные. Пока что буду перебором всех объектов решить эту задачу, а там по ходу посмотрим что будет мешать удалению.
Название: Re: Объединение слоев
Отправлено: Привалов Дмитрий от 03-09-2020, 15:03:57
Задача объединить слои, а именно, перенести все объекты из объединяемых слоев в один и удалить остальные.
вторую часть задачи лучше сформулируй так "...и удалить, если не используются."
..иначе она станет основной по времени.

Ищи по форуму  Database.Purge
Есть Database.Purge, которая позволяет определить можно ли безболезнено удалять.
Название: Re: Объединение слоев
Отправлено: Александр Ривилис от 03-09-2020, 16:00:05
Пока что буду перебором всех объектов решить эту задачу
Перебирать где будешь?
Название: Re: Объединение слоев
Отправлено: Павел55 от 03-09-2020, 16:35:58
Перебирать где будешь?
В BlockTable.
Название: Re: Объединение слоев
Отправлено: Александр Ривилис от 03-09-2020, 16:40:16
В BlockTable.
В BlockTable нет примитивов и соответственно нет слоёв. Наверное ты имеешь в виду все BlockTableRecord в BlockTable, как предложил  avc.
Название: Re: Объединение слоев
Отправлено: Павел55 от 03-09-2020, 16:48:59
В BlockTable нет примитивов и соответственно нет слоёв. Наверное ты имеешь в виду все BlockTableRecord в BlockTable, как предложил  avc.
Ага, это и имел в виду.