フォーラムに記載した ”レッツ穴あけ” の時には、既に実装されていた
オブジェクトなのですが、見落としていた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でエクスポートし、再インポートした形状の穴
これらも認識している為、純粋に形状として穴と判断出来るものを
見つけ出してくれているようです。便利ですね。