ADN Open CIS
Сообщество программистов Autodesk в СНГ

05/02/2014

Настройки видимости с использованием параметра GEOM_VISIBILITY_PARAM

В статье обсуждается полезный и интересный пример с форума Revit API, в котором принимали участие  Remy van den Bor из компании ICN Solutions, Rudolf Honke из Mensch und Maschine acadGraph, а также Joe Ye и команда разработчиков Revit. В теме обсуждалось как можно задать настройки видимости элемента в редакторе семейств.

 Remy: Привет, ревитчики.

Кто-нибудь знает, как можно добраться до настроек видимости элемента в редакторе семейств с помощью API?

В интерфейсе я просто выбираю элемент, жму Переопределение видимости/графики и меняю настройки, например Видимость на планах этажей, спереди/сзади, справа/слева и настройки детализации..

Я попробовал покопаться в RevitLookup, но так и не нашел подходящего параметра, который изменяется, когда я меняю настройки видимости.

Буду премного благодарен за помощь.

Rudolf: Попробуйте такой код:

Код - C#: [Выделить]
  1.   FamilyElementVisibility visibility = new
  2.     FamilyElementVisibility(
  3.       FamilyElementVisibilityType.Model );
  4.   visibility.IsShownInCoarse = true;
  5.   visibility.IsShownInFine = true;
  6.   visibility.IsShownInMedium = true;
  7.   visibility.IsShownInFrontBack = true;
  8.   visibility.IsShownInLeftRight = true;
  9.   visibility.IsShownInPlanRCPCut = false;
  10.   yourElement.SetVisibility( visibility );

Remy: Спасибо огромное. Похоже это то что нужно.

Но есть один вопрос: вы говорите, что нужно применить метод SetVisibility к элементу, но у меня так и не получилось заставить этот метод работать.

Я попробовал применить метод как к FamilyInstance так и к Element. В обоих случаях Visual Studio говорит мне что такого метода не существует.

Единственное что я нашел, то что такой метод есть у doc.ActiveView.SetVisibility, но там нет настроек видимости для конкретного элемента. Только для всей категории.

Отсюда еще один вопрос: как можно применить метод SetVisibility к конкретному экземпляру семейства (находясь в редакторе семейств)?

Rudolf: Упс. Действительно.

Я использовал метод для элементов типа SymbolicCurve.

В редакторе семейств можно применить этот метод для линий модели (ModelCurves).

Также, каждый элемент, чей класс унаследован от класса GenericForm содержит этот метод. Т.е. это выдавливание, переход, сдвиг и т.д.

Remy: Ок. Понял.

Да, когда я создал выдавливание и посмотрел какие же методы в нем есть, я увидел метод, о котором вы говорили.

Но у меня другая ситуация. Я создал сдвиг (Sweep) и загрузил его в другое семейство. Таким образом я имею дело со вложенным семейством.

Вложенное семейство имеет тип FamilyInstance, который не имеет метода SetVisibility.

А просто преобразовать FamilyInstance к Sweep – не выйдетJ

Rudolf: Есть еще один способ как добраться до настроек видимости.

Экземпляр семейства, находящийся внутри редактора семейства, содержит встроенный параметр, который называется GEOM_VISIBILITY_PARAM.

Это числовой параметр, который можно задать вручную.

Единственное, вам нужно найти зависимость между этим числом и соответствующим настройкам в интерфейсе.

В диалоге ниже, этот параметр называется Переопределение видимости/графики.

Вот настройки видимости в интерфейсе:

 

И вот значение этого параметра:

 

Изменив значение в интерфейсе

 

Мы видим, что меняется и значение параметра:

 

Таким образом, вы можете выставить нужное значение видимости в интерфейсе и посмотреть какому число оно соответствует.

Этим способом можно настраивать видимость и для вложенных семейств.

По крайней мере я на это надеюсьJ

Remy: Класс! То что нужно.

Правда я обычно не люблю использовать такие штуки как работа с непонятными загадочными числами, как в этом случае, но по всей видимости мне придется сделать исключение.

Подведем небольшой итог:

Метод FamilyElementVisibility можно использовать когда создается твердотельный объект, типа выдавливания, переход, вращение и т.п.

