テスト用のデータをその都度チマチマ作るのが辛くなり、
スクリプトで作る事にしました。
# 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
スクリプト実行後、ボディを選択すると
ドーンと100個、ランダムな位置・向きでコピペします。
何も考えていないので、こんな感じで干渉するものも
出来ます。(テストで使用する分には問題無いです)