Полезности BIM кодерам

|  Revit API

Экспоненциальная запись чисел, более простые проверки на null, короткие записи свойств, использование операторов для более кратких записей, наглядное представление углов в радианах и другие полезные приемы помогают сделать код более простым и легко читаемым.

1. Краткая запись дробных чисел:

1E-7 вместо 0.0000001, здесь единица это седьмая цифра после запятой.

Краткая запись больших чисел: 1E+6 вместо 1000000.

Если минус - переносим запятую на указанное количество знаков вправо, если плюс - влево.

При сравнении чисел в Ревит точность после 6 знаков после запятой не имеет смысла. Экспоненциальная запись помогает укоротить формулы, например:

if (Math.Abs(x - y) < 1E-7) вместо if (Math.Abs(x - y) < .0000001)

2. Укорачиваем проверку на null:

Большинство упоминаемых оператов и фич являются стандартными возможностями C# 6.0

var f = list.FirstOrDefault(e=>e.LookupParameter("Мой параметр")?.AsString() == "Основание");

Такая запись не вызовет ошибку, если параметр "Мой параметр" отсутствует в проекте. Вопросительный знак (оператор проверки на null ?.) вызывает проверку на null и возвращает для переменной "f" null, если параметра не существует.

Быстро проверяем данные и назначаем переменную, если null, с помощью оператора ??. Хорошо в свойствах использовать:

private object num;

public object Num

{ get => num ?? (num = list.Last());

set => num = value; }


3. Свойства, раз зашла речь о них, пишем покороче:

string st = string.Empty;

public string St { get => st; set=> st = value; }

и вот так свойство только для чтения с одновременной инициализацией:

public string St => "Мой текст";

Помним что свойству сразу можно подать метод со значением, что не сделаешь для обычного поля:

public string St => new TestClass().GetValue();

И вообще анонимные свойства можно инициализировать как поля:

public string St { get; set; } = "Текст";

Про свойства можем еще почитать в статье про C#6.0

4. Немного про углы

Углы Revit меряет в радианах. Конечно, мы привыкли к градусам. Число Пи все мы знаем со школы. Есть класс Math в библиотеке System, а в нем константа PI. Вот только взгляните на это:

360 градусов = 2 * Пи = 6,26 радиана  (Math.PI * 2)

270 градусов = 1.5 * Пи = 4,71 радиана (Math.PI * 1.5)

180 градусов =  Пи = 3,14 радиана (Math.PI)

90 градусов = 0,5 * Пи = 1,57 радиана (Math.PI * 0.5)

Через Пи радианы кажутся роднее, и не надо их гонять туда-сюда в градусы.

5. Опять про проверки. Делаем их короче:

if(obj == null)

{ i = 10; }

else i = 20;

Вместо этого пишем (используя оператор ?:):

i = obj == null ? 10 : 5; еще например так: string.Format("Данное число равно {0}", obj == null ? 10 : 5)

6. Out или ref

В методы значение по ссылке я люблю передавать через out (не ref). Потому что в теле метода переменную переданную по out обязательно надо инициилизировать, а ref нет. То есть про out - переменную не забудешь, компилятор напомнит. Только с out еще и такие штуки в коде можно писать:

MyMethod (out string name);

string n = name; // переменная name уже инициилизирована ранее в методе MyMethod, и в теле этого метода ей присвоено некое значение  по крайней мере null. Очень удобно.

7. Конвертация текста в число с плавающей запятой

Пользовательские данные могут представлять собой числа как с запятой так и точкой. Правильно преобразуем их в числа с плавающей запятой типа Double, что бы не возникало ошибок во время выполнения кода:

text = text.Replace(',', '.'); // Сначала меняем все запятые на точки.

double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out double result);

result ... //используем результат конвертации

8. Проверка соответствия типа is

Оператор is проверяет соответствует ли объект а типу b. Оператор as приводит объект a к типу b или возвращает null, если приведение невозможно. А теперь пример использования преимущества оператора is:

if (elem is CableTray cable)

{ var st = cable.GetShapeType(); }

Работает это конструкция так: если elem является CableTray тогда объект elem приводится к типу CableTray и одновременно назначается переменная cable, как результат такого приведения, а выражение считается true.

Ну а если elem не является CableTray, то никакого приведения типа не происходит и выражение является false. Упрощаем код и экономим время на кодирование.

9. Про IEnumerable

Удобно когда ваши классы и методы используют или возвращают не конкретный список, например List<CableTray>, а интерфейс IEnumerable<CableTray>.

В Revit целая куча объектов сложена в самые разные списки, массивы, стеки и прочая, прочая. Кроме того Linq операции (Where, Select и пр.) возвращают IEnumerable. Зачастую их конвертируют в список ( .ToList() ) и частое  применение такой конвертации замедляет скорость программы. Кроме того зачастую неизвестно, какой тип списка нужно будет подать в ваш класс или метод.

Интерфейс IEnumerable примет большинство списков Revit API без конвертации, а вам не придется гадать какой тип списка должен получать или возвращать ваш метод.

Поддержите разработку приложений для Revit.

Подписывайтесь ВКонтакте!

Подписывайтесь в Facebook!

Следите за BIM3D в Твиттере!

Извините за предствленные неудобства. Всплывающее окно не побеспокоит Вас в ближайшее время!

Назад

BIM3D Tools для

Revit 2017, 2018 и 2019

СКАЧАТЬ БЕСПЛАТНО
Архив новостей блога