C#ATIA

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

ボディをかき集める

Fusion360と他のCADを併用されている方いらっしゃいますか?

Fusion360は色々なフォーマットのデータを読み込んでくれるので
助かっているのですが、Fusion360上ではこんな感じで表示しているのに
f:id:kandennti:20171027193132p:plain
中間フォーマットでエクスポートしたものを、他のCADで読み込んだ際
こんな感じになってガッカリした経験は無いでしょうか?
f:id:kandennti:20171027193141p:plain
何で、色が抜けるのか? 僕、理由を知ってます。
実はデータの状態で色が抜けてしまうようです。
f:id:kandennti:20171027193149p:plain
ちょっと大げさにしましたが赤印位置にボディがあり
全てルートコンポーネント(一番トップのコンポーネント)ではない位置に
入っています。 原因はこれなんです。
(Upしたデータは、子コンポーネントに入っているような気がしてます)

色を反映させてエクスポートしたいのであれば、全てのボディを
ルートコンポーネントに移動させればOKです。
f:id:kandennti:20171027193200p:plain
これって、Tree上でD&Dをやれば済む話ではあるのですが、
対象のボディが案外Treeの深い位置にあり、数が多いと面倒なんです。

・・・そう、面倒。 なので全てのボディをかき集めるスプリクトを
作ってみました。

#FusionAPI_python
#Author-kantoku
#Description-Collect_All_Body
#アクティブなプロダクトの全てのボディをルートにかき集める

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        
        #確認
        msg = '全てのボディをルートコンポーネントにかき集めます。\nよろしいですか?'
        title = 'ボディかき集め'
        btn = adsk.core.MessageBoxButtonTypes.OKCancelButtonType
        icon = adsk.core.MessageBoxIconTypes.QuestionIconType
        Res = ui.messageBox(msg, title, btn, icon) 
        
        if Res != adsk.core.DialogResults.DialogOK: return       
        
        #モロモロ
        product = app.activeProduct
        des = adsk.fusion.Design.cast(product)       
        
        #パラメトリックじゃないとNG
        des.designType = adsk.fusion.DesignTypes.ParametricDesignType
        
        #ルート
        root = des.rootComponent
        
        #ルート以下のコンポーネント
        cmplst = []
        cmplst = Get_Comps(root, cmplst)
        
        #全ボディコンテナ
        bdyslst = [cmp.bRepBodies for cmp in cmplst if cmp.bRepBodies.count > 0]
        
        #全ボディ
        bdylst = []
        for bdys in bdyslst:
            for bdy in bdys:
                bdylst.append(bdy)
        if bdylst.count == 0 :
            return
        
        #カットペースト
        tgtBodies = root.features.cutPasteBodies
        [tgtBodies.add(bdy) for bdy in bdylst]
        
        #おしまい
        ui.messageBox('Done')

    except:
        if ui:
            ui.messageBox('エラー\n{}'.format(traceback.format_exc()))

#全コンポーネント
def Get_Comps(comp, complst):
    occs = comp.occurrences
    
    lst = [occ.component for occ in occs]
    
    if lst.count == 0:
        return complst
    
    for cmp in lst:
        complst.append(cmp)
        Get_Comps(cmp, complst)
    return complst

Pythonまだまだ駄目だなぁ。見事に二重ループがあるし…。
こんな感じです。

本当は、CATIAのProductからPartを作るコマンドをイメージしていたのですが
異なるDocument間でどうやったらコピペ出来るのか、方法わかりませんでした。
僕はこれで事足りるんですけどね。