C#ATIA

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

穴形状のタイプを認識する

フォーラムに記載した ”レッツ穴あけ” の時には、既に実装されていた
オブジェクトなのですが、見落としていたRecognizedHoleオブジェクト
と言うものがあります。
Fusion 360 Help
穴として認識した形状を保持してくれた上、様々な情報を得ることが
出来そうです。
非常に便利なのですが、'23.9.19時点(ver2.0.17244)ではオンラインヘルプに
試験管の絵文字が付いており、プレビュー機能(正式にサポートしている訳ではない)
だと言うことですが、まぁ大きく変更される事は無いと思っています。


テストとして、次のサンプルデータを作成してみました。

見易いように断面解析にしていますが、全て同一の直径の穴ですが、
普通の穴やザグリ付き、底面がフラットなもの等です。

続いてこのようなスクリプトを作成しました。

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.fusion as fusion
import adsk.cam as cam


UPPER_TYPE_MAP = {
    cam.HoleSegmentType.HoleSegmentTypeFlat: "無し",
    cam.HoleSegmentType.HoleSegmentTypeTorus: "R面取り",
    cam.HoleSegmentType.HoleSegmentTypeCone: "面取り",
}

LOWER_TYPE_MAP = {
    cam.HoleSegmentType.HoleSegmentTypeFlat: "フラット",
    cam.HoleSegmentType.HoleSegmentTypeTorus: "球体",
    cam.HoleSegmentType.HoleSegmentTypeCone: "ドリル",
}


def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface
        des: fusion.Design = app.activeProduct
        root: fusion.Component = des.rootComponent

        sels: core.Selections = ui.activeSelections

        holeGroups = list(
            cam.RecognizedHoleGroup.recognizeHoleGroups(
                [root.bRepBodies[0]]
            )
        )

        holeGroup: cam.RecognizedHoleGroup = None

        for holeGroup in holeGroups:
            hole: cam.RecognizedHole = holeGroup[0]

            segments = [hole.segment(i) for i in range(hole.segmentCount)]

            cylinders = [s for s in segments 
                if s.holeSegmentType == cam.HoleSegmentType.HoleSegmentTypeCylinder]

            segments.insert(0, None)
            segments.append(None)

            cylinder: cam.RecognizedHoleSegment = None
            for cylinder in cylinders:
                info = get_hole_info(
                    cylinder,
                    segments,
                )

                sels.clear()
                sels.add(cylinder.face)
                ui.messageBox(info, "穴情報")

        sels.clear()

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


def get_hole_info(
    segment: cam.RecognizedHoleSegment,
    segments: list[cam.RecognizedHoleSegment]
):
    pass
    indexes = [i for i, x in enumerate(segments) if x == segment]

    if len(indexes) < 1: return ""
    idx = indexes[0]

    # upper
    uprSegment: cam.RecognizedHoleSegment = segments[idx - 1]
    uprMsg = "上側:"
    if uprSegment:
        if uprSegment.holeSegmentType in UPPER_TYPE_MAP:
            uprMsg += UPPER_TYPE_MAP[uprSegment.holeSegmentType]
        else:
            uprMsg += "不明"
    else:
        uprMsg += "無し"

    # lower
    lwrSegment: cam.RecognizedHoleSegment = segments[idx + 1]
    lwrMsg = "下側:"
    if lwrSegment:
        if lwrSegment.holeSegmentType in LOWER_TYPE_MAP:
            lwrMsg += LOWER_TYPE_MAP[lwrSegment.holeSegmentType]
        else:
            lwrMsg += "不明"
    else:
        lwrMsg += "貫通"

    return "\n".join([uprMsg, lwrMsg])

実行は "デザイン" で行ってください。
まず、穴と認識出来る円筒面を見つけ選択し、円筒面の上側と下側の面の種類で
穴径上のタイプを判断し表示しています。

ザグリ穴は底面フラットと同じ判断です。


このデータは全て "穴" コマンドで作成した穴なのですが、
・スケッチに円を描いて押し出した穴
・スケッチにプロファイルを描いて、回転で作成した穴
・Stepでエクスポートし、再インポートした形状の穴
これらも認識している為、純粋に形状として穴と判断出来るものを
見つけ出してくれているようです。便利ですね。