Добавить свойства

Автор Тема: Добавить свойства  (Прочитано 2782 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Добавить свойства
« : 03-06-2018, 17:49:44 »
Простите за дилетантский вопрос. Как можно добавить новые свойства к семейству, элементы которого вставлены в чертеж?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Добавить свойства
« Ответ #1 : 03-06-2018, 20:27:15 »
Есть собственно, 2 способа:
1) добавить параметры проекта (соответствующая кнопка на вкладке "Управление"). Вы создаете параметр заданного типа и назначаете список категорий, к которому он применяется
2) если речь идет о пользовательском семействе, то параметры можно добавить, отредактировав само семейство

Если что, программно доступны оба способа (в первом случае параметр должен быть общим)

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #2 : 03-06-2018, 20:28:11 »
Интересует программная реализация

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #3 : 03-06-2018, 20:29:41 »
Есть пользовательское семейство, которое программно подгружается в проект. Как можно добавить параметры к этому семейству ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Добавить свойства
« Ответ #4 : 03-06-2018, 20:40:03 »
Пример кода смогу завтра сделать. Сейчас опишу суть. Есть метод Document.EditFamily(family) - он переданное пользовательское семейство из проекта открывает в режиме редактирования,  т.е. вызываете следующий код:
Код - C# [Выбрать]
  1. var famDoc = currentProjectDocument.EditFamily(family);

Затем вызываете famDoc.FamilyManager.AddParameter в транзакции, естественно.

Потом загружаете семейство обратно в проект currentProjectDocument, а famDoc закрываете (метод Close)

В принципе, ничего сложного, но есть места, где можно подзастрять. Если будете сейчас пробовать, напишите результат, ну или подождите, завтра пример кода выложу

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #5 : 03-06-2018, 20:41:12 »
Был бы благодарен за код. Но и сам попробую

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #6 : 03-06-2018, 20:52:27 »
Вот пробовал так

Код - C# [Выбрать]
  1.  var familyDoc = document.EditFamily(family);
  2.  
  3.             using (Transaction trans = new Transaction(familyDoc, "Add param"))
  4.             {
  5.                 trans.Start();
  6.  
  7.                 BuiltInParameterGroup addToGroup = BuiltInParameterGroup.INVALID;
  8.                 ParameterType parameterType = ParameterType.Text;
  9.                 familyDoc.FamilyManager.AddParameter("New param", addToGroup, parameterType, true);
  10.  
  11.                 trans.Commit();
  12.                 familyDoc.Close(false);
  13.             }

Но почему то не появляется новый параметр. Видимо, что то упускаю. Был бы очень благодарен за помощь
« Последнее редактирование: 03-06-2018, 23:28:16 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Добавить свойства
« Ответ #7 : 03-06-2018, 20:57:28 »
Семейство нужно перезагрузить в проект после изменений + BuiltInParameterGroup.INVALID как бы, скорее всего, не будет работать, нужно указать, в какую группу добавить параметр

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #8 : 03-06-2018, 20:59:11 »
А как перегрузить? Можно пример?
 А категорию я не знаю в какую. Нужно добавить параметр стоимость.
И еще дополнительные общие параметры

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Добавить свойства
« Ответ #9 : 03-06-2018, 21:04:23 »
Посмотрите вот этот метод: http://www.revitapidocs.com/2018.1/cb950c8e-f440-c6db-8563-d1dd16ef3fee.htm

Его можно вызвать перед familyDoc.Close(false). Нужно будет только создать свою реализацию интерфейса IFamilyLoadOptions и переменную передать вторым параметром.

