C#ATIA

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

穴テンプレート1

Fusion360の製造の"穴テンプレート"の存在は薄々知っていたのですが、
意味を理解していませんでした。

"テンプレート"と"穴テンプレート"の違いが判らなかったので、試したことすら
有りませんでした。
実際に"穴テンプレート"して登録し、"テンプレートから作成"を行っても全く同じ
動作です。


事の発端は"穴認識"コマンドです。

※"穴認識"は製造の拡張機能で、追加する必要があります。
※製造の拡張機能は個人ライセンスでは導入できません。

単純な穴形状に対しては選択出来る"アクション"はこの様に表示されました。

続いて、ザグリ穴付きの"アクション"はこの様に数がグッと減ります。

3D形状からザグリ穴の存在を認識し、"アクション"にリストされる
テンプレートからも単純な穴加工とは異なることを認識しています。

最初は、この"アクション"で表示されるリストは自作のテンプレートは
利用出来ないのかと思っていたのですが、テンプレートライブラリを
選択出来る項目が有る為、自作のものも選択可能だろうと予測出来ました。

しかし、通常のテンプレートは"アクション"では表示されません。
何故?


そこで同じ穴加工を"テンプレート"と"穴テンプレート"で作成し、
エクスポートした物を比較してみました。
2か所違いがあります。

左は"穴テンプレート"で右が"テンプレート"です。
"Cylinder"や"Cone"が有ることから形状を認識しているようです。


こちらでは"Type"や"Ratio"が見られるので、穴の形状に対して
何の工具で、穴径に対して使用する工具径の比率が記載されているようです。

恐らく"穴認識"の"アクション"でリストされる項目は"穴テンプレート"の
この部分を読み取り判断されて表示しているのだろうと思われ、
通常の"テンプレートから作成"ではこの部分を無視して読み込まれている
と思われます。

つまり"穴テンプレート"は"穴認識"で利用する事を目的とした
テンプレートファイルではないかと思われます。


と、ここまでが前置きです。
この"穴テンプレート"ファイルの形状情報を持っている"holeSignature"タグ
内の情報で、使用すべき穴形状情報が取得出来そうなので、ここだけを抜き出します。


XMLファイルから情報が欲しいだけなので、テキストファイルとして読み込んで
グリグリ探し回ったり、正規表現使ったりでも事が済みそうなのですが、
ここは頑張って(勉強を兼ねて)XMLファイルとして扱いたい。

最初はElementTreeを使用して試していたのですが、使いにくい・・・。
pythonでDOMを操作したい - C#ATIA

Fusion360APIの場合、外部モジュールのインストールが面倒なのでやりたく
ないのですが、素直に諦めて定番のBeautifulSoupをインストールしました。

BeautifulSoupのインストール先やら穴テンプレートのファイルパスやら
細かな事は無視し、こんな感じのスクリプトを作りました。

# Fusion360API Python script

import traceback
import adsk.core as core
import pathlib

import sys
import pathlib

THIS_DIR = pathlib.Path(__file__).resolve().parent
PACKAGE_PATH = str(THIS_DIR / "lib" / "site-packages")
if not PACKAGE_PATH in sys.path:
    sys.path.append(PACKAGE_PATH)
from bs4 import BeautifulSoup

TEMPLATES_DIR = THIS_DIR / "templates"

def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface

        # 穴テンプレートパス
        xmlPath = str(TEMPLATES_DIR / "test_hole.f3dhsm-template")

        # 穴テンプレートを読み込みパーサーへ
        with open(xmlPath, 'r', encoding="utf-8") as f_in:
            soup = BeautifulSoup(f_in, "html.parser")

        # holesignatureタグから情報収集
        holeSignatures = soup("holesignature")
        for holeSignature in holeSignatures:
            geoTypes = [h.attrs["type"] for h in holeSignature(type)]
            app.log(" : ".join(geoTypes))

        ui.messageBox("Done")

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

これだけの量なのに苦戦・・・。BeautifulSoupについて分かっていなさすぎる。
一番の謎はこちらです。

holeSignature(type)

変数holeSignatureはリストなのですが、1行毎に改行のみの状態になっていました。
(BeautifulSoupはそんなものらしい)
ところが、上記の記述をすると改行のみの行は除去され好都合でした。
(書き間違えて実装した際に偶然発見。理由が知りたい・・・)


実行するとテキストコマンドウィンドウにはtypeの値のみが出力されます。

Cone : Cylinder : Cone

何となく、面取りが有り、底面はドリル先端形状だろうと予測は付きます。


細かく調べていないのですが、"穴テンプレート"は作成時にエラーが出やすく
条件が若干シビアでした。
・形状タブの選択モードは"選択された面"のみ

・複数工程を1つの穴テンプレートにする事は可能ですが、異なる穴軸の
 工程は同じ穴テンプレートにすることは出来ない。


探したところ"穴認識"については、なん重のケロさんががっちり説明されて
いました。(比較的後半です)
Fusion360 CAM解説 ドリルコマンド 自動穴認識 ベースプレート編② - YouTube