C#ATIA

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

シリンダーの凹面を探す

こちらにちょっと記載したのですが、
Re: レッツ穴あけ - Autodesk Community

is_hole関数の説明時に

・・・ひょっとしたらisParamReversedプロパティだけでも判断出来るのかなぁ。

と記載しました。

isParamReversedプロパティはこちらです。
help.autodesk.com
別件でこのプロパティの存在を知りました。

何となくなのですが、ジオメトリ(BRapFace.geometry)は、凸側方向を
法線方向と定義されているような気がします。
ソリッドの凸Rと凹Rの場合、それぞれが矢印方向が法線方向と言うことです。

これはこれで良いような気もしますが、ちょっと前に困ったのが
サーフェスのオフセットコマンドでした。
オフセットの数値をプラスで入力した場合、両方ともボディの
外側にオフセットされます。

オフセットされる方向はこれで良いのですが、凹側は法線方向とは
逆になります。
これがisParamReversedプロパティの意味なんだろうと思います。

個人的な印象は、各々の面の法線方向はバラバラでも、ソリッドや
シェル(サーフェスが繋がった状態)の状態では、法線方向が整った
状態になっているような気がします。(CATIAでも、そうです)

それを考えるとisParamReversedプロパティがTrueの場合は、
シリンダ・コーン・トーラスについては凹形状を意味している
ような気がします。・・・自信が無いのですが。


試すために次のスクリプトを作りました。

# Fusion360API Python script

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

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

        msg: str = 'Select'
        selFilter: str = 'Bodies'
        sel: core.Selection = select_ent(msg, selFilter)
        if not sel:
            return

        faces = find_hole_faces(
            sel.entity,
        )

        sels: core.Selections = ui.activeSelections
        sels.clear()
        [sels.add(f) for f in faces]

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


def find_hole_faces(
    body: fusion.BRepBody,
) -> list[fusion.BRepFace]:
    '''
    穴面を探し出す
    '''
    # 円筒面のみ
    faces = [f for f in body.faces
        if f.geometry.objectType == core.Cylinder.classType()]

    # ボスの円筒面は除去
    faces = [f for f in faces if f.isParamReversed]

    return faces


def select_ent(
    msg: str,
    filter: str
) -> core.Selection:

    try:
        app: core.Application = core.Application.get()
        ui: core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filter)
        return sel
    except:
        return None

スクリプトを実行してボディを選択すると、isParamReversed = True となる
シリンダ面のみが選択された状態で終了します。

Fusion360に入っている幾つかのデータで試したところ、
今のところは、反例となるような面は見つかっていないので、
正しそうな気もします。

シリンダ・コーン・トーラス以外の曲面(波状になって凸凹を持つような面)や
平面についてはそれに該当しないとは思っています。
(ユーグリッド幾何学上は、凹の平面ってないし・・・)