Home > 3D-CAD > Fusion 360 > ドキュメント > API

ベクトルドロー・レベルゼロ

FusionAPIのPython特有の問題

広告

新規作成日 2017-05-11
最終更新日

公式ドキュメントの和訳です。

原文:「Python Specific Issues

Fusion 360は、いくつかの異なるプログラミング言語から使用することができる、一つのAPIを持っています。ほとんどの場合、APIは、ほんの少しの言語固有の構文の変更とプログラミング言語のそれぞれと非常によく似た方法で使用されます。しかしながら、場合によっては、特定の言語のために、APIが、どのように使われるかに、著しい違いがあります。このトピックでは、違いについて説明します。それは、Pythonに固有です。そして、以下の一覧にした話題を網羅しています。

Pythonスクリプトやアドインを編集して、デバッグする

Editing and Debugging a Python Script or Add-In

Pythonスクリプトやアドインを編集するか、デバッグするとき、Spyder IDE(統合された開発環境)が、表示されるでしょう。あなたが、新しいスクリプトやアドインを作成するために、「スクリプトとアドイン」コマンドを使用するとき、それは、Fusion Applicationオブジェクトを取得するコードが含まれています。UserInterfaceオブジェクトに参照を取得するために、Applicationオブジェクトを使用します。そして、その次に、メッセージボックスを表示します。Spyder IDEとPythonコードは、以下で確かめることができる新しいアドインのために、作成されます。あなたは、Spyder IDEで、コードを編集することができます。

Spyder IDE

開発環境の重要な機能は、あなたのプログラムをデバッグする機能です。また、デバッグは、Spyder IDEでも実行されます。デバッグを開始するために、2つの方法があります。まず、あなたが、今までに、Spyderでスクリプトやアドインを開いていない場合、あなたは、スクリプトとアドイン・コマンドを実行することができます。ダイアログでスクリプトやアドインを選択します。そして、その次に、ダイアログの右下のドロップダウンから、Debugを選択します。これは、Spyderでスクリプトを開きます。そして、プログラムの最初の行のブレークポイントで、スクリプトやアドインのデバッグを開始します。次に、あなたが、すでに、Spyderでスクリプトを開いたことがある場合、あなたは、ツールバーで、Debugファイル・コマンドを使用できます。以下に示すように、デバッグプロセスを開始します。

Spyderでデバッグプロセスを開始

あなたが、すでに、このスクリプトをデバッグしていた場合、以下に示されるダイアログが、表示されるでしょう。「Yes」をクリックして、デバッグを続けます。

表示されるダイアログで「Yes」をクリック

一旦、あなたが、デバッグを開始すると、あなたは、以下に示されるツールバーで、あなたのコードをステップ実行するために、デバッグコマンドを使用できます。Spyderは、そこで、あなたのコードをステップ実行するために、一般的なオプションをサポートしています。:

  • いずれかの関数を呼び出し、手順を1行ずつステップ実行します。
  • 関数にステップインします。
  • 現在の関数から飛び出します。
  • 次のブレークポイントに、達するまで実行します。
  • デバッグを終了します。

また、あなたは、Debugメニュー、あるいは、F12ショートカットを使用して、ブレークポイントを追加する、あるいは、削除することができます。

デバッグの間、あなたは、以下に示すように、変数インスペクタ・ウィンドウを使用して、変数の値を確認することができます。また、あなたは、さらに、変数を調べるために、コンソール・ウィンドウの出力関数を使用することができます。これは、以下で、Occurrences.countプロパティの値を確認するために、説明されています。

変数インスペクタ・ウィンドウを使用して、変数の値を確認することができます。

参照引数

Reference Arguments

Pythonは、出力や '参照による'引数をサポートしていません。たとえば、Point3D.getDataメソッドは、次のように設計されています。:

boolean Point3D.getData( out double x, out double y, out double z )

