#はじめに
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()))
ここまでの内容でこのようなスプライン曲線と長方形ができます
このサンプルではスケッチの基準平面が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)
sketch1
の Sketch.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で確認
一つ目の引数は対称にするかどうかを指定している
##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 オブジェクトを作成。
押し出しを作成するのに結構な手数がかかるのね・・・
##ボディから情報を取得して変数に代入
# 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
に代入します
#まとめ
Intersect に関するサンプルだったはずだけど Extrude や構築平面・軸・点に関する内容がややこしかった。もっと整理しながら進めないと理解が難しそう
前の記事 Fusion 360 を Pythonで動かそう その8 スケッチのフィレットとオフセット
次の記事 Fusion 360 を Pythonで動かそう その10 理解しづらかったことのおさらい