Определить тип штриховки

Автор Тема: Определить тип штриховки  (Прочитано 2554 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Определить тип штриховки
« : 11-06-2019, 23:01:14 »
Всем привет. Исследую тип FillPattern - столкнулся с вопросом: а как, собственно говоря, определить тип штриховки? Это Основная (Basic) или Пользовательская (Custom)?
При исследовании штриховок в проекте я не заметил никакой особенной разницы. Единственное - в основных штриховках может быть максимум 2 FillGrid'а. Но логично предположить, что и Пользовательскую штриховку можно создать с такими показателями.
Еще заметил разницу - у основных штриховок метод GetSegments для FillGrid возвращает пустой список
Возможно подсказка где-то в этом описании:
Цитировать
A grid line is described in the two dimensions of a face as follows: angle, origin, shift, offset, segments
Angle specifies the direction, in degrees, of the grid line relative to the x-axis.
Parallel lines are drawn as specified by Offset and Shift to fill the entire face. Offset defines the distance between parallel lines. Zero Offset is not allowed. Shift moves the pattern of dashes and spaces along the length of each new parallel line. Shift is ignored if the line is solid.
The segments defines a repeating pattern of dashes and spaces for the grid line. If it is omitted, the line is solid. Positive numbers define dashes, negative numbers define spaces, and zero specifies a dot. If you begin a pattern with a space, do not alternate dashes and spaces, or do not end with a space, Revit will introduce tiny dashes or spaces to compensate. Revit expands dots and very short dashes into dashes of a minimum size.
Но пока не уверен, какое свойство смотреть

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Определить тип штриховки
« Ответ #1 : 11-06-2019, 23:12:03 »
Еще заметил - у Основного типа значение свойства LengthPerArea равняется значению свойства LinesPerLength, а у Пользовательского типа значение свойства LinesPerLength всегда (по крайней мере в моем тестовом файле) ровняется нулю.
Пока что склоняюсь к этому варианту определения типа штриховки

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Определить тип штриховки
« Ответ #2 : 12-06-2019, 00:39:00 »
Похоже, что никак.

Тоже начал с того, что пошёл смотреть LengthPerArea / LengthPerLength.

Еще заметил - у Основного типа значение свойства LengthPerArea равняется значению свойства LinesPerLength

Файл примера архитектурного проекта, совсем мимо - штриховка Steel LengthPerArea  = LinesPerLength = 171.428571429 <> 0. Пользовательская. Wood Board - пользовательская штриховка LinesPerLength = 6.096

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Определить тип штриховки
« Ответ #3 : 12-06-2019, 00:46:54 »
Еще заметил разницу - у основных штриховок метод GetSegments для FillGrid возвращает пустой список

Тоже, к сожалению, мимо. Тот же файл примера архитектурного проекта, та же пользовательская штриховка Steel. 2 FillGrid-а, у обоих GetSegments отдает пустой список.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Определить тип штриховки
« Ответ #4 : 12-06-2019, 01:01:03 »
Ок, завтра поизучаю штриховки в стандартных примерах. Может что увижу
Ещё вариант - лезть в библиотеку и смотреть - может там приватный метод есть какой. Проблема только в том, что нужно искать родной редактор скорее всего, а на него явно нет обертки в библиотеках

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Определить тип штриховки
« Ответ #5 : 12-06-2019, 01:06:29 »
Я не нашёл, там только обёртки вызовов unmanaged кода

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Определить тип штриховки
« Ответ #6 : 15-06-2019, 10:53:57 »
Итак, я провел исследование и сделал метод определения типа штриховки. В точности уверен на 95% =))
Для начала, в рамках своего плагина, сделал перечислитель для типа штриховки:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Тип создания штриховки
  3. /// </summary>
  4. public enum FillPatternCreationType
  5. {
  6.     /// <summary>
  7.     /// Основная
  8.     /// </summary>
  9.     Basic = 0,
  10.  
  11.     /// <summary>
  12.     /// Пользовательская
  13.     /// </summary>
  14.     Custom = 1
  15. }

Ну и, собственно, сам метод. Все свои мысли описал в комментариях. Замечания приветствуются
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Определение типа штриховки
  3. /// </summary>
  4. /// <returns>Тип штриховки: Основная (Basic) или Пользовательская (Custom)</returns>
  5. private FillPatternCreationType DetectCreationType(FillPattern fillPattern)
  6. {
  7.     // Основная штриховка может состоять из параллельных линий или из линий крест-накрест. Это значит, что
  8.     // если количество FillGrid больше 2, то это точно Пользовательская штриховка
  9.     if (fillPattern.GridCount > 2)
  10.         return FillPatternCreationType.Custom;
  11.  
  12.     // Основная штриховка не может иметь штрихов
  13.     if (fillPattern.StrokesPerArea > 0)
  14.         return FillPatternCreationType.Custom;
  15.  
  16.     // Рассмотрим два варианта количества FillGrid
  17.  
  18.     if (fillPattern.GridCount == 1)
  19.     {
  20.         // Мне так и не удалось создать пользовательскую штриховку с одним FillGrid которая
  21.         // имела бы свойства, схожие с основной штриховкой. При попытке создать штриховку с одной горизонтальной
  22.         // линией (использовал команду из pyRevit) я получил штриховку, у которой StrokesPerArea > 0.
  23.         // По этой причине считаю, что штриховка с одним FillGrid и StrokesPerArea == 0 является основной
  24.         return FillPatternCreationType.Basic;
  25.     }
  26.  
  27.     if (fillPattern.GridCount == 2)
  28.     {
  29.         // Как и в случае с GridCount == 1 я попробовал создать штриховку с двумя линиями, пересекающимися
  30.         // под прямым углом - штриховка опять имела StrokesPerArea > 0
  31.         // Но все-равно добавлю дополнительную проверку, а именно: если GridCount == 2 и это Основная штриховка,
  32.         // то разница между углами обоих FillGrid должна быть 90 градусов
  33.         var firstAngle = fillPattern.GetFillGrid(0).Angle;
  34.         var secondAngle = fillPattern.GetFillGrid(1).Angle;
  35.  
  36.         if (Math.Abs(Math.Abs(firstAngle - secondAngle) - (Math.PI / 2)) < 0.1)
  37.             return FillPatternCreationType.Basic;
  38.     }
  39.  
  40.     // в остальных случаях считаю, что это Пользовательская штриховка
  41.     return FillPatternCreationType.Custom;
  42. }