C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

Fusion360APIでNURBS曲線を作成してみる3

こちらの続きです。
Fusion360APIでNURBS曲線を作成してみる2 - C#ATIA

前回のものを修正し、より実践的なNURBS曲線を作ってみます。
耐え切れなかった為、こちらにサンプルデータをUpしました。
GrabCAD - CAD library
CATIAで作成した曲線と、確認用に押出ししたサーフェスをIgesにしています。
(ファイル名:nurbs_curve_3d_sample1.igs)

こちらをFusion360でインポート(サーフェスだけです)し、以下のスプリクトを
実行します。

#FusionAPI_python
#Author-kantoku
#Description-NurbsCurve3D_Test3
#Nurbsカーブ作成テスト

import adsk.core, adsk.fusion, traceback

_app = adsk.core.Application.get()
_ui = _app.userInterface

def run(context):
    try:
        global _app, _ui
        des = adsk.fusion.Design.cast(_app.activeProduct)
        comp = des.rootComponent
        
        #NURBSカーブ作成準備
        poss = [[10, -20, -10], 
                [9.587310041, -19.66378473, -7.111170289], 
                [9.066687233, -19.24725683, -4.318376656], 
                [8.414915532, -18.73943189, -1.64725845], 
                [7.064932775, -17.72835072, 2.46828599], 
                [5.183948194, -16.46330539, 5.802194902], 
                [4.342483009, -15.92222727, 6.978456889], 
                [2.558949274, -14.84247725, 8.853440155], 
                [0.4455897088, -13.72427175, 9.964573277], 
                [-0.6232459496, -13.19898599, 10.30174101], 
                [-2.929444025, -12.16203711, 10.59962188], 
                [-5.413111131, -11.2518361, 10.14198332], 
                [-6.714932791, -10.8317392, 9.723113911], 
                [-10.15600129, -9.869701012, 8.217440862], 
                [-13.65008051, -9.267637855, 5.788366698], 
                [-15.79519881, -9.037527212, 4.03034148], 
                [-17.91158269, -8.933957503, 2.08841731], 
                [-20, -8.944926835, 0]]      
        poles = [adsk.core.Point3D.create(
                pos[0] * 0.1, pos[1] * 0.1, pos[2] * 0.1)
                for pos in poss]
        
        degree = 5
        
        knot_vec = [0, 17.39738523, 28.8962564, 39.23864718, 50.07377854, 67.53908293]
        mults = [6, 3, 3, 3, 3, 6]
        knots = []
        for i, m in enumerate(mults):
            for k in range(0, m):
                knots.append(knot_vec[i])
        
        weights = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        
        #NURBSカーブ作成 - 画面上には出来ない
        nc = adsk.core.NurbsCurve3D.createRational(poles, degree, knots, weights, False)
        print(str(nc is None))
        #スケッチ作成
        sk = comp.sketches.add(comp.xYConstructionPlane)
        
        #スケッチにNURBSカーブ挿入
        fs = sk.sketchCurves.sketchFittedSplines.addByNurbsCurve(nc)
        
        #NURBSカーブをスケッチから抽出
        sk.include(fs)
        
        #元のNURBSカーブ削除
        fs.deleteMe()
        
        _ui.messageBox('done')
    except:
        if _ui:
            _ui.messageBox('エラー\n{}'.format(traceback.format_exc()))

NURBSカーブの各パラメータはsirenで取得したデータです。結果はこちら
f:id:kandennti:20170816141436p:plain
(ファイル名:nurbs_curve_3d_sample1.f3d)
何だかわかりにくいのですが、サーフェスの境界部分の1ヶ所だけ曲線が追加されます。
(個人的には感動してます)

最初はFusion360APIの長さ単位が "Cm" だと言うことをすっかり忘れていたので
とんでもない結果になりましたが、単位を合わせた所一致しました。
(コントロールポイント以外はそのままの数値です・・・恐らく)

polesリストを作る時の処理はpythonの内包表記で "らしく" 書けたのですが、
knotsのリストを作る辺りのコードが2重ループになっており、ちょっと残念です。
内包表記で2重ループ回避出来そうな気がしたんだけどなぁ・・・。