サーフェスのオフセット面を作りたいのですが、
思うように出来なくて悩んでます。
こんな感じの状態で、Body1の選択された青い面のオフセット面を
作成したいのです。但し、Body1はComponent1:1に有り、
それとは異なるRootのコンポーネントがアクティブな状態です。
そして、Body1と同じコンポーネントにオフセット面を作成したいんです。
こんなコードにしました。
#FusionAPI_python test_offset #Author-kantoku #Description-オフセット面の作成 import adsk.core, adsk.fusion, traceback def run(context): ui = None try: app = adsk.core.Application.get() ui = app.userInterface sel = Sel('Select Solid Face','SolidFaces') if sel is None: return face = sel.entity CreateZeroOffset(face) 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 print(comp.name) #コンポーネントのフューチャーのオフセットを取得 offsets = comp.features.offsetFeatures objs = adsk.core.ObjectCollection.create() objs.add(face) offsets.add(offsets.createInput(objs, zero, newBody))
これを上記の状態で実行すると
アクティブなコンポーネント(今回はRoot)にオフセット面が
出来ています。
手動で行った感覚であれば
”まぁ当然アクティブなコンポーネントに出来るでしょ”
と思うのですが、CreateZeroOffset関数内の
#選択された面のあるボディのコンポーネント取得 comp = face.body.parentComponent ↑選択面の存在するコンポーネント print(comp.name) ↑確認 選択面のコンポーネント名を出力 #コンポーネントのフューチャーのオフセットを取得 offsets = comp.features.offsetFeatures ↑上のコンポーネント内のオフセットフューチャー オブジェクトを取得
と言う手順でオフセット面を作成している為、選択面の存在する
コンポーネントにオフセット面が作成されるのが当然のように
感じています。
何となく納得できなかったので、フォーラムで検索すると
こちらをHit。
https://forums.autodesk.com/t5/fusion-360-api-and-scripts/activate-component-with-code/m-p/7470207
Ekinsさんは、僕に近い感覚の事を書いています。
(アクティブなコンポーネントに出来るわけじゃないと ・・・多分)
質問者さんは納得しなかったようで、やっぱりアクティブにしたい
ような雰囲気です。
(僕も、常にアクティブなコンポーネントに作成されている
実感はあります。)
納得は出来ないものの目的地にたどり着く為には、やっぱり
目的のコンポーネントをアクティブにするしかない と思っている
のですが、コンポーネントからオカレンスをどうやったら
取得できるのか? を探し中。