C#ATIA

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

ボディを破壊する1

Fusionの11月のUpdateで、カスタムグラフィックがかなり軽くなったとの記載です。

と言っても古いバージョンに切り替える事も出来ないので比較が出来ません。

そこで以前作った際に動作が重くて使い物にならなかったものでテストしてみようと
思ったのですが、生憎コードを紛失(いつもの事です・・)したので、
”確かこんな処理をしていたような気がする”
と言った感じで再作成してみました。

スクリプト実行後ダイアログが表示されるので、選択すると面毎にバラバラにして
ふっとばします!

# Author-
# Description-
# Fusion360API Python script

import traceback
# import adsk.cam
# import fusion
# import core
import adsk
import adsk.core as core
import adsk.fusion as fusion
import time


_app: core.Application = None
_ui: core.UserInterface = None
_des: fusion.Design = None
_handlers = []

_selIpt: core.SelectionCommandInput = None

CMD_INFO = {
    'id': 'kantoku_test',
    'name': 'test',
    'tooltip': 'test'
}

class MyCommandCreatedHandler(core.CommandCreatedEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: core.CommandCreatedEventArgs):
        core.Application.get().log(args.firingEvent.name)
        try:
            global _handlers
            cmd: core.Command = core.Command.cast(args.command)
            cmd.isOKButtonVisible =False

            inputs: core.CommandInputs = cmd.commandInputs

            onDestroy = MyCommandDestroyHandler()
            cmd.destroy.add(onDestroy)
            _handlers.append(onDestroy)

            onExecute = MyExecuteHandler()
            cmd.execute.add(onExecute)
            _handlers.append(onExecute)

            onExecutePreview = MyExecutePreviewHandler()
            cmd.executePreview.add(onExecutePreview)
            _handlers.append(onExecutePreview)

            global _selIpt
            _selIpt = inputs.addSelectionInput(
                "_selIptId",
                "Body",
                "Select Body"
            )
            _selIpt.addSelectionFilter(
                core.SelectionCommandInput.Bodies
            )

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


class MyExecutePreviewHandler(core.CommandEventHandler):
    def __init__(self):
        super().__init__()
    def notify(self, args: core.CommandEventArgs):
        None
        global _selIpt
        if _selIpt.selectionCount < 1:
            return
        
        body: fusion.BRepBody = _selIpt.selection(0).entity
        body.isLightBulbOn = False
        _selIpt.clearSelection()

        cog: core.Point3D = body.getPhysicalProperties().centerOfMass

        tmpMgr: fusion.TemporaryBRepManager = fusion.TemporaryBRepManager.get()

        facesContaner: list = []

        face: fusion.BRepFace = None
        for face in body.faces:
            p: core.Point3D = face.centroid
            vec: core.Vector3D = cog.vectorTo(p)
            vec.normalize
            facesContaner.append(
                {
                    "face": tmpMgr.copy(face),
                    "vec": vec,
                }
            )


        global _des
        root: fusion.Component = _des.rootComponent

        count = 15
        for idx in range(1,count):
            cgGroup: fusion.CustomGraphicsGroup = root.customGraphicsGroups.add()
            for faceDict in facesContaner:
                # clone: fusion.BRepBody = tmpMgr.copy(faceDict["face"])
                clone: fusion.BRepBody = faceDict["face"]
                v: core.Vector3D = faceDict["vec"].copy()
                v.scaleBy(idx*0.2)

                mat: core.Matrix3D = core.Matrix3D.create()
                mat.translation = v

                tmpMgr.transform(clone, mat)

                cgBody: fusion.CustomGraphicsBRepBody = cgGroup.addBRepBody(clone)
                # cgFaces.append(cgGroup.addBRepBody(clone))

            adsk.doEvents()
            _app.activeViewport.refresh()
            time.sleep(0.05)
            
            
            if idx != (count-1):
                cgGroup.deleteMe()
        

class MyExecuteHandler(core.CommandEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: core.CommandEventArgs):
        core.Application.get().log(args.firingEvent.name)


class MyCommandDestroyHandler(core.CommandEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: core.CommandEventArgs):
        core.Application.get().log(args.firingEvent.name)
        adsk.terminate()


def run(context):
    try:
        global _app, _ui, _des
        _app = core.Application.get()
        _ui = _app.userInterface
        _des = _app.activeProduct

        cmdDef: core.CommandDefinition = _ui.commandDefinitions.itemById(
            CMD_INFO['id']
        )

        if not cmdDef:
            cmdDef = _ui.commandDefinitions.addButtonDefinition(
                CMD_INFO['id'],
                CMD_INFO['name'],
                CMD_INFO['tooltip']
            )

        global _handlers
        onCommandCreated = MyCommandCreatedHandler()
        cmdDef.commandCreated.add(onCommandCreated)
        _handlers.append(onCommandCreated)

        cmdDef.execute()

        adsk.autoTerminate(False)

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

動画を撮ったのですが、再生出来ず・・・・

こんな感じのデータです。

ボディを選択すると

と言った具合に、コマ送りで面をバラバラにしちゃいます。
(キャンセルボタンを押すと元に戻ります)

絶対に役に立たないからね。