Удаление элементов семейства, созданных в шаблоне семейства

Автор Тема: Удаление элементов семейства, созданных в шаблоне семейства  (Прочитано 7749 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Добрый день. Подскажите пожалуйста, есть такое семейство:
MP_Kermi_Profil-K(22,33).rfa
В нем нельзя удалять элементы, в частности, надпись с названием фирмы, которую разработчики сделали импортированной геометрией и занесли в шаблон семейства.
Этот способ:
Код - C# [Выбрать]
  1. ICollection<ElementId> ElementIds= new FilteredElementCollector(doc)
  2.                                          .OfCategory(BuiltInCategory.OST_MechanicalEquipment).ToElementIds();
  3. doc.Delete(ElementIds);
  4.  
находит 3 элемента и выдает ошибку при удалении: One or more of the elementIds cannot be deleted.
     Данная проблема стоит остро в нашей фирме, т.к. передаваемые нам семейства от этих разработчиков не могут быть использованы при разработке документации и приходится тратить много времени на переделку этих семейств.
     Может у вас будут какие-нибудь идеи как удалить эту надпись или скрыть при оформлении документации?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Pabloa, судя по всему, тут проблема не в API. Я и в интерфейсе не могу удалить эту надпись.


А приведенный код удалит и сам радиатор, так как он тоже Mechanical Equipment. Нужно по другому определить эту надпись

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я тоже не смог удалить надпись в самой программе. Дал BIM'ам поиграться =)

Кстати, вдогонку - в этом семействе есть еще параметры Company и Copyright, которые я также не смог найти и удалить

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Pabloa, судя по всему, тут проблема не в API. Я и в интерфейсе не могу удалить эту надпись.


А приведенный код удалит и сам радиатор, так как он тоже Mechanical Equipment. Нужно по другому определить эту надпись
В интерфейсе не удаляется, да, забыл сказать.
А в какой категории эта надпись я пока не понял. Но думаю, даже если найти ее, все равно doc.delete так же не сработает

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Про параметры я наврал - я их сразу не увидел просто)
А вот не удаляемый элемент - это интересно. Ни вручную, ни программно не удаляется. Как создать такой - мы пока тоже не нашли. Но задачка интересная (в плане - сделать также) - будем думать

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Данная проблема стоит остро в нашей фирме, т.к. передаваемые нам семейства от этих разработчиков не могут быть использованы при разработке документации и приходится тратить много времени на переделку этих семейств.
     Может у вас будут какие-нибудь идеи как удалить эту надпись или скрыть при оформлении документации?
А я не понял вот - в каком месте её видно?
Я вижу её только внутри редактора семейства - в документации (на листах или видах) я ее не вижу

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
А я не понял вот - в каком месте её видно?
Я вижу её только внутри редактора семейства - в документации (на листах или видах) я ее не вижу
Действительно, не видно в проекте. Неправильно меня информировали) Вопрос стоит в том, что фирма может предъявить претензии на основе нарушения авторского права, если не удалить эти надписи. Этих семейств 2000 в проекте. Заказчик требует BIM модель, которая не будет содержать идентификаторов каких-то сторонних организаций. Сторонняя организация делала для нас Архитектурную часть, но удалять эти надписи отказалась.

Отмечено как Решение Павел Тер-Микаэлян 02-02-2018, 19:11:34

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Есть лайфхак, как эту надпись "убрать", не удаляя самого элемента. Вся фишка заключается в том, что ему можно заменить геометрию.
Я проводил тесты с вашим семейством так:
Код - C# [Выбрать]
  1. using Autodesk.Revit.Attributes;
  2. using Autodesk.Revit.DB;
  3. using Autodesk.Revit.UI;
  4.  
  5. namespace Revit_PlanDimensions
  6. {
  7.     [Transaction(TransactionMode.Manual)]
  8.     [Regeneration(RegenerationOption.Manual)]
  9.     public class Test : IExternalCommand
  10.     {
  11.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  12.         {
  13.             var doc = commandData.Application.ActiveUIDocument.Document;
  14.             using (Transaction tr = new Transaction(doc, "TEST"))
  15.             {
  16.                 tr.Start();
  17.  
  18.                 var el = doc.GetElement(new ElementId(14082675)) as FreeFormElement;
  19.                 var el2 = doc.GetElement(new ElementId(14082241));
  20.                
  21.                 foreach (GeometryObject geometryObject in el2.get_Geometry(new Options()))
  22.                 {
  23.                     if (geometryObject is Solid solid)
  24.                     {
  25.                         el?.UpdateSolidGeometry(solid);
  26.                         break;
  27.                     }
  28.                 }
  29.                 tr.Commit();
  30.             }
  31.             return Result.Succeeded;
  32.         }
  33.     }
  34. }
Здесь: 14082675 - идентификатор того самого неудаляемого элемента, 14082241 - идентификатор элемента выдавливания, которым создано оборудование. Радиатор короче =)
После работы кода неудаляемый элемент меняет свою форму на форму оборудования.
Это вот идея, от которой вы можете отталкиваться. Например, можно создать полый элемент выдавливания с размерами 1х1х1 (меньше нельзя) и заменить на его геометрию. Этот элемент потом хрен найдешь в семействе =))
Проблема только в том, что этот код работает при запуске в редакторе семейства. На счет того, чтобы провернуть трюк прям из документа - я не уверен что можно

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Здесь: 14082675 - идентификатор того самого неудаляемого элемента, 14082241 - идентификатор элемента выдавливания, которым создано оборудование. Радиатор короче =)
После работы кода неудаляемый элемент меняет свою форму на форму оборудования.
Это вот идея, от которой вы можете отталкиваться. Например, можно создать полый элемент выдавливания с размерами 1х1х1 (меньше нельзя) и заменить на его геометрию. Этот элемент потом хрен найдешь в семействе =))
Проблема только в том, что этот код работает при запуске в редакторе семейства. На счет того, чтобы провернуть трюк прям из документа - я не уверен что можно
Ого, вот это да)) Спасибо громадное))) вы просто гений)))) бегу тестировать))))

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Александр Пекшев aka Modis, Все получилось, только почему-то надпись удаляется, а не заменяется) Так даже лучше, только я не понял почему.
Этот блок я по другому переписал, а все остальное осталось
Код - C# [Выбрать]
  1.  if (geometryObject is Solid)
  2.                     {
  3.                         el?.UpdateSolidGeometry((Solid)geometryObject);
  4.                         break;
  5.                     }
  6.  
В любом случае, большое вам спасибо :)))

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Все получилось, только почему-то надпись удаляется, а не заменяется)
Она не удаляется, а становится на тоже самое место, где находится элемент из которого вы брали solid. Если брали из радиатора, то просто подвиньте мышкой радиатор и увидите там второй такой-же, только полый

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Этот блок я по другому переписал
Зачем?

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Зачем?
вот здесь if (geometryObject is Solid solid) подчеркивает красным solid, может у меня c# не той версии

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Она не удаляется, а становится на тоже самое место, где находится элемент из которого вы брали solid. Если брали из радиатора, то просто подвиньте мышкой радиатор и увидите там второй такой-же, только полый
Точно) спасибо))

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
может у меня c# не той версии
100%. Это добавили в одной из последних версий