C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)※記載されている内容は個人の意見であり、所属する団体等を代表する意見では御座いません・・・・よ!

逆の法線を持つ平面を作成する

フォーラムのこちらを回答しました。
https://forums.autodesk.com/t5/fusion-api-and-scripts-forum/inversion-of-the-normal-of-a-construction-plane/td-p/13915918
法線が逆になる平面の必要性がちょっと分からないのですが、
恐らく直接この平面を作成する方法は無いような気がしています。

完全にパラメトリックな平面の作成は難しいのですが(遠回りすれば出来そう)
パラメトリックモードを保ったまま、逆法線の平面を作り出すことは比較的簡単です。

あちらに投げたコードのままでは使い勝手が悪いため、平面を選択出来るようにしてみました。

# 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

        # select
        msg: str = "Select Plane"
        selFilter: str = core.SelectionCommandInput.ConstructionPlanes
        sel: core.Selection = select_ent(msg, selFilter)
        if not sel:
            return

        # target plane
        targetPlane: fusion.ConstructionPlane = sel.entity

        # geometry
        origin: core.Point3D = targetPlane.geometry.origin
        vecU: core.Vector3D = targetPlane.geometry.uDirection
        vecV: core.Vector3D = targetPlane.geometry.vDirection
        vecV.scaleBy(-1)

        # size
        displayBounds: core.BoundingBox2D = targetPlane.displayBounds
        minP: core.Point2D = displayBounds.minPoint.copy()
        maxP: core.Point2D = displayBounds.maxPoint.copy()
        minP.y = -minP.y
        maxP.y = -maxP.y      
        reverseBounds: core.BoundingBox2D = core.BoundingBox2D.create(minP, maxP)
        reverseBounds.expand(minP)
        reverseBounds.expand(maxP)
    
        # create new plane
        reversedPlane: core.Plane = core.Plane.createUsingDirections(
            origin,
            vecU,
            vecV
        )

        # add plane
        planes: fusion.ConstructionPlanes = targetPlane.parent.constructionPlanes
        baseFeat: fusion.BaseFeature = None
        if des.designType == fusion.DesignTypes.ParametricDesignType:
            baseFeat = root.features.baseFeatures.add()

        reversed: fusion.ConstructionPlane = None
        if baseFeat:
            try:
                baseFeat.startEdit()
                ipt: fusion.ConstructionPlaneInput = planes.createInput()
                ipt.setByPlane(reversedPlane)
                reversed = planes.add(ipt)
            except Exception:
                None
            finally:
                baseFeat.finishEdit()
        else:
            ipt: fusion.ConstructionPlaneInput = planes.createInput()
            ipt.setByPlane(reversedPlane)
            reversed = planes.add(ipt)

        reversed.displayBounds = reverseBounds

    except:
        if ui:
            ui.messageBox("Failed:\n{}".format(traceback.format_exc()))


def select_ent(
    msg: str,
    filter: str
) -> core.Selection:

    try:
        app: core.Application = core.Application.get()
        ui: core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filter)
        return sel
    except:
        return None

基準フィーチャで平面を作成しているので、元の平面を変更してしまうと一致しないものとなります。

見た目を同じようにするためdisplayBoundsも反転させていますが、原点の平面は違っちゃいますね・・・。

これは原点がズームサイズに影響を受けないように表示されているので、カスタムグラフィックスの
ナンやカンやの影響だと思うので仕方ありません・・・。

もう一つ、パラメトリックモードで基準フィーチャを作成すると(正確にはエディットモードを抜けると)
こちらの"ボディ"を非表示にしても表示されてしまいます。

"ん、バグじゃない?" と思ったのですが、手作業でもこちらの警告が出るので仕様なんですね。

仕様とは言え面白くないですね。何とかしたい。