Выбор и удаление всех объектов принадлежащих виду

Автор Тема: Выбор и удаление всех объектов принадлежащих виду  (Прочитано 3118 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн KisliАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Всем доброго времени суток, не могу решить одну проблему. Удаление всех элементов (текст, линии аннотации и прочее) на чертежном виде. Может кто подсказать в каком направлении копать чтобы отфильтровать их?


Код - C# [Выбрать]
  1. //Выбираю и делаю вид по названию, если такой имеется
  2. var sheet = new FilteredElementCollector(doc).OfClass(typeof(View)).Where(a=>a.Name=="Ведомость деталей").First();
  3. uidoc.ActiveView=sheet as View;
  4.  
  5. //A на этой строке выдает аргумент эксепшн                    
  6. var elem = new FilteredElementCollector(doc).OfClass(typeof(Element)).Where(a=>a.OwnerViewId==sheet.Id).ToList();
  7. //Еще так пробовал, но это тоже не работает
  8. var elem = new FilteredElementCollector(doc, sheet.Id).WhereElementIsViewIndependent().ToList();
  9.  

Оффлайн KisliАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
В общем нашел как добавить все что мне необходимо в список удаления, но появилась следующая проблема, вылетает ошибка InvalidOperationExteption. По описанию вроде выходит что итератор не может приводить к изменению базы данных Ревита
и поясняется что это бывает при удалении элементов. Может кто подсказать как все таки удалить все, ну и может кто знает как более красиво решить проблему с фильтрацией нужных объектов?



Код - C# [Выбрать]
  1.  
  2.         //Находим нужный вид
  3.                         var sheet = new FilteredElementCollector(doc).OfClass(typeof(View)).Where(a=>a.Name=="Ведомость деталей").First();
  4.                         //Делаем его активным
  5.                         uidoc.ActiveView=sheet as View;
  6.                        
  7.                         ICollection<ElementId> na = new List<ElementId>();
  8.                         na.Add(sheet.Id);
  9.                        
  10.                         //Создаем фильтр по виду
  11.                         ElementOwnerViewFilter bbf = new ElementOwnerViewFilter(sheet.Id);
  12.                        
  13.                         //Создаем фильтр исключения чтобы в набор удаления не попал сам вид
  14.                         ExclusionFilter noView= new ExclusionFilter(na);
  15.                         LogicalAndFilter summFilter = new LogicalAndFilter(bbf,noView);
  16.                        
  17.                         //Фильтры исключения не сработали поэтому я вручную прописал что название вида не должно быть таким, и некий элемент ExtentElem тоже мне не нужен, не зая правда что это
  18.                         IEnumerable<Element> elem=new FilteredElementCollector(doc).WherePasses(summFilter).Where(a=>a.Name!="Ведомость деталей").Where(a=>a.Name!="ExtentElem");
  19.                        
  20.                        
  21.                        
  22.                         using (Transaction t = new Transaction(doc, "Delete element"))
  23.                         {
  24.                                
  25.                                 t.Start();
  26.                                
  27.                                 foreach (Element e in elem) {
  28.                                        
  29.                                         ElementId id = e.Id;
  30.                                         //Собственно сама ошибка вылезает тут
  31.                                         doc.Delete(id);
  32.                                 }
  33.                                
  34.                                
  35.                                 t.Commit();
  36.                         }
  37.                        
  38.  

Оффлайн KisliАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
В общем решил проблему, но правда выглядит убого, но вроде работает как надо
Код - C# [Выбрать]
  1. //Создаем лист айдишек на удаление
  2. IList<ElementId> deletEl = new List<ElementId>();
  3. //перегоняем все Id элементов в список айдишек на удаление
  4. foreach (Element e in elem) {
  5.         deletEl.Add(e.Id);
  6. }
  7. using (Transaction t = new Transaction(doc, "Delete element"))
  8. {
  9.         t.Start();
  10.         //Теперь можно и удалить
  11.         foreach (ElementId  id in deletEl) {
  12.                
  13.                 doc.Delete(id);
  14.         }
  15.  
  16.         //Profit!
  17.         t.Commit();
  18. }
  19.