Столкнулся сегодня с задачей, в которой мне необходимо было высчитать производные в точке для дуги. Как и прежде я снова открыл справку и, так как я не обладаю высшим геометрическим образованием, я снова впал в ступор с вопросом «Какое же значение мне нужно?». Поэтому я решил сделать для себя и для всех небольшую шпаргалку-визуализацию.
Суть шпаргалки – получить визуальное представление для векторов класса Transform, получаемых при использовании метода Curve.ComputeDerivatives
Подробнее: Revit. Визуализация ComputeDerivatives для Line и Arc
Используя API Navisworks, мы можем выполнять раскраску элементов, а также сбрасывать раскраску. При этом можно использовать постоянный или временный цвет. Для этого используются методы OverridePermanentColor, OverrideTemporaryColor, ResetPermanentMaterials, ResetTemporaryMaterials. Про прозрачность не пишу, так как все тоже самое, что и про цвет.
Существуют нюансы с раскраской элементов, которые необходимо учитывать. Причем, получается, что идеального варианта раскраски вообще нет.
Подробнее: Нюансы раскраски элементов в Navisworks
Как оказалось, в Revit API нет методов, позволяющих разделить кривую Curve на части заданной длины. Именно такая задача недавно у меня при разработке плагина. В AutoCAD API есть хороший метод GetPointAtDist, который позволяет решить данную задачу, но в Revit API пришлось решать её самому.
В моем случае мне нужно было получить точки деления кривой на части заданной длины. Для решения задачи нам понадобятся параметры кривой. Получаем начальный и конечный параметр и через интерполяцию находим шаг параметризации, равнозначный длине части. Далее просто делаем цикл, прибавляя шаг параметризации, до тех пор, пока сумма шагов не достигнет конечного параметра. Если шаг по длине не делит кривую на равнозначные части (в конце остается участок меньшей длины, чем заданная длина части), берем ещё конечную точку. Если заданная длина части вдруг оказалась меньше длины кривой, берем конечные точки:
/// <summary>
/// Возвращает точки деления кривой на части указанной длины
/// </summary>
/// <param name="curve">Кривая</param>
/// <param name="step">Шаг деления</param>
public static IEnumerable<XYZ> Divide(this Curve curve, double step)
{
if (curve.Length > step)
{
var startParameter = curve.GetEndParameter(0);
var endParameter = curve.GetEndParameter(1);
var parameterStep = (endParameter - startParameter) / (curve.Length / step);
var parameterSum = startParameter;
do
{
yield return curve.Evaluate(parameterSum, false);
parameterSum += parameterStep;
}
while (parameterSum < endParameter);
if (Math.Abs(parameterSum - endParameter) > 0.0001)
yield return curve.GetEndPoint(1);
}
else
{
yield return curve.GetEndPoint(0);
yield return curve.GetEndPoint(1);
}
}
Данную идею можно реализовать и для других схожих задач: взять точку на определенном расстоянии, поделить кривою на заданное количество частей и т.д. Главное, что нужно понять из данной записи – все подобные задачи необходимо решать через параметры кривой.
В данной небольшой заметке я не открою Америку и не расскажу что-то уникальное. Но заметку я решил написать, так как не сразу можно догадаться о причинах такого поведения.
Итак, у вас есть команда, работающая по сценарию: запуск команды, выбор примитива, какие-то действия с примитивом. И может случиться так: вы запустили команду, начался запрос на выбор примитива, вы покрутили колесиком, а затем нажали Esc и произошло зуммирование к тем границам экрана, которые были до вызова команды. Иногда это может сильно бесить пользователей.
Подробнее: AutoCAD. Как устранить обратный zoom при прерывании выбора примитивов