Настройки видимости с использованием параметра GEOM_VISIBILITY_PARAM
В статье обсуждается полезный и интересный пример с форума Revit API, в котором принимали участие Remy van den Bor из компании ICN Solutions, Rudolf Honke из Mensch und Maschine acadGraph, а также Joe Ye и команда разработчиков Revit. В теме обсуждалось как можно задать настройки видимости элемента в редакторе семейств.
Remy: Привет, ревитчики.
Кто-нибудь знает, как можно добраться до настроек видимости элемента в редакторе семейств с помощью API?
В интерфейсе я просто выбираю элемент, жму Переопределение видимости/графики и меняю настройки, например Видимость на планах этажей, спереди/сзади, справа/слева и настройки детализации..
Я попробовал покопаться в RevitLookup, но так и не нашел подходящего параметра, который изменяется, когда я меняю настройки видимости.
Буду премного благодарен за помощь.
Rudolf: Попробуйте такой код:
- FamilyElementVisibility visibility = new
- FamilyElementVisibility(
- FamilyElementVisibilityType.Model );
- visibility.IsShownInCoarse = true;
- visibility.IsShownInFine = true;
- visibility.IsShownInMedium = true;
- visibility.IsShownInFrontBack = true;
- visibility.IsShownInLeftRight = true;
- visibility.IsShownInPlanRCPCut = false;
- 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++:
- unsigned int m_bUndefined:1; // Mostly for caching errors
- unsigned int m_bModel:1;
- // Model
- unsigned int m_bPlanRCPCut:1;
- unsigned int m_bTopBottom:1;
- unsigned int m_bFrontBack:1;
- unsigned int m_bLeftRight:1;
- // View direction specific
- unsigned int m_bOnlyWhenCut:1;
- unsigned int m_reserved:6;
- // Detail level
- unsigned int m_bCoarse:1;
- unsigned int m_bMedium:1;
- unsigned int m_bFine:1;
- // ----- 16 bits up to here -------
- // Old stuff - for compatibility with loaded families
- unsigned int m_bOld:1;
- unsigned int m_bOldGeom:1;
- // Old Geom
- unsigned int m_bOldGeomPlan:1;
- unsigned int m_bOldGeomRCP:1;
- unsigned int m_bOldGeomElev:1;
- unsigned int m_bOldGeom3d:1;
- // Old Curves
- unsigned int m_bOldCurve3d:1;
- unsigned int m_bOldCurveParallel:1;
- unsigned int m_bOldCurveAntiParallel:1;
- unsigned int m_bOldCurveInFront:1;
Например, m_bCoarse находится на 14 позиции, так как поле m_reserved занимает 6 бит. Таким образом, вы можете получить значение, исползаю битовую маску, например так:
- int ival = e.get_Parameter(
- BuiltInParameter.GEOM_VISIBILITY_PARAM )
- .AsInteger();
- 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