Code:
import adsk.core, adsk.fusion, tracebackui = None
def run(context):
try:
global ui
app = adsk.core.Application.get()
ui = app.userInterface
design = adsk.fusion.Design.cast(app.activeProduct)
rootComp = design.rootComponent
sketches = rootComp.sketches
plane = rootComp.xZConstructionPlane #.xYConstructionPlane
sketch = sketches.add(plane)
sketchCircles = sketch.sketchCurves.sketchCircles
centerPoint = adsk.core.Point3D.create(0, 0, 0)
sketchCircles.addByCenterRadius(centerPoint, 10.0)
centerPoint = adsk.core.Point3D.create(10, 0, 0)
sketchCircles.addByCenterRadius(centerPoint, 10.0)
boundingBoxesSketch = sketches.add(plane)
for profile in sketch.profiles:
bound = getPreciseBoundingBox3D(profile)
boundingBoxesSketch.sketchCurves.sketchLines.addTwoPointRectangle(bound.minPoint, bound.maxPoint)
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def getPreciseBoundingBox3D(
profile :adsk.fusion.Profile
) -> adsk.core.BoundingBox3D:
# get sketch
skt :adsk.fusion.Sketch = profile.parentSketch
sktMat :adsk.core.Matrix3D = skt.transform
# get WireBody
loop :adsk.fusion.ProfileLoop = profile.profileLoops[0]
crvs = [pc.geometry for pc in loop.profileCurves]
if not sktMat.isEqualTo(adsk.core.Matrix3D.create()):
for crv in crvs:
crv.transformBy(sktMat)
tmpMgr = adsk.fusion.TemporaryBRepManager.get()
wireBody, _ = tmpMgr.createWireFromCurves(crvs)
# get OrientedBoundingBox3D
vecX :adsk.core.Vector3D = skt.xDirection
vecY :adsk.core.Vector3D = skt.yDirection
app = adsk.core.Application.get()
measureMgr :adsk.core.MeasureManager = app.measureManager
orientedBox :adsk.core.OrientedBoundingBox3D = measureMgr.getOrientedBoundingBox(
wireBody, vecY, vecX)
halfX = orientedBox.width * 0.5
halfY = orientedBox.length * 0.5
halfZ = orientedBox.height * 0.5
vec3D = adsk.core.Vector3D
maxPnt :adsk.core.Point3D = orientedBox.centerPoint.copy()
maxPnt.translateBy(vec3D.create(halfX, halfY, halfZ))
minPnt :adsk.core.Point3D = orientedBox.centerPoint.copy()
minPnt.translateBy(vec3D.create(-halfX, -halfY, -halfZ))
return adsk.core.BoundingBox3D.create(minPnt, maxPnt)