CauldronDevelopmentLLC / CAMotics

Open-Source Simulation & Computer Aided Machining - A 3-axis CNC GCode simulator
Other
609 stars 142 forks source link

In Python sim.wait() kills the task it's waiting on. #385

Open nikcleju opened 1 year ago

nikcleju commented 1 year ago

I'm trying to run one of the examples via the Python API.

After some trial and error, I have something like this:


import sys
sys.path.append('/usr/lib/python3/dist-packages')

import camotics

# Create a Camotics object
sim = camotics.Simulation()

# Open project
sim.open('/usr/share/doc/camotics/examples/wave/wave.camotics')
sim.wait()

# Read g-code file
with open("/usr/share/doc/camotics/examples/wave/wave.gcode") as f:
    gcode = '\n'.join(f.readlines())

# Process g-code
print("Computing path...")
sim.compute_path(gcode=gcode)
sim.wait()

# Take a look at the path (optional)
print("Getting path...")
path = sim.get_path()
sim.wait()

# Start simulation
sim.start(threads=1, reduce=True)
sim.wait()

print("Sim finished")

surfbin = sim.get_surface(format='binary')
sim.wait()

surfpy  = sim.get_surface(format='python')
sim.wait()

sim.write_surface(filename='surf.stl')
sim.wait()

print("Finish()")

The simulation runs successfully, but the resulting surface is empty, so get_surface() and write_surface() fail. Do you have any idea why?

Basically I'm looking for a way to save the simulation result to a STL file.

nikcleju commented 1 year ago

I managed to get it running by replacing the sim.wait() after sim.start() with polling if running:

sim.start(threads=4, time=100000, reduce=True)
#sim.wait()
while sim.is_running():
    sleep(0.01)

With sim.wait() it would sometimes work, and sometimes not. I still don't understand why is this happening. When exactly should I use sim.wait() and when not?

jcoffland commented 1 year ago

The problem is that there is a mistake in wait(). It calls PyTask::join() which interrupts the task then waits for it to exit. It will be fixed in the next release. What you're doing with the while loop is fine.