2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fusion 360 を Pythonで動かそう その9 スケッチの交差

Last updated at Posted at 2020-07-25

#はじめに
Fusion360 のAPIの理解を深めるために公式ドキュメント内のサンプルコード Sketch Intersect API Sample (スケッチの交差 APIサンプル) の内容からドキュメントを読み込んでみたメモ書きです
指定されたエンティティをスケッチ平面と交差させ、その交差を表すスケッチ ジオメトリを作成します。

#スクリプトの内容を確認する
##最初と最後のおまじないから途中まで
最初と最後のお決まりのパターンについては [その5] (https://qiita.com/reisyu/items/c5544f877238b70730ce)で、スプライン曲線の作成は [その7] (https://qiita.com/reisyu/items/0fe79a2ad224606a562d)で、長方形の作成は[**その4**] (https://qiita.com/reisyu/items/b9b8ef714495ba1c5eda)で触れたので説明を省略します。

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        
        # Create a document.
        doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
 
        product = app.activeProduct
        design = adsk.fusion.Design.cast(product)

        # Get the root component of the active design
        rootComp = design.rootComponent
        
        # Create a sketch
        sketches = rootComp.sketches
        sketch1 = sketches.add(rootComp.yZConstructionPlane)
        
        # Create an object collection for the points.
        points = adsk.core.ObjectCollection.create()

        # Define the points the spline with fit through.
        points.add(adsk.core.Point3D.create(-5, 0, 0))
        points.add(adsk.core.Point3D.create(5, 1, 0))
        points.add(adsk.core.Point3D.create(6, 4, 3))
        points.add(adsk.core.Point3D.create(7, 6, 6))
        points.add(adsk.core.Point3D.create(2, 3, 0))
        points.add(adsk.core.Point3D.create(0, 1, 0))

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

        # Get sketch lines
        sketchLines = sketch1.sketchCurves.sketchLines
        
        # Create sketch rectangle
        startPoint = adsk.core.Point3D.create(0, 0, 0)
        endPoint = adsk.core.Point3D.create(5.0, 5.0, 0)
        sketchLines.addTwoPointRectangle(startPoint, endPoint)
       
        #
        # ここにコードを追加していく
        #

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

ここまでの内容でこのようなスプライン曲線と長方形ができます
image.png
このサンプルではスケッチの基準平面がYZ平面になっているのですが、Point3DのXYZ座標値とスケッチ内の座標系とグローバル座標系との関係がよくわからない・・・
Point3D の X 座標値がグローバル座標の -Z に Point3D の Y 座標値 が グローバル座標の Y になっている???

##スケッチから line を取得して変数に代入

        # Get two sketch lines
        sketchLineOne = sketchLines.item(0)
        sketchLineTwo = sketchLines.item(1)

SketchLines.item メソッドでインデックス 0 と 1 のラインを取得して変数に代入する

##スケッチからプロファイルを取得して変数に代入

        # Get the profile
        prof = sketch1.profiles.item(0)

sketch1Sketch.profiles プロパティProfiles オブジェクトを取得し、Profiles.item メソッドProfile オブジェクトを取得して prof に代入する

##押し出しの準備

        # Create an extrusion input
        extrudes = rootComp.features.extrudeFeatures
        extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)

Component オブジェクトfeatures プロパティFeatures オブジェクトを取得して、
Features オブジェクトextrudeFeatures プロパティExtrudeFeatures オブジェクトを取得し、extrudes に代入
ExtrudeFeatures オブジェクトcreateInput メソッドExtrudeFeatureInput オブジェクトを作成し、extInputに代入

##押し出し距離の設定

        # Define that the extent is a distance extent of 5 cm
        distance = adsk.core.ValueInput.createByReal(5.0)

押し出し距離を設定するためにはValueInput オブジェクトを作らなきゃいけないらしい。ValueInput.createByReal メソッドで実数値 (5.0) を指定している。

##ExtrudeFeatureInput の設定(setDistanceExtent プロパティ)

        # Set the distance extent
        extInput.setDistanceExtent(False, distance)

ExtrudeFeatureInput オブジェクトsetDistanceExtent メソッドがリファレンスマニュアルに見当たらなかったのでVSCODEで確認
image.png
一つ目の引数は対称にするかどうかを指定している

