C#ATIA

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

ボディのクローンを大量に作る

テスト用のデータをその都度チマチマ作るのが辛くなり、
スクリプトで作る事にしました。

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

def run(context):
    ui = adsk.core.UserInterface.cast(None)
    try:
        app :adsk.fusion.Application = adsk.core.Application.get()
        ui = app.userInterface

        msg :str = 'Select'
        selFiltter :str = 'Bodies'
        sel :adsk.core.Selection = selectEnt(msg ,selFiltter)
        if not sel: return

        body :adsk.fusion.BRepBody = sel.entity

        # ここ変える
        cloneRandom(body, 100)

        app.activeViewport.fit()

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

def cloneRandom(
    body :adsk.fusion.BRepBody,
    count : int = 10,
    minPos = -1000,
    maxPos = 1000,):


    def getRandomMatrix3D(
        ) -> adsk.core.Matrix3D:

        Vec3D = adsk.core.Vector3D
        ary = [random.randint(minPos, maxPos) for _ in range(3)]
        vecDmy :adsk.core.Vector3D = Vec3D.create(
            ary[0]*0.1, ary[1]*0.1, ary[2]*0.1)

        ary = [random.randint(minPos, maxPos) for _ in range(3)]
        vecX :adsk.core.Vector3D = Vec3D.create(
            ary[0]*0.1, ary[1]*0.1, ary[2]*0.1)
        vecX.normalize()

        vecY :adsk.core.Vector3D = vecX.crossProduct(vecDmy)
        vecY.normalize()

        vecZ :adsk.core.Vector3D = vecX.crossProduct(vecY)
        vecZ.normalize()

        ary = [random.randint(minPos, maxPos) for _ in range(3)]
        pnt :adsk.core.Point3D = adsk.core.Point3D.create(
            ary[0]*0.1, ary[1]*0.1, ary[2]*0.1)

        mat :adsk.core.Matrix3D = adsk.core.Matrix3D.create()
        mat.setWithCoordinateSystem(pnt, vecX, vecY, vecZ)

        return mat

    # ********
    mats = [getRandomMatrix3D() for _ in range(count)]

    tmpMgr :adsk.fusion.TemporaryBRepManager = adsk.fusion.TemporaryBRepManager.get()
    clones = []
    for mat in mats:
        pass
        clone = tmpMgr.copy(body)
        tmpMgr.transform(clone, mat)
        clones.append(clone)

    comp :adsk.fusion.Component = body.parentComponent
    bodies :adsk.fusion.BRepBodies = comp.bRepBodies
    baseFeats = comp.features.baseFeatures
    baseFeat = baseFeats.add()
    baseFeat.startEdit()
    for clone in clones:
        bodies.add(clone,baseFeat)
    baseFeat.finishEdit()

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

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

スクリプト実行後、ボディを選択すると
f:id:kandennti:20210621124200p:plain
ドーンと100個、ランダムな位置・向きでコピペします。

何も考えていないので、こんな感じで干渉するものも
出来ます。(テストで使用する分には問題無いです)
f:id:kandennti:20210621124412p:plain