C#ATIA

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

平面と同等のカスタムグラフィックを表示する

Fusion360APIです。

平面を強調表示するためにカスタムグラフィックを利用したいです。

今までカスタムグラフィックはボディや面、スケッチの要素はあるの
ですが、平面は行ったことがありません。
CATIAと違って、Fusion360の平面は有限なんですよね。
違和感しかありません。

取りあえずこんな感じで出来ました。

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.fusion as fusion
import itertools

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

        constPlane: fusion.ConstructionPlane = root.constructionPlanes[0]

        points = get_plane_points(constPlane)

        coordArray = list(
            itertools.chain.from_iterable(
                [p.asArray() for p in points]
            )
        )
        coords = fusion.CustomGraphicsCoordinates.create(coordArray)

        vertexIndices = [0,1,2, 0,2,3]

        normal = constPlane.geometry.normal.asArray()
        normalIndices = [0,0,0, 0,0,0]

        cgGroup: fusion.CustomGraphicsGroup = root.customGraphicsGroups.add()
        meshPlane = cgGroup.addMesh(coords, vertexIndices, normal, normalIndices)

        meshPlane.color = fusion.CustomGraphicsSolidColorEffect.create(
            core.Color.create(255,0,0,127)
        )

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


def get_plane_points(
    plane: fusion.ConstructionPlane,
) -> list[core.Point3D]:

    geo: core.Plane = plane.geometry

    uVec: core.Vector3D = geo.uDirection
    uVec.normalize()

    vVec: core.Vector3D = geo.vDirection
    vVec.normalize()

    bBox: core.BoundingBox2D = plane.displayBounds
    xLst = [
        bBox.maxPoint.x,
        bBox.minPoint.x,
        bBox.minPoint.x,
        bBox.maxPoint.x,
    ]
    yLst = [
        bBox.maxPoint.y,
        bBox.maxPoint.y,
        bBox.minPoint.y,
        bBox.minPoint.y,
    ]

    vecLst = [uVec.copy() for _ in range(4)]
    [v.scaleBy(x) for v, x in zip(vecLst, xLst)]

    vVecLst = [vVec.copy() for _ in range(4)]
    [v.scaleBy(y) for v, y in zip(vVecLst, yLst)]

    [u.add(v) for u, v in zip(vecLst, vVecLst)]

    points = [geo.origin.copy() for _ in range(4)]

    [p.translateBy(v) for p, v in zip(points, vecLst)]

    return points

直接カスタムグラフィックとして表示する方法が無いと思う為、
二つの三角形を表示させました。
平面から境界となる4点を求めているのが、get_plane_points関数なの
ですが、もっと簡単な方法があるのかな・・・。