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

15/09/2015

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

Ссылочные Аргументы

Python не поддерживает вывод или аргументов "по ссылке". Например, метод Point3D.getData выполнен в виде:

Код - Python: [Выделить]
  1. boolean Point3D.getData( out double x, out double y, out double z )

Аргументы x, у и z типа "out double", где "out" указывает что аргумент "по ссылке". Документация указывает, что этот аргумент будет использоваться в качестве аргумента, содержащего выходной результат.

В Python, все выходы функций возвращаются как одно возвращаемое значение, которое для Python будет кортежем, если есть какие-либо аргументы "out". Первое значение в кортеже всегда будет документированным возвращаемым значением функции. Другие значения аргументами out в том же порядке, в котором они перечислены в списке аргументов. Пример ниже иллюстрирует вызов функции Point3D.getData и непосредственное присвоение результатов переменным.

Код - Python: [Выделить]
  1. (retVal, x, y, z) = point.getData()

Работа с коллекциями

Коллекции Fusion - это любые объекты, который поддерживают свойство count и метод item, (и как правило множество других функций тоже). Оболочки, которые создаются для коллекций для интерфейса Fusion Python поддерживают стандартный контейнер итерации Python и длинный синтаксис, так что вы можете выбрать между использованием count и item или более дружелюбным для Python итератором. Например, вместо того, чтобы использовать:

Код - Python: [Выделить]
  1. (for i in range(col.count): item = col.item(i) ...

Вы можете написать это:

Вы также можете использовать функцию len поэтому вместо col.count вы можете использовать len(col).

Для доступа к конкретному элементу в коллекции можно использовать предоставляемый Fusion API метод, либо вы можете использовать стандартны аксессор контейнера Python, так что вместо того, чтобы использовать col.item(i), можно использовать col[i].В дополнение к этому, потому что коллекции используют стандартный контейнер Python, вы можете также использовать синтаксис контейнера "slice", чтобы получить подмножество элементов из коллекции. Например,

  • col[0] # Получить первый элемент в контейнере.
  • col[-1] # Получить последний элемент в контейнере.
  • col[:2] # Получить первые два элемента в контейнере в виде списка.
  • col[-2:] # Получить последние два элемента в контейнере в виде списка.
  • col[1:4] # Получить второй, третий и четвертый элементы в контейнере в виде списка.

Типы объектов

Питон - не строго типизированный язык. Тем не менее, вы можете выяснить, какой конкретный тип существующего объекта. Для этого есть несколько подходов. Сначала вы можете использовать функцию type(), чтобы получить тип объекта.

Код - Python: [Выделить]
  1. # Получить выбранный объект.
  2. selObj = app.activeSelection.item(0).object
  3.  
  4. # Проверить, является ли это линией эскиза.
  5. if type(selObj) is adsk.fusion.SketchLine:
  6.     print( "SketchLine is selected." )

Функция type() возвращает непосредственный тип объекта, но не работает, если вы хотите от выяснить, является ли этот объект унаследованным от другого объекта. Например, код ниже не сработает и никогда войдет в объявление if, потому что все объекты будут их специфического типа.

Код - Python: [Выделить]
  1. # Получить выбранный объект.
  2. selObj = app.activeSelection.item(0).object
  3.  
  4. # Проверить, является ли это любым типом эскиза.
  5. # Это никогда не будет работать, потому что объекты определенного типа.
  6. if type(selObj) is adsk.fusion.SketchEntity:
  7.     print( "A sketch entity is selected." )
  8.  

SketchLine происходит от SketchCurve, который является производным от SketchEntity, который является производным от core.Base. Если у вас есть объект, и вы хотите увидеть, является ли он любым типом вхождения эскиза, вы можете использовать функцию isinstance() вместо type(), как показано ниже.

Код - Python: [Выделить]
  1. # Получить выбранный объект.
  2. selObj = app.activeSelection.item(0).object
  3.  
  4. # Проверить, является ли вхождение производным от SketchEntity.
  5. if isinstance(selObj, adsk.fusion.SketchEntity):
  6.     print( "Is some kind of sketch curve." )
  7.  

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

Одинаковыми являются потребности сравнения как объектов так и переменных, которые ссылаются один на тот же объект Fusion. В Python вы можете использовать оператор равенства '=='. Код ниже проверяет две переменные, чтобы проверить, ссылаются ли они на одну и ту же грань.

Код - Python: [Выделить]
  1. # Сравните две переменные, чтобы увидеть, ссылаются ли они на одну и ту же грань.
  2. if face1 == face2:
  3.     print( "Faces are the same" )

Оператор Python "is" не может быть использован для сравнения двух объектов Fusion. Вместо этого вы должны использовать оператор равенства, как показано выше.

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

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

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

Опубликовано 15.09.2015
Отредактировано 06.10.2015 в 23:11:17