C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

無限直線と面の交差した座標の取得2

こちらの続きです。
無限直線と面の交差した座標の取得 - C#ATIA

まず、こんなボディを作ります。底面の中心が原点です。
f:id:kandennti:20180528190203p:plain

前回のコードを修正しました。

#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]
をそれぞれ通過する無限直線との座標値を表示させます。

今回は、ボディの天面を選択してみます。
結果としては、
f:id:kandennti:20180528190217p:plain
左から、1)2)3)です。
1)は正しい値です。3)も交差しないので正しいです。
問題は2)なんです。天面とはかけ離れた位置を表示します。
原因は単純で、面側の情報が無限平面となってしまっているからです。

        brep = sel.entity #←選択した面のエンティティを取得(BRepFace型)
        surf = adsk.core.Surface.cast(brep.geometry)#←BRepFaceのジオメトリを取得

surfをキャストしてもしなくても、Plane型でした。
f:id:kandennti:20180528190228p:plain
名称からしていかにも無限平面っぽいです。

これぐらい単純な面と線であれば、何かしら計算すれば境界内に入っているか?
どうか? を判断できますが、傾いていた場合は・・・と言うところで
悩んでます。
点がサーフェス上に存在しているかどうかを判断出来れば良いのですが・・・。