Загрузка существующего семейства с добавленными параметрами в проект

Автор Тема: Загрузка существующего семейства с добавленными параметрами в проект  (Прочитано 6181 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Доброго времени суток. Создал wpf приложение в Revit c добавлением к существующему семейству параметров. Перепробовал многие варианты, включая  "IFamilyLoadOptions", все неудачно. Параметры программа добавляет, если делать через "SaveAs", то проблем нет. Проблема с загрузкой семейства в проект. Ошибок при компиляции не возникает. Думал дело в "IFamilyLoadOptions", но какие могут с ним быть проблемы....
Помогите, пожалуйста найти ошибку, не хотят перезаписываться параметры. ("overwriteParameterValues = true").



Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.IO;
  5. using System.Windows.Forms;
  6. using Autodesk.Revit.ApplicationServices;
  7. using Autodesk.Revit.DB;
  8. using Autodesk.Revit.UI;
  9. using Autodesk.Revit.UI.Selection;
  10. using WPFprog.ViewModel;
  11. using WPFprog.Model;
  12. using System.Linq;
  13.  
  14. namespace WPFprog.Model
  15. {
  16.     internal class RevitModelClass
  17.     {
  18.  
  19.         private UIApplication _uiApplication;
  20.         private Autodesk.Revit.ApplicationServices.Application _application;
  21.         private Document _document;
  22.         private readonly UIDocument _uiDocument;
  23.         public ElementId SelectedFamilyId;
  24.  
  25.         public static bool containsDefinition(DefinitionGroup grp, string paramName)
  26.         {
  27.             paramName = paramName.ToLower();
  28.  
  29.             foreach (Definition def in grp.Definitions)
  30.                 if (string.Equals(def.Name.ToLower(), paramName))
  31.                     return true;
  32.  
  33.             return false;
  34.         }
  35.         public bool AddParametersToFamily(List<MyParameter> pars)
  36.         {
  37.             Element family = _document.GetElement(SelectedFamilyId);
  38.             if (SelectedFamilyId == null) return false;
  39.             if (family is FamilyInstance fi)
  40.  
  41.             {
  42.                 var collector = new FilteredElementCollector(_document).OfClass(typeof(Family))
  43.                     .OfType<Family>()
  44.                     .FirstOrDefault(x => x.Name ==  fi.Symbol.FamilyName);
  45.                 var famDoc = _document.EditFamily(collector);
  46.                 using (Transaction tr = new Transaction(famDoc, "addParameters"))
  47.                 {
  48.                     tr.Start();
  49.  
  50.                     foreach (var par in pars)
  51.                     {
  52.                         BuiltInParameterGroup gr = BuiltInParameterGroup.PG_GENERAL;
  53.                         famDoc.FamilyManager.AddParameter(par.def, gr, true);
  54.                     }
  55.                     tr.Commit();
  56.                 }
  57.                 //famDoc.SaveAs("C:\\Users\\Александр\\Desktop\\Не получается.rfa");
  58.                 famDoc.LoadFamily(_document, new FamilyLoadOptions());
  59.                 famDoc.Close(false);
  60.             }
  61.  
  62.             return false;
  63.         }
  64.  
  65.         public RevitModelClass(UIApplication uiapp)
  66.         {
  67.             _uiApplication = uiapp;
  68.             _application = _uiApplication.Application;
  69.             _uiDocument = _uiApplication.ActiveUIDocument;
  70.             _document = _uiDocument.Document;
  71.         }
  72.         public static ObservableCollection<MyParameter> GenerateParametersList(Document doc)
  73.         {
  74.             ObservableCollection<MyParameter> definitions = new ObservableCollection<MyParameter>();
  75.             var deffile = doc.Application.OpenSharedParameterFile();
  76.             if (deffile != null)
  77.             {
  78.                 foreach (var gr in deffile.Groups)
  79.                 {
  80.                     foreach (ExternalDefinition df in gr.Definitions)
  81.                     {
  82.                         definitions.Add(new MyParameter() { Name = df.Name, def = df });
  83.                     }
  84.                 }
  85.             }
  86.             return definitions;
  87.  
  88.         }
  89.         class FamilyLoadOptions : IFamilyLoadOptions
  90.         {
  91.             public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
  92.             {
  93.                 overwriteParameterValues = true;
  94.  
  95.                 return true;
  96.             }
  97.  
  98.             public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
  99.             {
  100.                 source = FamilySource.Family;
  101.  
  102.                 overwriteParameterValues = true;
  103.  
  104.                 return true;
  105.             }
  106.         }
  107.     }
  108. }
« Последнее редактирование: 18-10-2019, 11:25:57 от Александр Ривилис »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
А можете конкретизировать, что именно происходит в Вашем случае?

В упрощенном виде на Iron Python Shell накидал, всё работает как ожидается:
Код - Python [Выбрать]
  1. from Autodesk.Revit.UI import *
  2.  
  3. family = selection[0].Symbol.Family
  4.  
  5. famDoc = doc.EditFamily(family)
  6.  
  7. tx = Transaction(famDoc, "ss")
  8. tx.Start()
  9.  
  10. fm = famDoc.FamilyManager
  11.  
  12. prm = famDoc.FamilyManager.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_COMMENTS)
  13.  
  14. fm.Set(prm, "test")
  15.  
  16. tx.Commit()
  17.  
  18. famDoc.LoadFamily(doc, UIDocument.GetRevitUIFamilyLoadOptions())
  19.  
  20. famDoc.Close(False)

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

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

