ADN Open CIS
Сообщество программистов Autodesk в СНГ

03/09/2015

Понимание единиц измерения в Fusion 360 - Часть 1

Понимание того, как Fusion использует единицы измерения, очень важно в успешном использовании API.При использовании API единицы измерения, используемые Fusion всегда согласованы. Получение и установка значений всегда использует внутренний тип единиц для этой категории единиц. Эти типы единиц известны как единицы баз данных, потому что это те же самые единицы, которые Fusion использует внутренне и как данные сохраняются в файле. Этими единицами измерения являются:

  • Длины - Сантиметры
  • Углы - Радианы
  • Массы - Килограммы

Внутренние блоки всегда используют эти типы без каких-либо исключений. Например, если вы вызываете свойство SketchCurve.length, чтобы получить длину объекта в эскизе, возвращенное значение всегда будет в сантиметрах. Если вы используете метод Vector3D.angleTo для измерения угла между двумя векторами, результирующий угол всегда будет возвращается в радианах (помните, что радиан π равен 180 градусов). На первый взгляд это может показаться не идеально, потому что вы, возможно, захотите, чтобы работать в других единицах. Тем не менее, это на самом деле делает большинство вещей легче, потому что вы всегда можете рассчитывать на на единицы, которые являются согласованными и не придется беспокоиться о текущей активной единице измерения, которую пользователь может изменить. Вы просто пишете программу для работы в единицах, указанных выше, и она всегда будет работать так как ожидается, независимо от активных единиц. Единственный раз, когда вам нужно беспокоиться о преобразовании единиц - это когда вам нужно взаимодействовать с пользователем, путем введения им значения или отображение значения.

Единицы при общении с пользователем

Единицы становятся немного более сложным, когда взаимодействуем с пользователем. По нескольким причинам. Во-первых, пользователь может выбрать одну из нескольких единиц длины по умолчанию, как показано ниже. Также побочный эффект имеет установка единицы массы по умолчанию. Например, если вы выбираете дюймы, единицой массы является фунт, но если вы выбираете сантиметры - это граммы. Углы для пользователя всегда в градусах.

Вторая причина, по которой работать с пользователем сложнее - это потому что, когда пользователь вводит значение, результатом является строка, которая должна быть оценена, чтобы убедиться, что их ввод является действительным, и интерпретируется в реальное значение. Третья причина заключается в том, что то, что они водят, не обязательно должно быть простым значением. Вот три примера действительных записей при определении глубины отверстия:

  • "3" - в этом случае результат зависит от того, что пользователь выбрал в качестве активной единицы измерения. Например, если были выбраны дюймы, это интерпретируется как 3 дюйма, а если были выбрали миллиметры, это интерпретируется как 3 мм.
  • "3 in" - В данном случае это всегда интерпретируется как 3 дюйма, независимо от того, что какая активная единица измерения.
  • "3/2" - Возвращает 3 единицы активной единицы, разделенной на 2.
  • "hole_depth" - это ссылается на существующий параметр. Конечно, это также можно использовать как часть уравнения, т.е. "hole_depth / 2".

Поскольку пользователь имеет большую гибкость в том, как он может указать значения и потому, что он также может изменить активную единицу измерения, будет довольно трудно написать код, который правильно интерпретирует любую строку, вводимую пользователем. Чтобы помочь с этим, API поддерживает несколько утилит, которые преобразуют строку пользователя во внутренние единицы. Это позволяет принимать любую из строк примера выше, и конвертировать их в значения расстояния в единицах базы данных (сантиметры).

Это то, как Fusion работает внутри. Каждый раз, когда пользователь вводит какие-либо данные, есть строка и Fusion должен разобрать строку и выяснить, является ли она действительно какое её реальное значение. Он преобразует строку в реальное значение в единицы базы данных и использует это для всех операций в Fusion. Если значение должно быть отображено пользователю, создается строка, которая основана на настройках текущей активной единицы измерения и других настроек единиц, и отображается пользователю.

