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

17/09/2015

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

Подсказки кода

Хотя Python не является сильно типизированным языком, IDE по-прежнему пытается выяснить тип, который представляет переменная, поэтому он может показывать соответствующие подсказки кода для этого объекта. Например, на рисунке среда знает, что функция adsk.core.Application.get возвращает объект Application поэтому, когда я набираю точку после app, она показывает список методов и свойств, поддерживаемых объектом Application. То же самое верно, если я использую переменную ui, потому что он знает, что она ссылается на объект UserInterface.

 

Возможность IDE корректно обрабатывать подсказки кода сбоит, когда свойства типизированы вернуть базовый класс, но на самом деле возвращает один из производных классов. Типичным примером этого является использование свойства activeProduct объекта Application. Это свойство типизировано для того, чтобы вернуть объект Product, но всегда будет возвращать более конкретный объект, который является производным от Product. При работе с Fusion будет возвращать объект Design. На рисунке ниже показаны подсказки кода, которые имеют методы и свойства, поддерживаемые только объектом Product, но наиболее вероятно, что вы захотите получить доступ к методам и свойствам, которые являются специфическими для объекта Design. Вы все еще можете написать код без использования подсказок кода, и он будет работать точно так же, но имеющиеся подсказки кода могут значительно улучшить вашу способность использовать API, быстро показывая вам, какие методы и свойства поддерживает объект и аргументы, которые требует метод.

Хотя это не требуется для для запуска программы, вы можете передать переменные определенному типу, так что IDE знает, что представляет собой эта переменная и может показывать соответствующие подсказки кода. Вы можете сделать это в Python, используя статическую функцию "cast". Это используется ниже, чтобы передать переменной будет объект Design, и вы можете видеть, что подсказки кода в настоящее время показывают все методы и свойства, поддерживаемые объектом Design. Вызов функции cast вернет None в том случае, когда активный продукт не является проектом.

 

Другой распространенный пример, когда IDE не может показать подсказки кода, когда с API используется для того, чтобы выполнить выбор. Например, используя свойство UserInterface.activeSelections. Фактический выбранный объект, возвращается свойством Selection.entity которое типизировано возвращать объект Base, от которого наследуются все объекты Fusion, и не очень удобно для подсказок кода. Если вы знаете тип объекта, который будет выбран, вы можете использовать функцию cast, чтобы дать IDE знать какого тип переменная, что показано ниже.

Код - Python: [Выделить]
  1. sels = app.userInterface.activeSelections
  2. # Отобрать выбор до края.
  3. edge = adsk.fusion.BRepEdge.cast(sels[0].entity)
  4. if not edge:
  5.     ui.messageBox('An edge was not selected.')
  6.     return
  7. # Теперь будут хорошие подсказки кода для переменной "edge".

Дополнительные модули Python

Многие модули были написаны для Python, чтобы расширить его возможности. Python, который поставляется с Fusion, включает в себя только основные модули, которые поставляются со стандартной установкой Python. Тем не менее, вы можете использовать другие модули, делая их доступными для вашей программы Python. Вместо установки или добавления модуля к sys.path мы рекомендуем вам иметь локальную копию модуля для вашего сценария. Для того чтобы сделать это, вы устанавливаете модуль Python в той же директории, что и ваш скрипт, или в подкаталоге. Компоновка ниже рекомендована в том случае, если имя сценария является "MyScript" и имя модуля Python является xlrd (модуль, который обеспечивает доступ к файлам Microsoft Excel).

 

Для ссылки на модуль в скрипте Python вы используете синтаксис относительного пути, как показано ниже.

Код - Python: [Выделить]
  1. from .Modules import xlrd

Разное

Python работает в рамках процесса Fusion, а также работает в главном потоке Fusion. Из-за этого когда ваша программа выполняется, обязательным является заморозка Fusion, потому что программа никогда не получает шанс среагировать на сообщения. Типичным примером этого является, когда ваш скрипт или надстройка редактирует модель. Даже если ваша программа работает успешно и делает ожидаемые изменения в модели, вы не видите эти изменения, пока ваша программа не завершается. Это происходит по причине того, что сообщения, отправляемые системой для обновления дисплея, не в состоянии быть обработаны, потому что основной поток выполняет сценарий или надстройку.

В некоторых случаях это действительно желательно, так как на обновления графики тратится меньше времени и общее время выполнения программы будет короче. Тем не менее, в других случаях лучше, если пользователь может просматривать модель, которая строится для того, чтобы убедиться, что она верна, и потому что это и также служит в качестве своеобразного счетчика прогресса. Другой пример - это когда вам требуется манипулировать камерой при облете вокруг и через модель. Fusion должен быть в состоянии обрабатывать и реагировать на сообщения изменения камеры, чтобы иметь возможность обновить экран. В API поддерживает функцию doEvents, которые временно останавливает выполнение надстройки или сценария и дает шанс Fusion обработать любое сообщение в очереди.Ниже приведен пример сценария, который создает 100 новых экземпляров выбранного компонента. С вызовом doEvents вы видите каждое вхождение, когда оно добавляется к сборке. Без него графика не обновляется пока программа не закончит выполнение.

Код - Python: [Выделить]
  1. def copyOccurrence():
  2.     ui = None
  3.     try:
  4.         app = adsk.core.Application.get()
  5.         ui = app.userInterface
  6.  
  7.         occ = adsk.fusion.Occurrence.cast(ui.selectEntity('Select an occurrence', 'Occurrences').entity)
  8.  
  9.         if occ:
  10.             root = app.activeProduct.rootComponent
  11.  
  12.             # Получить ссылаемый компонент.
  13.             comp = occ.component
  14.  
  15.             # Создать 100 вхождений со смещением 5 см в направлении Х от выбранного события.
  16.             trans = occ.transform
  17.             offset = trans.getCell(0, 3)
  18.             for i in range(0, 100):
  19.                 offset += 5
  20.                 trans.setCell(0, 3, offset)
  21.                 root.occurrences.addExistingComponent(comp, trans)
  22.  
  23.                 # Вызвать doEvents для того, чтобы дать Fusion возможность среагировать.
  24.                 adsk.doEvents()
  25.     except:
  26.         if ui:
  27.             ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

 

Источник: http://help.autodesk.com/view/NINVFUS/ENU/?guid=GUID-743C88FB-CA3F-44B0-B0B9-FCC378D0D782+

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

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

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