C#ATIA

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

穴テンプレートのトーラスを考える2

こちらの続きです。
穴テンプレートのトーラスを考える1 - C#ATIA

取りあえず、現状の理解の下に確認スクリプトを作成しました。
トーラス(R面取り等)を選択すると、それっぽい情報を出力します。

# 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 = 'ToroidalFaces'
        sel: core.Selection = select_ent(msg, selFilter)
        if not sel:
            return

        face: fusion.BRepFace = sel.entity
        eva: core.SurfaceEvaluator = face.evaluator
        prmBox: core.BoundingBox2D = eva.parametricRange()
        midPrm: core.Point2D = core.Point2D.create(
            (prmBox.minPoint.x + prmBox.maxPoint.x) * 0.5,
            (prmBox.minPoint.y + prmBox.maxPoint.y) * 0.5,
        )

        for isU in (True, False):
            arc: core.Arc3D = core.Arc3D.cast(
                eva.getIsoCurve(midPrm.x, isU)[0]
            )
            if arc: break

        if not arc: return

        torus: core.Torus = face.geometry
        _, origin, _, _, _ = torus.getData()

        vec: core.Vector3D = arc.center.vectorTo(origin)
        startVec: core.Vector3D = arc.center.vectorTo(arc.startPoint)
        endVec: core.Vector3D = arc.center.vectorTo(arc.endPoint)
        app.log(
            f"bottomAngle:{vec.angleTo(startVec)} / topAngle:{vec.angleTo(endVec)}"
        )

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


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

"bottomAngle"と"topAngle"はプロファイルの円弧の始点終点で
処理させていますが、正しいかどうかは分かっていません。
そして、"sweepAngle"は取りあえず無視。

実際に試すと

凸形状ですが、出力される桁数が異なるものの取りあえず
正しそうです。
(理想は bottomAngle="-0.000000" topAngle="1.570796")

しかし、凹形状は正しくないです。

(理想は bottomAngle="4.712389" topAngle="3.141593")

何となく原因は、
・円弧の始点終点では無く、穴の軸方向を元に三次元座標の上下で
 判断する必要がありそう。
・Vector3D.angleToメソッドで角度を求めているが、ひょっとしたら
 180°以上が駄目なのかも(未確認)
では無いかな? とは思ってます。結構面倒だな・・・。