Как полностью удалить параметр из проекта?

Автор Тема: Как полностью удалить параметр из проекта?  (Прочитано 7266 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Добрый день!

Допустим, у меня есть параметр, которых я хочу удалить из проекта полностью, чтобы во внутренней БД его не осталось и Revit Lookup его не показывал. Как это сделать вручную, я знаю, но как это сделать через код?
Пробовал через doc.Delete(elemId) - не работает.
Пробовал способ
Код - C# [Выбрать]
  1. public static void DeleteParameter(Document doc, string name, ParameterType type)
  2. {
  3. BindingMap map = doc.ParameterBindings;
  4. DefinitionBindingMapIterator it = map.ForwardIterator();
  5. it.Reset();
  6.  
  7. Definition def = null;
  8. while (it.MoveNext())
  9. {
  10.     if (it.Key != null && it.Key.Name == name && type == it.Key.ParameterType)
  11.     {
  12.         def = it.Key;
  13.         break;
  14.     }
  15. }
  16.  
  17. if (def != null)
  18. {
  19.     map.Remove(def);
  20. }
  21. return;
  22. }
но он тоже не сработал. Что посоветует уважаемый форум?
« Последнее редактирование: 24-01-2017, 10:04:26 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме!
Обрати внимание у меня в подписи как правильно форматировать код на форуме.
Ну а по существу вопроса тебе кто-нибудь ответит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
По существу вопроса нашел несколько ссылок, которые возможно помогут:
http://forums.autodesk.com/t5/revit-api-forum/deleting-a-non-shared-project-parameter/m-p/5979781#M13650 (отличие - запуск транзакции)
http://forums.autodesk.com/t5/revit-api-forum/remove-family-type-parameter/td-p/6674338 (удаление параметра из семейства)
http://adndevblog.typepad.com/aec/2015/08/delete-custom-familyparameter.html (отличие - запуск транзакции)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Александр, спасибо ) Про форматирование принял к сведению.
Посмотрел ссылки, две из них не подходят, так как они про параметр семейства, а у нас параметр проекта. В третьей код аналогичен тому, что я привёл. Но всё равно спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В третьей код аналогичен тому, что я привёл
Транзакция не помогла?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Транзакция не помогла?
Увы. Я свой код внутри транзакции исполнял, и никаких исключений не возникало.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Заодно уточни версию Revit и установленные обновления.
В Revit 2016 Update 5 похоже есть баг: http://forums.autodesk.com/t5/revit-architecture-forum/bug-in-update-release-6-revit-2016-delete-shared-para-comes-back/td-p/6490727
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Hugh 25-01-2017, 15:46:18

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Hugh, у меня стандартный вопрос. Когда пишете
тоже не сработал.
то что происходит? Просто ничего?
Метод BindingMap.Remove возвращает результат типа bool. Можете проверить значение в вашем случае?
Вообще подобная тема уже была. Там я приводил пример кода. Код на удаление прямо сейчас проверил, все работает, все удаляется.

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Revit 17.0.501.0, 20160720_1515(x64), Service Pack 2

Итак, вроде заработало. Не всё, но дальше уже можно разбираться. Я решил упростить код максимально, чтобы он удалял только один конкретный параметр "TestParam". Вот код:
Код - C# [Выбрать]
  1. public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  2. {
  3.     UIApplication uiapp = commandData.Application;
  4.     UIDocument uidoc = uiapp.ActiveUIDocument;
  5.  
  6.     doc = uidoc.Document;
  7.  
  8.     var bindingMap = doc.ParameterBindings;
  9.  
  10.     DefinitionBindingMapIterator it
  11.       = bindingMap.ForwardIterator();
  12.  
  13.     while (it.MoveNext())
  14.     {
  15.         Definition def = it.Key;
  16.  
  17.         if (def.Name.Equals("TestParam"))
  18.         {
  19.             //Запускаем транзакцию
  20.             try
  21.             {
  22.                 using (var t = new Transaction(doc, "Удаляем параметр"))
  23.                 {
  24.                     t.Start();
  25.                     bool Result = bindingMap.Remove(def);
  26.                     t.Commit();
  27.                     TaskDialog.Show("Удаление параметра", Result ? "Удалён" : "Не удалён");
  28.                     break;
  29.                 }
  30.             }
  31.             catch (Exception exp)
  32.             { Log.Write(exp); }
  33.  
  34.         }
  35.     }
  36.  
  37.     return Result.Succeeded;
  38. }//Execute

Я запустил его и Revit Lookup больше мне этот параметр не показывает.

Правда, в процессе отладки у меня внезапно случился крах: FatalExecutionEngineError, который никак не обрабатывался. Но после обновления до 17.0.1099.0
20161117_1200(x64) 2017.1.1 стало обрабатываться нормально, и причина ошибке была найдена: падал итератор после удаления связывания. Я добавил break и всё стало нормально.

Спасибо всем большое за помощь!

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Столкнулся с такой же проблемой, но в моем случае параметр все равно не удаляется из проекта.
Код - C# [Выбрать]
  1.  private bool UploadProjectParameter(Document doc, string name, ParameterType type)
  2.         {
  3.             BindingMap map = doc.ParameterBindings;
  4.             DefinitionBindingMapIterator it = map.ForwardIterator();
  5.             it.Reset();
  6.  
  7.             Definition def = null;
  8.             while (it.MoveNext())
  9.             {
  10.                 if (it.Key != null && it.Key.Name == name && type == it.Key.ParameterType)
  11.                 {
  12.                     def = it.Key;
  13.  
  14.                     if (def != null)
  15.                     {
  16.                         using (Transaction tr = new Transaction(doc, "Delete parameters"))
  17.                         {
  18.                             tr.Start();
  19.                             bool isDeleted = map.Remove(def);
  20.                             tr.Commit();
  21.                         }
  22.  
  23.                         return true;
  24.                     }
  25.                 }
  26.             }
  27.  
  28.             return false;
  29.         }
  30.  

isDeleted  возвращает true, все преарасно отрабатывает, но в проекте параметр все равно "висит".
Единственное, что заметил, параметр, который не удалается еще находится в группе (RevitLookup) - ParameterElement, возможно его сначала надо удалить оттуда.

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
В итоге получилось, что параметры, которые не удалялись были в материалах, пришлось напрямую обращаться к материалу, чтобы удалить параметр через его Id.
Код - C# [Выбрать]
  1. Parameter parameter = material.LookupParameter(p.ParameterName);
  2. using (Transaction tr = new Transaction(doc, "Delete parameters"))
  3.     {
  4.          tr.Start();
  5.          if (null != parameter && ElementId.InvalidElementId != parameter.Id)
  6.          {
  7.                doc.Delete(parameter.Id);
  8.           }
  9.           tr.Commit();
  10.  }
  11.