fusion360でpython apiを使って任意の図形を描いてみた

Python

はじめに

今回、fusion360のpython apiを用いてサイクロイド曲線を描くことがあったので備忘録代わりに書き示しておきます。

python apiを用いて任意の図形を作れるのは魅力的だと思いました。

moduleのインポートの仕方

fusion360環境でのpythonは通常の実行環境と異なるので、pythonのmoduleを通常のpip installでは保存できません。ちょっとだけめんどくさかったのでメモ書きしておきます。

環境の確認

アドインを開いてもらって適当なサンプルスクリプトのpythonファイルを選択していただくと画像のように絶対パスが入手できます。

今回はこの絶対パスのうちの

C:/Users/[User Name]/AppData/Local/Autodesk/webdeploy/production/525fe9b2ece26c4d179982b11ecdfb713cb5058f/Python/ 

のdirectoryに移動します。そのdirectory上で

python -m pip install [任意のmodule]

これで任意のmoduleをインストールできます。今回はnumpyをダウンロードしました。

サイクロイド曲線の描き方

今回は公式ドキュメントを参考にプログラムを作りました。

公式ドキュメントを読んでいると任意の点を図面に描写(points.add(adsk.core.Point3D.create(x, y, 0))して、それらを曲線で繋いでいる(spline = sketch.sketchCurves.sketchFittedSplines.add(points))ことが読み取れます。

つまり任意の点がサイクロイド曲線上に載るようにプログラムをかいてあげれば解決するということです。
そのため、このようにプログラムすればサイクロイドが描写できます。
ここでaはサイクロイドの半径、resolutionはポイント数の細かさです。
from numpy import sin,pi,cos

#parameter
resolution = 10
a = 1

# Define the points the spline with fit through.
for i in range(resolution):
      theta = i*2*pi/resolution
      x = a*(theta-sin(theta))
      y = a*(1-cos(theta))
      points.add(adsk.core.Point3D.create(x, y, 0))

# Create the spline.
spline = sketch.sketchCurves.sketchFittedSplines.add(points)

 

以上でサイクロイドが書けます。基本的に公式ドキュメントを読んでpython moduleさえDLできればなんとかなることがわかりました。

以下に全部のコードを記載します。

/import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try: 
        app = adsk.core.Application.get()
        ui = app.userInterface

        doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
        design = app.activeProduct

        # Get the root component of the active design.
        rootComp = design.rootComponent

        # Create a new sketch on the xy plane.
        sketch = rootComp.sketches.add(rootComp.xYConstructionPlane)

        # Create an object collection for the points.
        points = adsk.core.ObjectCollection.create()

        """
        ここから任意の図形の定義
        """

        from numpy import sin,pi,cos

        #parameter
        resolution = 10
        a = 1

        # Define the points the spline with fit through.
        for i in range(resolution):
            theta = i*2*pi/resolution
            x = a*(theta-sin(theta))
            y = a*(1-cos(theta))
            points.add(adsk.core.Point3D.create(x, y, 0))

        # Create the spline.
        spline = sketch.sketchCurves.sketchFittedSplines.add(points)

        """
        ここまで任意の図形の定義
        """

        # Get spline fit points
        fitPoints = spline.fitPoints
        
        # Get the second fit point
        fitPoint = fitPoints.item(1)
        
        # If there is no the relative tangent handle, activate the tangent handle
        line = spline.getTangentHandle(fitPoint)
        if line is None:
             line = spline.activateTangentHandle(fitPoint)
                
        # Get the tangent handle           
        gottenLine = spline.getTangentHandle(fitPoint)
        
        # Delete the tangent handle
        gottenLine.deleteMe()

        # Activate the curvature handle
        # If the curvature handle activated. the relative tangentHandle is activated automatically
        activatedArc= spline.activateCurvatureHandle(fitPoint)
        
        # Get curvature handle and tangent handle
        gottenArc= spline.getCurvatureHandle(fitPoint)
        gottenLine = spline.getTangentHandle(fitPoint)
        
        # Delete curvature handle
        gottenArc.deleteMe();

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

コメント

タイトルとURLをコピーしました