NEW: Welcome to the Rhino 6 version of this page! Looking for the older Rhino 5 version?

### Garden Path Sample

Demonstrates basic syntax for writing python scripts.

Python

import rhinoscriptsyntax as rs
import math #Use this to get sine, cosine and radians.
import scriptcontext as sc

def test():

#Assign variables to the sin and cos functions for use later.
Sin = math.sin
Cos = math.cos

# Acquire information for the garden path

# set default values for the distances
default_hwidth = 1
default_tspace = 1

# look for any previously used values stored in sticky and use those if available.
if sc.sticky.has_key("GP_WIDTH"):
default_hwidth = sc.sticky["GP_WIDTH"]

if sc.sticky.has_key("GP_Space"):
default_tspace = sc.sticky["GP_SPACE"]

#get the path direction, length and location from two points entered by the user
sp = rs.GetPoint("Start point of path centerline")
if sp is None: return

ep = rs.GetPoint("End point of path centerline", sp)
if ep is None: return

#now ask the user what the distances should be, offering the defaults arrived at above

hwidth = rs.GetDistance(sp, default_hwidth,  second_pt_msg = "Half width of path")
if hwidth is None: return

#Store the new value in sticky for use next time
sc.sticky["GP_WIDTH"] = hwidth

if trad is None: return

#Store  the new value in sticky for use next time

tspace = rs .GetDistance(sp, default_tspace, second_pt_msg = "Distance between tiles")
if tspace is None: return

#Store  the new value in sticky for use next time
sc.sticky["GP_SPACE"] = tspace

# Calculate angles

temp = rs.Angle(sp, ep)

pangle = temp[0]

plength = rs.Distance(sp, ep)

width = hwidth * 2

angp90 = pangle + 90.0

angm90 = pangle - 90.0

# To increase speed, disable redrawing

rs.EnableRedraw (False)

# Draw the outline of the path
#make an empty list
pline = []

#add points to the list
pline.append(rs.Polar(sp, angm90, hwidth))

pline.append(rs.Polar(pline[0], pangle, plength))

pline.append(rs.Polar(pline[1], angp90, width))

pline.append(rs.Polar(pline[2], pangle + 180.0, plength))

#add the first point back on to the end of the list to close the pline
pline.append (pline[0])

#create the polyline from the lst of points.

# Draw the rows of tiles

#define a plane -
#using the WorldXY plane the reults will always be added parallel to that plane,
#regardless of the active plane where the points are picked.

plane = rs.WorldXYPlane()

pdist = trad + tspace

off = 0.0

while (pdist <= plength - trad):

#Place one row of tiles given distance along path

# and possibly offset it

pfirst = rs.Polar(sp, pangle, pdist)

pctile = rs.Polar(pfirst, angp90, off)

pltile = pctile

while (rs.Distance(pfirst, pltile) < hwidth - trad):

plane = rs.MovePlane(plane, pltile)

pltile = rs.Polar(pltile, angp90, tspace + trad + trad)

pltile = rs.Polar(pctile, angm90, tspace + trad + trad)

while (rs.Distance(pfirst, pltile) < hwidth - trad):

plane = rs.MovePlane(plane, pltile)

pltile = rs.Polar(pltile, angm90, tspace + trad + trad)

pdist = pdist + ((tspace + trad + trad) * Sin(math.radians(60)))

if off == 0.0:

else:

off = 0.0

if __name__ == "__main__":

test()



The goal of the garden path sample is to develop a script that draws a garden path and fills it with circular concrete tiles. For those familiar with AutoLISP®, the programming language of Autodesk’s AutoCAD®, you are probably also familiar with the garden path tutorial.