こちらの続きです。
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
恐らく、これで必要そうなテストは終わりです。
・・・面の接続関係はあるけど、後回しにしよう。
さぁ道具はそろった。後は形にしよう。