При разработке плагина, работающего с штриховками, столкнулся с интересной ситуацией - в Revit API нет методов определения типа штриховки. Речь идет не о типе "Условный" или "Моделирующий", а о типе "Основная" или "Пользовательская". Исследовав несколько различных штриховок я создал метод определения типа штриховки.
В данном методе я уверен на 95%, так как у меня не получилось создать пользовательскую штриховку, которая не прошла проверку этим методом.
Для начала создадим перечеслитель типа штриховки:
/// <summary>
/// Тип создания штриховки
/// </summary>
public enum FillPatternCreationType
{
/// <summary>
/// Основная
/// </summary>
Basic = 0,
/// <summary>
/// Пользовательская
/// </summary>
Custom = 1
}
Ну а далее, собственно говоря, сам метод. Все свои изыскания я описал в комментариях. Замечания приветствуются.
/// <summary>
/// Определение типа штриховки
/// </summary>
/// <returns>Тип штриховки: Основная (Basic) или Пользовательская (Custom)</returns>
private FillPatternCreationType DetectCreationType(FillPattern fillPattern)
{
// Основная штриховка может состоять из параллельных линий или из линий крест-накрест. Это значит, что
// если количество FillGrid больше 2, то это точно Пользовательская штриховка
if (fillPattern.GridCount > 2)
return FillPatternCreationType.Custom;
// Основная штриховка не может иметь штрихов
if (fillPattern.StrokesPerArea > 0)
return FillPatternCreationType.Custom;
// Рассмотрим два варианта количества FillGrid
if (fillPattern.GridCount == 1)
{
// Мне так и не удалось создать пользовательскую штриховку с одним FillGrid которая
// имела бы свойства, схожие с основной штриховкой. При попытке создать штриховку с одной горизонтальной
// линией (использовал команду из pyRevit) я получил штриховку, у которой StrokesPerArea > 0.
// По этой причине считаю, что штриховка с одним FillGrid и StrokesPerArea == 0 является основной
return FillPatternCreationType.Basic;
}
if (fillPattern.GridCount == 2)
{
// Как и в случае с GridCount == 1 я попробовал создать штриховку с двумя линиями, пересекающимися
// под прямым углом - штриховка опять имела StrokesPerArea > 0
// Но все-равно добавлю дополнительную проверку, а именно: если GridCount == 2 и это Основная штриховка,
// то разница между углами обоих FillGrid должна быть 90 градусов
var firstAngle = fillPattern.GetFillGrid(0).Angle;
var secondAngle = fillPattern.GetFillGrid(1).Angle;
if (Math.Abs(Math.Abs(firstAngle - secondAngle) - (Math.PI / 2)) < 0.1)
return FillPatternCreationType.Basic;
}
// в остальных случаях считаю, что это Пользовательская штриховка
return FillPatternCreationType.Custom;
}
Если в процессе разработки плагина и использования метода будут найдены какие-либо дополнительные условия, то статья будет дополнена