Python script, help me understanding this


I haven written a python script to create a testtrack purposed to test the cornering behaviour of a cad/cam machine. The script creates a polyline with incremental corner sharpness every time it has come full circle.
Every time the corner changes sharpness, it prints the new corner together with the distance travelled. As a backup, it creates or updates a text file with the same values.
The script works fine, the polyline and the printed values appear almost instantaneously in Rhino when the script is started. The problem is, it continues to do something for the next minute or so. It gets there in the end, but I am puzzled as to what causes the delay. I tried commenting out the lines related to the text file, but nothing changed.

Can someone shed some light on this?

The script:
# Testtrack for CAM angle negotiation.
# by Max Zuijdendorp, April 2018

# dit script creeert een polyline van een track met bochten (richtingsveranderingen) die in scherpte toenemen tot 180 graden, waarmee je het bochtgedrag van de freesmachine kunt testen.
# de bocht wordt met dezelfde scherpte herhaald totdat een volledige cirkel is doorlopen.
# in regels 19 t/m 22 worden de starthoek van de eerste bocht, de toename van de bochthoek na elke cirkel, de lengte van elk lijnstuk en de hoek van de laatste bocht die nog meegenomen wordt vastgelegd.
# als je in regel 19 de waarde van een "verdachte" hoek invult, en in regel 20 de waarde 0 invult kun je een volledige cirkel met die hoek doorlopen om de machine te testen.

import rhinoscriptsyntax as rs
import math

# Check of laag "Testtrack" bestaat, indien niet voeg deze laag dan toe
if not rs.IsLayer("Testtrack"):


	corner =4			# hoek in graden van de eerste bocht (niet op 0 zetten)
	cornerincr = 0.5 	# hoek in graden waarmee de bocht toeneemt bij elke nieuwe cirkel. Indien dit 0 is wordt maar 1 cirkel getekend
	sectionlen = 10 	# lengte van de lijnstukken
	lastcorner = 180 	# scherpste hoek die nog meegenomen wordt.
	angle = 0	
	repeat = 0		
	start = (0,0,0)	
	run = True
	totallen = 0
	Pointlist = []
	Pointlist.append (start)
	diamax = sectionlen/math.sin(corner*math.pi/360)
	if (diamax > 500):  # diameter van de eerste/grootste cirkel
		print"Maximum machinebereik overschreden"
		run = False
	if run:
		createtextfile = True	# True maakt tekstbestand aan of ververst het, False niet.
		if createtextfile:
			f.write("Eerste bochthoek:  "+str(corner)+'\n')
			f.write("Laatste bochthoek:  "+str(lastcorner)+'\n')
			f.write("Hoektoename:  "+str(cornerincr)+'\n')
			f.write("Lengte lijnsegment:  "+str(sectionlen)+'\n')	
			f.write("Snijlengte-Nieuwe Hoek\n")
		imax = 1	# als cornerincr 0 is wordt maar 1 keer een cirkel doorlopen, in alle andere gevallen wordt hieronder het aantal cirkels berekend.
		if (cornerincr <> 0):
			imax = int((lastcorner-corner)/cornerincr)+1

		for i in range(0,imax,1):
			repeat = int(360/corner)+1 # de bocht wordt herhaald met dezelfde hoek totdat tenminste 360 graden doorlopen is
			for n in range(0,repeat,1):
				angle = angle + corner
				point = rs.Polar(start, angle, sectionlen, rs.WorldXYPlane() ) #	WorldZXPlane	WorldYZPlane
				end = point

				Pointlist.append (point)
				start = end

			corner = corner + cornerincr
			totallen = totallen+(n+1)*sectionlen
			print totallen, corner
			if createtextfile: f.write(str(totallen)+"    "+str(corner)+'\n')
		rs.AddPolyline (Pointlist)
		if createtextfile: f.close()



Funny thing is, when I comment out line 67 print totallen, corner, there is no delay anymore. But after undoing that the delay is back. But as I said above, creation of the polyline is instantaneous, and I also can see the last line of printed values straight away.


I don’t know how many lines that prints out, but the delay might be just Rhino waiting to print out a lot of lines of info - printing stuff to the command line takes a significant amount of time and if you have massive amounts to print, that might be filing up a buffer somewhere… Just a theory based on what you wrote though.


Hi Mitch, yes it has to print some 350 lines. I can only see one line in the command line while It is busy, but as I said I am seeing the last printed line almost instantaneously, and still it carries on for some time. I think I am seeing some sort of refresh when it is ready though. Oh well, it gets there in a reasonable time, and I can bypass the printing when I get tired of the delay, and rely on the text file updates only.