Python Bounding Box Error

Python Bounding Box Error

isocam
Collaborator Collaborator
819 Views
1 Reply
Message 1 of 2

Python Bounding Box Error

isocam
Collaborator
Collaborator

Can anybody help?

 

Can somebody try the following to see if it is the script fault or the fault of Fusion 360?

 

Please create a simple rectangle sketch 100mm x 50mm and extrude it by 10mm

 

Obviously, if you run the following script, you should get 100mm x 50mm x 10mm

 

Here is my script:

 

import traceback
import adsk.fusion
import adsk.core

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

comp: adsk.fusion.Component = des.activeComponent

bBox: adsk.core.BoundingBox3D = comp.boundingBox

maxPnt: adsk.core.Point3D = bBox.maxPoint

minPnt: adsk.core.Point3D = bBox.minPoint

length = abs(maxPnt.x - minPnt.x)

width = abs(maxPnt.y - minPnt.y)

height = abs(maxPnt.z - minPnt.z)

unitsMgr: adsk.core.UnitsManager = des.unitsManager

defLenUnit = unitsMgr.defaultLengthUnits

ratio = unitsMgr.convert(1, unitsMgr.internalUnits, defLenUnit)

msg = [
f'length : {length * ratio} {defLenUnit}',
f'width : {width * ratio} {defLenUnit}',
f'height : {height * ratio} {defLenUnit}',
]

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

 

I am getting a 0.02 increase on all dimensions.

 

Can I please ask if anybody else is getting the same error?

 

Many thanks in advance!

 

Darren

Accepted solutions (1)
820 Views
1 Reply
Reply (1)
Message 2 of 2

kandennti
Mentor
Mentor
Accepted solution

Hi @isocam .

 

The Bounding property is not very accurate.

https://forums.autodesk.com/t5/fusion-360-api-and-scripts/non-minimum-profile-boundingbox-is-it-a-bu... 

 

For more accurate results, it is better to use MeasureManager.getOrientedBoundingBox method.

https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-DE730595-9235-4DA1-8096-22A058921819 

 

I tried this method, but it is not supported for Component.
Therefore, I created a sample that processes all BRepBodies in a Component.

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core

def run(context):
    ui = adsk.core.UserInterface.cast(None)
    try:
        app: adsk.fusion.Application = adsk.core.Application.get()
        ui = app.userInterface
        des: adsk.fusion.Design = app.activeProduct
        comp: adsk.fusion.Component = des.activeComponent

        # get OrientedBoundingBox
        measMgr: adsk.core.MeasureManager = app.measureManager
        OrientedBBoies = []
        for body in comp.bRepBodies:
            OrientedBBoies.append(
                measMgr.getOrientedBoundingBox(
                    body,
                    comp.yConstructionAxis.geometry.direction,
                    comp.xConstructionAxis.geometry.direction
                )
            )

        # get Temporary BRepBody
        tmpMgr: adsk.fusion.TemporaryBRepManager = adsk.fusion.TemporaryBRepManager.get()
        tmpBodies = []
        for bBox in OrientedBBoies:
            tmpBodies .append(
                tmpMgr.createBox(bBox)
            )

        # get UnionBody
        unionBody: adsk.fusion.BRepBody = tmpBodies[0]
        if len(tmpBodies) > 1:
            for body in tmpBodies[1:]:
                tmpMgr.booleanOperation(
                    unionBody,
                    body,
                    adsk.fusion.BooleanTypes.UnionBooleanType
                )

        # get UnionBody-OrientedBoundingBox
        OrientedBBox: adsk.core.OrientedBoundingBox3D = measMgr.getOrientedBoundingBox(
            unionBody,
            comp.yConstructionAxis.geometry.direction,
            comp.xConstructionAxis.geometry.direction
        )

        unitsMgr: adsk.core.UnitsManager = des.unitsManager
        defLenUnit = unitsMgr.defaultLengthUnits
        ratio = unitsMgr.convert(1, unitsMgr.internalUnits, defLenUnit)

        msg = [
            f'length : {OrientedBBox.length * ratio} {defLenUnit}',
            f'width : {OrientedBBox.width * ratio} {defLenUnit}',
            f'height : {OrientedBBox.height * ratio} {defLenUnit}',
        ]

        ui.messageBox('\n'.join(msg))

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

 

 

Also, the indentation of the code is maintained when this is used.

1.png