x、y、z引数の型は 'out double'です。 'out'は 'by reference'引数を示します。ドキュメントは、この引数が、結果が含まれる出力引数として、使用されることを指摘しています。

Pythonでは、すべての関数出力は、関数の一つの戻り値として返されています。それは、out引数がある場合、Pythonの場合はタプルになります。タプルの最初の値は、関数の記録された戻り値です。他の値は、引数リストで一覧にされる、同じ順序のout引数です。以下の例は、Point3D.getData関数の呼び出し、そして、直接、変数に結果を割り当てることを説明します。

(retVal, x, y, z) = point.getData()

コレクションの操作

Working with Collections

Fusionコレクション・オブジェクトは、countプロパティとitemメソッド(そして、一般的には、多くの他の関数も)をサポートしている、オブジェクトです。Fusion Pythonインターフェイスのコレクションのために作成されるラッパは、標準的なPythonコンテナの反復とlength構文をサポートしています。それで、あなたは、countとitem、あるいは、より多くのPython扱いやすい反復子から、選択をすることができます。たとえば、次の代わりに:

for i in range(col.count):
    item = col.item(i)
    ...

あなたは、その代わりに以下を使用することができます。:

for item in col:
    ...

また、あなたは、col.countの代わりに、len(col)を使うことができる、len関数を使用することができます。

コレクション内の特定のアイテムにアクセスするために、あなたは、Fusion APIで提供されるitemメソッドを使用することができます。あるいは、あなたは、col.item(i)を使う代わりに、標準的なPythonコンテナ・アクセサを使用することができます。あなたは、col[i]を使用することができます。これに加えて、コレクションが、標準的なPythonコンテナを使用しているため、また、あなたは、コレクションから、項目のサブセットを取得するために、コンテナの"slice"構文を使用することができます。例えば、

col[0]   # コンテナで最初の項目を取得します。

col[-1]  # コンテナで最後の項目を取得します。

col[:2]  # コンテナ内の最初の2つの項目をリストとして取得します。

col[-2:] # コンテナ内の最後の2つの項目をリストとして取得します。

col[1:4] # コンテナ内の2、3および4番目の項目をリストとして取得します。

オブジェクト型

Object Types

Pythonは、厳密に型指定された言語でありません。しかしながら、あなたは、既存のオブジェクトに、どんな特定の型があるかについて調べることができます。2つのアプローチがあります。まず、あなたは、オブジェクトの型を取得するtype()関数を使用することができます。

# 現在選択されたentity.cを取得します。
selObj = app.activeSelection.item(0).object

# それがスケッチの線であるかどうか確かめるために、確認します。
if type(selObj) is adsk.fusion.SketchLine:
    print( "SketchLine is selected." )

type()関数は、オブジェクトの即時型を返しますが、動作しません。あなたが、見つけたい場合は、オブジェクトが、他のオブジェクトから継承される場合、例えば、以下のコードは、動作しません。そして、すべてのオブジェクトが、特定の型になるため、if文は決して入力されません。

# 現在選択されたエンティティを取得します。
selObj = app.activeSelection.item(0).object

# どの型のスケッチエンティティであるかを確認してください。
# オブジェクトは、特定の型であるため、これは決して動作しません。
if type(selObj) is adsk.fusion.SketchEntity:
    print( "A sketch entity is selected." )

SketchLineは、SketchCurveから派生しています。それは、SketchEntityから派生しています。それは、core.Baseから派生しています。あなたが、オブジェクトを持っていて、確かめたい場合、それが、スケッチ・エンティティの型である場合、あなたは、以下に示すように、type()の代わりに、isinstance()関数を使うことができます。

# 現在選択されたエンティティを取得します。
selObj = app.activeSelection.item(0).object

# エンティティが、SketchEntityから派生している場合、確かめるために、確認します。
if isinstance(selObj, adsk.fusion.SketchEntity):
    print( "Is some kind of sketch curve." )

