Fusion360 APIを使ってアセンブリに含まれるすべての子部品のスクリーンショットを保存する
2020/09/04 categories:Fusion360| tags:Fusion360|Fusion360 API|
パーツリストを作成する場合などにCADの絵が欲しくなるので、アセンブリの全子部品を画像化するスクリプトを作成しました。
処理内容
処理内容は下記の図の通りです。
ルートコンポーネントの子部品をすべて表示状態にする
ApplicationからrootComponentを取得して、rootComponent.allOccurrencesのオカレンスのisLightBulbOnをすべてTrueにすることでルートコンポーネントの子部品をすべて表示状態にできます。
root_component = app.activeProduct.rootComponent
all_occurrences = root_component.allOccurrences
for occurrence in all_occurrences:
occurrence.isLightBulbOn = True
表示をビューにフィットする
adsk.core.Application.get()で取得したApplicationオブジェクトからactiveViewportを取得して、ViewPortからcameraを取得、isFitViewをTrueに設定したcameraをViewPortにセットすることで、表示がビューにフィットした状態になります。この処理はホームビューに移動コマンドを実行したときと同じ挙動になります。
def view_fit(app):
view_port = app.activeViewport
if not view_port:
return False
camera = view_port.camera
if not camera:
return False
camera.isFitView = True
view_port.camera = camera
ビューポートを画像として保存
Application.activeViewport.saveAsImageFile()で表示している画面を画像ファイルとして保存できます。
app.activeViewport.saveAsImageFile('D:/images/' + root_component.name + '.jpg', 600, 600)
コンポーネントを1つだけ表示状態にする
表示状態の設定はオカレンスオブジェクトに対してoccurrence.isLightBulbOn = Falseとすることで非表示状態にできます。
処理対象のオカレンスであり、まだ表示設定にしていない場合はオカレンスを表示状態にします。処理対象のオカレンスではない場合で、子部品がある場合は表示状態に、子部品がない場合は非表示状態にします。
def visible_one_component(occurrence1, all_occurrences):
visible_flag = True
for occurrence2 in all_occurrences:
if not occurrence1 == occurrence2:
if len(occurrence2.childOccurrences) > 0:
occurrence2.isLightBulbOn = True
visible_children(occurrence1)
else:
occurrence2.isLightBulbOn = False
else:
if visible_flag:
visible_flag = False
occurrence2.isLightBulbOn = True
動作の様子
Fusion360 APIでアセンブリの子部品すべてのスクリーンショットを保存するスクリプト作ってみた。ドキュメント作成とかに使えるかも。ただスクリプト実行中にFusion360が固まるのが少し気になる。 pic.twitter.com/tPEhCiXRKf
— ymt-lab (@ymt_lab) September 4, 2020
出力された画像
指定したフォルダ(今回はD:\images)に以下のように画像が保存されます。
ソースコード
#Author-
#Description-
import adsk.core, adsk.fusion, adsk.cam, traceback
def unique_children_screenshots(app):
root_component = app.activeProduct.rootComponent
all_occurrences = root_component.allOccurrences
unique_children = { occ.component.name : occ for occ in all_occurrences }
unique_children = [ unique_children[key] for key in unique_children ]
for occurrence in all_occurrences:
occurrence.isLightBulbOn = True
view_fit(app)
app.activeViewport.saveAsImageFile('D:/images/' + root_component.name + '.jpg', 600, 600)
for occurrence in unique_children:
visible_one_component(occurrence, all_occurrences)
view_fit(app)
component_name = occurrence.component.name
app.activeViewport.saveAsImageFile('D:/images/' + component_name + '.jpg', 600, 600)
for occurrence in all_occurrences:
occurrence.isLightBulbOn = True
view_fit(app)
def visible_one_component(occurrence1, all_occurrences):
visible_flag = True
for occurrence2 in all_occurrences:
if not occurrence1 == occurrence2:
if len(occurrence2.childOccurrences) > 0:
occurrence2.isLightBulbOn = True
visible_children(occurrence1)
else:
occurrence2.isLightBulbOn = False
else:
if visible_flag:
visible_flag = False
occurrence2.isLightBulbOn = True
def visible_children(occurrence1):
for occurrence2 in occurrence1.childOccurrences:
occurrence2.isLightBulbOn = True
visible_children(occurrence2)
def view_fit(app):
view_port = app.activeViewport
if not view_port:
return False
camera = view_port.camera
if not camera:
return False
camera.isFitView = True
view_port.camera = camera
def run(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
unique_children_screenshots(app)
ui.messageBox('Finished!!!')
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))