Fusion360API コンポーネントボディーの結合と移動

Fusion360API コンポーネントボディーの結合と移動

Anonymous
855件の閲覧回数
4件の返信
メッセージ1/5

Fusion360API コンポーネントボディーの結合と移動

Anonymous
適用対象外

Fusion360のAPIにおいてわからないことがあるので質問させていただきます。

2つのボディを認識し1つ目のボディーをターゲット,2つ目のボディをツールボディとします.

1.ツールボディを残したまま切り取りを行います.

2.ターゲットボディを回転移動させます.

3.ツールボディを回転運動させます.

1-3を繰り返すプログラムを作成する予定なのですが,切り取りの後のボディの移動がうまくいきません.

エラーコードはTypErrorで64行目の

moveFeatureInput = moveFeats.createInput(TargetBody, trans)

が原因となっています.

ソースコードを下に乗せるので,問題点の指摘と解決方法を教えていただきたいです。

 

import adsk.core, adsk.fusion, traceback,math,csv,os

def run(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
# Create a document.
#"""doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)"""
#現在の距離をdistance_now,初期化も行う
distance_now = 0
#終了距離をdistance_end
distance_end = 5.0
#微小移動距離Δhをh_app
h_app = 0.25
#回転角度Θをsita
sita = math.pi/100
product = app.activeProduct
design = adsk.fusion.Design.cast(product)
rootComp = design.rootComponent

occs = rootComp.occurrences
 
Target = occs.item(0).component

features = rootComp.features

TargetBody = adsk.core.ObjectCollection.create()
TargetBody =Target.bRepBodies.item(0)

ToolBodies = adsk.core.ObjectCollection.create()
ToolBodies.add(Target.bRepBodies.item(1))
#while (distance_now<distance_end):
 
CombineCutInput = rootComp.features.combineFeatures.createInput(TargetBody, ToolBodies )

CombineCutFeats = features.combineFeatures
CombineCutInput = CombineCutFeats.createInput(TargetBody, ToolBodies)
CombineCutInput.isKeepToolBodies = True
CombineCutInput.operation = adsk.fusion.FeatureOperations.CutFeatureOperation
 
CombineCutFeats.add(CombineCutInput)

#ワーク側の回転運動

#回転軸の定義
trans = adsk.core.Matrix3D.create()
#trans.setToRotation(math.pi*0.2, adsk.core.Vector3D.create(1,0,0), adsk.core.Point3D.create(0,0,0))
rotX = adsk.core.Matrix3D.create()
rotX.setToRotation(math.pi*0.2, adsk.core.Vector3D.create(1,0,0), adsk.core.Point3D.create(0,0,0))
trans.transformBy(rotX)

#rotY = adsk.core.Matrix3D.create()
#rotY.setToRotation(math.pi*0.3, adsk.core.Vector3D.create(0,1,0), adsk.core.Point3D.create(0,0,0))
#trans.transformBy(rotY)
 
#rotZ = adsk.core.Matrix3D.create()
#rotZ.setToRotation(math.pi*0.5, adsk.core.Vector3D.create(0,0,1), adsk.core.Point3D.create(0,0,0))
#trans.transformBy(rotZ)

# Create a move feature
moveFeats = features.moveFeatures

moveFeatureInput = moveFeats.createInput(TargetBody, trans)

moveFeats.add(moveFeatureInput)
#ToolBodies.move(transform)



distance_now = distance_now + h_app
 


except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
 
0 件のいいね
解決済み
856件の閲覧回数
4件の返信
返信 (4)
メッセージ2/5

kandennti
Mentor
Mentor

@Anonymous さん こんにちは

 

pythonの場合はインデントの役割が重要なのですが、通常の方法でトピを書いてしまうと
全てインデントを殺します。
その為、画像左部分をクリックするとダイアログが表示されるので、そちらにコードを
記入してもらえると、インデントが保たれます。(状況を再現するのが早いので助かります)
1.png
又、言語部分を切り替えると各言語なりに色分けされる為、それっぽく見えます。
この部分は修正したい場合は、ダブルクリックでダイアログが再表示されます。
 
 
さて、本題のエラーですが、MoveFeatures.createInputメソッドの第一引数は
ObjectCollectionですが、BRepBodyを渡している事が原因です。
 
その為、この様に修正しました。
・・・
        Target = occs.item(0).component

        features = rootComp.features

        # TargetBody = adsk.core.ObjectCollection.create() # 紛らわしいためコメント化
        TargetBody =Target.bRepBodies.item(0)

        ToolBodies = adsk.core.ObjectCollection.create()
        ToolBodies.add(Target.bRepBodies.item(1))

・・・
        # Create a move feature
        moveFeats = features.moveFeatures

        # moveFeatureInput = moveFeats.createInput(TargetBody, trans)
        # この辺を修正
        targetBodies = adsk.core.ObjectCollection.create()
        targetBodies.add(TargetBody)
        moveFeatureInput = moveFeats.createInput(targetBodies, trans)
        # ここまで
        
        moveFeats.add(moveFeatureInput)
・・・
 
この部分を修正しても、moveFeats.addでエラーとなります。
ちょっと時間が無いため、後ほど。(御本人で解決出来れば、その方が良いとも思ってます)
メッセージ3/5

Anonymous
適用対象外

以前の質問でも返信ありがとうございました。
コードの書き方についても参考にさせていただきます。

 

moveFeatureInput =  moveFeats.createInput(Toolbodies, rotX)

質問の前に上記のコードの方でも試していたのですが、エラーが出ていたので手詰まりを感じていました。

 trans = adsk.core.Matrix3D.create()

       
        rotX = adsk.core.Matrix3D.create()
        rotX.setToRotation(math.pi*0.2, adsk.core.Vector3D.create(0,1,0), adsk.core.Point3D.create(0,0,0))
        trans.transformBy(rotX)

私としては上のコードに問題があると思っていたのですが、

https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-d2e83d0b-781c-4faf-91ff-6cd31cc2174d

上記のsetToRotationのパラメータの通りに与えることが出来ていると思えます.

お時間をとらせて申し訳ないのですが、自分の力で解決できそうにないのでコードを記載していただけると大変ありがたいです。

 

 

 

メッセージ4/5

kandennti
Mentor
Mentor
解決済み

>お時間をとらせて申し訳ないのですが

大丈夫です。日本語でAPIの質問に答えられることをうれしく思っています。

 

moveFeatureInput =  moveFeats.createInput(Toolbodies, rotX)

これでもエラーとなっている件ですが、 そこの行列の演算は間違っていません。

あえて付け加えるのであれば、度(degree)->ラジアンはPIを使用しなくても

math.radians(degree)

があるので、そちらの方が便利かな? とは感じます。

 

 

上記と前回書いた "moveFeats.addでエラー" も同じことが原因です。

1.png

恐らく"コンポーネント1:1" 内の "ボディ1" と "ボディ2" を処理しているの

だろうと思います。

 

moveFeaturesを取得する際、この様になっています。
moveFeats = features.moveFeatures

 

さらに、featuresの取得はこの様になっています。

features = rootComp.features

ルートコンポネントのfeaturesを取得しています。

ルートコンポーネントはここです。

1.png

ボディと同じコンポーネントのfeaturesで処理する必要があります。

combineFeaturesの場合、偶々上手く行った と考えて下さい)

 

つまりこんな感じにすると正しく動作するはずです。

・・・
        # Create a move feature
        # moveFeats = features.moveFeatures

        # moveFeatureInput = moveFeats.createInput(TargetBody, trans)

        moveFeats :adsk.fusion.MoveFeatures = Target.features.moveFeatures
        targetBodies = adsk.core.ObjectCollection.create()
        targetBodies.add(TargetBody)
        moveFeatureInput = moveFeats.createInput(targetBodies, trans)

        moveFeats.add(moveFeatureInput)
・・・

 

又、何かあったらご質問下さい。

メッセージ5/5

Anonymous
適用対象外

今回も詳細な返信をしていただきありがとうございます。

除去後に半回転をさせるプログラムを試してみたのですが,お陰様でうまくいきました。

除去後半回転.PNG

また何かわからないことがあれば質問させていただきます。今回も本当にありがとうございました。