Autodesk Fusion 360にはいつもお世話になっています. (教育機関ライセンス無料なので)
別途生成した座標データを含むCSVがあり, それを点としてインポートする方法がわからなかったのでメモを残します.
自分の用途的に, 同一平面内の点のインポートがスコープです.
#課題
Fusionにビルトインであるスクリプト(ImportSplineCSV.py)はCSVの座標をスプラインとしてインポートするもの > 余計なことをせずに点がいい
#目的
Pythonスクリプトで, CSVに含まれる座標を点としてxy平面のスケッチにインポートする
#入力するCSV
CSVの書式はカンマ区切りで, 1行に1つの点のx,y,z座標をいれる. (zは全て0)
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です.
ディレクトリ追加直後にはスクリプトが反映されず, ウィンドウを閉じたり開いたりしていたら表示されるようになりました.
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がフリーズしてしまい使い物になりませんでした.
ここを見る限り一般的な問題のようで, 回避するにはスケッチを分けるといいようです.
私の用途としてはインポートした座標を元にバルクに穴を開けたいだけだったので, 円としてインポートしなくても穴径は指定できたのと, スケッチを分けると後工程が面倒になると思ったので思い切って点としてインポートしました.