import rhinoscriptsyntax  as rs
import scriptcontext as sc
import Rhino

def round_point(pt, intRnd):
    x = round(pt.X,intRnd)
    y  = round(pt.Y, intRnd)
    z = round(pt.Z, intRnd)
        
    return Rhino.Geometry.Point3d(x, y, z)

def CurvePointAtAxis():
    
    tol = sc.doc.ModelAbsoluteTolerance 
    
    id = rs.GetObject("Select curve to test", 4, preselect=True)
    if not id: return
    
    geo = rs.coercecurve(id)
    bb = geo.GetBoundingBox(False)
    
    while True:
        axis = 0
        if sc.sticky.has_key('CRV_AXIS_INT'):
            axis = sc.sticky ['CRV_AXIS_INT']
        
        blnMark = True
        if sc.sticky.has_key('CRV_AXIS_MARKER'):
            blnMark = sc.sticky ['CRV_AXIS_MARKER']
       
        gp = Rhino.Input.Custom.GetPoint()
        
        axisList = ["X", "Y", "Z"]
        print axis
        gp.AddOptionList("Axis", axisList, axis)
        
        opMark = Rhino.Input.Custom.OptionToggle(blnMark,"No", "Yes")
        gp.AddOptionToggle("MarkPoint",  opMark)
        
        gp.AcceptString(True)
        
        gp.AcceptNumber(True, True)
        
        ret =gp.Get()
        
        if gp.CommandResult() != Rhino.Commands.Result.Success:
            return gp.CommandResult()
            
        if ret == Rhino.Input.GetResult.Point:
            pt = gp.Point()
            break
            
        if ret == Rhino.Input.GetResult.Number:
            temp = gp.Number()
            
            if axis == 0:
                pt = Rhino.Geometry.Point3d(temp,0,0)
            elif axis ==1:
                pt = Rhino.Geometry.Point3d( 0,temp, 0)
            else:
                pt = Rhino.Geometry.Point3d(0, 0,temp)
            break
            
        if ret == Rhino.Input.GetResult.Option:
            idx = gp.OptionIndex()
            print idx
            if idx == 1:
                axis = gp.Option().CurrentListOptionIndex
                sc.sticky['CRV_AXIS_INT'] = axis
            
            blnMark = opMark.CurrentValue
            print blnMark
            sc.sticky['CRV_AXIS_MARKER'] = blnMark
            
            continue
       
        if ret == Rhino.Input.GetResult.String:
            temp = gp.StringResult()
            
            if temp.upper() in axisList:
                axis = axisList.index(temp.upper())
                sc.sticky['CRV_AXIS_INT'] = axis
                continue
            else:
                continue

    if not pt: return

    if axis == 0:
        plane = Rhino.Geometry.Plane.WorldYZ
        plane.Origin = pt
        
    elif axis == 1:
        plane = Rhino.Geometry.Plane.WorldZX
        plane.Origin = pt
        
    else:
        plane = Rhino.Geometry.Plane.WorldXY
        plane.Origin = pt
    
    int = Rhino.Geometry.Intersect.Intersection.CurvePlane(geo, plane, tol)
    if not int: return
    
    ptStr = ''
    
    for item in int:
        if item.IsPoint:
            if blnMark: rs.AddPoint(item.PointA)
            iPt = str(round_point(item.PointA, 4))+ '\n'
            ptStr = ptStr+ iPt
            print "Point at " + iPt
            
    rs.ClipboardText(ptStr)
    
    
if __name__ == '__main__':CurvePointAtAxis()