こちらにちょっと記載したのですが、
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に入っている幾つかのデータで試したところ、
今のところは、反例となるような面は見つかっていないので、
正しそうな気もします。
シリンダ・コーン・トーラス以外の曲面(波状になって凸凹を持つような面)や
平面についてはそれに該当しないとは思っています。
(ユーグリッド幾何学上は、凹の平面ってないし・・・)