Fusion360のCAMは昨年の4月に桁違いに強化され、今では自動化するための
機能が十分備わった状態になっていると思ってます。
そんな中、干渉チェックをAPIで行いたい とちょっと面白そうなテーマを
見つけました。
CAMソフトによっては、ツールパスを計算した際に一緒に干渉チェックを行い
データとして干渉情報を持っているソフトも有るのですが、自分が知る限り
Fusion360CAMはそのような方法をとっておらず、シミュレーションを行う事で
干渉チェックを行う事になります。
と言う事で、APIでシミュレーションを行い、干渉情報を拾い出すサンプルを
作成しました。
Solved: Re: Detect Collision - Autodesk Community
# Fusion360API Python script import traceback import adsk import adsk.core as core import adsk.cam as cam import time import re def run(context): ui: core.UserInterface = None try: app: core.Application = core.Application.get() ui = app.userInterface camObj: cam.CAM = cam.CAM.cast(app.activeProduct) if not camObj: return if camObj.setups.count < 1: return # First “setup” setup: cam.Setup = camObj.setups[0] # A list of “Setup”, “Operations”, “NC Programs”, etc. msg = get_simulation_issues([setup]) ui.messageBox( msg, "Simulation Issues" ) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) def get_simulation_issues( entities: list) -> None: # ** Support Functions ** def get_issues( text: str, ) -> str: pattern = r"(Errors: \d+, Warnings: \d+)" match = re.search(pattern, text) return match.group() def is_ready( text: str, ) -> bool: pattern = r"Verification, (.*?) - Errors:" match = re.search(pattern, text) return "100%" in match.group() # ****** ui: core.UserInterface = None try: app: core.Application = core.Application.get() ui = app.userInterface # Select entities sels: core.Selections = ui.activeSelections sels.clear() for ent in entities: sels.add(ent) # Start Simulation app.executeTextCommand(u"Commands.Start IronSimulation") app.executeTextCommand(u"Commands.Start SimulationIssues") while True: time.sleep(0.5) adsk.doEvents() dialogInfo = app.executeTextCommand(u"Toolkit.cmdDialog") if is_ready(dialogInfo): # End of calculation issues = get_issues(dialogInfo) break # Stop Simulation app.executeTextCommand(u"Commands.Start SimulationStop") # Select clear sels.clear() return issues except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
ちょっとだけ説明すると、Fusion360CAMの場合はシミュレーションを起動した
直後は干渉チェックが全ておらず、一定時間待つ必要があります。多分。
それを行っているのがis_ready関数です。
実は、ブログでは取り上げなかったのですが、以前別件で類似するような
内容の質問で利用した方法です。気が付いたんです、これでイケると。
(やっぱり、テキストコマンド使っちゃうな。)
これもダイレクトメッセージもらっていたのですが、気が付かずに
リプライしてました・・・。