@andreas.pedersen8EDUH .
We created a sample to compare.
I didn't know how to do the splitting using TemporaryBRepManager, so I used the booleanOperation method.
The result of my test was that TemporaryBRepManager was faster to process.
I feel that the reason for the slowness is the fact that Component.bRepBodies.add needs to be done twice when using the analyzeInterference method.
# Fusion360API Python script
import traceback
import adsk.fusion
import adsk.core
import time
def run(context):
ui = adsk.core.UserInterface.cast(None)
try:
app: adsk.core.Application = adsk.core.Application.get()
ui = app.userInterface
des: adsk.fusion.Design = app.activeProduct
msg: str = 'Select Solid Body'
selFiltter: str = 'SolidBodies'
sel: adsk.core.Selection = selectEnt(msg, selFiltter)
if not sel:
return
targetBody:adsk.fusion.BRepBody = sel.entity
des.designType = adsk.fusion.DesignTypes.ParametricDesignType
# start test
app.log(' -- test start --')
t = time.time()
# Please switch between test1 and test2 to execute.
test1(targetBody) # Design.analyzeInterference
# test2(targetBody) # TemporaryBRepManager.booleanOperation
app.log(f'done: {time.time() - t} s')
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def selectEnt(
msg: str,
filterStr: str) -> adsk.core.Selection:
try:
app = adsk.core.Application.get()
ui = app.userInterface
sel = ui.selectEntity(msg, filterStr)
return sel
except:
return None
# TemporaryBRepManager.booleanOperation Method
# https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-F845AD0E-D25F-4FDD-B31B-3E6DFC5A8A9B
def test2(
targetBody: adsk.fusion.BRepBody,
step: float = 1):
app: adsk.core.Application = adsk.core.Application.get()
measMgr: adsk.core.MeasureManager = app.measureManager
oriBBox: adsk.core.OrientedBoundingBox3D = measMgr.getOrientedBoundingBox(
targetBody,
adsk.core.Vector3D.create(1, 0, 0),
adsk.core.Vector3D.create(0, 1, 0),
)
minZ = oriBBox.centerPoint.z - oriBBox.height * 0.5
halfStep = step * 0.5
count = int((oriBBox.height // step) + 1)
baseBBox: adsk.core.OrientedBoundingBox3D = oriBBox.copy()
baseBBox.centerPoint = adsk.core.Point3D.create(
oriBBox.centerPoint.x,
oriBBox.centerPoint.y,
minZ + halfStep
)
baseBBox.height = step
tempMgr: adsk.fusion.TemporaryBRepManager = adsk.fusion.TemporaryBRepManager.get()
tempBodies = []
for idx in range(count):
bBox: adsk.core.OrientedBoundingBox3D = baseBBox.copy()
pnt: adsk.core.Point3D = bBox.centerPoint.copy()
pnt.z = minZ + halfStep + (step * idx)
bBox.centerPoint = pnt
tempBodies.append(tempMgr.createBox(bBox))
# -- Same process until this part --
resBodies = []
for tempBody in tempBodies:
clone: adsk.fusion.BRepBody = tempMgr.copy(targetBody)
tempMgr.booleanOperation(
clone,
tempBody,
adsk.fusion.BooleanTypes.IntersectionBooleanType
)
resBodies.append(clone)
comp: adsk.fusion.Component = targetBody.parentComponent
bodies: adsk.fusion.BRepBodies = comp.bRepBodies
resBaseFeat: adsk.fusion.BaseFeature = comp.features.baseFeatures.add()
resBaseFeat.startEdit()
try:
for body in resBodies:
bodies.add(
body,
resBaseFeat
)
except:
pass
finally:
resBaseFeat.finishEdit()
app.log(f' bodies count: {resBaseFeat.bodies.count}')
# Design.analyzeInterference Method
# https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-7B17A057-49A7-4332-ACD1-F6FA4EA84C88
def test1(
targetBody: adsk.fusion.BRepBody,
step: float = 1):
app: adsk.core.Application = adsk.core.Application.get()
measMgr: adsk.core.MeasureManager = app.measureManager
oriBBox: adsk.core.OrientedBoundingBox3D = measMgr.getOrientedBoundingBox(
targetBody,
adsk.core.Vector3D.create(1, 0, 0),
adsk.core.Vector3D.create(0, 1, 0),
)
minZ = oriBBox.centerPoint.z - oriBBox.height * 0.5
halfStep = step * 0.5
count = int((oriBBox.height // step) + 1)
baseBBox: adsk.core.OrientedBoundingBox3D = oriBBox.copy()
baseBBox.centerPoint = adsk.core.Point3D.create(
oriBBox.centerPoint.x,
oriBBox.centerPoint.y,
minZ + halfStep
)
baseBBox.height = step
tempMgr: adsk.fusion.TemporaryBRepManager = adsk.fusion.TemporaryBRepManager.get()
tempBodies = []
for idx in range(count):
bBox: adsk.core.OrientedBoundingBox3D = baseBBox.copy()
pnt: adsk.core.Point3D = bBox.centerPoint.copy()
pnt.z = minZ + halfStep + (step * idx)
bBox.centerPoint = pnt
tempBodies.append(tempMgr.createBox(bBox))
# -- Same process until this part --
comp: adsk.fusion.Component = targetBody.parentComponent
bodies: adsk.fusion.BRepBodies = comp.bRepBodies
bodyObjs: adsk.core.ObjectCollection = adsk.core.ObjectCollection.create()
bodyObjs.add(targetBody)
toolBaseFeat: adsk.fusion.BaseFeature = comp.features.baseFeatures.add()
toolBaseFeat.startEdit()
try:
for body in tempBodies:
bodyObjs.add(
bodies.add(
body,
toolBaseFeat
)
)
except:
pass
finally:
toolBaseFeat.finishEdit()
des: adsk.fusion.Design = app.activeProduct
interferanceResults: adsk.fusion.InterferenceResults = des.analyzeInterference(
des.createInterferenceInput(bodyObjs)
)
interBodies = []
res: adsk.fusion.InterferenceResult
for res in interferanceResults:
interBodies.append(res.interferenceBody)
resBaseFeat: adsk.fusion.BaseFeature = comp.features.baseFeatures.add()
resBaseFeat.startEdit()
try:
for body in interBodies:
bodies.add(
body,
resBaseFeat
)
except:
pass
finally:
resBaseFeat.finishEdit()
# resBaseFeat.bodies.count <- 0
app.log(f' bodies count: {len(interBodies)}')
toolBaseFeat.deleteMe()