C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

オフセット面の作成場所3

小出しになっちゃいますが、こちらの続きです。
オフセット面の作成場所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()

これで、当初予定していた動きになるようになりました。
まだまだ問題山積みです。オカレンスが。