Отмечено как Решение Alex25 21-10-2019, 22:47:00

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
А можете конкретизировать, что именно происходит в Вашем случае?

В упрощенном виде на Iron Python Shell накидал, всё работает как ожидается:
Код - Python [Выбрать]
  1. from Autodesk.Revit.UI import *
  2.  
  3. family = selection[0].Symbol.Family
  4.  
  5. famDoc = doc.EditFamily(family)
  6.  
  7. tx = Transaction(famDoc, "ss")
  8. tx.Start()
  9.  
  10. fm = famDoc.FamilyManager
  11.  
  12. prm = famDoc.FamilyManager.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_COMMENTS)
  13.  
  14. fm.Set(prm, "test")
  15.  
  16. tx.Commit()
  17.  
  18. famDoc.LoadFamily(doc, UIDocument.GetRevitUIFamilyLoadOptions())
  19.  
  20. famDoc.Close(False)

По действиям:
1. Нажимаю на кнопку на  панели. (Вызываю программу)
2. Программа предлагает указать семейство для добавления параметров(Программа берет из общего файла выбранные параметры и добавляет в выделенное семейство)
3.Выбираю несколько параметров в окне, нажимаю кнопку добавить, revit думает секунду(загружает), я как понимаю не перезаписывает семейство при загрузке в проект.
НА ДРУГОМ КОМПЬЮТЕРЕ РАБОТАЕТ. В чем может быть дело?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
НА ДРУГОМ КОМПЬЮТЕРЕ РАБОТАЕТ. В чем может быть дело?
Совпадают версии Revit и установленные обновления для него?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Первоначально делал с библиотеками Revit 2019.2, потом попробовал на 2015 и все заработало.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
НА ДРУГОМ КОМПЬЮТЕРЕ РАБОТАЕТ. В чем может быть дело?


Случайно, семейство не было открыто раньше?

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
НА ДРУГОМ КОМПЬЮТЕРЕ РАБОТАЕТ. В чем может быть дело?


Случайно, семейство не было открыто раньше?
Нет , раньше не было открыто (уже открыто )
Я и через отладку и через " запуск внешней программы " запускал.
До этого, такого не было с программами. Могу zip файл скинуть , полностью с решением...нужно ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
А на "том же" компьютере, но в другом проекте?

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
А на "том же" компьютере, но в другом проекте?
Да, так тоже делал

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
А на "том же" компьютере, но в другом проекте?
Да, так тоже делал
На 2018 попробовал, все тоже самое , что и на 2019, я уже не знаю что делать, неделю пробую
Он Не заходит в OnFamilyFound. По картинке можете посмотреть контрольные значения





upload images