C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

APIで干渉チェックする

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関数です。

実は、ブログでは取り上げなかったのですが、以前別件で類似するような
内容の質問で利用した方法です。気が付いたんです、これでイケると。
(やっぱり、テキストコマンド使っちゃうな。)

これもダイレクトメッセージもらっていたのですが、気が付かずに
リプライしてました・・・。