Метод с магическими числами можно использовать, когда нужно установить настройки видимости для вложенных семейств.

Например,

  • Все галочки выделены – 57406
  • На планах этажей/потолков не выделены – 57398
  • Слева/справа не выделены – 57374

Спасибо еще раз! J

Rudolf: Думаю эта тема должна понравиться Джереми.

Было бы неплохо узнать, что же все-таки значат эти цифры. Или хотя бы алгоритм, по которому они вычисляются.

Кстати, эти числа одинаковые при редактировании различных семейств или отличаются?

Remy: Да, согласен на все 100%.

На сколько я вижу, числа всегда одинаковые для всех элементов.

Кстати, для двумерных семейств это значение всегда равно 0.

Это неплохой пост для Джереми.

Jeremy: Я полностью с вами согласен ребята. Тема довольна интересна.

Две небольшие мысли для рассуждения:

  • Эти магические числа возможно будут не такими уж и загадочными, если преобразовать их в шестнадцатеричный вид.
  • Я буду совсем не удивлен, если где-то в API уже есть перечисления, обозначающие эти самые числа. Или это комбинация булевых значений.

Что думаете?

Rudolf: Да, я тоже так думаю.

Эти цифры могут быть и совсем не загадочными. Наверняка как-то можно вычислить их значение.

И это действительно может быть и комбинация неких перечислений.

И как заметил Remy, для плоских семейств значение равно 0.

В завершении темы, я бы все-таки хотел узнать, как вычисляется это значение.

Remy: Я тоже уверен, что где-то есть соответствующее значение перечисления, только оно скрыто от нас.

Так что пока, эти числа остаются все же загадочными для меня. Но Joe Ye уже добавил в список пожеланий объяснить значение этих цифр официально от Autodesk. Кто знает, может нам и раскроют тайну)

Andrzej: Вот определение констант, используемых нами в коде на C++:

Код - C++: [Выделить]
  1.   unsigned int m_bUndefined:1; // Mostly for caching errors
  2.   unsigned int m_bModel:1;
  3.  
  4.   // Model
  5.   unsigned int m_bPlanRCPCut:1;
  6.   unsigned int m_bTopBottom:1;
  7.   unsigned int m_bFrontBack:1;
  8.   unsigned int m_bLeftRight:1;
  9.  
  10.   // View direction specific
  11.   unsigned int m_bOnlyWhenCut:1;
  12.  
  13.   unsigned int m_reserved:6;
  14.  
  15.   // Detail level
  16.   unsigned int m_bCoarse:1;
  17.   unsigned int m_bMedium:1;
  18.   unsigned int m_bFine:1;
  19.  
  20.   // ----- 16 bits up to here -------
  21.  
  22.   // Old stuff - for compatibility with loaded families
  23.   unsigned int m_bOld:1;
  24.   unsigned int m_bOldGeom:1;
  25.  
  26.   // Old Geom
  27.   unsigned int m_bOldGeomPlan:1;
  28.   unsigned int m_bOldGeomRCP:1;
  29.   unsigned int m_bOldGeomElev:1;
  30.   unsigned int m_bOldGeom3d:1;
  31.  
  32.   // Old Curves
  33.   unsigned int m_bOldCurve3d:1;
  34.   unsigned int m_bOldCurveParallel:1;
  35.   unsigned int m_bOldCurveAntiParallel:1;
  36.   unsigned int m_bOldCurveInFront:1;

Например, m_bCoarse находится на 14 позиции, так как поле m_reserved занимает 6 бит.  Таким образом, вы можете получить значение, исползаю битовую маску, например так:

Код - C#: [Выделить]
  1.   int ival = e.get_Parameter(
  2.     BuiltInParameter.GEOM_VISIBILITY_PARAM )
  3.       .AsInteger();
  4.  
  5.   bool isCourse = 0 != (ival & (0x1 << 13));

Scott: Также следует взглянуть на пост установка видимости для кривой.

 

Большое спасибо всем участникам за обсуждение и решение проблемы.

Источник: http://thebuildingcoder.typepad.com/blog/2014/01/the-geom_visibility_param-visibility-settings.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=509

Опубликовано 05.02.2014
Отредактировано 05.02.2014 в 08:03:26