小出しになっちゃいますが、こちらの続きです。
オフセット面の作成場所2 - C#ATIA
ルートコンポーネントのアクティブ化がわからなかったのですが、
Designオブジェクトに、そのままズバリのネーミングな
activateRootComponentメソッドがありました。 ん~こんなところに
有っても気が付かないです。
#FusionAPI_python test_offset3 #Author-kantoku #Description-オフセット面の作成 import adsk.core, adsk.fusion, traceback def run(context): ui = None try: app = adsk.core.Application.get() ui = app.userInterface des = adsk.fusion.Design.cast(app.activeProduct) actOcc = des.activeOccurrence #拡張 adsk.fusion.Component.toOcc = toOccurrenc sel = Sel('Select Solid Face','SolidFaces') if sel is None: return face = sel.entity CreateZeroOffset(face) OccActivate(actOcc) ui.messageBox('Done') except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) def Sel(msg, selFilter): app = adsk.core.Application.get() ui = app.userInterface try: return ui.selectEntity(msg, selFilter) except: return None def CreateZeroOffset(face): zero = adsk.core.ValueInput.createByString('0 cm') newBody = adsk.fusion.FeatureOperations.NewBodyFeatureOperation #選択された面のあるボディのコンポーネント取得 comp = face.body.parentComponent #コンポーネントのフューチャーのオフセットを取得 offsets = comp.features.offsetFeatures objs = adsk.core.ObjectCollection.create() objs.add(face) OccActivate(comp.toOcc()) offsets.add(offsets.createInput(objs, zero, newBody)) #adsk.fusion.Component 拡張メソッド def toOccurrenc(self): root = self.parentDesign.rootComponent if self == root: return None occs = [occ for occ in root.allOccurrencesByComponent(self) if occ.component == self] return occs[0] #オカレンスのアクティブ化 def OccActivate(occ): app = adsk.core.Application.get() des = adsk.fusion.Design.cast(app.activeProduct) if occ is None: des.activateRootComponent() else: occ.activate()
これで、当初予定していた動きになるようになりました。
まだまだ問題山積みです。オカレンスが。