C#ATIA

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

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

こちらの続きです。
NURBS面を円筒面に変換する4 - C#ATIA

次は、円筒面が穴なのか軸なのかを判断したいです。
単純に曲率だけでは判断出来ない・・・と思うので。

こちらのテストで、法線側にRサイズオフセットすると
ソリッドの肉の中方向になる事が分かってます。
NURBS面を円筒面に変換する2 - C#ATIA


この様なデータを用意しました。

球体を用意し、スケッチの点を2個。
赤印の点は球体内で、緑印の点は球体の外です。

CATIAの経験上、ソリッドとソリッド内の点の最短距離を
測定した際、”0” になるはずです。
簡単なテストをしたところ、Fusion360でも同様でした。
これが0以外の場合、ちょっと大変なので助かりました。
あぁ、でもそうでも無いかも。

取りあえず最短距離で判断するスクリプトです。

# 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
        des: fusion.Design = app.activeProduct
        root: fusion.Component = des.rootComponent

        body: fusion.BRepBody = root.bRepBodies[0]
        skt: fusion.Sketch = root.sketches[0]

        innerPoint: core.Point3D = skt.sketchPoints[1].worldGeometry
        outerPoint: core.Point3D = skt.sketchPoints[2].worldGeometry

        [print(is_inner(body, pnt)) for pnt in (innerPoint, outerPoint)]

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

def is_inner(
    body: fusion.BRepBody,
    point: core.Point3D,
) -> bool:

    app: core.Application = core.Application.get()
    measMgr: core.MeasureManager = app.measureManager

    def get_min_distance(ent, pnt) -> float:
        return measMgr.measureMinimumDistance(ent, pnt).value

    return not get_min_distance(body, point) > 0

結果はこちらです。

True
False

分からないと思いますが、判断出来ています。
この方法だと、面上の点は・・・内側扱いです。

と、ここまで書いて気が付きました。
これじゃ穴か軸かを判断出来ない。