Fusion 360のアドインの作り方_球を作ってみよう

# はじめに
前回の記事では、Fusion360のアドインを使う上での事前知識や準備することについて取り上げました。この記事では、実際にどのようにコードを書いていくのか、テーマを設けて説明していきたいと思います。また、コードを解説していく中で、ちょこちょこ現れる重要なオブジェクトや概念について説明していきたいと思います。
今回のテーマは、**「球を作ってみよう」** です。

（※ なお、この記事はFusion360のCAD機能を触った経験があることを前提として書かれています。全く使ったことのない人は、CADとして一度使ってみて、どのような機能やオブジェクト概念があるのか知っておくことをお勧めします。）

# 準備
前回の記事で書いた手順に従って、まずアドインプログラムを作成します。デフォルトでは、プログラムのフォルダを開くと、たくさんのフォルダやファイルがあります。正直、プログラム名と同じファイル（ここでは、Mainスクリプトのファイルと呼ぶことにします）以外いらないので、下の画面で青色になっているやつは全部消しちゃいましょう。
![スクリーンショット 2023-05-02 18.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192889/66110658-1edf-7168-7547-a6104cb4060e.png)

また、Mainスクリプトのファイルを開くと、いろいろ書いてあるかと思いますが、要らないものばかりなのでこれもいろいろと消しちゃって、下の状態と同じにしてください。
~~~python
import adsk.core, adsk.fusion, traceback, math

def run(context):
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface 
        #ここに球作成のプログラムを書く

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

# このプログラムにおいてstop関数は意味をなさないので、以降省略する。ただし、実装するときは必ずstop関数を書くこと。
def stop(context):
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

~~~
これを実行すると、画面上に以下のようなメッセージボックスが表示されます。[UserInterfaceクラス](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-52303e26-c1c2-4a1c-8c1a-a3c199e6db63)のmessageBoxメソッドは、このように文章を表示する役割を持ちます。
![スクリーンショット 2023-05-02 18.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192889/bf66babb-66a4-a326-72fb-4f2a0f7dd25a.png)


# 球の作成
さて、いよいよ本題です。最初に、実装例を示そうと思います。
~~~ python
import adsk.core, adsk.fusion, traceback, math

def run(context):
    try:
        # ここは必ず書くこと
        app = adsk.core.Application.get()
        ui = app.userInterface
        design = adsk.fusion.Design.cast(app.activeProduct)
        # 大元のコンポーネントをとってくる
        rootComp = design.rootComponent

        # xy平面上に新規スケッチを作成する
        sketches = rootComp.sketches
        xyPlane = rootComp.xYConstructionPlane
        sketch = sketches.add(xyPlane)
    
        # 円を描画する
        center = adsk.core.Point3D.create(0, 0, 0) #中心座標を決定
        radius = 3 #半径を決定
        circles = sketch.sketchCurves.sketchCircles
        circle = circles.addByCenterRadius(center, radius)
            
        # 描画した円の回転軸を決める
        lines = sketch.sketchCurves.sketchLines
        axisLine = lines.addByTwoPoints(adsk.core.Point3D.create(center.x - radius, center.y, center.z), adsk.core.Point3D.create(center.x + radius, center.y, center.z))

        # ここはおまじない(少なくとも今の段階では理解する必要はない)
        prof = sketch.profiles.item(0)

        # 親コンポーネント（今回の場合、rootComp）のフィーチャーのうち回転フィーチャーをとってくる
        revolves = rootComp.features.revolveFeatures

        # 親コンポーネントの回転フィーチャー集合の中で、新しい回転フィーチャーを作成する。
        # 追加の時に、profileと回転軸とFeatureOperations（詳しくは知る必要なし）を引数として入力。
        # createInputメソッドで作成したRevolveFeatureInputがrevInputにreturnされる。
        revInput = revolves.createInput(prof, axisLine, adsk.fusion.FeatureOperations.NewComponentFeatureOperation)

        # 回転量を決める。ここでは、2π回転させている
        angle = adsk.core.ValueInput.createByReal(2*math.pi)

        # 追加した回転フィーチャーに、回転量の情報を加える。
        revInput.setAngleExtent(False, angle)

        # 親コンポーネントの回転フィーチャー集合に、新しく作った回転フィーチャーを加える。
        # RevolveFeatureがreturnされる。
        revfeature = revolves.add(revInput)

        ui.messageBox("Success")

    except:
         if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
~~~
これを実行すると、以下のように球ができます。
![スクリーンショット 2023-05-02 19.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192889/05e41167-3f85-6973-c595-da1b8e0af82b.png)


各コードの意味はコメントアウトである程度書き込んでいますが、いくつか補足したいと思います。

円を描画するところで、[Point3Dクラス](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-c49e1ed5-7221-49a4-abc9-81e7beb2e51d)を使っています。こちらは3次元のスカラー量を表しており、物体の座標を決めるときに必ず使うものなので覚えておきましょう。新しく座標を設定するときは、createメソッドを使います。
これに似たクラスで、[Vector3Dクラス](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-9cd7639c-97a9-4011-83f0-64694efe76e0)があります。こちらは3次元のベクトル量を表しており、物体の移動を行う際に使われます（詳しくは、[物体移動のサンプルコード](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-114E8EF9-D842-4579-BF84-DA73EA7AE52D)を参照。）。

また、フィーチャーについても説明したいと思います。フィーチャーはとても重要な概念で、ざっくりと言うと、**CADで何かしらの編集操作を加えるときに生成されるもの**です。編集操作とは、例えば、移動だったり、コピペだったり、押し出しだったり、回転だったりと色々あります。詳細は、[Featuresクラス](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-7bfd8596-4584-48b6-8b9b-1ea63e304d34)のページに載っているので、そちらを参照してください。以下に示している部分は、フィーチャーを生成して編集操作を行うところに当たります。この部分の書き方は、フィーチャーの種類、つまり行いたい編集操作の種類によって異なりますが、だいたいの流れとして、feature作成に使う情報をとってくる(作成する)→createinputする→親コンポーネント（操作対象の物体の上位に来るコンポーネント）のfeaturesに.addするという感じになります。

~~~ python
        # 親コンポーネント（今回の場合、rootComp）のフィーチャーのうち回転フィーチャーをとってくる
        revolves = rootComp.features.revolveFeatures

        # 親コンポーネントの回転フィーチャー集合の中で、新しい回転フィーチャーを作成する。
        # 追加の時に、profileと回転軸とFeatureOperations（詳しくは知る必要なし）を引数として入力。
        # createInputメソッドで作成したRevolveFeatureInputがrevInputにreturnされる。
        revInput = revolves.createInput(prof, axisLine, adsk.fusion.FeatureOperations.NewComponentFeatureOperation)

        # 回転量を決める。ここでは、2π回転させている
        angle = adsk.core.ValueInput.createByReal(2*math.pi)

        # 追加した回転フィーチャーに、回転量の情報を加える。
        revInput.setAngleExtent(False, angle)

        # 親コンポーネントの回転フィーチャー集合に、新しく作った回転フィーチャーを加える。
        # RevolveFeatureがreturnされる。
        revfeature = revolves.add(revInput)
~~~




以上が、球を作る上で少し重要かなと思ったことのまとめです。
実はクラスの階層関係については今回の記事では省略しました。次回の記事では、Fusion360 APIにおけるクラスの階層関係について触れたいと思います。

それでは、また！