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()))
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()
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?