##ExtrudeFeatureInput の設定(isSolid プロパティ)

        # Set the extrude type to be solid
        extInput.isSolid = True

isSolid プロパティTrueに設定している。デフォルトが True なので省略してもよい

##押し出し

        # Create the extrusion
        ext = extrudes.add(extInput)

ExtrudeFeatures.add メソッドextという名前の ExtrudeFeature オブジェクトを作成。
押し出しを作成するのに結構な手数がかかるのね・・・

image.png

##ボディから情報を取得して変数に代入

        # Get the body with the extrude
        body = ext.bodies.item(0)
        
        # Get a vertex of the body
        vertex = body.vertices.item(5)
        
        # Get a face of the vertex
        face = vertex.faces.item(0)

ExtrudeFeature オブジェクトbodies プロパティBRepBodies オブジェクトを取得し、item メソッドで インデックス 0 の BRepBody オブジェクトを取得して body に代入
BRepBody.vertices プロパティBRepBody.vertices オブジェクトを取得し、item メソッドでインデックス 5 のBRepVertex オブジェクトを取得し、vertex に代入
BRepVertex オブジェクトfaces プロパティBRepFaces オブジェクトを取得し、item メソッドでインデックス 0 の BRepFace オブジェクトを取得し、face に代入

##垂直軸の作成

        # Create perpendicular construction axis
        axes = rootComp.constructionAxes
        axisInput = axes.createInput()
        axisInput.setByPerpendicularAtPoint(face, vertex)
        axis = axes.add(axisInput)

ルートコンポーネントのconstructionAxes プロパティConstructionAxes オブジェクトを取得して axes に代入
ConstructionAxes.createInput メソッドConstructionAxisInput オブジェクトを作成して axisInput に代入
setByPerpendicularAtPoint メソッドで指定された点で面に対して法線となる軸を作成する
axes に add メソッドで追加し axis に代入
axisInput をかませた手順がややこしい・・・

##コンストラクションポイントの作成

         # Create construction point
        points = rootComp.constructionPoints
        pointInput = points.createInput()
        pointInput.setByTwoEdges(sketchLineOne, sketchLineTwo)
        point = points.add(pointInput)

軸の作成と同じような手順
constructionPoints オブジェクトcreateInput メソッドConstructionPointInput オブジェクトを作成
setByTwoEdges メソッドで 2つの直線的なエッジまたはスケッチラインの交点に施工点を作成する
points に add メソッドで追加し point に代入する

##コンストラクションプレーンの作成

        # Create construction plane
        planes = rootComp.constructionPlanes
        planeInput = planes.createInput()
        offsetValue = adsk.core.ValueInput.createByReal(3.0)
        planeInput.setByOffset(prof, offsetValue)
        plane = planes.add(planeInput)

こちらも軸の作成と同じような手順。Input用のオブジェクトをかませる手順の理解を深めたい

##新しいスケッチの作成

        # Create another sketch
        sketch2 = sketches.add(rootComp.xZConstructionPlane)

##entitiesというリストを作り色々とappend

        entities = []
        entities.append(body) # body
        entities.append(face) # face
        entities.append(sketchLineOne) # edge 
        entities.append(vertex) # vertex
        entities.append(spline) # sketch curve
        entities.append(axis) # construction axis
        entities.append(point) # construction point
        entities.append(plane) # construction plane

##新しいスケッチの作成

        sketchEntities = sketch2.intersectWithSketchPlane(entities)

Sketch.intersectWithSketchPlane メソッドで指定されたエンティティをスケッチ平面と交差させ、その交差を表すスケッチ・ジオメトリを作成し、sketchEntities に代入します
image.png

#まとめ
Intersect に関するサンプルだったはずだけど Extrude や構築平面・軸・点に関する内容がややこしかった。もっと整理しながら進めないと理解が難しそう:sob:

前の記事 Fusion 360 を Pythonで動かそう その8 スケッチのフィレットとオフセット
次の記事 Fusion 360 を Pythonで動かそう その10 理解しづらかったことのおさらい

参考

Fusion 360 API Reference Manual

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?