📝
Fusion 360のPython APIのメモ
位置固定ジョイント関連
位置固定ジョイントを名前から探す場合
jointsじゃなくてasBuiltJointsを使うのがポイント。jointsを使ったサンプルばかりで全然動かなくてハマった。
jnt :adsk.fusion.Joint = root.asBuiltJoints.itemByName('回転')
if not jnt:
ui.messageBox('Joint not found')
return
位置固定ジョイントをFusion 360の画面で選択する場合
jntSelect = ui.selectEntity('ジョイントを選択してください', 'Joints')
if jntSelect:
jnt = adsk.fusion.AsBuiltJoint.cast(jntSelect.entity)
位置固定ジョイントの角度をPythonから指定する場合
上で探したジョイントからRevoluteJointMotionにキャストしてrotationValueにラジアンで値を入れる。読み出す場合も同じ。ラジアンで読み取るので必要であれば変換する。
後半3行は別のサンプルに書いてあったのでそのまま記載。
rev = adsk.fusion.RevoluteJointMotion.cast(jnt.jointMotion)
rev.rotationValue = math.pi/180
adsk.doEvents()
time.sleep(0.1)
app.activeViewport.refresh(
Event関連
ExecuteHandlerが実行されない
上の行だとExecuteHandlerが実行されず、下の行だと実行される。
これが分からずめっちゃ時間掛かった。
# selectJointsControlled.setSelectionLimits(2)
selectJointsControlled.setSelectionLimits(0)
似たような話が以下の記事に書いてありました。
Occurenceの角度(Roll, Pitch, Yaw)を測定したい場合
getAsCoordinateSystem()で(origin, xAxis, yAxis, zAxis)の配列が得られる。
target = occ.transform.getAsCoordinateSystem()
ui.messageBox( str(target[1].x * 180/math.pi) )
以下の形式で得られるので、OccurenceのX軸のx方向成分、y方向成分、z方向成分が得られることになる?これが何故角度になっているのかが理解できてなくて悩んだ。
(origin, xAxis, yAxis, zAxis) = matrix3D_var.getAsCoordinateSystem()
最終的な自分の理解では、アークタンジェントで各成分から角度を出したときに、結局同じ値になったからそのままでいいのかなというところまでしか到達できませんでした。
各軸に沿った回転は以下の計算でいいのか、、。回転方向がこれで正しいのかちょっと怪しいです。
math.atan2(target[2].z, target[2].y)* 180/math.pi,
math.atan2(target[3].x, target[3].z)* 180/math.pi,
math.atan2(target[1].y, target[1].x)* 180/math.pi
以下の方法だと、ワールド座標のX軸と、原点からOccurenceのPositionをつなぐベクトルの角度しか得られずずっと悩んでいた。
xVector = des.rootComponent.xConstructionAxis.geometry.direction
ui.messageBox( occ.transform.translation.angleTo(xVector) )
4足ロボットでフォローしているでべさんも同じところで悩んでいた投稿を見つけた。
Discussion