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

17/01/2017

Fusion API: Атрибут возвращает NONE для грани, к которой был присоединён атрибут

Вопрос

Я присоединил атрибуты к нескольким выбранным граням сборки. Когда я осуществляю перебор граней каждого компонента и пытаюсь найти те грани, они не возвращают атрибуты. Мой код приведен ниже. Предполагается, что грань была выбрана в сборке.

Код - Python: [Выделить]
  1. def main():
  2.     ui = None
  3.     try:
  4.         app = adsk.core.Application.get()
  5.         ui = app.userInterface
  6.         face = adsk.fusion.BRepFace.cast(ui.activeSelections.item(0).entity)
  7.         face.attributes.add('MyGroup', 'MyName', 'MyValue')
  8.         design = adsk.fusion.Design.cast(app.activeProduct)
  9.       
  10.         for occ in design.rootComponent.occurrences:
  11.             comp = occ.component
  12.             body = comp.bRepBodies.item(0)
  13.             for face in body.faces:
  14.             
  15.                 attr = face.attributes.itemByName('MyGroup', 'MyName')
  16.                
  17.                 #всегда none
  18.                 if attr != None:
  19.                     ui.messageBox('Атрибут имеет значение {}'.format(attr))
  20.                 else:
  21.                     print('Атрибут имеет значение None')
  22.  
  23.     except:
  24.         if ui:
  25.             ui.messageBox('Ошибка:\n{}'.format(traceback.format_exc()))

Решение

Геометрия, которую мы видим в сборке, фактически является ссылками на исходные компоненты. Во Fusion 360 они называются объекты Proxy. Так, когда вы выбираете грань в контексте сборки, грань фактически является proxy гранью. Это значит, что атрибут был добавлен к грани proxy. В то же время, когда вы осуществляете перебор граней каждого компонента, он будет осуществлён по исходным граням, которые не имеют атрибутов, добавленных к proxy-грани. Так что, если вы хотите получить обратно эту информацию, вам необходимо получить proxy-грань для каждой исходной. Например:

Код - Python: [Выделить]
  1. def main():
  2.     ui = None
  3.     try:
  4.         app = adsk.core.Application.get()
  5.         ui = app.userInterface
  6.         face = adsk.fusion.BRepFace.cast(ui.activeSelections.item(0).entity)
  7.         face.attributes.add('MyGroup', 'MyName', 'MyValue')
  8.         design = adsk.fusion.Design.cast(app.activeProduct)
  9.       
  10.         for occ in design.rootComponent.occurrences:
  11.             comp = occ.component
  12.             body = comp.bRepBodies.item(0)
  13.             for face in body.faces:
  14.                 #получить proxy-грань в контексте сборки, соответствующую
  15.                 #исходной грани этого вхождения
  16.                 faceproxy= face.createForAssemblyContext(occ)
  17.                
  18.                 #получить атрибут proxy-грани
  19.                 attr = faceproxy.attributes.itemByName('MyGroup', 'MyName')
  20.                 #attr = face.attributes.itemByName('MyGroup', 'MyName')
  21.                
  22.                 if attr != None:
  23.                     ui.messageBox('Атрибут имеет значение {}'.format(attr))
  24.                 else:
  25.                     print('Атрибут имеет значение None')
  26.  
  27.     except:
  28.         if ui:
  29.             ui.messageBox('Ошибка:\n{}'.format(traceback.format_exc()))

Источник: http://adndevblog.typepad.com/manufacturing/2016/12/fusion-api-attribute-returns-none-for-the-face-that-has-been-attached-attribute.html
Автор перевода: Дмитрий Емельянов
Опубликовано 17.01.2017
Отредактировано 21.02.2017 в 01:25:33