C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

上側の面を判断する1

こちらの内容の ”上側の面を判断” のみをちょっと考えてみました。
[API] Determining all the top faces of the design - Autodesk Community

4番目のレスはフォーラムの調子が悪く、画像の添付は出来ない
改行は無効になる で読みづらい上、伝わりきらないとは感じてます。

一応こんな感じです。

#Fusion360API Python script
import adsk.core, adsk.fusion, traceback

_app = adsk.core.Application.cast(None)
_ui = adsk.core.UserInterface.cast(None)

def run(context):
    try:
        global _app, _ui
        _app = adsk.core.Application.get()
        _ui = _app.userInterface
        des :adsk.fusion.Design = _app.activeProduct
        root :adsk.fusion.Component = des.rootComponent

        # 平らな面のみ取得
        planeSurface = adsk.core.SurfaceTypes.PlaneSurfaceType
        body :adsk.fusion.BRepBody = root.bRepBodies[0]
        faces = [f for f in body.faces if f.geometry.surfaceType == planeSurface]

        # 測定用Plane - このままじゃ測定に利用出来ない
        dist = 100000
        upVec = adsk.core.Vector3D.create(0,1,0) #上方向ベクトル - 単位ベクトルじゃなくてもOK
        upVec.normalize()
        upVec.scaleBy(dist)
        pnt3D = adsk.core.Point3D
        origin = pnt3D.create(0,0,0)
        origin.translateBy(upVec)
        plane = adsk.core.Plane.create(origin, upVec)

        # コンストラクション平面 - これも測定に使えない
        # planes = root.constructionPlanes
        # planeIpt = planes.createInput()
        # planeIpt.setByPlane(plane)
        # baseFeats = root.features.baseFeatures
        # baseFeat = baseFeats.add()
        # baseFeat.startEdit()
        # plane = planes.add(planeIpt)
        # baseFeat.finishEdit()

        # 上向きベクトルと直交する面のみ
        measureMgr :adsk.core.MeasureManager = _app.measureManager
        faces = [f for f in faces if measureMgr.measureAngle(plane, f).value < 0.001]     

        # 平面とサーフェスの最短距離測定が出来ない!!
        # ダミーのボックス作成
        tmpMgr = adsk.fusion.TemporaryBRepManager.get()
        bound = adsk.core.OrientedBoundingBox3D.create(
            origin,
            plane.vDirection,
            plane.uDirection,
            dist, dist, 1)
        box = tmpMgr.createBox(bound)

        baseFeats = root.features.baseFeatures
        baseFeat = baseFeats.add()
        baseFeat.startEdit()
        box = root.bRepBodies.add(box,baseFeat)
        baseFeat.finishEdit()

        # ダミーのボックスとサーフェスの最短距離測定
        faces_dist = []
        for f in faces:
            faces_dist.append([f,measureMgr.measureMinimumDistance(f, box).value,])
        baseFeat.deleteMe()

        # 一番近い面
        uprFace = min(faces_dist, key=(lambda x: x[1]))

        # 面選択
        _ui.activeSelections.clear()
        _ui.activeSelections.add(uprFace[0])

    except:
        if _ui:
            _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

イマイチなんです。

・平面-サーフェス最短距離が測れない。
 過去にも経験していました。
  スプリクトで2要素間の距離測定をしたい2 - C#ATIA
・上記の理由から、一時的にベースフューチャを作成し削除している。
・マイナス方向は正しく処理されていない。(原因は僕)

もっと清楚な方法があると思うんだけどなぁ。