C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

オフセット面の作成場所

サーフェスのオフセット面を作りたいのですが、
思うように出来なくて悩んでます。

f:id:kandennti:20181001183859p:plain
こんな感じの状態で、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))

これを上記の状態で実行すると
f:id:kandennti:20181001183948p:plain
アクティブなコンポーネント(今回は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さんは、僕に近い感覚の事を書いています。
(アクティブなコンポーネントに出来るわけじゃないと ・・・多分)

質問者さんは納得しなかったようで、やっぱりアクティブにしたい
ような雰囲気です。
(僕も、常にアクティブなコンポーネントに作成されている
 実感はあります。)

納得は出来ないものの目的地にたどり着く為には、やっぱり
目的のコンポーネントをアクティブにするしかない と思っている
のですが、コンポーネントからオカレンスをどうやったら
取得できるのか? を探し中。