Fusion API: Атрибут возвращает NONE для грани, к которой был присоединён атрибут
Вопрос
Я присоединил атрибуты к нескольким выбранным граням сборки. Когда я осуществляю перебор граней каждого компонента и пытаюсь найти те грани, они не возвращают атрибуты. Мой код приведен ниже. Предполагается, что грань была выбрана в сборке.
- def main():
- ui = None
- try:
- app = adsk.core.Application.get()
- ui = app.userInterface
- face = adsk.fusion.BRepFace.cast(ui.activeSelections.item(0).entity)
- face.attributes.add('MyGroup', 'MyName', 'MyValue')
- design = adsk.fusion.Design.cast(app.activeProduct)
- for occ in design.rootComponent.occurrences:
- comp = occ.component
- body = comp.bRepBodies.item(0)
- for face in body.faces:
- attr = face.attributes.itemByName('MyGroup', 'MyName')
- #всегда none
- if attr != None:
- ui.messageBox('Атрибут имеет значение {}'.format(attr))
- else:
- print('Атрибут имеет значение None')
- except:
- if ui:
- ui.messageBox('Ошибка:\n{}'.format(traceback.format_exc()))
Решение
Геометрия, которую мы видим в сборке, фактически является ссылками на исходные компоненты. Во Fusion 360 они называются объекты Proxy. Так, когда вы выбираете грань в контексте сборки, грань фактически является proxy гранью. Это значит, что атрибут был добавлен к грани proxy. В то же время, когда вы осуществляете перебор граней каждого компонента, он будет осуществлён по исходным граням, которые не имеют атрибутов, добавленных к proxy-грани. Так что, если вы хотите получить обратно эту информацию, вам необходимо получить proxy-грань для каждой исходной. Например:
- def main():
- ui = None
- try:
- app = adsk.core.Application.get()
- ui = app.userInterface
- face = adsk.fusion.BRepFace.cast(ui.activeSelections.item(0).entity)
- face.attributes.add('MyGroup', 'MyName', 'MyValue')
- design = adsk.fusion.Design.cast(app.activeProduct)
- for occ in design.rootComponent.occurrences:
- comp = occ.component
- body = comp.bRepBodies.item(0)
- for face in body.faces:
- #получить proxy-грань в контексте сборки, соответствующую
- #исходной грани этого вхождения
- faceproxy= face.createForAssemblyContext(occ)
- #получить атрибут proxy-грани
- attr = faceproxy.attributes.itemByName('MyGroup', 'MyName')
- #attr = face.attributes.itemByName('MyGroup', 'MyName')
- if attr != None:
- ui.messageBox('Атрибут имеет значение {}'.format(attr))
- else:
- print('Атрибут имеет значение None')
- except:
- if ui:
- ui.messageBox('Ошибка:\n{}'.format(traceback.format_exc()))
Опубликовано 17.01.2017
Отредактировано 21.02.2017 в 01:25:33