1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fusion 360 を Pythonで動かそう その11 パスに沿った点がAPIにないので代替案を考えた

Last updated at Posted at 2020-08-02

#はじめに
Fusion 360 に パスに沿った点 というコマンドがあります。これを Fusion 360 API で実現しようと紆余曲折した記録です
image.png

#リファレンスマニュアルを調べてみる
Fusion 360 API で構築の点を作成する方法の指定は ConstructionPointInput Object を使います。リファレンスマニュアルのメソッドの中にある setBy で始まるものが UI での各コマンドに対応しているのでこの中から「パスに沿った点」を探します
image.png
setByCenter > 円/球/トーラスの中心点
setByEdgePlane > エッジおよび平面にある点
setByPoint > 頂点の点
setByThreePlanes > 3つの平面が通過する点
setByTwoEdges > 2つのエッジの通過点
あれ・・・???パスに沿った線に対応するメソッドがない???

#「パスに沿った点」はないけど「パスに沿った平面」はあった!
パスに沿った点によく似たコマンドで パスに沿った平面 というのがあります。
image.png
なぜかこちらはちゃんと ConstructionPlaneInput.setByDistanceOnPath メソッドがあるようです。平面は有るのに点は無いのはなぜだー!といっても無いものは無いので開き直って代替案を考えることにしました。

パスに沿った平面をつくる > その平面とパスとの交点をつくる という手順を Fusion 360 API でやってみます

#手順
スケッチ内の曲線状に点を作成する手順です
image.png

##最初と最後のおまじないから途中まで

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)

このスクリプトを実行するとこうなります
image.png

#まとめ
できたのはいいけど手数が多くて結構面倒でしたね。 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 に実装されてほしいー!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?