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

30/10/2015

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

Файлы заголовков

Интерфейс C ++ для Fusion API описан многими .h файлами, которые предоставляются в рамках установки Fusion. Существует отдельный файл .h для каждого класса, и они организованы в папки в папке "…/API/CPP/include". Есть две папки верхнего уровня, которые называются "Core" и "Fusion". Папка "Core" содержит функциональные возможности, не специфические для Fusion, (UI, материалы, Геометрия, и т.д.) и "Fusion" содержит специяическую для Fusion функциональность (Эскиз, Свойства, компоненты, и т.д.). Внутри каждой из этих папок сгруппирована определенная функциональность. Чтобы написать простую программу, которая создает профиль линий и выдавливает его, вы будете использовать классы, которые требуют включения следующих файлов заголовков.

Код - C++: [Выделить]
  1. #include <Core/Application/Application.h>
  2. #include <Fusion/Fusion/Design.h>
  3. #include <Fusion/Components/Component.h>
  4. #include <Fusion/Construction/ConstructionPlane.h>
  5. #include <Fusion/Sketch/Sketches.h>
  6. #include <Fusion/Sketch/Sketch.h>
  7. #include <Fusion/Sketch/SketchCurves.h>
  8. #include <Fusion/Sketch/SketchLines.h>
  9. #include <Fusion/Sketch/SketchLine.h>
  10. #include <Fusion/Sketch/Profiles.h>
  11. #include <Fusion/Sketch/Profile.h>
  12. #include <Fusion/Features/Features.h>
  13. #include <Fusion/Features/ExtrudeFeatureInput.h>
  14. #include <Fusion/Features/ExtrudeFeatures.h>
  15. #include <Fusion/Features/ExtrudeFeature.h>

Не всегда очевидно, в какую папку вы будете заглядывать, чтобы найти файл .h для конкретного класса. Раздел помощи для каждого класса, метода, свойства, и событие, перечисляет, который .h файл нужно включить чтобы использовать эту функциональность. Несмотря на то, что это не является стандартной практикой C++, вы можете избежать необходимости добавления #include для каждого класса, используемого в вашей программе, при помощи файлов "CoreAll.h" и "FusionAll.h". Эти два файла включают в себя все связанные .h файлы Fusion, который доступны. Это приводит к большему время компиляции, но из-за оптимизации компилятора результаты выполнения те же.

Код - C++: [Выделить]
  1. #include <Core/CoreAll.h>
  2. #include <Fusion/FusionAll.h>

Также для упрощения использования API вы можете использовать объявление "using namespace", чтобы ссылаться на полное пространство имен при объявлении переменных. Используя два объявления ниже, вам не нужно знать, определен ли класс в Core или Fusion.

Код - C++: [Выделить]
  1. using namespace adsk::core;
  2. using namespace adsk::fusion;

При объявлении переменной типа "Application" вы можете использовать:

Ptr<Application> app = Application::get();

Вместо:

Ptr<adsk::core::Application> app = Application::get();

Конечно, в обоих случаях - с помощью ли CoreAll.h и FusionAll.h, или используя пространство имен - выбор за вами, использовать ли ярлыки, или использовать практику, более стандартную для С ++.

Итерация

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

Код - C++: [Выделить]
  1. for (Ptr<BRepFace> newFace : selectedBody->faces())
  2. {
  3.     // Сделать что-то с гранью.
  4. }

Равенство объектов

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

Код - C++: [Выделить]
  1. If (face1 == face2)
  2.     ui.messageBox(“Faces are the same.”);

Вспомогательные функции

Интерфейс Си++ также поддерживает несколько вспомогательных функций, определенные в Core/Utils.h, которые полезны в некоторых особых случаях.

adsk::doEvents()) - приостанавливает выполнение вашего скрипта или надстройки и позволяет Fusion обрабатывать все сообщения, находящиеся в настоящее время в его очереди.Есть случаи, когда вы за управляете Fusion помощью программы, которую Fusion не будет поддерживать в графическом виде. Вызов doEvents дает Fusion шанс наверстать и обновить экран.

adsk::autoTerminate() - Когда выполняется сценарий C++, он автоматически прекращается.В большинстве случаев это желаемое поведение, потому что сценарии, как правило, выполняются, выполняя свою функцию, и всё. Если вы хотите чтобы программа по-прежнему работала и автоматически не прекращалась, лучше создать надстройку вместо использования скрипта. Тем не менее, возможно иметь сценарий - используя свойство autoTerminate - который продолжит работать и не завершится автоматически. Используя это свойство, вы можете проверить текущее состояние авто-завершения и установить его.

adsk::terminate() - Функция terminate заставляет сценарий или надстройке немедленно завершится.Это особенно полезно, это вы использовали autoTerminate со сценарием, так что он автоматически не завершается. Используя функцию terminate можно определить, когда сценарий можно прекратить.

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

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

Опубликовано 30.10.2015