オブジェクトの同一性

Object Equality

それは、2つのオブジェクト変数が、同じFusionオブジェクトを参照しているかどうか、比較する必要があるのが一般的です。Pythonでは、あなたは、等価演算子'=='を使用することができます。以下のコードは、それらが同じ面を参照する場合、2つの変数を確認します。

# それらが、同じ面を参照する場合、確かめるために、2つの変数を比較します。
if face1 == face2:
    print( "Faces are the same" )

Pythonの"is"識別演算子は、2つのFusionオブジェクトを比較するために、使用できません。その代わりに、上で示されるように、あなたは、等価演算子を使用する必要があります。

コード・ヒント:

Code Hint

Pythonが厳密に型指定された言語ではありませんが、IDEは、依然として変数を表現する型を理解しようとします。それで、それは、そのオブジェクトのために、適切なコード・ヒントを表示することができます。例えば、下の画像では、IDEは、Applicationオブジェクトを返す、adsk.core.Application.get関数を認識しています。それで、私が、appの後にピリオドを入力するとき、それは、Applicationオブジェクトによって、サポートされるメソッドとプロパティのリストを表示します。同じは、trueです。それを知るため、私が、ui変数を使用する場合、それは、UserInterfaceオブジェクトを参照しています。

オブジェクトのために、適切なコード・ヒントを表示することができます。

プロパティが、基底クラスを返すために分類されるとき、適切にコード・ヒントを処理するためのIDEの能力は、失敗しますが、実際には、派生クラスの1つを返します。この一般的な例は、ApplicationオブジェクトのactiveProductプロパティの使い方です。このプロパティは、Productオブジェクトを返すために型を指定します。しかし、常に、Productから派生する、より具体的なオブジェクトを返します。Fusionで動作するとき、それはDesignオブジェクトを返します。下の図は、コード・ヒントを示しています。それは、Productオブジェクトで、メソッドとプロパティだけが、サポートされますが、それは、おそらく、あなたが、Designオブジェクトのために、特別なメソッドとプロパティにアクセスしたいと考えるでしょう。あなたは、まだ、コード・ヒントを使うことなく、コードを記述することができます。そして、それは、まったく同じように実行されます。しかし、コード・ヒントを持っていることは、あなたが、オブジェクト・サポートとメソッドが必要とする引数によって、どんなメソッドとプロパティでも速く表示することで、APIを使用するための、あなたの能力を非常に改善できます。

コード・ヒントは、Productオブジェクトで、メソッドとプロパティだけが、サポートされます

プログラムを実行する必要はありませんが、あなたは、特定の型に変数を型変換できます。それで、IDEは、その変数が、何を表現するかわかっています。そして、続いて、適切なコード・ヒントを表示することができます。あなたは、static "cast"関数を使用して、Pythonで、これを行います。これは、以下で、変数をDesignオブジェクトに型変換するために、使用できます。そして、あなたは、確かめることができます。Designオブジェクトで、コード・ヒントは、現在、サポートされるメソッドとプロパティの全てを表示しています。型変換された関数の呼び出しは、この場合、実行中の製品が、デザインではないNoneを返すでしょう。

変数をDesignオブジェクトに型変換するために、使用できます。

IDEの他の一般的な例は、選択を実行するためにAPIを使用するとき、コード・ヒントを表示できません。例えば、UserInterface.activeSelectionsプロパティを使用します。選択されている実際のオブジェクトは、Selection.entityプロパティによって返されます。それは、派生されるすべてのFusionオブジェクト、そして、極めて役に立つのためのコード・ヒントではなく、のBaseオブジェクトを返すために、型を指定します。あなたが、オブジェクトの型を知っている場合、それが、選択されます。あなたは、以下に示すように、IDEが、変数がどんな型か知るために、cast関数を使用することができます。

sels = app.userInterface.activeSelections

