C#ATIA

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

NURBS面を円筒面に変換する6

こちらの続きです。
NURBS面を円筒面に変換する5 - C#ATIA
邪魔が入って半日以上取り掛かれなかった・・・・。

前回は失敗しました。目的は穴か軸かの判断です。
フッと思い付きたのは、こんな感じです。

円柱になりそうな面の重心が赤い点とします。(適当です)

面上に点を作成します。これを点Aとします。
点Aを法線方向に少しだけ移動します。これを点Bとします。

穴の面の場合は法線は中心方向で、軸は外側方向だと分かっています。
つまり距離を測定し、
・重心-A > 重心-B : 穴
・重心-A < 重心-B : 軸
になるのではないか? と予測しました。

で、こちらを作って確認したところ大丈夫そうです。

# 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 = 'Faces'
        while True:
            sel: core.Selection = selectEnt(msg, selFilter)
            if not sel:
                break

            app.log(f'{is_hole(sel.entity)}')

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


def is_hole(
    face: fusion.BRepFace,
) -> bool:

    point: core.Point3D = face.pointOnFace

    eva: core.SurfaceEvaluator = face.evaluator

    normal: core.Vector3D = None
    _, normal = eva.getNormalAtPoint(point)
    normal.normalize()
    normal.scaleBy(0.001)

    checkPnt: core.Point3D = point.copy()
    checkPnt.translateBy(normal)

    tmpMgr: fusion.TemporaryBRepManager = fusion.TemporaryBRepManager.get()
    clone: fusion.BRepBody = tmpMgr.copy(face)
    physicalProp: fusion.PhysicalProperties = clone.getPhysicalProperties()
    cog: core.Point3D = physicalProp.centerOfMass

    return cog.distanceTo(checkPnt) < cog.distanceTo(point)


def selectEnt(
    msg: str,
    filterStr: str
) -> core.Selection:

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

恐らく、これで必要そうなテストは終わりです。
・・・面の接続関係はあるけど、後回しにしよう。

さぁ道具はそろった。後は形にしよう。