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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как удалить неиспользуемый слой? (.NET API AutoCAD C#)

Как удалить неиспользуемый слой? (.NET API AutoCAD C#)

Ответ
Поиск в этой теме
Непрочитано 21.03.2014, 00:57 #1
Как удалить неиспользуемый слой? (.NET API AutoCAD C#)
лузер
 
Изучение .NET ACAD2010/BRICS14
 
Москва
Регистрация: 26.01.2014
Сообщений: 30

Задача - по строковому значению "имя_слоя" проверить, используется ли слой с таким именем, и если нет, то удалить его. В типе LayerTable есть метод Has на проверку, что слой с таким именем есть в таблице слоев. Еще есть метод Add чтобы добавить к слоям новый слой в виде переменной типа LayerTableRecord. А как стирать слои я не нашел. Подскажите пожалуйста.
И если у кого есть готовая программа на стирание лишних слоев, тоже выложите
Просмотров: 6002
 
Непрочитано 21.03.2014, 01:58
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


А метода Delete разве нет?
gomer вне форума  
 
Непрочитано 21.03.2014, 04:39
#3
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от gomer Посмотреть сообщение
А метода Delete разве нет?
Есть метод Erase у LayerTableRecord, как впрочем и у любого другого наследника DBObject
лузер, надеюсь ты убедился что слой действительно не используется (Database.Purge тебе в помощь) и это не один из встроенных слоев (типа "0", "DEFPOINTS")
Александр Ривилис вне форума  
 
Непрочитано 21.03.2014, 22:05
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Можешь взять за основу
Код:
[Выделить все]
        [CommandMethod("ULL")]
        public void DELunLays()
        {
            var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            var ed = doc.Editor;

            List<string> lays = new List<string>();

            try
            {
                using (var db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database)
                {

                    using (var tr = db.TransactionManager.StartTransaction())
                    {

                        using (var lt = (LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead))
                        {
                            lt.GenerateUsageData();


                            foreach (ObjectId layId in lt)
                            {
                                var ltr = (LayerTableRecord)tr.GetObject(layId, OpenMode.ForRead);

                                if (!ltr.IsUsed)
                                {
                                    lays.Add(ltr.Name);
                                }
                            }

                            lt.UpgradeOpen();

                            foreach (string layname in lays)
                            {
                                var ltr = (LayerTableRecord)tr.GetObject(lt[layname], OpenMode.ForWrite);
                                if (db.Clayer!=lt[layname])
                                ltr.Erase();// may use also: ltr.Erase(true);

                            }

                            lt.GenerateUsageData();//   repeat  optional //
                            ed.Regen();
                            tr.Commit();
                        }

                    }

                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
            }
        }
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 22.03.2014, 01:57
#5
лузер

Изучение .NET ACAD2010/BRICS14
 
Регистрация: 26.01.2014
Москва
Сообщений: 30


Код Олега еще не смотрел, пока что Purge() пробовал. Почему-то слои не удаляются, хотя должны:

_AcAp.Application.ShowAlertDialog("убедиться что массив не пустой: " + oid[0].Length);
ObjectIdCollection oidc = new ObjectIdCollection(oid[0]);
database2.Purge(oidc);

Здесь oid[1][] - массив ObjectId, слои из LayerTable
лузер вне форума  
 
Непрочитано 23.03.2014, 02:02
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от лузер Посмотреть сообщение
Почему-то слои не удаляются, хотя должны:
Кому должны? Описание метода Purge смотрел? Этот метод ничего не удаляет!!! Он только позволяет узнать можно ли безболезненно удалить объект/примитив или нет.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.03.2014, 20:05
#7
лузер

Изучение .NET ACAD2010/BRICS14
 
Регистрация: 26.01.2014
Москва
Сообщений: 30


В описании про метод Purge ничего нет (см. приложенный скриншот). Я посмотрел просто в Intellisense, этот метод принимает аргумент типа ObjectIdCollection. Как понимаю, после применения Purge(oidc) в каком-то поле или свойстве LayerTableRecord должна отобразиться информация bool о взоможности удалить слой? В брикскаде не очень подробная справка
Но я уже решил проблему, просто скопировал код который Олег выкладывал выше. Там проверяется свойство IsUsed и если оно false то слой удаляется. Все нормально, работает. Только добавил к этому список с именами слоев - кандидатов на удаление. Не все там понимаю, но главное уметь применить, а не понять. Например что означает "List<string> lays = new List<string>();" , эти скобки <>, не знаю что это такое
Миниатюры
Нажмите на изображение для увеличения
Название: Скрин Purge.png
Просмотров: 76
Размер:	48.3 Кб
ID:	124965  
лузер вне форума  
 
Непрочитано 23.03.2014, 20:40
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от лузер Посмотреть сообщение
В описании про метод Purge ничего нет (см. приложенный скриншот).

Цитата:
Сообщение от лузер Посмотреть сообщение
Как понимаю, после применения Purge(oidc) в каком-то поле или свойстве LayerTableRecord должна отобразиться информация bool о взоможности удалить слой?
Неправильно понимаешь. После вызова этого метода в ObjectIdCollection останутся только те ObjectID, которые можно безопасно удалить.
Цитата:
Сообщение от лузер Посмотреть сообщение
В брикскаде не очень подробная справка
Я хоть слово говорил о брикскаде? Или вопрос звучал применительно к брикскад? Если бы это было так, то я бы вообще не стал бы вмешиваться, так как понятия не имею что в нем есть и чего в нем нет.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.03.2014, 20:54
#9
лузер

Изучение .NET ACAD2010/BRICS14
 
Регистрация: 26.01.2014
Москва
Сообщений: 30


Будут какие-либо опасности, если удалять слой только полагаясь на свойство layaerTableRecord.IsUsed? Применение Purge() дает более надежный результат? Если Программа.cs такая, что под удаление никак не могут попасть слои "0" и "Defpoints", а удаляются только лишние сгенерированные слои. Сам сгенерировал и сам потом удалил.

"Я хоть слово говорил о брикскаде? Или вопрос звучал применительно к брикскад? Если бы это было так, то я бы вообще не стал бы вмешиваться, так как понятия не имею что в нем есть и чего в нем нет."
Вот видите как хорошо, что Я о Брикскаде ничего не говорил. А то бы Вы и не ответили. На будущее так и буду делать. Брикскад почти ничем не отличается от Автокада по части .NET Api
лузер вне форума  
 
Непрочитано 23.03.2014, 21:02
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от лузер Посмотреть сообщение
Применение Purge() дает более надежный результат?
Как я могу ответить на этот вопрос если ты используешь Брикскад? В AutoCAD - да.
Цитата:
Сообщение от лузер Посмотреть сообщение
А то бы Вы и не ответили.
Ну теперь буду знать и не буду отвечать.
Цитата:
Сообщение от лузер Посмотреть сообщение
Брикскад почти ничем не отличается от Автокада по части .NET Api
Внешне - возможно, хотя "почти" очень условно. А вот что там внутри и насколько одинаково будут себя вести AutoCAD и Брикскад - понятия не имею. Тем более что у меня Брискад не установлен и проверить я не могу.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как удалить неиспользуемый слой? (.NET API AutoCAD C#)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не выключается слой в Autocad Ермак@ AutoCAD 15 06.11.2018 14:12
Копировать лист, удалить слой Пионер AutoCAD 5 22.09.2009 17:31
Удалить слой из фильтра слоев Kotsar AutoCAD 2 13.04.2007 10:27
Помогите удалить слой! Dim@ AutoCAD 14 27.10.2006 14:57
Как удалить слой? дрейк AutoCAD 4 13.07.2005 23:55