При разработке плагина, работающего с штриховками, столкнулся с интересной ситуацией - в 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;
}Если в процессе разработки плагина и использования метода будут найдены какие-либо дополнительные условия, то статья будет дополнена



 
										