Fusion 360 を Pythonで動かそう その４　スケッチにいろんな方法で線を描く

#はじめに
Fusion360 のAPIの理解を深めるために公式ドキュメント内のサンプルコード [**Create sketch lines in various ways API Sample**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-98e163be-fd07-11e4-9c39-3417ebd3d5be) の内容からドキュメントを読み込んでみたメモ書きです
スケッチの線や長方形を色々な方法で作成します。

#スクリプトの内容を確認する

##最初と最後のおまじないとスケッチの作成まで
最初と最後のこの辺りはFusion360 APIのお決まりのパターンのようです。スケッチの作成については[**その２**](https://qiita.com/reisyu/items/7198eed3aaaaacbd0899)で触れたので今回は説明を省略します。

```Python
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.
        sketches = rootComp.sketches;
        xyPlane = rootComp.xYConstructionPlane
        sketch = sketches.add(xyPlane)

        #
        # ここにコードを追加していく
        #

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
```
##2本のつながった線を書く

```python
        # Draw two connected lines.
        lines = sketch.sketchCurves.sketchLines;
        line1 = lines.addByTwoPoints(adsk.core.Point3D.create(0, 0, 0), adsk.core.Point3D.create(3, 1, 0))
        line2 = lines.addByTwoPoints(line1.endSketchPoint, adsk.core.Point3D.create(1, 4, 0))
```
[**SketchCurves.sketchLines プロパティ**](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-9e4b596d-f50e-4c67-b62f-e310edb53504)を取得し`lines`に代入する
`line1`は**[Point3D.create メソッド](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-e6a5729c-9233-4448-9d3f-e0dd8b0b4559)**でXYZ座標を指定してポイントを作成し、**[SketchLines.addByTwoPoints メソッド](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-d951811b-886d-4712-b9e9-3edd0069b44e)**で2点を指定して線を描いている
`Line2`は`line1.endSketchPoint`で取得した[**SketchLine オブジェクトのプロパティ**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-bae6c34a-0ceb-4519-aed8-46b64dcba534)を使って始点を指定している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a8676fde-d0a9-9c5e-278a-d2bd66266e0d.png)

##2点指定して長方形を描く

```python
        # Draw a rectangle by two points.
        recLines = lines.addTwoPointRectangle(adsk.core.Point3D.create(4, 0, 0), adsk.core.Point3D.create(7, 2, 0))
```
[**SketchLines.addTwoPointRectangle メソッド**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-2f19bc65-1780-478e-b1f3-9f69e7efd2bb)で2点を指定して長方形を描く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/1accd5b7-3b18-986f-7a2d-35e39cdb352a.png)

##スケッチに水平・垂直拘束をかける
```python
        # Use the returned lines to add some constraints.
        sketch.geometricConstraints.addHorizontal(recLines.item(0))
        sketch.geometricConstraints.addHorizontal(recLines.item(2))
        sketch.geometricConstraints.addVertical(recLines.item(1))
        sketch.geometricConstraints.addVertical(recLines.item(3))
```
[**GeometricConstraints.addHorizontal メソッド**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-c38beb2a-0a51-4883-bffe-20d42e5eefa4)で水平拘束 を [**GeometricConstraints.addVertical メソッド**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-b965e975-7aa3-4ead-be78-b8b65519446c)で垂直拘束をかけている 

##スケッチに寸法拘束をかける
```python
        sketch.sketchDimensions.addDistanceDimension(
                        recLines.item(0).startSketchPoint, recLines.item(0).endSketchPoint,
                        adsk.fusion.DimensionOrientations.HorizontalDimensionOrientation,
                        adsk.core.Point3D.create(5.5, -1, 0));
```
[**SketchDimensions.addDistanceDimension メソッド**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-4fbf358a-6d3f-4521-9db0-6e3a5fe866a9)で2点を指定して寸法拘束をかけている。
recLines.item(0)の始点と終点を指定し、寸法の向きは水平とし、テキストの基準点を座標指定している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/f922d819-3f4b-1db0-17e2-45ca562309de.png)

##3点指定の長方形と中心点指定の長方形を描く
```Python
        # Draw a rectangle by three points.
        recLines = lines.addThreePointRectangle(adsk.core.Point3D.create(8, 0, 0), 
                      adsk.core.Point3D.create(11, 1, 0), adsk.core.Point3D.create(9, 3, 0))

        # Draw a rectangle by a center point.
        recLines = lines.addCenterPointRectangle(adsk.core.Point3D.create(14, 3, 0), 
                      adsk.core.Point3D.create(16, 4, 0))
```
ここは特に問題なし！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/5b746682-91f3-5b71-c625-6a086a1b04a0.png)

#まとめ
少しづつだけど分かってきたような気がするけど、もう少しシンプルに書けないものだろうか？寸法の向きを指定するのに`adsk.fusion.DimensionOrientations.HorizontalDimensionOrientation`ってのは長すぎ＆階層深すぎのような？？？

前の記事　[Fusion 360 を Pythonで動かそう その３　スケッチに3つの接線で円を描く](https://qiita.com/reisyu/items/a226454ada23f5d3f49b)
次の記事　[Fusion 360 を Pythonで動かそう その５　最初と最後のおまじないを読んでみる](https://qiita.com/reisyu/items/c5544f877238b70730ce)

# 参考
[Fusion 360 API Reference Manual](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-7B5A90C8-E94C-48DA-B16B-430729B734DC)