Группа - ну это уж как пользователь попросит, стоимость по логике скорее всего в PG_IDENTITY_DATA

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #10 : 03-06-2018, 21:36:54 »
Что то не получается. А можно пример?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить свойства
« Ответ #11 : 03-06-2018, 23:29:51 »
YLSV,
Прочтите у меня в подписи о том, как следует форматировать код у нас на форуме и соблюдайте это правило.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 04-06-2018, 22:03:21

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Добавить свойства
« Ответ #12 : 04-06-2018, 10:32:17 »
Обещанный пример:
Код - C# [Выбрать]
  1. [Transaction(TransactionMode.Manual)]
  2. public class AddFamilyParameterCommand : IExternalCommand
  3. {
  4.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  5.         {
  6.                 var uiapp = commandData.Application;
  7.                 var uidoc = uiapp.ActiveUIDocument;
  8.                 var doc = uidoc.Document;
  9.  
  10.                 var family = FindFamily(doc);
  11.  
  12.                 if (family == null)
  13.                 {
  14.                         message = "Семейство не найдено";
  15.  
  16.                         return Result.Failed;
  17.                 }
  18.  
  19.                 var parameterDefinition = FindParameterDefinition(doc.Application);
  20.  
  21.                 if (parameterDefinition == null)
  22.                 {
  23.                         message = "В файле общих параметров отсутствует параметр";
  24.  
  25.                         return Result.Failed;
  26.                 }
  27.  
  28.                 var familyDocument = doc.EditFamily(family);
  29.  
  30.                 if (AddParameter(familyDocument, parameterDefinition))
  31.                         familyDocument.LoadFamily(doc, new FamilyLoadOptions());
  32.                
  33.                 familyDocument.Close(false);
  34.  
  35.                 return Result.Succeeded;
  36.         }
  37.  
  38.         private static Family FindFamily(Document document)
  39.         {
  40.                 var collector = new FilteredElementCollector(document);
  41.  
  42.                 return collector
  43.                         .OfClass(typeof (Family))
  44.                         .OfType<Family>()
  45.                         .FirstOrDefault(x => x.Name == "M_Fixed");
  46.         }
  47.  
  48.         private static ExternalDefinition FindParameterDefinition(Application application)
  49.         {
  50.                 if (string.IsNullOrEmpty(application.SharedParametersFilename) || !File.Exists(application.SharedParametersFilename))
  51.                         return null;
  52.  
  53.                 var definitionFile = application.OpenSharedParameterFile();
  54.  
  55.                 return definitionFile
  56.                         .Groups
  57.                         .FirstOrDefault()
  58.                         ?.Definitions
  59.                         .Cast<ExternalDefinition>()
  60.                         .FirstOrDefault();
  61.         }
  62.  
  63.         private static bool AddParameter(Document familyDocument, ExternalDefinition parameterDefinition)
  64.         {
  65.                 var familyManager = familyDocument.FamilyManager;
  66.  
  67.                 if (HasParameter(familyManager, parameterDefinition.GUID))
  68.                         return false;
  69.  
  70.                 using (var transaction = new Transaction(familyDocument, "add parameter"))
  71.                 {
  72.                         transaction.Start();
  73.  
  74.                         familyManager.AddParameter(parameterDefinition, BuiltInParameterGroup.PG_IDENTITY_DATA, true);
  75.  
  76.                         transaction.Commit();
  77.                 }
  78.  
  79.                 return true;
  80.         }
  81.  
  82.         private static bool HasParameter(FamilyManager familyManager, Guid parameterId)
  83.         {
  84.                 return familyManager
  85.                         .Parameters
  86.                         .Cast<FamilyParameter>()
  87.                         .Where(x => x.IsShared)
  88.                         .Any(x => x.GUID == parameterId);
  89.         }
  90.  
  91.         class FamilyLoadOptions : IFamilyLoadOptions
  92.         {
  93.                 public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
  94.                 {
  95.                         overwriteParameterValues = true;
  96.  
  97.                         return true;
  98.                 }
  99.  
  100.                 public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
  101.                 {
  102.                         source = FamilySource.Family;
  103.  
  104.                         overwriteParameterValues = true;
  105.  
  106.                         return true;
  107.                 }
  108.         }
  109. }

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 0
Re: Добавить свойства
« Ответ #13 : 04-06-2018, 20:23:01 »
Спасибо! Все получилось после небольшой доработки!