#はじめに
Fusion 360 に パスに沿った点 というコマンドがあります。これを Fusion 360 API で実現しようと紆余曲折した記録です
#リファレンスマニュアルを調べてみる
Fusion 360 API で構築の点を作成する方法の指定は ConstructionPointInput Object を使います。リファレンスマニュアルのメソッドの中にある setBy で始まるものが UI での各コマンドに対応しているのでこの中から「パスに沿った点」を探します
setByCenter > 円/球/トーラスの中心点
setByEdgePlane > エッジおよび平面にある点
setByPoint > 頂点の点
setByThreePlanes > 3つの平面が通過する点
setByTwoEdges > 2つのエッジの通過点
あれ・・・???パスに沿った線に対応するメソッドがない???
#「パスに沿った点」はないけど「パスに沿った平面」はあった!
パスに沿った点によく似たコマンドで パスに沿った平面 というのがあります。
なぜかこちらはちゃんと ConstructionPlaneInput.setByDistanceOnPath メソッドがあるようです。平面は有るのに点は無いのはなぜだー!といっても無いものは無いので開き直って代替案を考えることにしました。
パスに沿った平面をつくる > その平面とパスとの交点をつくる という手順を Fusion 360 API でやってみます
##最初と最後のおまじないから途中まで
import adsk.core, adsk.fusion, traceback
def run(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
design = app.activeProduct
# Get the root component of the active design.
rootComp = design.rootComponent
#
# ここにコードを追加していく
#
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
##スケッチの中のスプラインを取得する
スケッチ1のなかのスプラインを取得して crvPath に代入しています
# スケッチの中のスケッチ1を取得 > スケッチ1の中のスプラインカーブを取得
sketch1 = rootComp.sketches.item(0)
crvPath = sketch1.sketchCurves.sketchFittedSplines.item(0)
##パスに沿った平面を作成する
setByDistanceOnPath を使ってパスに沿った面を作成します。始点を0、終点を1として0~1の値を指定するのですが、直接数値を入力するのではなく、ValueInput オブジェクトで指定する必要があります。
# constructionPlanes オブジェクトを取得
planes = rootComp.constructionPlanes
# ConstructionPlaneInput オブジェクトを取得
planeInput = planes.createInput()
# パスに沿った平面を作成
distance = adsk.core.ValueInput.createByReal(0.4)
planeInput.setByDistanceOnPath(crvPath, distance)
plane = planes.add(planeInput)
##平面とパスの交点を作る
Fusion 360 には平面とパスとの交点を作るコマンドはありませんが、Sketch.intersectWithSketchPlane メソッド でスケッチ平面と曲線との交点を作ることができます。指定するパスは曲線一本だとしても配列にしないといけないようです。ここでは entities
という配列に crvPath
を追加して intersectWithSketchPlane メソッドの引数に入れています。
# 新しいスケッチを追加
sketch2 = rootComp.sketches.add(plane)
# スケッチ平面とパスとの交点を作成
entities = []
entities.append(crvPath)
skPoints = sketch2.intersectWithSketchPlane(entities)
#まとめ
できたのはいいけど手数が多くて結構面倒でしたね。 pointInput.setByDistanceOnPath はリファレンスに載っていないだけで実は使えるのではと淡い期待を抱いてこんなコードを描いて実行してみた・・・けどエラーが出てしまってだめでした!
# Get construction points
points = rootComp.constructionPoints
# Create construction point input
pointInput = points.createInput()
# Add construction point by distance on path
distance = adsk.core.ValueInput.createByReal(0.4)
pointInput.setByDistanceOnPath(crvPath, distance)
point = points.add(pointInput)
早く API に実装されてほしいー!