LoginSignup
4
1

More than 3 years have passed since last update.

Fusion 360にCSVから点をインポートする

Last updated at Posted at 2020-11-29

Autodesk Fusion 360にはいつもお世話になっています. (教育機関ライセンス無料なので)

別途生成した座標データを含むCSVがあり, それを点としてインポートする方法がわからなかったのでメモを残します.
自分の用途的に, 同一平面内の点のインポートがスコープです.

課題

Fusionにビルトインであるスクリプト(ImportSplineCSV.py)はCSVの座標をスプラインとしてインポートするもの > 余計なことをせずに点がいい

目的

Pythonスクリプトで, CSVに含まれる座標を点としてxy平面のスケッチにインポートする

入力するCSV

CSVの書式はカンマ区切りで, 1行に1つの点のx,y,z座標をいれる. (zは全て0)

input.csv
1.5,3.6,0
8.4,2.8,0
3.4,6.1,0

スクリプト

フローとしては, ダイアログで指定したCSVファイルに対して, カンマ区切りをばらして座標を抽出し, ポイントとしてスケッチに追加する, という作業を各行に対して行います.

下記コードを.pyファイルに記入し, 適当な場所に配置します.
(自分の場合は C:\Users\USERNAME\AppData\Roaming\Autodesk\Autodesk Fusion 360\API\Scripts あたり)

あとはFusion 360を開き, 画面上部から Tools > ADD-INS > Scripts and Ad-Ins... と進み, My Scripts欄のプラスボタンを押してファイルを保存したディレクトリを指定すればOKです.
ディレクトリ追加直後にはスクリプトが反映されず, ウィンドウを閉じたり開いたりしていたら表示されるようになりました.

ImportCSVPoints.py
import adsk.core, adsk.fusion, traceback
import io

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        product = app.activeProduct
        design = adsk.fusion.Design.cast(product)
        title = 'Import points from csv'
        if not design:
            ui.messageBox('No active Fusion design', title)
            return

        dlg = ui.createFileDialog()
        dlg.title = 'Open CSV File'
        dlg.filter = 'Comma Separated Values (*.csv);;All Files (*.*)'
        if dlg.showOpen() != adsk.core.DialogResults.DialogOK :
            return

        filename = dlg.filename
        with io.open(filename, 'r', encoding='utf-8-sig') as f:
            root = design.rootComponent
            sketch = root.sketches.add(root.xYConstructionPlane)
            line = f.readline()
            data = []
            while line:
                pntStrArr = line.split(',')
                for pntStr in pntStrArr:
                    try:
                        data.append(float(pntStr))
                    except:
                        break

                if len(data) >= 3 :
                    sketchPoints = sketch.sketchPoints
                    point = adsk.core.Point3D.create(data[0], data[1], data[2])
                    sketchPoint = sketchPoints.add(point)
                line = f.readline()
                data.clear()

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

※未検証なのでわかりませんが… スケッチにxy平面を指定しているので, z座標に何か数字が入ったら動かないかもしれません. あるいは3次元スケッチになるのかな…? あまり使いこなせていないのでよくわかってないです.
検証された方がいればコメントにてご教授ください.

余談

このスクリプトですが, 個数にして700弱の点をインポートするのに使っていますが, 問題なく動いています.

同様の方法でSketchCirclesメソッドを使ってCSVから丸をインポートしようとしましたが, 200ぐらいに数を減らしてもFusionがフリーズしてしまい使い物になりませんでした.
ここを見る限り一般的な問題のようで, 回避するにはスケッチを分けるといいようです.

私の用途としてはインポートした座標を元にバルクに穴を開けたいだけだったので, 円としてインポートしなくても穴径は指定できたのと, スケッチを分けると後工程が面倒になると思ったので思い切って点としてインポートしました.

4
1
1

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
4
1