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

29/10/2015

Особенности, характерные для C++ - Часть 1

Fusion 360 имеет один API, который можно использовать из нескольких языков программирования. В большинстве случаев, API используется очень подобным образом из каждого из языков программирования, просто с небольшой оглядкой на специфические языковые изменения синтаксиса. Тем не менее, в некоторых случаях существуют значительные различия в том, как API используется для конкретного языка.В этой теме обсуждается различия, которые являются уникальными для C++ и охватывает вопросы, перечисленные ниже.

  • Специфические для ОС особенности
  • Объявление объекта
  • Обработка ошибок
  • Свойства
  • Типы объектов и приведение типов
  • События
  • Заголовочные файлы
  • Итерации
  • Равенство объектов
  • Вспомогательные функции
  • Отладка сценариев или надстроек Windows
  • Отладка сценариев или надстроек Mac

Специфические для ОС особенности

При создании нового сценария Python и JavaScript или надстройки, используя команду "Scripts and Add-Ins" создается один файл cpp, но создаются проекты как для Visual Studio (.vcxproj) так и для Xcode (.xcodeproj), которые используют, один и тот же cpp. В большинстве случаев один и тот же код может быть использован как на Windows, Mac, если вы не выбрали, чтобы использовать внешнюю библиотеку, которая является специфической для ОС. Даже если это, как правило, возможно, чтобы один и тот же исходный код мог быть использован как для Mac и Windows, бинарный же, используемый Fusion является специфическим для ОС. Это означает, что вы должны использовать Windows и Visual Studio для компиляции сценария или надстройки для Windows, а OS X и Xcode, чтобы скомпилировать его для Mac.

Большая часть обсуждения ниже о коде вашего сценария или надстройки и является платформо-независимым, так что относится как к Mac, так и к Windows. Последняя тема описывает отладку сценария или надстройки, которая является специфической для ОС.

Объявление объекта

Объявления переменных и аргументы функции, которые используют определенный Fusion тип должны всегда использовать определенный Fusion шаблон Ptr для создания умного указателя.Умный указатель будет автоматически обрабатывать добавление и удаление ссылок, удаление ссылки, когда она не больше не нужна (т.е. когда переменная выходит из области видимости или явным образом устанавливается в nullptr), и приведение.

Код - C++: [Выделить]
  1. Ptr<SketchLine> line1;
  2. bool doAnimation(Ptr<SketchCurve> pathCurve, Ptr<Vector3D> upDirection)
  3. {
  4. }

Обработка ошибок

В C++ реализации Fusion API, все ошибки отчитываются посредством кодов ошибок. Утверждения не передаются, так что try-catch не будет работать. В большинстве случаев это означает одну из двух вещей. Во-первых, если функция должна вернуть объект, она либо вернет ожидаемый объект или какой-либо другой документируемый результат (обычно NULL), указывающее что функция завершилась ошибкой. Это показано ниже.

Код - C++: [Выделить]
  1. Ptr<SketchLine> ln = lines->addByTwoPoints(p1, p2);
  2. if (!ln)
  3.     return false;

Если функция завершилась ошибкой, вы можете получить дополнительную информацию о причине отказа, используя метод GetLastError объекта Application. Это показано ниже:

Код - C++: [Выделить]
  1. Ptr<SketchLine> ln;
  2. ln = lines->addByTwoPoints(p1, p2);
  3. If (!ln)
  4. {
  5.     // Получить сообщение об ошибке
  6.     std::string errorMessage;
  7.     int errorCode = app->getLastError(&errorMessage);
  8.     if (GenericErrors::Ok != errorCode)
  9.         ui->messageBox(errorMessage);
  10.     return false;
  11. }

Второй способ создания отчетов об ошибках - для функций, которые возвращают логическое значение, указывающее успех или неудачу, как показано ниже. Опять же, вы можете использовать метод GetLastError, чтобы получить больше информации об ошибке.

Код - C++: [Выделить]
  1. bool isOK = sk->isComputeDeferred(false);
  2. if (!isOK)
  3.     return false;

Свойства

С++ не поддерживает свойства так, как они определены в API, и как они используются JavaScript и Python. Образец JavaScript ниже иллюстрирует использование доступного для чтения-записи имени свойства объекта компонента для того, чтобы получить имя существующего компонента, а затем задания его значения.

Код - JavaScript: [Выделить]
  1. // JavaScript
  2. if (comp.name == "Test")
  3.     comp.name = "New Test";

В C ++, свойства реализуются с помощью двух перегруженных функций, где версия считывания свойства реализована в виде функции, которая не имеет никаких аргументов и возвращает значение свойства. Установка значения свойства выполняется с помощью функции, которая принимает один аргумент, который является новым значением свойства и возвращает логическое значение, указывающее на успех или неудачу. Обе эти функции показаны ниже.

Код - C++: [Выделить]
  1. // C++
  2. if (comp->name() == "Test")
  3.     bool isOK = comp.name("New Test");

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

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

Опубликовано 29.10.2015
Отредактировано 29.10.2015 в 08:38:52