Manipulating a component's origin

Manipulating a component's origin

Anonymous
Not applicable
999 Views
2 Replies
Message 1 of 3

Manipulating a component's origin

Anonymous
Not applicable

is there a way to translate and rotate an orgin of a component using the python API.

I have code to reorient the coordinate system of an occurance but it doesn't seem to do anything to the actual component:

 

def translateToNewOrigin(root, newOrigin, newZaxis):
        zAxis = newZaxis
        (x,y,z)= axes(zAxis)
        xAxis = adsk.core.Vector3D.create(x[0],x[1],x[2])
        yAxis = adsk.core.Vector3D.create(y[0],y[1],y[2])
        zAxis = adsk.core.Vector3D.create(z[0],z[1],z[2])
#        reportMessageBox("Axes: \nx:{}\ny:{}\nz:{}",(x,y,z))
        for occurrence in design.rootComponent.allOccurrencesByComponent(root):
    #        reportMessageBox("occurance: {}", (occurrence.component.name))
            # Get the current transform of the occurrence
            transform = occurrence.transform
    #        reportMessageBox("transform: {}", (transform.asArray()))
            coordinateSystem = transform.getAsCoordinateSystem()
    #        reportMessageBox("system: {}, {}, {},{};", coordinateSystem)
            transform.setToAlignCoordinateSystems(coordinateSystem[0],coordinateSystem[1],coordinateSystem[2],coordinateSystem[3],newOrigin,xAxis,yAxis,zAxis)
    #        reportMessageBox("new Transform: {}", (transform.asArray()))
            # Set the tranform data back to the occurrence 
            occurrence.transform = transform
    #        reportMessageBox("result: {}", (self.design.rootComponent.allOccurrencesByComponent(self.RWOH).item(0).transform.asArray()))
0 Likes
1,000 Views
2 Replies
Replies (2)
Message 2 of 3

ekinsb
Alumni
Alumni

I didn't follow how you intend to define your new coordinate system.  Just the origin and Z axis isn't enough because the part can still spin around the Z axis.  Moving an occurrence is certainly possible.  Below is a variation of your program that just uses a point to define the new origin.

 

def testTranslate():
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        
        design = app.activeProduct
        rootComp = adsk.fusion.Component.cast(design.rootComponent)
        
        newOrigin = adsk.core.Point3D.create(1,1,1)
        translateToNewOrigin(design, newOrigin)
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


def translateToNewOrigin(design, newOrigin):
    root = adsk.fusion.Component.cast(design.rootComponent)
    
    # Iterate through the occurrences in the root component.
    for occurrence in root.occurrences:
        # Get the current transform of the occurrence.
        trans = adsk.core.Matrix3D.cast(occurrence.transform)
        
        # Change the translation portion of the matrix to account for the new origin.
        trans.translation = newOrigin.asVector()

        # Set the transform of the occurrence.
        occurrence.transform = trans

    # Snapshot the changes.
    root.parentDesign.snapshots.add()

Brian Ekins
Inventor and Fusion 360 API Expert
Mod the Machine blog
0 Likes
Message 3 of 3

AagAag
Advocate
Advocate

I have read many times that the Fusion GUI does not allow any manipulation of a component's origin. Does your post mean that you can override this limitation by directly manipulating a component's origin programmatically through the Python interface? Does the Python interface, therefore, expose functionalities that are hidden from the GUI?

0 Likes