# 選択範囲を稜線にキャストします。
edge = adsk.fusion.BRepEdge.cast(sels[0].entity)
if not edge:
    ui.messageBox('An edge was not selected.')
    return
	
# 次に、変数"edge"のために、素晴らしいコード・ヒントが、あります。

追加のPythonモジュール

Additional Python Modules

多くのモジュールは、Pythonの機能を拡張するために、書かれています。Fusionで提供されるPythonは、Pythonの標準的なインストールと一緒に、やって来る、中心的なモジュールだけを含んでいます。しかしながら、あなたは、あなたのPythonプログラムに、利用できるそれらを作成することによって、他のモジュールを使用することができます。モジュールをsys.pathにインストールするか、追加する代わりに、私たちは、あなたが、スクリプトのためのモジュールのローカルコピーを持つことを推奨します。これを実行するには、あなたは、スクリプトやサブディレクトリとして、同じディレクトリに、Pythonモジュールをインストールします。以下のレイアウトは、推奨されているものです。この場所の、この場合のスクリプト名は「MyScript」で、そして、Pythonモジュールの名前は、xlrdです。(Microsoft Excelファイルへのアクセスを提供するモジュール)。

スクリプトやサブディレクトリとして、同じディレクトリに、Pythonモジュールをインストールします。

あなたのPythonスクリプトで、モジュールを参照するために、あなたは、以下で示されたように、相対パス構文を使用します。

from .Modules import xlrd

その他

Miscellaneous

Pythonは、Fusion工程の範囲内で実行し、そして、また、メインFusionスレッドで実行します。このため、あなたのプログラムが、実行しているとき、メッセージに反応する機会を全く持っていないため、Fusionは、ほとんどフリーズしているように見えます。この一般的な例は、あなたのスクリプトやアドインが、モデルを編集している時です。あなたのプログラムが正常に実行され、モデルに期待される変更を作成していたとしても、プログラムが完了するまで、これらの変更は表示されません。これは、更新するシステムによって、メッセージが、送信されたためです。ディスプレイは、メインスレッドが、スクリプトやアドインを実行しているため、扱うことができません。

場合によっては、これは、実際に望ましいです。なぜなら、画像を更新更新する時間、そして、実行する総時間を短縮します。プログラムは、より速くなります。しかしながら、他の場合には、ユーザーが、構築されているモデルを観察することができると、確認する方法として、それが、プログレスメーターの一種として、正しく提供されると、より素晴らしいです。これがいつ必要かという他の例が、モデルのまわりを、そして、それによって飛ぶために、あなたがカメラを操作している時です。Fusionは、ディスプレイを更新できるように、カメラの変更されたメッセージを処理して、そして、反応できる必要があります。APIは、doEvents関数をサポートします。それは、一時的に、アドインやスクリプトの実行を停止させます。そして、Fusionに、キューに入れたメッセージを処理する機会を与えます。以下は、選択されたコンポーネントの100の新しいインスタンスを作成する、サンプルスクリプトです。doEventsを呼び出すと、アセンブリに追加されるため、それぞれの発生が表示されます。それが無ければ、プログラムが完了するまで、画像は更新されません。

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

        occ = adsk.fusion.Occurrence.cast(ui.selectEntity('Select an occurrence', 'Occurrences').entity)
        
        if occ:
            root = app.activeProduct.rootComponent

            # 参照されたコンポーネントを取得します。
            comp = occ.component

            # 選択されたオカレンスから、X方向性に、5cmオフセットされる100のオカレンスを作成します。
            trans = occ.transform
            offset = trans.getCell(0, 3)
            for i in range(0, 100):
                offset += 5
                trans.setCell(0, 3, offset)
                root.occurrences.addExistingComponent(comp, trans)

                # Fusionに反応する機会を与えるために、doEventsを呼び出します。
                adsk.doEvents()
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Home 3D-CAD 2D-CAD 3D-モデラー 学生版 モデリング資料

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」