Особенности, характерные для 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), и приведение.
- Ptr<SketchLine> line1;
- bool doAnimation(Ptr<SketchCurve> pathCurve, Ptr<Vector3D> upDirection)
- {
- }
Обработка ошибок
В C++ реализации Fusion API, все ошибки отчитываются посредством кодов ошибок. Утверждения не передаются, так что try-catch не будет работать. В большинстве случаев это означает одну из двух вещей. Во-первых, если функция должна вернуть объект, она либо вернет ожидаемый объект или какой-либо другой документируемый результат (обычно NULL), указывающее что функция завершилась ошибкой. Это показано ниже.
- Ptr<SketchLine> ln = lines->addByTwoPoints(p1, p2);
- if (!ln)
- return false;
Если функция завершилась ошибкой, вы можете получить дополнительную информацию о причине отказа, используя метод GetLastError объекта Application. Это показано ниже:
- Ptr<SketchLine> ln;
- ln = lines->addByTwoPoints(p1, p2);
- If (!ln)
- {
- // Получить сообщение об ошибке
- std::string errorMessage;
- int errorCode = app->getLastError(&errorMessage);
- if (GenericErrors::Ok != errorCode)
- ui->messageBox(errorMessage);
- return false;
- }
Второй способ создания отчетов об ошибках - для функций, которые возвращают логическое значение, указывающее успех или неудачу, как показано ниже. Опять же, вы можете использовать метод GetLastError, чтобы получить больше информации об ошибке.
- bool isOK = sk->isComputeDeferred(false);
- if (!isOK)
- return false;
Свойства
С++ не поддерживает свойства так, как они определены в API, и как они используются JavaScript и Python. Образец JavaScript ниже иллюстрирует использование доступного для чтения-записи имени свойства объекта компонента для того, чтобы получить имя существующего компонента, а затем задания его значения.
- // JavaScript
- if (comp.name == "Test")
- comp.name = "New Test";
В C ++, свойства реализуются с помощью двух перегруженных функций, где версия считывания свойства реализована в виде функции, которая не имеет никаких аргументов и возвращает значение свойства. Установка значения свойства выполняется с помощью функции, которая принимает один аргумент, который является новым значением свойства и возвращает логическое значение, указывающее на успех или неудачу. Обе эти функции показаны ниже.
- // C++
- if (comp->name() == "Test")
- bool isOK = comp.name("New Test");
Обсуждение: http://adn-cis.org/forum/index.php?topic=3157
Опубликовано 29.10.2015Отредактировано 29.10.2015 в 08:38:52