Revit: Определяем тип штриховки

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

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

Tags:
© 2018-2019 modplus.org

Please publish modules in offcanvas position.