Использование объекта UnitsManager

Объект UnitsManager поддерживает функции, которые делают работу с единицами гораздо легче. Приведенный ниже код просит у пользователя ввести длину, используя поле ввода. Окно ввода позволяет пользователю ввести любую строку без ожидания того, что представляет собой эта строка. Затем код проверяет, что запись является допустимым выражением длины и затем отображает оценочные результаты в сантиметрах.

Код - C#: [Выделить]
  1. // Запрос у пользователя ввода строки и проверка того, является ли она действительной.
  2. var isValid = false;
  3. var input = '1 in';  // Начальное значение по умолчанию.
  4. var realValue;
  5. while (!isValid) {
  6.     // Получить строку от пользователя.
  7.     var objIsCancelled = [];
  8.     input = ui.inputBox('Enter a distance', objIsCancelled, 'Distance', input);
  9.  
  10.     // Выход из программы, если диалог был отменен.
  11.     if (objIsCancelled.value) {
  12.         adsk.terminate();   
  13.         return;
  14.     }
  15.  
  16.     // Проверка, была ли введена действительная длина.
  17.     var unitsMgr = design.unitsManager;
  18.     try {
  19.         realValue = unitsMgr.evaluateExpression(input, unitsMgr.defaultLengthUnits);
  20.         isValid = true;
  21.     }
  22.     catch (e) {
  23.         // Неверное выражение, так что отображаем сообщение об ошибке и устанавливаем флаг, того чтобы позволить им
  24.         // ввести значение снова.
  25.         ui.messageBox('"' + input + '" is not a valid length expression.', 'Invalid entry',
  26.                       adsk.core.MessageBoxButtonTypes.OKButtonType,
  27.                       adsk.core.MessageBoxIconTypes.CriticalIconType);
  28.         isValid = false;
  29.     }
  30. }
  31.  
  32. // Использовать значение для чего-либо.
  33. ui.messageBox('input: ' + input + ', result: ' + realValue);

Когда вы получите значение из Fusion или вычисляете его сами и должны отобразить его пользователю, можно использовать объект UnitsManager для того, чтобы отформатировать значение, так он находится в правильной единице измерения и имеет правильное количество десятичных знаков, исходя из текущих пользовательских настроек.

Код - C#: [Выделить]
  1. // Отображение результата, используя текущие активные единицы.
  2. var unitsMgr = design.unitsManager;
  3. var displayLength = unitsMgr.formatInternalValue(length, unitsMgr.defaultLength, true);       
  4. ui.messageBox('The length of all edges in the selected body is: ' + displayLength);

Всегда ожидается, что длинна, которая передается, будет в единицах базы данных (см) и метод formatInternalValue форматирует её таким образом, чтобы она была в указанных единицах. Наиболее распространенная вещью будет использование длинны по умолчанию, что собственно этот пример и делает. Если вам нужно указать другого блока типа, кроме длины по умолчанию можно указать его имя.

Большинство функций, доступных для объекта UnitsManager имеют аргументы, где нужно указать единицу измерения. Единицы задаются с помощью строки и используют те же строки, которые вы используете при указании единиц для параметра, хотя UnitManager является более гибким в том, как вы можете объединить блоки. Например, Fusion не позволит вам создать параметр, описывающий ускорение при помощи комбинации существующих типов известных единиц, таких как "m/s/s" или "m/s^2». Тем не менее, это является действительным описанием единицы измерения, когда используется в UnitsManager. Пример ниже определяет единицы, используя метры и секунды, так что возвращаемый результат будет "0.20 m/ s^2".

var result = unitsMgr.formatInternalValue(20, 'm/s/s', true);

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

 

Источник: http://help.autodesk.com/view/NINVFUS/ENU/?guid=GUID-A81B295F-984A-4039-B1CF-B449BEE893D7

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=3082

Опубликовано 03.09.2015
Отредактировано 03.10.2015 в 12:56:42