C#ATIA

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

カスタムグラフィックのサンプル

カスタムグラフィックのサンプルを作ってみました。

スクリプト実行後ボディをクリックすると、ボディが破壊されます・・・。
実際のボディは非表示にしているだけなので、問題無いです。

#Fusion360API Python script
#Author-kantoku
#Description-カスタムグラフィックスサンプル

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app  :adsk.core.Application = adsk.core.Application.get()
        ui   :adsk.core.UserInterface = app.userInterface
        des  :adsk.fusion.Design = app.activeProduct
        root :adsk.fusion.Component = des.rootComponent

        msg :str = 'Select Body'
        selFiltter :str = 'Bodies'
        sel :adsk.core.Selection = selectEnt(ui, msg ,selFiltter)
        if not sel: return
        body :adsk.fusion.BRepBody = sel.entity
        
        adsk.fusion.BRepFace.getCG = getCG
        adsk.fusion.BRepFace.getMat = getMat
        cgs :adsk.fusion.CustomGraphicsGroups = root.customGraphicsGroups
        cg_mat = [(f.getCG(cgs), f.getMat()) for f in body.faces]

        body.isLightBulbOn = False
        ui.activeSelections.clear()
        for i in range(10):
            for cg, mats in cg_mat:
                cg.transform = mats[i]
            app.activeViewport.refresh()
            adsk.doEvents()

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

def getCG(
    self :adsk.fusion.BRepFace,
    cgs :adsk.fusion.CustomGraphicsGroups):

    cg = cgs.add()
    mesh = self.meshManager.displayMeshes.bestMesh
    cgCoords = adsk.fusion.CustomGraphicsCoordinates
    coords = cgCoords.create(mesh.nodeCoordinatesAsDouble)
    cgMesh = cg.addMesh(coords, mesh.nodeIndices, 
        mesh.normalVectorsAsDouble, mesh.nodeIndices)
    return cgMesh


def getMat(
    self :adsk.fusion.BRepFace):

    body :adsk.fusion.BRepBody = self.body
    cog :adsk.core.point3D = body.physicalProperties.centerOfMass
    vec :adsk.core.Vector3D = cog.vectorTo(self.pointOnFace)
    vec.normalize()
    move = adsk.core.Vector3D.create()
    mat :adsk.core.Matrix3D = adsk.core.Matrix3D.create()
    mats = []
    for i in range(10):
        move.add(vec)
        mat.translation = move
        mats.append(mat.copy())
    return mats

def selectEnt(
        ui :adsk.core.UserInterface,
        msg :str, 
        filtterStr :str) -> adsk.core.Selection:

    try:
        sel = ui.selectEntity(msg, filtterStr)
        return sel
    except:
        return None

正直なところ想像していたより、処理が重かったです。
それ以上に思ったより面白くない。


今回動画を、こちらで紹介しているサイトのサービスを利用してみました。
はてなブログにMP4動画を超簡単にアップロード投稿する方法を紹介します - イーサモンとディセントラランドで一緒に歩くんだZ!
確かにお手軽です。