気の向くままに

たぶん、技術ネタブログになると思う。

【球状歯車に挑戦⑤】pythonでFusion360を動かす

 まずは球状歯車と鞍状歯車のうち、鞍状歯車を作るためにFusion360pythonガリガリ動かします。

ボディを選択してコピー

        #コピーのためのおまじない
        product = app.activeProduct
        design = adsk.fusion.Design.cast(product)
        rootComp = design.rootComponent
            
        #既存のBodyを読み込む
        orgBody, cpyBody = None, None
        for bufBody in rootComp.bRepBodies:
            if bufBody.name == "ball":
                orgBody = bufBody
        cpyBody = rootComp.features.copyPasteBodies.add(orgBody)
        cpyBody.name = "copy"   #これ実はBodyのnameと違うみたいです。下の操作履歴のところの名称みたいです。

 nameを参照して"ball"になっているBodyをコピーするという内容です。

コピーしたものを回転⇒移動させる

        #回転、移動のためのおまじない
        features = rootComp.features
        moveFeats = features.moveFeatures
        
        #targetのコレクションを作る
        target = adsk.core.ObjectCollection.create()
        #target.add(cpyBody)
        target.add(newBody)     #何故かこちらでないとコレクション等に入れられない

        #Y軸周りにangle角度回転
        #(1, 0, 0)ベクトルを(cos, o ,sin)ベクトルまで回転させる
        angle = 30
        if angle != 0:  #0°だと途中でエラーがでる
            fromVec = adsk.core.Vector3D.create(1,0,0)
            toVec = adsk.core.Vector3D.create(math.cos(math.radians(angle)), 0, math.sin(math.radians(angle)))
            axisVec = adsk.core.Vector3D.create(0,1,0)
            rotTrans = adsk.core.Matrix3D.create()
            rotTrans.setToRotateTo(fromVec, toVec, axisVec)
            rotFeatureInput = moveFeats.createInput(target, rotTrans)
            moveFeats.add(rotFeatureInput)

        #(px, py, pz)に移動
        px, py, pz = 10, 10, 0    #何故かcm単位系なのに注意
        if px**2 + py**2 + pz**2 != 0:  #移動距離が0だとエラーがでる
            moveTrans = adsk.core.Matrix3D.create()
            vector = adsk.core.Vector3D.create(px, py, pz)
            moveTrans.translation = vector
            moveFeatureInput = moveFeats.createInput(target, moveTrans)
            moveFeats.add(moveFeatureInput)

 必ず回転をする時はグローバル座標の原点中心で回転するつもりでしてください。回転の処理(moveFeats.add)をしてから、移動の処理をすることが大切です。変なところに吹っ飛んでいきます。

結合させる

        #結合をするおまじない
        combines = rootComp.features.combineFeatures
        
        #ツールで結合処理
        combineInput = combines.createInput(orgBody, targetCol)
        combineInput.operation = adsk.fusion.FeatureOperations.JoinFeatureOperation
        combineInput.isKeepToolBodies = False
        combineInput.isNewComponent = False
        retVal = combines.add(combineInput)

 isKeepToolBodies = Trueにすると、ツールのBodyが消えません。また後日説明しますが今回の用途だとツールが消える方が後の処理が楽です。
FeatureOperations.JoinFeatureOperationをFeatureOperations.CutFeatureOperationにすると切り取りになります。

 で、これらを色々組み合わせていくと鞍状歯車ができます。
参考までに上のでできるものはこんな感じです。回転してから移動した後、一つのBodyにまとまっています。
f:id:gear2nd_droid:20210709234555p:plain