Tracking a moving body

Tracking a moving body

Anonymous
Not applicable
1,129 Views
5 Replies
Message 1 of 6

Tracking a moving body

Anonymous
Not applicable

Hello,

 

I am trying to figure out if there is a way to track (preferably draw a spline of where the body is moving) a moving body. I am currently running a script that allows the body to be moved, and want to draw out the path that the body is taking. Any help or direction is appreciated

 

Thanks

0 Likes
1,130 Views
5 Replies
Replies (5)
Message 2 of 6

ekinsb
Alumni
Alumni

What's causing the body to move?  Is the user using the Move feature or are you doing something through the API?  Is it really a body that's moving or is it an occurrence that the body is in?  It's difficult to understand what's really happening and what you want to do without more details.


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

Anonymous
Not applicable

I attached a video of my current model. the gears are rotating which is causing the links to move. I need to track that blue point on the end of the long link. What i need to try and do is create a spline of the path it is taking.

0 Likes
Message 4 of 6

Anonymous
Not applicable

Brian,

 

I am sorry for the multiple questions.  This is for a university project and we are new to fusion 360 and its api (but knowledgeable in python).  The image I attached shows what the hierarchy is.  Basically we need to query the xyz location of the object, either through position data or a 4x4 matrix.  I was looking for something like "root.body.itemByName" but I cant find a 'body' method.  Secondly, is there an example program that I am missing which shows this?  It seems like the example programs on the API list are all about modeling within python, but do not work back and forth between having something done already in the program and then modifying different parts of it using the API.

 

Thank you,

Justin

0 Likes
Message 5 of 6

ekinsb
Alumni
Alumni

Sorry for my slow reply.  I've been traveling and haven't had much time to tend the forum recently.

 

I started to write a description of how I would approach this but decided a sample is easier for both of us.  Below is a picture of the result.

MotionCurve.png

Below is the code that I used to accomplish the creation of the curve above.  It asks you to select a vertex and then uses hard-coded values to find a specific joint in the assembly but then it changes the angle of that joint and saves the current position of the vertex in a collection and finally uses those points to create the curve.  Of course it wouldn't have to be a vertex that you track but anything that can be used to infer a position.

 

Here's the code and I've attached the assembly that I used.  You'll see that the joint is actually in one of the sub-assemblies and the code would actually be a bit simpler if the joint is in the root component.

 

import adsk.core, adsk.fusion, traceback, math
        
def run(context):
    ui = None
    
    try:
        # Boilerplate code to access Fusion 360 instance.
        app = adsk.core.Application.get()
        ui  = app.userInterface

        product = app.activeProduct
        design = adsk.fusion.Design.cast(product)
        root = design.rootComponent

        # Get the joint called "Motor" in PistonAssembly:1
        # This gets the joint within the PistonAssembly component,
        # not in the context of the top-level assembly.
        pistonOcc = root.occurrences.itemByName('PistonAssembly:1')
        joint = pistonOcc.component.joints.itemByName('Motor')

        # We need the joint relative to root component so we 
        # need a proxy for the joint.
        joint = joint.createForAssemblyContext(pistonOcc)

        # Have the point to track selected.
        pointSel = ui.selectEntity('Select a vertex.', 'Vertices')
        vert = adsk.fusion.BRepVertex.cast(pointSel.entity)

        numSteps = 90
        startValue = 0
        endValue = math.pi * 2

        # This assumes the joint is a revolute joint.
        revMotion = adsk.fusion.RevoluteJointMotion.cast(joint.jointMotion)
        revMotion.rotationValue = startValue
        positions = adsk.core.ObjectCollection.create()
        for i in range(numSteps+1):
            val = startValue + ((endValue - startValue) * (i/numSteps))           
            revMotion.rotationValue = val
            app.activeViewport.refresh()
            
            positions.add(vert.geometry)

        sk = root.sketches.add(root.xYConstructionPlane)
        sk.sketchCurves.sketchFittedSplines.add(positions)   
        sk.name = 'Motion Curve'         
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

 

 


Brian Ekins
Inventor and Fusion 360 API Expert
Mod the Machine blog
Message 6 of 6

Anonymous
Not applicable

Brian,

 

I just got it working with my system. Thank you for the help, I appreciate it. 

 

Justin Tranchina

0 Likes