こちらの続きです。
無限直線と面の交差した座標の取得 - C#ATIA
まず、こんなボディを作ります。底面の中心が原点です。
前回のコードを修正しました。
#FusionAPI_python #Author-kantoku #Description-無限直線と選択面の交差テスト import adsk.core, adsk.fusion, traceback _app = adsk.core.Application.get() _ui = _app.userInterface def run(context): try: #面の選択 selFilters = 'Faces' sel = _ui.selectEntity('面を選択/ESC-中止', selFilters) if sel is None: return brep = sel.entity surf = adsk.core.Surface.cast(brep.geometry) #交点座標 GetIntersectPosition(surf, [0,0,0], [0,0,10.0]) GetIntersectPosition(surf, [500,0,0], [500,0,10.0]) GetIntersectPosition(surf, [0,0,0], [0,500,0]) except: if _ui: _ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) def GetIntersectPosition(plane, start, end): try: #直線 st_pnt = adsk.core.Point3D.create(start[0]*0.1, start[1]*0.1, start[2]*0.1) ed_pnt = adsk.core.Point3D.create(end[0]*0.1, end[1]*0.1, end[2]*0.1) line = adsk.core.Line3D.create(st_pnt, ed_pnt).asInfiniteLine() lst = line.intersectWithSurface(plane) if lst.count > 0 : pnt3d = lst[0] msg = 'x:{:.3f} y:{:.3f} z:{:.3f}'.format(pnt3d.x*10, pnt3d.y*10, pnt3d.z*10) else: msg = '交差しません' _ui.messageBox(msg) except: if _ui: _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
本来、単位に関してはunitsManagerで行うのがFusion360APIのお作法ですが
そこが重要なのではないのでムリムリにやってます。
スプリクト実行後、選択した面と
1)[0,0,0], [0,0,10.0]
2)[500,0,0], [500,0,10.0]
3)[0,0,0], [0,500,0]
をそれぞれ通過する無限直線との座標値を表示させます。
今回は、ボディの天面を選択してみます。
結果としては、
左から、1)2)3)です。
1)は正しい値です。3)も交差しないので正しいです。
問題は2)なんです。天面とはかけ離れた位置を表示します。
原因は単純で、面側の情報が無限平面となってしまっているからです。
brep = sel.entity #←選択した面のエンティティを取得(BRepFace型) surf = adsk.core.Surface.cast(brep.geometry)#←BRepFaceのジオメトリを取得
surfをキャストしてもしなくても、Plane型でした。
名称からしていかにも無限平面っぽいです。
これぐらい単純な面と線であれば、何かしら計算すれば境界内に入っているか?
どうか? を判断できますが、傾いていた場合は・・・と言うところで
悩んでます。
点がサーフェス上に存在しているかどうかを判断出来れば良いのですが・・・。