こちらの続きです。
穴テンプレートのトーラスを考える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°以上が駄目なのかも(未確認)
では無いかな? とは思ってます。結構面倒だな・・・。