こちらの続きです。
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
分からないと思いますが、判断出来ています。
この方法だと、面上の点は・・・内側扱いです。
と、ここまで書いて気が付きました。
これじゃ穴か軸かを判断出来ない。